【问题标题】:Perl File I/O grepPerl 文件 I/O grep
【发布时间】:2015-11-13 11:45:06
【问题描述】:

我从内存中执行此操作时可能存在语法错误,但是:

use strict;
use warnings;

open(FILE, "+>file") or die "can't open";
print FILE "foo";
if (grep {/^foo$/m}, <FILE>) {
   print "bar";
}
close(FILE) or die "can't close";

为什么这个打印栏没有,我应该怎么做?我正在写入文件,如果我在继续之前将某些内容写入文件,我需要在未来检查,即。如果 foo 已经存在,则不要写 foo。

【问题讨论】:

  • 另外,它是 grep {EXPR} LISTgrep EXPR, LIST 但绝不是 grep {EXPR}, LIST

标签: perl file io


【解决方案1】:

从文件(例如&lt;FILE&gt;)读取数据从当前文件指针开始读取,而不是从文件开头读取。在这种情况下,这最终成为文件的结尾——没有任何内容被读取。

如果你想从头开始阅读,你可以先从头开始:

seek FILE, 0, 0;

但是,请记住,这将非常低效。如果您希望这是一个常见的操作,最好将您写入的内容存储到一个数组中并在其中进行搜索。

【讨论】:

    【解决方案2】:

    可能导致此问题的代码存在一些问题。

    文件的输出可能会被缓冲,因此在将缓冲区刷新到文件之前,从文件中读取不会看到输出。

    此外,当您写入文件时,文件句柄的位置会移动到您写入的位置的末尾,因此读取不会看到它。这未经测试,但您应该按照类似的方式进行查看。

    use Modern::Perl;
    use Fcntl qw(SEEK_SET);
    
    open(my $file_handle, "+>", "file") or die "can't open";
    print $file_handle "foo";
    $file_handle->flush;
    seek $file_handle, 0, SEEK_SET);
    
    if (grep {/^foo$/m}, <$file_handle>) {
        print "bar\n";
    }
    
    close($file_handle) or die "can't close";
    

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2012-05-01
      • 2010-12-25
      • 2010-11-20
      • 2013-09-22
      • 2016-02-09
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多