Как я могу позволить стату if получить доступ к группе захвата из приведенного выше регулярного выражения? - PullRequest
1 голос
/ 15 января 2011

У меня есть оператор if внутри цикла while для фильтрации имен файлов * .iso, а не * .vmdk.Это работает ... Сорта, есть только одна маленькая проблема, которую я не могу понять.Когда я запускаю код, и в цикле есть совпадение с оператором if, он делает запись хеша точно такой же, как и должна, но поскольку он не знает номер канала интерфейса IDE, он просто вызывает запись хеша "IDE", а«IDE0» или «IDE1».

Вот мой код,

        foreach my $vm (@virtual_machines) {
        my $vmx_file = $ssh1->capture("cat $virtual_machines{$vm}{VMX}");
        my $disk_count = -1;
        my $port;
        while ($vmx_file =~ m/^(ide(?<PORT>[0-1])\:[0-1])\.fileName\s+=\s+"(?<DISK>[^"]+)["]/xmg) {
$port = "$+{port}";
            if ("$+{DISK}" =~ m/\/vmfs\/volumes\/.+?\/(?<ISO>.+?\.iso)/xm) {
                ++$disk_count;
                $virtual_disks{$vm}{"IDE$+{PORT}"}{"Disk$disk_count"} = "$+{ISO}";
            } else {
                ++$disk_count;
                $virtual_disks{$vm}{"IDE$+{PORT}"}{"Disk$disk_count"} = "$+{DISK}";
            }
        }
    }

Как я уже говорил выше, код работает за исключением этой части.Это то, как я подхожу к этому неправильно?Мне нужно сделать что-то вроде цикла, который ищет 2 совпадения или что-то?

1 Ответ

4 голосов
/ 15 января 2011

Вы перекрываете переменную $+, когда выполняете второе совпадение с регулярным выражением (значение в if).Вы должны сэкономить $+{PORT} до if.

РЕДАКТИРОВАТЬ : эта демонстрация описывает, что происходит в вашем коде:

#!/usr/bin/perl

use strict;
use warnings;

my $string = "hi 1234 bye";
$string =~ /(?<num>\d+)/;
print $+{num}, "\n";
$string =~ /./;
print $+{num} || "Clobbered", "\n";

отпечатки:

1234
Clobbered
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...