我有一个名为test.txt的文件,内容如下:
Test
Foo
Bar
但我想把每行都放进一个数组,并像这样打印出来:
line1 line2 line3
但是我该怎么做呢?
#!/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;
这是我的一行代码:
perl -e 'chomp(@a = <>); print join(" ", @a)' test.txt
解释:
@a
数组chomp(..)
- 去除每行的结束符号@a
数组perl -le 'chomp(@a=<>); print "@a"' file ..
- Greg Bacon#!/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(@lines);
- Ivan Nevostruev再给你一个选择:
#!/usr/bin/env perl
open(FILE, "<", "test.txt") or die("Can't open file");
@lines = <FILE>;
close(FILE);
chomp(@lines);
print join(" ", @lines);
如果你经常需要读取文件,可以使用CPAN中的File::Slurp 模块:
use strict;
use warnings;
use File::Slurp;
my @lines = read_file('test.txt');
chomp @lines;
print "@lines\n";
use strict;
use warnings
my @array = <> ;
chomp @array;
print "@array";
它由以下人员运行:
scirpt.pl [your file]
这是我能想到的最简单版本:
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";
}
'
use autodie;
。 - Ivan Nevostruev