我正在使用Perl来解析我已转换为制表符分隔文本文件的Excel电子表格。 我想写一个 if 循环,它取决于某个列中是否存在值,但是null值会导致我的代码失败。
这是tsv文件的样子:
Patient No. Date Freezer Location Description Frozen @ Passage
PT101 12/29/09 F1,-130 P-3,68 SERUM
PT101 2/16/10 F1,-130 Q-9,62 Omentum 4
PT101 2/16/10 F1,-130 Q-9,63 Omentum 4
PT101 F1,-130 O-3,8 L Ovary Tumor
请注意,某些行包含空单元格
以下是代码:
#!/usr/bin/perl
use strict;
use warnings;
my $file = shift @ARGV;
open( FILE, $file );
while (<FILE>) {
my $line = $_;
chomp $line;
my @c = split( "\t", $line );
my $p = $c[5];
if ( $p !~ /\d/ ) { next; } # this value will be a number if it is present
print "$line\n";
}
close FILE;
当我运行这个时,我收到一条错误消息抱怨混淆了正则表达式if语句的未启动值。如果有 if 语句可用于检查未启动的值?是否有其他方法可以编写基于第6列中是否存在值的 if 语句?
注意:我考虑过使用 pop 函数来获取最右边的值并检查该值是否为数字,但这是不受欢迎的,因为在我的示例中右侧有更多列有时是数字的,有时是文本的,有时是空白的。
答案 0 :(得分:0)
我有一个if语句可以用来检查未启动的值吗?是否有其他方法可以编写基于第6列中是否存在值的if语句?
有很多方法可以做到这一点。您可以使用“undefined-or”运算符(//
)
next unless ( $p // '' ) =~ /\d/;
或者您可以检查定义:
next unless defined( $p ) && $p =~ /\d/;
如果不是'0'
是有效数字字符串的情况,你可以简单地检查“虚假”,如下所示:
next unless $p && $p =~ /\d/;
但是,我想我会尝试向您展示如何使用Text::CSV
:
my $csv = Text::CSV->new ({ sep_char => "\t" });
while ( my $line = <FILE> ) {
chomp $line;
next unless $line;
die $csv->error_diag
unless $csv->parse( $line )
;
next unless defined( my $p = ( $csv->fields )[5] );
next unless $p =~ /\d/;
say $line;
}