Perl - 一个数组内容

时间:2015-06-17 16:19:36

标签: arrays perl

你能解释一下如何检查元素是否属于数组吗?我的脚本需要知道元素是否需要扩展来创建快捷方式并将其复制到另一个目录。

以下是一个例子:

my @array = qw(avi mp4 mov);
my $dir = "E:\Downloads";
opendir (my $dh, $dir);
while (my $file = readdir($dh))
{
    if($file ~= ) 
    instructions...
}

3 个答案:

答案 0 :(得分:4)

perlfaq4,section&#34中有一个解决方案;如何判断某个元素是否包含在列表或数组中?"在这:http://perldoc.perl.org/perlfaq4.html#How-can-I-tell-whether-a-certain-element-is-contained-in-a-list-or-array

如果您使用的是Perl 5.10或更新版本,解决方案是:

if( $item ~~ @array ) {
    say "The array contains $item"
}

如果你有一个旧的Perl,请查看链接。还有其他可能性。

关于您的任务:如果您只想在文件夹中搜索具有特定扩展名的文件,我建议您使用File::Find::Rule

# find all the .pm files in @INC
my @files = File::Find::Rule->file()
                        ->name( qr/\.(?:avi|mp4|mov)$/ )
                        ->in( $dir );

答案 1 :(得分:3)

您可以使用grep一次查看一个数组,看看是否匹配:

if ( grep $file ~= /\Q.$_\z/, @array ) {

或者将数组元素加入到单个正则表达式中:

my @array = qw(avi mp4 mov);
my $selected_extensions = qr/^\.(?:@{[ join '|', map quotemeta, sort @array ]})\z/;
my $dir = "E:\Downloads";
opendir (my $dh, $dir);
while (my $file = readdir($dh))
{
    if($file ~= $selected_extensions) 
    instructions...
}

答案 2 :(得分:1)

在你的情况下,你可以写

while ( my $file = glob 'E:\Downloads\*.{avi,mp4,mov}' ) {
    # Process $file
}