Tôi đang làm việc trên một dự án mà tại một thời điểm nhận được một danh sách các tập tin từ một máy chủ FTP. Tại thời điểm đó, nó trả về một mảng của các tệp HOẶC nếu tham chiếu regex tùy chọn (tức là qr
), được thông qua, nó lọc danh sách xuống bằng grep. Hơn nữa, nếu qr
có nhóm chụp, nó xử lý phần được chụp dưới dạng số phiên bản và trả về thay vì hashref trong đó khóa là phiên bản và giá trị là tên tệp (sẽ được trả về làm mảng nếu không có nhóm chụp) . Mã trông giống như (đơn giản hóa một chút)Đếm các nhóm chụp trong regex 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;
}
}
Triển khai này cố gắng tạo băm và trả về nếu thành công. Câu hỏi của tôi, là tôi có thể phát hiện rằng qr
có một nhóm chụp và chỉ cố gắng để tạo ra các hash nếu nó?
cho tôi biết nếu tôi nhận được nó: bạn khớp một chuỗi rỗng với sự thay đổi không có gì hoặc regex của tôi. Không có gì cho phép nó phù hợp, nhưng nó vẫn populates @ +, mà sau đó có số lượng các nhóm nắm bắt như số lượng các yếu tố. Tôi có đúng không? Rất thông minh! –
(sửa) ... sau đó có thêm một phần tử so với ảnh chụp (vì $ + [0] là đối sánh) nhưng vì $ # + nhỏ hơn số phần tử, nó trả về số kết quả phù hợp –
@JoelBerger , chính xác. :-) – Qtax