2011-01-15 6 views
1

Ich habe eine if-Anweisung innerhalb einer while-Schleife, um Dateinamen herauszufiltern, die * .iso und nicht * .vmdk sind. Es funktioniert ... sorta, es gibt nur ein kleines Problem, das ich nicht herausfinden kann. Wenn ich den Code ausführe und es eine Übereinstimmung mit der if-Anweisung in der Schleife gibt, macht er den Hash-Eintrag genauso wie er sollte, aber weil er die Kanalnummer der IDE-Schnittstelle nicht kennt, ruft er einfach den Hash-Eintrag "IDE" auf "IDE0" oder "IDE1". Wie kann ich eine if-Anweisung erlauben, auf eine Erfassungsgruppe von einem obigen Regex zuzugreifen?

Hier ist mein Code,

 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}"; 
      } 
     } 
    } 

Wie ich schon oben gesagt, funktioniert der Code mit Ausnahme, dass ein Teil. Ist die Art, wie ich mich dem annähere, falsch? Muss ich etwas wie eine Schleife machen, die nach 2 Übereinstimmungen oder etwas sucht?

Antwort

4

Sie sind die Variable $+ Clobbering, wenn Sie Ihre zweite Regex-Übereinstimmung (die in der if). Sie sollten $+{PORT} vor dem if speichern.

EDIT: Diese Demo beschreibt, was im Code passiert:

#!/usr/bin/perl 

use strict; 
use warnings; 

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

druckt:

1234 
Clobbered 
+0

So kann es nicht, dass die Variable gelesen, weil es zu begraben liegt? – ianc1215

+0

Ich habe meinen Code zu dem geändert, was Sie empfohlen haben, und es funktioniert perfekt, danke für die Hilfe. Ich war mir ziemlich sicher, dass es etwas Einfaches war. – ianc1215

+0

@ Solignis, kein Problem. Ich habe ein Code-Snippet hinzugefügt, um zu demonstrieren, was vor sich geht. Die Übereinstimmungsvariablen werden jedes Mal zurückgesetzt, wenn ein Regex-Operator verwendet wird. – cam

Verwandte Themen