【问题标题】:Read Increment Then Write to a text file in perl读取增量然后写入 perl 中的文本文件
【发布时间】:2014-09-24 05:48:03
【问题描述】:

我有这个小 perl 脚本,它打开一个 txt 文件,读取其中的数字,然后用递增 1 的数字覆盖文件。我可以打开并从文件中读取,我可以写入文件,但我“我遇到了覆盖问题。此外,我想知道是否有办法在不打开文件两次的情况下做到这一点。这是我的代码:

#!/usr/bin/perl

open (FILE, "<", "data.txt") or die "$! error trying to a\
ppend";

 undef $/;

$number = <FILE>;
$number = int($number);
$myNumber = $number++;
print $myNumber+'\n';
close(FILE);

open(FILE, ">data.txt") or die "$! error";
print FILE $myNumber;
close(FILE);

【问题讨论】:

    标签: perl file-io increment


    【解决方案1】:

    换行

    $myNumber = $number++;
    to 
    $myNumber = $number+1;
    

    这应该可以解决问题。

    以下是您只需打开文件一次的方法:

     open(FILE, "+<data.txt") or die "$! error";
     undef $/; 
    
     $number = <FILE>;
     $number = int($number);
     $myNumber = $number+1;
     seek(FILE, 0, 0); 
     truncate(FILE, tell FILE);
     print $myNumber+"\n";
    
     print FILE $myNumber;
     close(FILE);
    

    【讨论】:

    • Verber 想要专门打开文件一次并覆盖其中的数字。有没有其他专门针对这个用例的方法?
    • 搜索足以覆盖旧数字,因为新数字永远不会比它短。好吧,“从不”的意思是,“如果这是一个问题,解决方案就在别处。”
    • 有道理不知道我在想什么 :) 谢谢
    【解决方案2】:

    您第一次使用open 的三参数形式很好。您还需要在第二个open 中这样做。此外,您应该在脚本中使用词法变量,即以my 开头的变量——即使是文件句柄也是如此。

    您可以只增加保存数字的变量,而不是将其传递给新变量。此外,最好使用chomp。话虽如此,请考虑以下选项:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    undef $/;
    
    open my $fhIN, "<", "data.txt" or die "Error trying to open for reading: $!";
    chomp( my $number = <$fhIN> );
    close $fhIN;
    
    $number++;
    
    open my $fhOUT, ">", "data.txt" or die "Error trying to open for writing: $!";
    print $fhOUT $number;
    close $fhOUT;
    

    另一个选择是使用模块File::Slurp,让它处理所有的 I/O 操作:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    use File::Slurp qw/edit_file/;
    
    edit_file { chomp; $_++ } 'data.txt';
    

    【讨论】:

      【解决方案3】:

      试试这个:

      #!/usr/bin/perl
      use strict;
      use warnings;
      my $file = "data.txt";
      my $number = 0;
      my $fh;
      if( -e $file ) {
          open $fh, "+<", $file or die "Opening '$file' failed, because $!\n";
          $number = <$fh>;
          seek( $fh, 0, 0 );
      } else {                  # if no data.txt exists - yet
          open $fh, ">", $file or die "Creating '$file' failed, because $!\n";
      }
      $number++;
      print "$number\n";
      print $fh $number;
      close( $fh );
      

      如果您使用的是 bash shell,并将代码保存到 test.pl,您可以使用以下命令对其进行测试:

      for i in {1..10}; do ./test.pl; done
      

      然后'cat data.txt',应该显示一个10。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-02
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多