0

我正在尝试将换行符分隔的文件读入 Perl 中的数组。我不希望换行符成为数组的一部分,因为元素是稍后读取的文件名。也就是说,每个元素都应该是“foo”而不是“foo\n”。过去,我使用 Stack Overflow 问题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

4

这是我通常从文件中读取的方式。

open (my $in, "<", "test") or die $!;
my @arr;

while (my $line = <$in>) {
  chomp $line;
  push @arr, $line;
}

close ($in);

chomp将从读取的行中删除换行符。您还应该使用open.

于 2013-08-02T00:05:31.480 回答
1
  • 将文件路径放在自己的变量中,以便可以轻松更改。
  • 使用 3 参数 open。
  • 测试所有打开、打印和关闭是否成功,如果没有,则打印错误和文件名。

尝试:

#!/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 回答