为什么我收到错误

时间:2014-09-09 14:39:44

标签: excel perl xls xlsx

在我的代码中,我有一个函数可以验证工作表中的单元格是否包含有效值,这意味着: 它包含一些东西。 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增量,一切正常。

有谁可以告诉我为什么在第一种情况下会发生错误?

谢谢。

3 个答案:

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

谢谢你们的帮助。