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 $!;

推奨されるように、レキシカル ファイル ハンドルを使用して 3 つの引数 open を使用しました。詳細については、 perldoc -f openを参照してください。

を使用している場合、このような間違いが明らかになりuse warnings、エラーが発生します。

readline() on closed filehandle INPUT at ...

ただし、警告を使用していない場合、エラーは静かで致命的です。言うまでもなく、常に

use warnings;
use strict;
于 2012-07-16T15:07:31.663 に答える
2

あなたが主張するように、フィールドが4つのスペースで区切られている場合、コードは機能します。

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

を使用して、ファイルに実際に 4 つのスペースが含まれていることを確認しますod -c


split "..."ところで、代わりに を使用して、自分に嘘をついていますsplit /.../。の最初の引数splitは正規表現です。1つに見えるようにすると、より明確になります。

于 2012-07-16T15:00:17.167 に答える