在Perl中读取换行符分隔文件

时间:2013-08-01 23:53:14

标签: perl input delimiter

我正在尝试将换行符分隔的文件读入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

我真的不明白我做错了什么。如何将这些文件读入数组?

3 个答案:

答案 0 :(得分:4)

以下是我通常从文件中读取的内容。

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

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

close ($in);

chomp将从读取的行中删除换行符。您还应该使用open的三参数版本。

答案 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)

  • 将文件路径放在自己的变量中,以便轻松实现 改变。
  • 使用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";