【问题标题】:Error In Finding Number of Elements In Array (Perl)?查找数组中的元素数时出错(Perl)?
【发布时间】:2013-03-04 09:17:56
【问题描述】:

我正在尝试用 Perl 编写一个程序来查找数组中元素的数量。 (这个数组应该由当前目录中扩展名为“.txt”的文件组成。然后我打算使用这个数组将所有“.txt”文件读入哈希中。)但是,我一直得到一个数组大小 = 0。我知道我的目录中有超过 8 个“.txt”文件,那么我不会有超过 8 个数组元素吗?

我的程序如下:

    #!/user/bin/perl
    my $readfdir = '.';
    opendir(DIR, $readfdir) or die $!;
    my @readf = glob(".*.txt");
    my $arrSize = @readf;
    print "array size = $arrSize\n";

【问题讨论】:

    标签: arrays perl hashtable


    【解决方案1】:

    你的 glob 很可能不是你想的那样

    my @readf = glob(".*.txt");
    

    您正在使用看起来像正则表达式的语法,即.* 来匹配任何字符串,但在一个全局范围内,即*。所以应该是:

    my @readf = glob("*.txt");
    

    此外,如果您使用 glob 代替,您的 opendir 语句将非常多余。使用 opendir/readdir 或 glob。

    【讨论】:

      【解决方案2】:
      glob(".*.txt");
      

      你有一个“。”在文件名的开头,您确定在您的目录中有以这种方式命名的文件吗?

      【讨论】:

        【解决方案3】:

        更改您的 glob 规范。

        use warnings;
        use strict;
        
        my @readf = glob("*.txt");
        my $arrSize = @readf;
        print "array size = $arrSize\n";
        

        另外,opendirglob 都不需要。

        【讨论】:

        • 非常感谢!您能告诉我如何将此标记为有用或另一个已接受的答案吗?
        【解决方案4】:

        这是一个不使用glob的解决方案。

        my $dir = ".";
        my @list_of_files;
        
        opendir(my $dh, $dir) or die "$!";
        for my $file (readdir $dh){
            push(@list_of_files, $file) if
                $file =~ /\.txt$/;
        }
        
        print join(' ', @list_of_files), "\n";
        print "Number of files: ", scalar(@list_of_files), "\n";
        

        另外,我相信您的示例中不需要readdir。例如。你可以glob

        此示例也将仅扫描给定目录中的 txt 文件。如果您想查找给定目录“下方”的所有内容,File::Find 非常棒。

        【讨论】:

        • “push”命令有什么作用?你能不使用“push”命令把当前目录下的所有“.txt”文件放到一个数组中吗?我为这个简单的问题道歉。感谢您的帮助!
        • @user2174373 push 将元素添加到列表的末尾。见perldoc
        • 这个解决方案不好有两个原因:(1) 你在for (readdir $dh) 中一次将整个目录读入内存。在标量上下文中使用readdir 一次使用一个条目:while(my $file = readdir $dh){}。 (2)哦,所有pushing。您刚刚重新发明了 grep 内置函数:my @files = grep /\.txt$/, readdir $dh; 可以替换您的整个循环,尽管这会将整个目录列表加载到内存中。
        • @amon 公平评论。对于人们 new,如 OP 中所述,perl。我不明白向他们展示pushfor 有什么不好。你是否会说这个解决方案也很糟糕,因为我 print 列表中的文件,即使 OP 没有问?
        猜你喜欢
        • 2014-12-04
        • 1970-01-01
        • 2018-09-18
        • 2022-11-01
        • 1970-01-01
        • 2011-04-17
        • 2012-09-26
        • 2016-06-09
        • 1970-01-01
        相关资源
        最近更新 更多