Bắt đầu với 5.10, bạn có thể sử dụng named capture buffers cũng như:
#!/usr/bin/perl
use strict; use warnings;
my %data;
my $s = 'abcdefghijklmnopqr';
if ($s =~ /abc (?<first>def) ghi (?<second>jkl) mno (?<third>pqr)/x) {
push @{ $data{$_} }, $+{$_} for keys %+;
}
use Data::Dumper;
print Dumper \%data;
Output:
$VAR1 = {
'first' => [
'def'
],
'second' => [
'jkl'
],
'third' => [
'pqr'
]
};
Đối với phiên bản trước, bạn có thể sử dụng sau đây mà tránh được việc phải thêm một dòng cho mỗi bị bắt bộ đệm:
#!/usr/bin/perl
use strict; use warnings;
my $s = 'abcdefghijklmnopqr';
my @arrays = \ my(@first, @second, @third);
if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x) {
push @{ $arrays[$_] }, $captured[$_] for 0 .. $#arrays;
}
use Data::Dumper;
print Dumper @arrays;
Đầu ra:
$VAR1 = [
'def'
];
$VAR2 = [
'jkl'
];
$VAR3 = [
'pqr'
];
Nhưng tôi thích giữ dữ liệu liên quan trong một cấu trúc dữ liệu duy nhất, vì vậy tốt nhất bạn nên quay lại sử dụng hàm băm. Điều này đòi hỏi một mảng phụ trợ, tuy nhiên:
my %data;
my @keys = qw(first second third);
if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x) {
push @{ $data{$keys[$_]} }, $captured[$_] for 0 .. $#keys;
}
Hoặc, nếu tên của các biến thực sự là first
, second
vv, hoặc nếu tên của các bộ đệm không quan trọng nhưng chỉ để không, bạn có thể sử dụng :
my @data;
if (my @captured = $s =~ /abc (def) ghi (jkl) mno (pqr) /x) {
push @{ $data[$_] }, $captured[$_] for 0 .. $#captured;
}
Bạn có muốn đếm số lần mẫu được khớp không? Đó là những gì nó có vẻ như với tôi ... – Zaid
tôi cần phải xử lý các trận đấu – Incognito