0

改行で区切られたファイルを Perl の配列に読み込もうとしています。要素は後で読み取るファイル名であるため、改行を配列の一部にしたくありません。つまり、各要素は「foo\n」ではなく「foo」でなければなりません。Stack Overflow question Read a file into an array using Perl and Newline Delimited Inputで提唱されている方法を使用して、過去にこれを成功させました。

私のコードは次のとおりです。

open(IN, "< test") or die ("Couldn't open");
@arr = <IN>;
print("$arr[0] $arr[1]")

そして、私のファイル「テスト」は次のとおりです。

a
b
c
d
e

私の予想される出力は次のようになります。

a b

私の実際の出力は次のとおりです。

a
 b

何が間違っているのか本当にわかりません。これらのファイルを配列に読み込むにはどうすればよいですか?

4

3 に答える 3

1
  • ファイル パスを独自の変数に入れて、簡単に変更できるようにします。
  • 3 引数オープンを使用します。
  • すべてのオープン、印刷、およびクローズが成功するかどうかをテストし、そうでない場合は、エラーとファイル名を印刷します。

試す:

#!/usr/bin/env perl

use strict;
use warnings;

# --------------------------------------

use charnames qw( :full :short   );
use English   qw( -no_match_vars );  # Avoids regex performance penalty

# conditional compile DEBUGging statements
# See http://lookatperl.blogspot.ca/2013/07/a-look-at-conditional-compiling-of.html
use constant DEBUG => $ENV{DEBUG};

# --------------------------------------

# put file path in a variable so it can be easily changed
my $file = 'test';

open my $in_fh, '<', $file or die "could not open $file: $OS_ERROR\n";
chomp( my @arr = <$in_fh> );
close $in_fh or die "could not close $file: $OS_ERROR\n";

print "@arr[ 0 .. 1 ]\n";
于 2013-08-02T12:51:16.653 に答える
0

より冗長なオプションは、File::Slurp::read_fileを使用することです

my $array_ref = read_file 'test', chomp => 1, array_ref => 1;

とにかくファイル名のリストを保存する必要がある場合にのみ。

さもないと、

my $filename = 'test';
open (my $fh, "<", $filename) or die "Cannot open '$filename': $!";

while (my $next_file = <$fh>) {
  chomp $next_file;
  do_something($next_file);
}

close ($fh);

ファイルのリストを保持する必要がないため、メモリを節約できます。

また、ユースケースでファイル名の末尾の空白を本当に許可する必要がない限り、使用する$next_file =~ s/\s+\z//よりも使用したほうがよい場合があります。chomp

于 2013-08-02T01:04:22.753 に答える