2009-12-09 89 views

回答

20
#!/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對於狹窄,詞法文件句柄和3-arg'open'。 :) – Ether 2009-12-09 22:44:47

+7

你應該檢查文件是否成功打開。總是。或者'使用autodie;' – 2009-12-09 22:45:53

+0

好點。固定! – Corey 2009-12-10 06:16:24

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 ING然後印刷/字符串化所有元素交換(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 
+0

有快捷方式格格:'格格(@

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

它是由運行線);' – 2009-12-09 23:08:54

+0

哦,我忘了。謝謝你的提示,伊萬! – 2009-12-10 11:09:50

2

還有一個答案供你選擇:

#!/usr/bin/env perl 

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

這裏是我的單排:

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

說明:

  • 讀取的文件由線成@a陣列
  • chomp(..) - 刪除EOL符號用於使用空間作爲分隔
  • 打印結果
  • 通文件名作爲參數的每一行
  • 串連@a
+3

'perl -le'chomp(@a = <>);打印「@a」文件..' – 2009-12-09 23:11:57

+0

@gbacon:感謝縮短版本 – 2009-12-09 23:28:12

+0

謝謝。我從來沒有見過在同一時間加載和扼殺數組的簡寫方式。 – Echelon 2017-12-14 15:36:45

2

如果您發現自己經常啜食文件,則可以使用CP中的File::Slurp模塊AN:

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

my @lines = read_file('test.txt'); 
chomp @lines; 
print "@lines\n"; 
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"; 
    } 
' 
1

這是做到這一點(假設內部script.pl下面的代碼)的代碼:

scirpt.pl [your file]