我需要从$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
它能是什么?起初它看起来可能是原始的零,但我可以更改其中的任何一个的初始值,它不起作用。
答案 0 :(得分:3)
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> ;
答案 1 :(得分:3)
以下将读取当前目录中的所有文件,
并将它们存储在一个数组中。它排除了子目录,但确实包括
以.
字符开头的文件。然后,它从第一个数组创建另外两个数组。请参阅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");
答案 2 :(得分:1)
这就是我写这个程序的方式:
#! /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 = ();
答案 3 :(得分:0)
我认为你应该使用opendir(以及readdir
等)。
目前,您正在催生新流程并将它们连接在一起,而Perl可以使用标准内置命令完成所有这些工作。结果将立即作为数组返回,以便使用Perl正则表达式进行进一步处理。
(请注意,如果继续操作,则需要转义*
中的grep
。)