2

我有一个文件,其中包含以下格式的行:

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",$_);

在所有这些情况下,我再次得到一个空文件。

4

2 回答 2

4

可能是您的未决陈述失败。你不应该在不检查它是否失败的情况下使用 open ,例如

open my $fh, '<', $file or die $!;

正如推荐的那样,我使用了三个带有词法文件句柄的参数 open。有关详细信息,请参阅perldoc -f open

如果您使用 会显示这样的错误use warnings,并给出错误:

readline() on closed filehandle INPUT at ...

但是,如果您不使用警告,则错误将是无声且致命的。不言而喻,您当然应该始终

use warnings;
use strict;
于 2012-07-16T15:07:31.663 回答
2

如果字段由您声称的四个空格分隔,则您的代码有效。

$ echo 'field1    field2    field3' | perl -nlE'say for split "    ";'
field1
field2
field3

验证您的文件实际上包含四个空格,使用od -c.


顺便说一句,您使用split "..."而不是split /.../. 第一个 arg ofsplit是一个正则表达式。如果你让它看起来像一个,它会更清楚。

于 2012-07-16T15:00:17.167 回答