我使用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;当我运行它时,我会收到一条错误消息,抱怨不熟悉的值混淆了Regex语句。如果有一个 If 语句,我可以使用它来检查不熟悉的值?是否还有其他方法来编写基于第6列中存在的值的if语句?
注意:我考虑过使用pop函数来获得最正确的值,并检查该值是否是一个数字,但这是不可取的,因为在我的示例中,右边有更多列,有时是数字列,有时是文本列,有时是空白列。
发布于 2014-10-15 21:12:39
是否有一条if语句可以用于检查不熟悉的值?是否还有其他方法来编写基于第6列中存在的值的if语句?
有很多种方法可以做到这一点。您可以使用“未定义-或”运算符(//)。
next unless ( $p // '' ) =~ /\d/;或者你可以检查一下是否明确:
next unless defined( $p ) && $p =~ /\d/;如果不是'0'是一个有效的数字字符串,您可以简单地检查"falseness",如下所示:
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;
}https://stackoverflow.com/questions/26390225
复制相似问题