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

11

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

Test
Foo
Bar

但我想把每行都放进一个数组,并像这样打印出来:

line1 line2 line3

但是我该怎么做呢?

7个回答

24
#!/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
+1 坚持使用严格模式、词法文件句柄和带有三个参数的“open”函数。 :) - Ether
7
请确保文件已经成功打开,无论何时。或者使用 use autodie; - Ivan Nevostruev

17

这是我的一行代码:

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

解释:

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

5
perl -le 'chomp(@a=<>); print "@a"' file .. - Greg Bacon
@gbacon:感谢提供了更简短的版本。 - Ivan Nevostruev
谢谢。我以前从未见过同时加载和修剪数组的这种速记方式。 - Echelon

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循环的替代方法。这仍然是一个可行的选择,但你应该将(3)与chomp交换,并打印/字符串化所有元素:

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

(3) 字符串化是指将数组转换为字符串,并在数组元素之间插入值$"。默认情况下,这个值是一个空格。

参见:perlvar页面

因此,实际的第二次尝试是:

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

有一个chomp的快捷方式:chomp(@lines); - Ivan Nevostruev
哦,我忘了那个。谢谢你的提示,伊万! - Tamas Mezei

2

再给你一个选择:

#!/usr/bin/env perl

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

2

如果你经常需要读取文件,可以使用CPAN中的File::Slurp 模块:

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

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

1
这是实现此功能的代码(假设以下代码在 script.pl 中):
use strict;
use warnings
my @array = <> ;
chomp @array;
print "@array";

它由以下人员运行:

scirpt.pl [your file]

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";
    }
'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接