【问题标题】:How can I create an array of directory contents in Perl?如何在 Perl 中创建目录内容数组?
【发布时间】:2010-01-18 17:20:06
【问题描述】:

我需要从$directory 的内容中创建 3 个数组。 我可以使用的第一个:

$var = qx{ls $directory};
print $var;

但是第二个和第三个我想用 grep 搜索“Primary *”和“Secondary *”

我已经使用了命令:

my @primary = 0;
my @secondary = 0;

@primary = system("ls test_77 > test | grep Primary* test");
print @primary;
@secondary = system("ls test_77 > test | grep Secondary* test");
print @secondary;

但是,它在输出中包含一个零:

PrimaryCPE_Option_A.txt.test_77
PrimaryCPE_Option_B.txt.test_77
0SecondaryCPE_Option_A.txt.test_77
SecondaryCPE_Option_B.txt.test_77
0

可能是什么?起初它看起来可能是原来的零,但我可以更改任何一个的初始值,但它不起作用。

【问题讨论】:

  • 在使用 Perl 时尽可能避免使用“系统”。

标签: perl arrays


【解决方案1】:

Perl 可以在不调用系统命令的情况下做到这一点。

@secondary=glob("*Secondary*.txt");
print @secondary;
@primary=glob("*Primary*.txt")
print @primary;

其他方式是使用opendir()/readdir(),或者while循环例如

while(my $file=<*Primary*txt>){
  push(@secondary,$file);
}

或者

push (@secondary,$_) while<*Secondary*.txt> ;

【讨论】:

  • 非常感谢大家,这一切都很好。你们都很棒!
【解决方案2】:

下面会读取当前目录下的所有文件, 并将它们存储到一个数组中。它不包括子目录,但确实包括 以. 字符开头的文件。然后,它从第一个数组创建另外两个数组。参考File::Slurp

use strict;
use warnings;
use File::Slurp qw(read_dir);

my @all_files = grep { -f $_ } read_dir('./');
my @pfiles = grep {/^Primary/  } @all_files;
my @sfiles = grep {/^Secondary/} @all_files;

我现在将尝试解决您的问题。 system 返回外部命令的退出状态(例如ls)。它不返回目录列表。您将使用qx 返回目录列表。参考system

因此,由于您的 ls 命令成功,其退出状态为 0。因此,system 返回 0。此值存储到数组的第一个元素中。这是数组中的唯一值。我相信您看到的任何其他输出都来自您的grep

另外,我接近重现您的输出的唯一方法是在您的system 调用中将管道更改为分号,并去掉*

@primary = system("ls test_77 > test ; grep Primary test");

【讨论】:

    【解决方案3】:

    这就是我编写这个程序的方式:

    #! /usr/bin/env perl
    use strict;
    use warnings;
    use autodie;  # this is so that you don't have to check opendir(), and readdir().
    
    my @files = grep {
      -f $_;
    } do{
      opendir my $dir, '.';
      readdir $dir;
    };
    
    my @primary   = grep {/Primary/  } @files;
    my @secondary = grep {/Secondary/} @files;
    

    您通过这样声明数组将 0 放在列表中:

    my @primary = 0;
    

    如果你想要一个空数组,你只需声明它。

    my @primary;
    

    如果你想明确地将一个数组设置为空:

    @primary = ();
    

    【讨论】:

      【解决方案4】:

      我认为你应该使用opendir(和readdir等)。

      目前,您正在生成新进程并将它们连接在一起,而 Perl 可以使用标准的内置命令在进程中完成所有这些工作。结果将立即以数组形式返回,以便使用 Perl 正则表达式进行进一步处理。

      (请注意,如果您继续使用您的方法,则需要转义 grep 中的 *。)

      【讨论】:

        猜你喜欢
        • 2010-09-06
        • 2020-02-27
        • 2011-04-08
        • 1970-01-01
        • 2010-11-06
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多