4

配列にファイル名プレフィックスの@list1リストがあり、2 番目の配列に完全なファイル名のリストがあります@list2。最後に、 の接頭辞と一致しない完全なファイル名のみを含む 3 番目の配列を作成したいと考えています@list1。私は始めました:

for my $match (@list1) {
  @list3 = grep { !/$match/ } @list2;
}

しかし、それは私が思っていたことをしません。探している結果を得るために必要なオプションは何ですか。

4

3 に答える 3

5

おそらく代替正規表現が役立ちます:

use strict;
use warnings;

my @list1 = qw/a.f c data g j/;
my @list2 = qw/myfile.txt a.file.txt data.txt otherfile.txt jargon.txt/;

my $regex = join '|', map "\Q$_\E", @list1;

my @list3 = grep !/^(?:$regex)/, @list2;

print "$_\n" for @list3;

出力:

myfile.txt
otherfile.txt
于 2012-11-19T23:58:12.977 に答える
1

(あなたの例のように)よりリスト式のような方法を使用したい場合は、これで作業できます:

#!/usr/bin/env perl

use strict;
use warnings;
use List::Util 'first';
use feature 'say';

my @filenames = qw(foo bar baz quux alice bob);
my @forbidden = qw(f ba);

my @matching  = grep {
    my $filename = $_;
    not defined first { $filename =~ /^\Q$_/ } @forbidden;
} @filenames;

say for @matching;

出力:

quux
alice
bob

:firstここではコアの代わりに使用しました。grep長い@forbiddenリストでは、最初の (そしておそらく唯一の) 一致後に停止するため、より効率的である可能性があるためです。

于 2012-11-20T11:21:52.490 に答える
0
#!/usr/bin/perl

use strict;
use warnings;

my @prefixes = qw(a b d);
my @items = qw(apple banana cow dog fruitcake orangutan crabcake deer);

my @nonmatching;
ITEMS: foreach my $item (@items) {
    foreach my $prefix (@prefixes) {
        next ITEMS if ($item =~ /^$prefix/)
    }
    push @nonmatching, $item
}

$,=$\="\n";
print @nonmatching;

収量

cow
fruitcake
orangutan
crabcake

raina77ow の提案に従って編集されました。

于 2012-11-19T23:03:55.993 に答える