为什么我会收到错误

在我的代码中,我有一个函数来validation工作表中的单元格是否包含有效值,意思是:1.它包含一些东西。 2.包含的值不是SPACE,TAB或ENTER。

当我只是检查打印的function(打印单个单元格函数返回的值),显然,一切工作正常。 当我将“结果打印”集成到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和索引增量,一切工作正常。

谁能告诉我为什么在第一种情况下发生错误?

谢谢。

$worksheet->get_cell($a, $b)没有返回一个定义的值时,你不能在返回的undefined值上调用->value 。 你不想使用and而不是在条件?

当你比较两个string等于,你必须使用eq ,而不是==

 while( check_cell($worksheet, $i, 0) eq "correct cell" ) { #... }; 

另外,在check_cell返回0或1更自然,所以你不必在while循环中testing结果:

 sub check_cell { # return 1 if it's ok, else 0 } while( check_cell($worksheet, $i, 0) ) { #... }; 

从5.18.0开始,smartmatch运算符~~被标记为实验

在这种情况下,它修改了条件:

而不是这个:

 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退出没有任何错误。

谢谢你们的帮助。