【问题标题】:How do I open a file whose full name is unknown with Perl?如何使用 Perl 打开全名未知的文件?
【发布时间】:2011-03-16 15:57:20
【问题描述】:

我想知道是否有什么可以让我执行以下操作:

folder1 has files "readfile1" "f2" "fi5"

我唯一知道的是我需要读取以readfile 开头的文件,而我不知道字符串readfile 后面的名称中有什么。另外,我知道目录中没有其他文件以readfile开头。

如何使用open 命令打开此文件?

谢谢。

【问题讨论】:

    标签: perl file file-handling


    【解决方案1】:

    glob可用于查找匹配某个字符串的文件:

    my ($file) = glob 'readfile*';
    open my $fh, '<', $file or die "can not open $file: $!";
    

    【讨论】:

    • 因为简单的解决方案和正确的错误处理而被投赞成票。
    • 好吧,为了完整起见,您还应该检查 glob 错误以及返回是否为 null
    • 是的,他正确地处理了错误——但是 OP 会吗?提倡autodie更光荣。
    • 分配列表的第一个时,我更喜欢这样做:my $file = ( glob 'readfile*' )[0]; 只是为了使从列表中的提取更加明确,这样一些白痴就不会出现并使我的列表分配成为标量分配并打破东西。
    • @Evan Carrol:不完全。 glob 'readfile* 可以返回空列表、多个文件或一个目录。所以,要完整,这些都需要检查,不是吗?同意autodie虽然...
    【解决方案2】:

    您可以将glob 用于简单的情况,正如工具所建议的那样。

    my ($file) = glob 'readfile*';
    

    如果查找正确文件的标准更复杂,只需阅读整个目录并使用 Perl 的全部功能 将列表筛选为您需要的内容:

    use strict;
    use warnings;
    use File::Slurp qw(read_dir);
    
    my $dir   = shift @ARGV;
    my @files = read_dir($dir);
    
    # Filter the list as needed.
    @files = map { ... } @files;
    

    【讨论】:

      【解决方案3】:

      您不一定需要导入来读取目录的内容 - perl 有一些内置函数可以做到这一点:

      opendir DIR, ".";
      my ($file) = grep /readfile.*/, readdir(DIR);
      
      open FILE, $file or die $!;
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-11
      • 2011-01-28
      • 1970-01-01
      • 2012-05-02
      • 2012-06-04
      • 1970-01-01
      • 2011-04-26
      • 2018-05-30
      相关资源
      最近更新 更多