perl遍历一个数组,其路径匹配条件

时间:2015-05-01 18:43:58

标签: arrays perl

我正在尝试在我的linux系统上打印perl数组中提到的路径。如何添加一个数组元素,该元素将打印以cox/m3开头并具有名为foo

的子目录的路径列表
use strict;
use warnings;

my @excludepaths = (
  "abc/def/",
  "hij/klm/", 
  "cox/m3/*/foo/",  
);

foreach (@excludepaths) {
  print "$_\n";
    }
    exit 1;

当前输出:

abc/def/
hij/klm/
cox/m3/*/foo/

期望的输出:

abc/def/
hij/klm/
cox/m3/fsdf/dsgsdfg/fgf/foo/
cox/m3/weret/wer/foo/

2 个答案:

答案 0 :(得分:2)

use strict;
use warnings;

my @excludepaths = (
  "abc/def/",
  "hij/klm/", 
  "cox/m3/*/foo/",  
);

chdir '/path/to/root/dir';

foreach my $path (@excludepaths) {
  foreach (glob $path) {
    print "$_\n";
  }
}

答案 1 :(得分:0)

你遇到的问题是 - 你根本没有进行任何目录搜索。所以你所要做的就是打印数组元素,这就是为什么你得到的东西。

如果您想使用“shell style”语法进行扩展,那么您需要glob。但我建议 - 考虑使用File::Find并使用正则表达式:

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;

my @excludepaths = qw (
  abc/def/
  hij/klm/
  cox/m3/.*/foo/
);

## NB - switched to regular expression, not '*'

my $is_match = join ( "|", map { quotemeta } @excludepaths );
   $is_match = qr/($is_match)/;

sub print_if_match {
    return unless -d;
    if ( $File::Find::name =~ m/$is_match/ ) {
        print "$File::Find::name\n"; 
    }
}

find ( \&print_if_match, "/path/to/search", "../path_to_search/2" );