这里我们在给定文件中查找字符串“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";
}
}
}
答案 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 strict
和use 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
}
与您编写的任何代码一样,请务必测试您的代码。