2016-11-30 1 views
0

Ich bin verwirrt mit der Funktion des regulären Ausdrucks:Welche Funktion hat dieser Codeausdruck?

/\[\]$/

Ich versuchte, einen kurzen Perl-Code, um es zu verstehen, aber ich bin immer noch verwirrt. Die Code-Ausgabe ist Else

my $addr2 = {[{'firstname' => 'Nikhil', 'lastname' => 'Hegde'}, {'firstname' => 'Nikhil2', 'lastname' => 'Hegde2'}]}; 
if($addr2 =~ /\[\]$/) { 
    print "If\n"; 
} 
else { 
    print "Else\n"; 
} 

Ich dachte, dass /\[\]$/ darauf hinweisen würde, ob der Wert ein Array ist oder nicht, aber das scheint nicht der Fall zu sein. Ich dachte dann, dass der Wert vielleicht mit einem Array enden muss, wenn man bedenkt, dass es im regulären Ausdruck einen $ gibt. Also habe ich versucht, Substitution:

my $addr2 = {[{'firstname' => 'Nikhil', 'lastname' => 'Hegde'}, {'firstname' => 'Nikhil2', 'lastname' => 'Hegde2'}],[]};

aber das funktioniert auch nicht. Der Code-Ausgang bleibt Else.

Kann mir jemand helfen, den Ausdruck /\[\]$/ zu verstehen? Was für ein reguläres Matching tut es? Vielen Dank!

+0

Das entspricht literal '[]' (Klammerpaar) am Ende der Zeichenfolge. Also stimmt es mit der Zeichenfolge '" hallo [] "' überein, aber nicht mit '" hallo "'. Ohne die Klammern zu entfernen, sind die _character class_. Außerdem kann eine grundlegende Tatsache erforderlich sein: regex arbeitet an einer Zeichenkette, die in einer Variablen sein kann, aber Sie haben es in einer _complex-Datenstruktur_ versucht. – zdim

+0

Zeitüberschreitung ... um fortzufahren - Ihre '$ addr2' wird als' HASH (...) 'gedruckt - und diese Zeichenkette hat kein' [] 'an ihrem Ende. – zdim

+0

@ zdim Vielen Dank! Das erklärte viel –

Antwort

7

Ein regulärer Ausdruck überprüft das Übereinstimmen von Zeichenfolgen. In Ihrem Fall haben Sie versucht, eine Hash-Referenz zu finden. Deshalb ist Ihr Code in den Block else gegangen.

Jetzt die /\[\]$/. Es entspricht einem beliebigen String, der am Ende ein Literal [] hat. Zum Beispiel würde die Zeichenfolge my $str = "just an example []" dieser Regex entsprechen.

+1

Beachten Sie, dass wir eine Referenz - 'perl -wE '$ ra = [1,2]; sage $ ra wenn $ ra = ~/AR/''. Es ist nur so, dass ein hashref nicht das '[]' am Ende hat :) – zdim

+0

@zdim muss sagen, dass ich nie über diese Option nachgedacht habe! Sie können nie wissen, wann etwas so Seltsames nützlich sein könnte – yonyon100

+0

Vielleicht würde Data-Dumper-Ausgabe von $ addr2 klären, was vor sich geht? – Sobrique

Verwandte Themen