2

配列を印刷しようとしていますが、出力には配列の最後の行しか含まれていません。部分的なコードは次のとおりです。

open OUT, "> /myFile.txt"
    or die "Couldn't open output file: $!";

foreach (@result) {

    print OUT;
}

出力は

List Z

これが最後の行ですが、私が出力を行うとprint "@result"

List A

List B

List C  so on...

同じ配列で結果が異なる理由は少しわかりません。

4

3 に答える 3

7

直感で作業して、\r入力行の最後に追加しようとしましたが、確かに、入力の最後の行だけがファイルに出力されるという錯覚を引き起こします。テストするコードは次のとおりです。

use strict;
use warnings;

my @result = map "$_\r", 'A' .. 'Z';

open (OUT, "> myFile.txt") or die("Couldn't open output file: $!");
foreach (@result) {
    print OUT ;
}

おそらくあなたが行ったことはchomp、別のオペレーティング システム (DOS、Windows) のファイルの行に対して実行されたものであり、\r行末が取り除かれていません。したがって、行が印刷されると、行は互いに上書きされます。

これが間違っている場合、解決策は、dos2unixツールを使用してファイルを修正するか、次を使用することです。

s/\s+\z//; 

改行を削除します。

Data::Dumperオプションを使用して、モジュールを使用して入力を検査できますUseqq。たとえば、次のようになります。

use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper \@result;

これらの空白文字が出力に含まれている場合、それらは表示されます。

于 2012-09-18T18:15:24.963 に答える
2

問題はここにあります

open OUT, "> /myFile.txt"

これはあるべきです

open OUT, ">>", "/myfile.txt"

あなたが書いたものは、 foreach(@result) ループの反復ごとにファイル全体を上書きします。あなたがしようとしているのは、それに追加することです(">>")。">>" が追加され、">" が上書きされます。

また、">> /myfile.txt" を ">>", "/myfile.txt" に分割した方法にも注意してください。これは、オープンの特定性の低いアプリケーションに対して、より安全で堅牢です。

于 2012-09-19T12:12:53.133 に答える
0

任意のプラットフォームからの外国語の行末記号は、行末から空白をクリアし、印刷時に追加し直すことで簡単に修正できます。

このような

open my $out, '>', '/myFile.txt' or die "Couldn't open output file: $!";

foreach (@result) {
  s/\s+$//;
  print $out "$_\n";
}

また

foreach my $line (@result) {
  $line =~ s/\s+$//;
  print $out "$line\n";
}
于 2012-09-18T18:35:27.930 に答える