我正在從事一個項目,該項目從某個ftp服務器獲取文件列表。此時,它會返回文件的arrayref,或者如果傳遞了可選正則表達式引用(即qr
),它將使用grep過濾列表。此外,如果qr
有一個捕獲組,則它將捕獲的部分視爲版本號,並返回hashref,其中鍵爲版本,值爲文件名(如果沒有捕獲組,則返回爲數組) 。代碼如下(略有簡化)在qr正則表達式中計算捕獲組?
sub filter_files {
my ($files, $pattern) = @_;
my @files = @$files;
unless ($pattern) {
return \@files;
}
@files = grep { $_ =~ $pattern } @files;
carp "Could not find any matching files" unless @files;
my %versions =
map {
if ($_ =~ $pattern and defined $1) {
($1 => $_)
} else {
()
}
}
@files;
if (scalar keys %versions) {
return \%versions;
} else {
return \@files;
}
}
此實現嘗試創建哈希值,如果它成功返回。我的問題是,我可以檢測到qr
有一個捕獲組,並且只有在嘗試創建散列時纔會發現它?
讓我看看我是否得到它:你匹配一個空字符串反對任何東西或我的正則表達式的交替。沒有什麼讓它匹配,但它仍然填充@ +,然後捕獲組的數量作爲元素的數量。我對嗎?非常聰明! – 2011-12-28 16:51:54
(更正)...然後比捕獲多一個元素(因爲$ + [0]是匹配),但由於$#+比元素數少一個,它返回正確的匹配數 – 2011-12-28 17:05:01
@JoelBerger ,確切地說。 :-) – Qtax 2011-12-28 17:05:10