如何在Perl中将文件行读入数组?

时间:2009-12-09 22:18:46

标签: perl file-io

我有一个名为 test.txt 的文件,如下所示:

  

测试
  富
  杆

但是我想把每一行放在一个数组中并打印出这样的行:

  

line1 line2 line3

但我怎么能这样做?

7 个答案:

答案 0 :(得分:21)

#!/usr/bin/env perl
use strict;
use warnings;

my @array;
open(my $fh, "<", "test.txt")
    or die "Failed to open file: $!\n";
while(<$fh>) { 
    chomp; 
    push @array, $_;
} 
close $fh;

print join " ", @array;

答案 1 :(得分:14)

这是我的单线:

perl -e 'chomp(@a = <>); print join(" ", @a)' test.txt

说明:

  • 按行将文件读入@a数组
  • chomp(..) - 删除每行的EOL符号
  • 使用空格作为分隔符连接@a
  • 打印结果
  • 将文件名作为参数传递

答案 2 :(得分:2)

最基本的例子如下:

#!/usr/bin/env perl

use strict;
use warnings;

open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1)
my @lines = ();
while(<F>) { chomp; push(@lines, $_); } # (2)
close(F);

print "@lines"; # (3) stringify

(1)是文件打开的地方。

(2)文件句柄在列表环境中很好地工作(标量/列表环境由左值定义),因此如果将数组分配给文件句柄,则所有行都会插入到数组中。这些行由输入记录分隔符$/的值分隔(结束)。如果您use English;,则可以使用$IRS$INPUT_RECORD_SEPARATOR。此值默认为换行符\n;

虽然这似乎是一个好主意,但我忘了这样一个事实:如果你打印所有的行,结尾\n也会被打印出来。拜我。

最初的代码是:

my @lines = <F>;

而不是while循环。这仍然是一个可行的替代方案,但你应该用chomp交换(3)然后打印/字符串化所有元素:

for (@lines) { chomp; }
print "@lines";

(3)字符串化意味着将数组转换为字符串并在数组元素之间插入值$"。默认为空格。

请参阅:the perlvar page

所以实际的第二次尝试是:

#!/usr/bin/env perl

use strict;
use warnings;

open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1)
my @lines = <F>; # (2)
close(F);
chomp(@lines);

print "@lines"; # (3) stringify

答案 3 :(得分:2)

您可以选择另外一个答案:

#!/usr/bin/env perl

open(FILE, "<", "test.txt") or die("Can't open file");
@lines = <FILE>;
close(FILE);
chomp(@lines);
print join(" ", @lines);

答案 4 :(得分:2)

如果您发现自己经常丢弃文件,可以使用CPAN中的File::Slurp模块:

use strict;
use warnings;
use File::Slurp;

my @lines = read_file('test.txt');
chomp @lines;
print "@lines\n";

答案 5 :(得分:1)

这是我能提出的最简单的版本:

perl -l040 -pe';' < test.txt

大致相当于:

perl -pe'
  chomp; $\ = $/; # -l
  $\ = 040;       # -040
'

perl -e'
  LINE:
    while (<>) {
      chomp; $\ = $/; # -l
      $\ = " ";       # -040
    } continue {
      print or die "-p destination: $!\n";
    }
'

答案 6 :(得分:1)

这是执行此操作的代码(假设下面的代码在script.pl中):

use strict;
use warnings
my @array = <> ;
chomp @array;
print "@array";

它由以下人员运行:

scirpt.pl [your file]