如何在perl中区分“0”和NULL?

时间:2015-07-08 05:50:00

标签: perl

这里我们在给定文件中查找字符串“reftext”。旁边的行包含一个包含3个整数的字符串。所以我们在@all_num中提取它们。我们只在不为NULL时打印@all_num[2]的值。但是这里使用的逻辑不会打印@all_num[2],即使它有0。

#!/usr/bin/perl
open( READFILE, "<myfile.txt" );
@list        = <READFILE>;
$total_lines = scalar @list;

for ( $count = 0; $count < $total_lines; $count++ ) {
    if (@list[ $count =~ /reftext/ )
        {
            @all_num = @list[ $count + 1 ] =~ /(\d+)/g;
            if ( @all_num[2] != NULL ) {
                print "@all_num[2]\n";
            }
    }
}

5 个答案:

答案 0 :(得分:4)

Perl不包含NULL,因此行

if(@all_num[2]!= NULL)

在Perl中是荒谬的。 (更确切地说,它会尝试找到名为sub的{​​{1}}并运行它以获取与NULL进行比较的值,但未能这样做,因为您(大概)避开了@all_num[2]。 t定义了这样的sub。)请注意,如果您启用了use strict,这将导致致命错误,而不是假装工作。这是总是 use strict的众多原因之一。

旁注:当您从数组中提取值时,它只是一个值,因此在引用第三个元素时应该说$all_num[2]而不是@all_num[2]数组@all_num。 (是的,习惯这有点令人困惑。我听说它在Perl 6中已被更改,但我假设你在这里使用Perl 5。)注意,如果你已启用use warnings,它会告诉你&#34;标量值@all_num [2]更好地写为$ all_num [2]&#34;。这是总是 use warnings的众多原因之一。

如果你想测试$all_num[2]是否包含值,那么在Perl中表达它的正确方法是

if (defined $all_num[2])

答案 1 :(得分:2)

希望这有帮助,

use strict;
use warnings;

my @fvals = (
 [ i => undef ],
 [ j => 0 ],
 [ k => "" ],
);

for my $r (@fvals) {
  my ($k, $v) = @$r;
  if    (!defined($v)) { print "$k is undef\n"; }
  elsif (!length($v))  { print "$k is empty string\n"; }
  # elsif (!$v)        { print "$k is zero\n"; }
  # recognizes zero value in "0.0" or "0E0" notation
  elsif ($v == 0)      { print "$k is zero\n"; }
}

输出

i is undef
j is zero
k is empty string

答案 2 :(得分:2)

这是您的程序使用最佳实践的方式

你应该

  • 始终use strictuse warnings,并使用my

  • 声明所有变量
  • 使用open

  • 的三参数形式
  • 检查open来电是否成功,如果不是$!字符串,请加die

  • 使用while循环一次处理一行文件,而不是将整个文件读入内存

#!/usr/bin/perl

use strict;
use warnings;

open my $fh, '<', 'myfile.txt' or die $!;
while ( <$fh> ) {

  next unless /reftext/;

  my $next_line = <$fh>;
  my @all_num = $next_line =~ /\d+/g;
  print "$all_num[2]\n" if defined $all_num[2];
}

答案 3 :(得分:0)

试试这个:

#!/usr/bin/perl
use warnings;
use strict;

open(READFILE, "<", "myfile.txt") or die $!;
my @list = <READFILE>;
my $total_lines = scalar @list;
close (READFILE);

for(my $count=0; $count<$total_lines; $count++)
{
    if($list[$count] =~ /reftext/)
    {
        my @all_num = $list[$count+1] =~ /(\d+)/g;
        if($all_num[2] ne '')
        {
            print "$all_num[2]\n";
        }
    }
}

检查变量是否为空:

if ($str ne '')
{
    print $str;
}

或更好:

my ($str);
$str = "";
if (defined($str))
{
    print "defined";
}
else
{
    print "not defined";
}

答案 4 :(得分:0)

如果其他答案不起作用,请尝试将变量视为字符串:

if ( $all_num[2] == 'null' && length($all_num[2]) == 4 ){
     # null
} else {
     # not null
}

与您编写的任何代码一样,请务必测试您的代码。