Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl-如何解析.tsv文件中的空值_Regex_Perl_Parsing_Tsv - Fatal编程技术网

Regex Perl-如何解析.tsv文件中的空值

Regex Perl-如何解析.tsv文件中的空值,regex,perl,parsing,tsv,Regex,Perl,Parsing,Tsv,我正在使用Perl解析一个Excel电子表格,我已将其转换为以制表符分隔的文本文件。 我想编写一个if循环,它取决于某个列中是否存在值,但空值会导致代码失败 以下是tsv文件的外观: Patient No. Date Freezer Location Description Frozen @ Passage PT101 12/29/09 F1,-130 P-3,68 SERUM

我正在使用Perl解析一个Excel电子表格,我已将其转换为以制表符分隔的文本文件。 我想编写一个if循环,它取决于某个列中是否存在值,但空值会导致代码失败

以下是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语句。是否有If语句可用于检查未初始化的值?是否有其他方法可以根据第6列中的值编写if语句

注意:我考虑过使用pop函数来获取最右边的值,并检查该值是否为数字,但这是不可取的,因为在我的示例中,右边有更多的列,这些列有时是数字的,有时是文本的,有时是空白的

是否有if语句可用于检查未初始化的值?是否有其他方法可以根据第6列中的值编写if语句

有很多方法可以做到这一点。可以使用未定义的or运算符//

或者,您可以检查定义:

next unless defined( $p ) && $p =~ /\d/;
如果“0”不是有效的数字字符串,您可以简单地检查错误,如下所示:

next unless $p && $p =~ /\d/;
但是,我想我会尝试向您展示如何使用Text::CSV执行此操作:


请注意,您可以使用适当的CPAN模块直接读取Excel,从而避免转换为CSVDon,而不必为此使用正则表达式。使用Text::CSV或Text::csvxs模块。@Slavatron简单地使用它会更安全。
next unless $p && $p =~ /\d/;
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;
}