0

これは私のタブ区切りの入力ファイルです

Name<tab>Street<tab>Address

これは、出力ファイルを次のように見せたい方法です

Street<tab>Address<tab>Address

(はい、次の 2 つの列を複製します) 出力ファイルは代わりに次のようになります

Street<tab>Address
         <tab>Address

パールで何が起こっているのですか?これは私のコードです。

open (IN, $ARGV[0]);

open (OUT, ">output.txt");
while ($line = <IN>){

    chomp $line;
    @line=split/\t/,$line;

    $line[2]=~s/\n//g;
   print OUT $line[1]."\t".$line[2]."\t".$line[2]."\n";
}

close( OUT);
4

4 に答える 4

4

まず第一に、常に

  • use strictそしてuse warnings、最も些細なプログラムでも。myまた、最初の使用にできるだけ近い方法で各変数を宣言する必要があります。

  • レキシカル ファイル ハンドルと の 3 パラメータ形式を使用します。open

  • すべて openの呼び出しの成功を確認し、失敗の理由を示すdie文字列を含む$!

に表示されるコマンド ラインで指定されたファイルを明示的に開く必要がないことにも注意して@ARGVください<>

他の人が言ったように、Linux システムで DOS または Windows 起源のファイルを読んでいるようです。を使用する代わりに、を使用して各行からすべてのchomp末尾の空白文字を削除できます。CR と LF はどちらも「空白」としてカウントされるため、これにより各レコードからすべての行末記号が削除されます。ただし、末尾のスペースが重要な場合、または最後のフィールドが空白の可能性がある場合は、スペースとタブも削除されることに注意してください。その場合は、より適切です。s/\s+\z//s/[\r\n]+\z//

このバージョンのプログラムは問題なく動作します。

use strict;
use warnings;

@ARGV = 'addr.txt';

open my $out, '>', 'output.txt' or die $!;

while (<>) {
  s/\s+\z//;
  my @fields = split /\t/;
  print $out join("\t", @fields[1, 2, 2]), "\n";
}

close $out or die $!;
于 2013-10-08T14:32:10.037 に答える