在Perl中拆分4个空格

时间:2012-07-16 14:52:05

标签: perl

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

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

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

2 个答案:

答案 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是正则表达式。如果你让它看起来像一个更清楚。