1

私は perl を学んでいます。今は、マッチ キャプチャから、同時にいくつかの変数を入力しようとしています。以下のように、「長い」バージョンが機能しています。

$pc = ...
while ($pc =~ m/bla1(.*?)bla2(.*?)bla3(.*?)bla4(.*?)bla5(.*?)bla6(.*?)bla7/g) {
    $var1 = $1; 
    $var2 = $2;
    $var3 = $3;
    $var4 = $4;
    $var5 = $5;
    $var6 = $6;
    ...
}

単一のキャプチャ(whileループの外側)の場合、これを実行できることがわかっています:

my $string = 'abcde';
my @captures = $string =~ m/.(.)(.)(.)./;
my ($aa,$ab,$ac) = @captures;
print ("$aa - $ab - $ac\n");

while ループ内のすべての変数を一度に設定する方法はありますか? 以下のコードのようなことをする必要がありますか、それとももっと簡単な (2 つの正規表現を必要としない) 方法はありますか?

while ($pc =~ m/bla1(.*?)bla7/g) {
    my @captures = $1 =~ m/(.*?)bla2(.*?)bla3(.*?)bla4(.*?)bla5(.*?)bla6(.*?)/;
    ($var1,$var2,$var3,$var4,$var5,$var6) = @captures;
    ...
}

前もって感謝します。

4

2 に答える 2

6

まあ、あなたは使うことができます

while ($pc =~ m/bla1(.*?)bla2(.*?)bla3(.*?)bla4(.*?)bla5(.*?)bla6(.*?)bla7/g) {
    my ($var1, $var2, $var3, $var4, $var5, $var6) = ($1, $2, $3, $4, $5, $6);
    ... $var3 ...
}

また

while ($pc =~ m/bla1(.*?)bla2(.*?)bla3(.*?)bla4(.*?)bla5(.*?)bla6(.*?)bla7/g) {
    my @vars = ($1, $2, $3, $4, $5, $6);
    ... $vars[2] ...
}

また

sub captures { map substr($_[0], $-[$_], $+[$_] - $-[$_]), 1..$#- }

while ($pc =~ m/bla1(.*?)bla2(.*?)bla3(.*?)bla4(.*?)bla5(.*?)bla6(.*?)bla7/g) {
    my @vars = captures($pc);
    ... $vars[2] ...
}

また

sub captures { no strict 'refs'; map $$_, 1..$#- }

while ($pc =~ m/bla1(.*?)bla2(.*?)bla3(.*?)bla4(.*?)bla5(.*?)bla6(.*?)bla7/g) {
    my @vars = captures();
    ... $vars[2] ...
}

また

while ($pc =~ m/bla1(?<var1>.*?)bla2(?<var2>.*?)bla3(?<var3>.*?)bla4(?<var4>.*?)bla5(?<var5>.*?)bla6(?<var6>.*?)bla7/g) {
    ... $+{vars3} ...
}
于 2013-07-26T14:09:40.573 に答える
0

試す:

$pc = ...
while ( my @captured = $pc =~ m/bla1(.*?)bla2(.*?)bla3(.*?)bla4(.*?)bla5(.*?)bla6(.*?)bla7/g) {
于 2013-07-26T18:09:43.467 に答える