我已经为此苦苦挣扎了一段时间,并且不太熟悉 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
$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
不是系统调用。 $!
即使发出错误信号也是毫无意义的。