2010-06-30 99 views
1

我試圖返回一個文件替換爲\ n換行符的一行輸出所有行,而無需使用CPAN的Perl:我怎麼從文件中讀取和打印文本

這裏是我到目前爲止

#! /usr/local/bin/perl 

if ($#ARGV = "1")  { 
    print "$ARGV[0]\n"; 

    my $file = "$ARGV[0]"; 
    my $document = do { 
     local $/; 
     open my $fh, "<", $file 
      or die "could not open $file: $!"; 
     <$fh>; 
    }; 
    print "Doc: $document\n"; 
} 
+0

換行符是*'\ n' ..除非你在其中一個瘋狂的系統上。 – Ether 2010-07-01 00:00:05

+0

你真的想要一個字面反斜槓後跟一個n嗎?你爲什麼要這樣? – Ether 2010-07-01 00:41:14

+2

現在我們來說一切:開啓警告!或者在#的末尾加上-w!或者在代碼中使用「警告」。這將揭示一個重要問題。 – Schwern 2010-07-01 01:36:50

回答

1

您可以使用啜食模式(while循環不再需要)和一些正則表達式:

print map { $_ =~ s/\n/\\n/; $_ } (<>); 

或者一些SPE cial變量:

my @a = <>; 
$\ = $, = '\n'; 
chomp @a; 
print @a; 

($ \是輸出記錄分隔符,而$是輸出字段分隔符。這兩種適用於印刷者)

3
while(<>) {chomp;print;print '\n';} 
+0

'打印'\ n''不會做你期望的。 (試試看吧。) – Ether 2010-07-01 00:00:37

+0

@Ether:它的確如我所料。意圖是打印一個反斜槓,後面跟一個「n」,*不是一個換行符。 – 2010-07-01 00:02:00

+0

嗯好的,我完全誤解了OP想要的東西。 :)爲了減少歧義,你可以說''\\ n''。 – Ether 2010-07-01 00:19:15

0

我想這...

#! /usr/bin/perl 

if ($#ARGV = "1")  { 
open FILE, "<", "$ARGV[0]" or die $!; 
chomp $_; 
@chars = map ({ $_ =~ s/\n/\\n/; $_ } (<FILE>)); 
print @chars; 
print "@chars\n"; 
} 

..它給了我正確的輸出(除了一些空間,我需要學習如何去掉)

+1

當你沒有任何參數運行你的腳本時會出現什麼內容? – Toto 2010-07-01 15:26:28

0

這是一個清晰的長期解決方案。簡而言之,chomp將刪除所有尾隨的空格和控制字符。

#!/usr/bin/perl 

use strict; 
use warnings; 

my $filename = shift; 
my @contents; 
my $lines = 0; 

if (! -e $filename) { 
    print "Please provide a valid filename\n"; 
    exit; 
} 

print "Examining $filename\n"; 

open(FILE, "<$filename"); 

while (<FILE>) { 
    chomp(); 
    push(@contents, $_); 
    print "."; 
    $lines++; 
    if ($lines % 10 == 0) { 
     print "\n"; 
    } 
} 
close(FILE); 

print "done\n"; 

foreach (@contents) { 
    print "$_"; 
} 

print "\n";