2015-07-21 10 views
8

Wie kann ich den Anfang der nächsten Suchposition um 1 zurückspulen? Angenommen, ich möchte alle Ziffern zwischen # abgleichen. Das Folgende wird mir nur ungerade Nummern geben.Zurückspulen der nächsten Suchstartposition um 1?

my $data="#1#2#3#4#"; 

while ($data =~ /#(\d)#/g) { 
    print $1, "\n"; 
} 

Aber wenn ich den Anfang der nächsten Position um 1 zurückspulen könnte, würde ich sowohl gerade als auch ungerade Zahlen bekommen.

funktioniert das nicht: pos() = pos() - 1;

Ich weiß, dass ich diese split mit erreichen kann. Aber das beantwortet meine Frage nicht.

for (split /#/, $data) { 
    print $_, "\n"; 
} 
+0

'/ c 'nur entfernt. –

Antwort

8

Sie pos() auf $_ Aufruf statt $data

Von perldoc

Gibt den Offset von dem die letzten m // g links Suche Aus für die betreffende Variable ($ _ wird verwendet, wenn die Variable nicht angegeben ist)

So

,

pos($data) = pos($data) - 1; 
+0

'pos ($ data) -;' – ikegami

11

Ein Ansatz ist ein look-ahead assertion zu verwenden: sind

while ($data =~ /#(\d)(?=#)/g) { 
    print $1, "\n"; 
} 

die Zeichen in der Vorgriff Behauptung nicht Teil des angepassten Ausdrucks und nicht aktualisieren pos() vorbei an dem \d Teil des regulären Ausdrucks .

Weitere Demos:

say "#1#2#3#4#" =~ /#(\d)/g;   # 1234 
say "#1#2#3#4" =~ /#(\d)/g;   # 1234 
say "#1#2#3#4#" =~ /#(\d)(?=#)/g;  # 1234 
say "#1#2#3#4" =~ /#(\d)(?=#)/g;  # 123 
+5

Während dies die gestellte Frage nicht beantwortet, ist es eine bessere Lösung für das, was das OP zu tun versucht. – cjm

+1

Ich bin ständig erstaunt, dass Leute dieses Kauderwelsch lesen können. Diese obere While-Schleife - keine Ahnung WTF es tut. –

+0

Zum Glück sind Sie an der richtigen Stelle, da SO-Benutzer Ihnen Antworten auf alle Arten von Programmierfragen geben können. –