Frage

Ich habe in Perl wurde die Programmierung ab und zu schon seit Jahren, wenn auch nur sporadisch meine primäre Sprache ist es. Weil ich oft Monate vergehen, ohne dass Perl zu schreiben, verlasse ich mich stark auf mein Eselsohren Camel Buch mich daran zu erinnern, wie die Dinge zu tun. Allerdings, wenn ich Rezepte wörtlich ohne Verständnis zu kopieren, das stört mich. Dies ist eines der drängendsten: Auf Seite 154 der 3. Auflage Kamel, gibt es ein Beispiel für „Modifizieren Strings en passant , die wie folgt lautet:

($lotr = $hobbit) =~ s/Bilbo/Frodo/g;

Q1), was geht hier vor? Auf was genau ist die Regex in Betrieb?

Q2) Ist das nahezu magische Syntax, die für eine solche grundlegende Operation als „nehmen einen String von $ ein, ändern Sie es mit einem regulären Ausdruck, Ort Ergebnis in $ b“?

Q3) Wie kann ich tun, um diesen Vorgang der Schleife Standardvariable als Anfangszeichenfolge?

Apologies im Voraus Perl Träumer, für die die oben ganz natürlich aussieht.

War es hilfreich?

Lösung

Hmmm ... ($lotr=$hobbit) =~ s/Bilbo/Frodo/g ist eine der vielen magicks von Perl. Jetzt für einige Antworten.

Q1) $lotr wird, um den Wert enthalten in $hobbit zugeordnet. Nach der Zuweisung können wir über die Quellvariable vergessen. Treat ($lotr = $hobbit) wie es eigene Aussage ist als-ob wir geschrieben:

$lotr = $hobbit;
$lotr =~ s/Bilbo/Frodo/g;

statt. Die Regex arbeitet auf $lotr.

Q2) Die Syntax ist einfach eine einzeilige Version des Snippets oben angegeben. Betrachten Sie es als „kopieren Sie die Zeichenfolge aus $a, kopieren Sie sie in $b und ändern $b mit dem regulären Ausdruck“ statt „nehmen eine Zeichenfolge aus $a, ändern Sie es mit einem regulären Ausdruck, Ort Ergebnis in $b

Q3) Ich gehe davon aus, dass Sie das Standardmuster bedeuten Platzsuche durch „Loop-Standardvariable“? In diesem Fall verwendet nur $_ statt $hobbit:

while (<>) {
  chomp;
  ($lotr = $_) =~ s/Bilbo/Frodo/g;
  print "\$lotr = [$lotr]\n";
  print "\$_    = [$_]\n";
}

Interessanterweise ist die Magie var $_ durch diese Operation nicht geändert. Dies ist, wie können Sie davon ausgehen, dass die Zuordnung geschieht vor die regex Substitution und dass die Substitution nicht in Wechselwirkung auf dem Standard-Musterraum in keiner Weise.

Und für die erfahrene Sache Perl-Programmierers ... Ich weiß nicht, zu viele Menschen, die durch einig Stück Perl-Syntax geworfen werden, unabhängig davon, wie lange sie es gestarrt ‚cept Mr. Schwartz natürlich;)

Andere Tipps

Verschiedene Sprachen verschiedene Dinge tun, mit dem Zuweisungsoperator. In einigen ist es eine Aussage, kein Ausdruck, so kann nicht in einen größeren Ausdruck kombiniert werden. In einigen, gibt sie den Wert zugewiesen, sondern nur als einen Wert, nicht als etwas (oft einen R-Wert genannt), die selbst modifiziert werden kann oder zugeordnet (L-Wert). Ein Beispiel hierfür ist C, wo Sie schreiben:

 a = b = c;  # assign value of c to b and a

aber nicht:

 ++(b = a);  # assign value of a to b, then increment b

Und in einigen, das Ergebnis einer Zuweisung ist der L-Wert zugewiesen. (In Perl, gilt dies nur für skalare Zuweisungen;. Liste Zuordnungen sind ein komplexeres Biest) So können Sie tun ++ ($ b = $ a) oder ($ b = $ a) = ~ s / a / b / oder jede andere Operation, die ein L-Wert für die Zuordnung erwartet, und es wird die Zuordnung und dann weiter modifizieren, den L-Wert zugewiesen.

zuerst tun

Wenn in Q2 Sie eine Unterkette von $ nehmen bedeuten zu einem, könnte man dieses Idiom nützlich finden:

($b) = $a =~ /(substring-to-match)/;
$b =~ s/regex-on-susbtring/result-string/;

tun Beachten Sie auch, dass $ a und $ b sind keine normalen Variablen in Perl, da sie spezielle Bereichsregeln auf die Sortierfunktion im Zusammenhang haben. Siehe 'perldoc perlvar' für Details.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top