使用 Perl 时出现“In合适的 ioctl for device”

问题描述 投票:0回答:1

我已经为此苦苦挣扎了一段时间,并且不太熟悉 Perl 的核心对象系统。这是出现问题的大型项目的简化部分。我正在尝试编写一个包装另一个类的类,该类将 .xlsx 电子表格文件输出到磁盘上。除非我在 do_something 子例程中包含 die 语句,否则这个将起作用。如果我包含 die 语句,它将停止,但 .xlsx 文件仍会写入光盘,直到 die 语句为止。它不会包含#Does't write 中的行。如果我省略 die 语句,它将完全按预期工作,打印所有内容并优雅地关闭。

导致此“ioctl”错误的原因是什么以及如何修复它?这在我的较大项目上失败,并将文件输出到光盘,但不包括从子例程写入的行,即使没有 die 语句。任何帮助,将不胜感激。谢谢!

#!/usr/bin/perl

package TestClass;

use Excel::Writer::XLSX;
use POSIX qw(strftime);
use Data::Dumper;

use strict;
use diagnostics;

sub new{
    my $class = shift;

    my $workbook = Excel::Writer::XLSX->new('test.xlsx');
    my $worksheet = $workbook->add_worksheet('demo');

    my $format = $workbook->add_format(
    color => 'black',
    bold => 1
    );
    
    my $self = {
    format => $format,
    workbook => $workbook,
    worksheet => $worksheet
    };
    bless $self, $class;

    $worksheet->merge_range( 0,0, 0,2, (strftime '%F %I:%M %P', localtime), $format );
    
#    $self->{worksheet}->write( 2,2, "Check", $format );
    $worksheet->write( 2,2, "Check", $format );
    &do_something( $self, 3,3, "Mate" );           # Main problem
    $worksheet->write( 4,4, "Match", $format );    # Doesn't write with 'die'

    $workbook->close();
    
    return $class;
}

sub do_something{
    my ( $self, $y, $x, $txt ) = @_;

    print Dumper( $self->{worksheet} ), "\n";
    print ref( $self->{worksheet} ), "\n\n";
# Line below writes but dies.
    $self->{worksheet}->write( $y,$x, $txt, $self->{format} ) or die "Didn't work: $!";
    
    return 1;
}


1;

运行时出现错误信息:

Uncaught exception from user code:
    Didn't work: Inappropriate ioctl for device at ./TestClass.pm line 47.
    TestClass::do_something(TestClass=HASH(0x55c438170d88), 3, 3, "Mate") called at ./TestClass.pm line 33
    TestClass::new("TestClass") called at -e line 1

使用 Dumper() 和 ref() 的输出进行调用:

sudo perl -e "require './TestClass.pm';TestClass->new();"
$VAR1 = bless( {
                 '_dim_rowmin' => 0,
                 '_rstring' => '',
                 '_filter_cols' => {},
                 '_tempdir' => undef,
                 '_default_row_pixels' => 20,
                 '_margin_top' => '0.75',
                 '_fh' => undef,
                 '_external_background_links' => [],

            [ Snipped for brevity ]

                 '_default_date_pixels' => 68,
                 '_xls_rowmax' => 1048576,
                 '_col_size_changed' => 0,
                 '_set_rows' => {},
                 '_outline_on' => 1,
                 '_str_total' => \2,
                 '_write_match' => [],
                 '_shape_hash' => {}
               }, 'Excel::Writer::XLSX::Worksheet' );

Excel::Writer::XLSX::Worksheet

一切正常运行且“die”被注释掉时的屏幕截图: Spreadsheet img

perl oop ioctl
1个回答
0
投票

$self->{worksheet}->write
成功时返回零。当调用成功时,你实际上会导致程序失败。

写入方法返回:

  0 for success.
 -1 for insufficient number of arguments.
 -2 for row or column out of bounds.
 -3 for string too long.

此外,

$self->{worksheet}->write
不是系统调用。
$!
即使发出错误信号也是毫无意义的。

© www.soinside.com 2019 - 2024. All rights reserved.