【问题标题】:Perl - Append to last line of a filePerl - 附加到文件的最后一行
【发布时间】:2015-11-20 19:41:39
【问题描述】:

我是 Perl 新手,谁能告诉我如何根据当前值附加输出文件的最后一个条目? 例如。我正在生成一个输出 txt 文件说

a b c d 10

通过一些处理,我得到值 20,现在我希望分配这个值 20 并与之前的集合对齐

a b c d 10

把它变成

a b c d 10 20

【问题讨论】:

    标签: perl append


    【解决方案1】:

    假设最后一行没有换行符

    use strict;
    use warnings;
    
    open(my $fd, ">>file.txt");
    print $fd " 20";
    

    如果最后一行已经有换行符,则输出将在下一行结束,即

    a b c d 10
     20
    

    在任何一种情况下都可以使用更长的版本

    use strict;
    use warnings;
    
    open(my $fd, "file.txt");
    my $previous;
    while (<$fd>) {
        print $previous if ($previous);
        $previous = $_;
    }
    
    chomp($previous);
    print "$previous 20\n";
    

    但是,这个版本并没有修改原始文件。

    【讨论】:

      【解决方案2】:

      尝试这样做

      单行版本

      perl -pe 'eof && do{chomp; print "$_ 20"; exit}' file.txt
      

      脚本版本

      #!/usr/bin/env perl
      
      use strict; use warnings;
      
       while (defined($_ = <ARGV>)) {
          if (eof) {
              chomp $_;
              print "$_ 20";
              exit;
          }
      }
      continue {
          die "-p destination: $!\n" unless print $_;
      }
      

      样本输出

      $ cat file.txt
      a b c d 08
      a b c d 09
      a b c d 10
      
      
      $ perl -pe 'eof && do{chomp; print "$_ 20"; exit}' file.txt
      a b c d 08
      a b c d 09
      a b c d 10 20
      

      【讨论】:

        【解决方案3】:
        perl -0777 -pe 's/$/ 20/' input.txt > output.txt
        

        说明:通过将输入记录分隔符设置为-0777 来读取整个文件,对匹配文件结尾或最后一个换行符之前的读取数据执行替换。

        您也可以使用-i 开关对输入文件进行就地编辑,但这种方法是有风险的,因为它会执行不可逆的更改。它可以与备份一起使用,例如-i.bak,但是该备份在多次执行时会被覆盖,因此我通常建议使用 shell 重定向,就像我上面所做的那样。

        【讨论】:

          【解决方案4】:

          先读取整个文件,可以通过这个子程序read_file

          sub read_file {
              my ($file) = @_;
              return do {
                  local $/;
                  open my $fh, '<', $file or die "$!";
                  <$fh>
              };
          }
          
          my $text = read_file($filename);
          chomp $text;
          print "$text 20\n";
          

          【讨论】:

            猜你喜欢
            • 2011-04-09
            • 2012-01-05
            • 2015-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多