我正在尝试将换行符分隔的文件读入Perl中的数组。我不希望换行符成为数组的一部分,因为这些元素是稍后要读取的文件名。也就是说,每个元素应该是“foo”而不是“foo \ n”。我过去使用Stack Overflow问题 Read a file into an array using Perl 和 Newline Delimited Input 中提出的方法成功完成了这项工作。
我的代码是:
open(IN, "< test") or die ("Couldn't open");
@arr = <IN>;
print("$arr[0] $arr[1]")
我的文件'test'是:
a
b
c
d
e
我的预期输出是:
a b
我的实际输出是:
a
b
我真的不明白我做错了什么。如何将这些文件读入数组?
答案 0 :(得分:4)
以下是我通常从文件中读取的内容。
open (my $in, "<", "test") or die $!;
my @arr;
while (my $line = <$in>) {
chomp $line;
push @arr, $line;
}
close ($in);
答案 1 :(得分: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
,除非您的用例确实需要允许在文件名中使用尾随空格。
答案 2 :(得分:0)
尝试:
#!/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";