我有一个文件,其中包含以下格式的行:
field1 field2 field3
每个字段用4个空格分隔。
我正在尝试使用Perl从上面的列表中提取field2。
所以,这就是我所做的,
#! /usr/bin/perl
($input, $output) = @ARGV;
chomp $output;
open(INPUT,"<",$input);
open(OUTPUT,">>",$output);
while(<INPUT>)
{
chomp $_;
($f1,$f2,$f3)= split("\t",$_,3); // *** This line was modified later.
print OUTPUT $f2."\n";
}
close INPUT;
close OUTPUT;
这给了我一个空白文件。
我尝试用星号修改上面指定的行:
($f1,$f2,$f3)= split("\t",$_);
($f1,$f2,$f3)= split(" ",$_);
($f1,$f2,$f3)= split("\s\s\s\s",$_);
在所有这些情况下,我再次获得一个空文件。
答案 0 :(得分:4)
可能是您的公开声明失败了。你不应该在没有检查它是否失败的情况下使用open,例如
open my $fh, '<', $file or die $!;
我建议使用三个参数打开一个词法文件句柄。有关详细信息,请参阅perldoc -f open。
如果您使用的是use warnings
,则会出现这样的错误:
readline() on closed filehandle INPUT at ...
但是,如果您没有使用警告,则错误将是沉默且致命的。不言而喻,你当然应该
use warnings;
use strict;
答案 1 :(得分:2)
如果您声明的字段间隔四个空格,则代码可以正常工作。
$ echo 'field1 field2 field3' | perl -nlE'say for split " ";'
field1
field2
field3
使用od -c
验证您的文件实际包含四个空格。
split "..."
代替split /.../
骗你自己。 split
的第一个arg是正则表达式。如果你让它看起来像一个更清楚。