2010-06-30 102 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";