【问题标题】:perl: how do I read all lines from a file and print as one line of textperl:如何从文件中读取所有行并打印为一行文本
【发布时间】:2010-06-30 23:25:09
【问题描述】:

我试图在不使用 CPAN 的情况下返回用 \n 替换换行符的文件的输出

这是我目前所拥有的

#! /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";
}

【问题讨论】:

  • 换行符 \n.. 除非你在那些疯狂的系统中。
  • 你真的想要一个反斜杠后跟一个 n 吗?你为什么想要那个?
  • 现在让我们一起说:开启警告!在 #! 的末尾加上 -w行或代码中的use warnings。这将揭示一个重要问题。

标签: perl string file


【解决方案1】:
while(<>) {chomp;print;print '\n';}

【讨论】:

  • print '\n' 不会做你所期望的。 (试试看。)
  • @Ether:它完全符合我的预期。目的是打印一个反斜杠,后跟一个“n”,不是换行符。
  • 嗯,好吧,我完全误解了 OP 想要什么。 :) 为了不那么模棱两可,你可以改成'\\n'
【解决方案2】:

您可以使用 slurp 模式(不再需要 while 循环)和一些正则表达式:

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

或者一些特殊的变量:

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

($\是输出记录分隔符,$,是输出字段分隔符,都适用于打印操作符)

【讨论】:

    【解决方案3】:

    我试过这个...

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

    .. 它给了我正确的输出(除了一些我需要学习如何去除的空格)

    【讨论】:

    • 当你在没有任何参数的情况下运行你的脚本会发生什么?
    【解决方案4】:

    为了清楚起见,这是一个很长的解决方案。简而言之,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";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      相关资源
      最近更新 更多