在我的代码中,我有一个函数可以验证工作表中的单元格是否包含有效值,这意味着: 它包含一些东西。 2.包含的值不是SPACE,TAB或ENTER。
当我只是检查打印中的函数(打印函数返回的单个单元格的值)时,显然,一切正常。
当我整合"打印结果"进入while循环,为了检查一系列单元格,它收到错误消息:Can't call method "value" on an undefined value at D:\test.pl
这是我的代码:
use strict;
use Spreadsheet::ParseXLSX;
my $parser = Spreadsheet::ParseXLSX->new();
sub check_cell($) {
my ( $worksheet, $a, $b ) = @_;
if ( $worksheet->get_cell( $a, $b )
or not ord( $worksheet->get_cell( $a, $b )->value() ) ~~ [ 32, 9, 10 ] )
{
return 1;
} else {
return 0;
}
}
my $workbook = $parser->parse('D:\test.pl data.xlsx');
if ( !defined $workbook ) {
die $parser->error(), ".\n";
}
my $worksheet = $workbook->worksheet(0);
my $i = 8;
while ( &check_cell( $worksheet, $i, 0 ) ) {
print &check_cell( $worksheet, $i, 0 ), "\n";
$i++;
}
如果我删除while和index增量,一切正常。
有谁可以告诉我为什么在第一种情况下会发生错误?
谢谢。
答案 0 :(得分:2)
当你比较两个字符串的平等时,你必须使用eq
,而不是==
while( check_cell($worksheet, $i, 0) eq "correct cell" ) {
#...
};
此外,在check_cell
子中返回0或1更为自然,因此您无需在while
循环中测试结果:
sub check_cell {
# return 1 if it's ok, else 0
}
while( check_cell($worksheet, $i, 0) ) {
#...
};
智能匹配运算符~~
自Perl 5.18.0起已被标记为实验性
答案 1 :(得分:1)
当$worksheet->get_cell($a, $b)
没有返回定义的值时,您无法在返回的未定义值上调用->value
。你不想在条件中使用and
而不是or
吗?
答案 2 :(得分:1)
在这种情况下,它修改了条件:
而不是:
if ( $worksheet->get_cell( $a, $b )
or not ord( $worksheet->get_cell( $a, $b )->value() ) ~~ [ 32, 9, 10 ] )
{
return 1;
}
我用过:
if ( $worksheet -> get_cell($a, $b) ) {
if ( not ord($worksheet -> get_cell($a, $b) -> value()) ~~ [32, 9, 10] ){
return 1;
}
}
并且scrit退出没有任何错误。
谢谢你们的帮助。