Hier ist das, was ich nicht verstehe.
Dieses Skript funktioniert ordnungsgemäß (beachten Sie die Verkettung in der Kartenfunktion):
%Vor%Aber ohne Verkettung funktioniert die Karte nicht. Hier ist das Skript, von dem ich erwarte, dass es funktioniert, aber es funktioniert nicht:
%Vor%Können Sie bitte ein solches Verhalten erklären?
Perl verwendet Heuristiken, um zu entscheiden, ob Sie Folgendes verwenden:
%Vor%Weil "{" oft der Anfang eines Blocks ist, könnte es auch der Anfang eines Hashrefs sein.
Diese Heuristiken sehen im Token-Stream (IIRC zwei Tokens) nicht sehr weit voraus.
Sie können erzwingen, dass "{" als Block interpretiert wird:
%Vor%Sie können erzwingen, dass "{" unter Verwendung von:
als Hash interpretiert wird %Vor% grep
leidet ähnlich. (Technisch ist dies auch do
, da ein hashref als Argument angegeben werden kann, das dann mit einem String versehen und behandelt wird, als wäre es ein Dateiname. Das ist aber nur komisch.)
Pro Documentation
für map
:
Da Perl nicht nach dem schließenden
kommt}
vorausschaut, muss er raten, worauf es sich bezieht, basierend auf dem, was es direkt nach dem{
findet. Normalerweise wird es richtig gemacht, aber wenn es nicht funktioniert, wird es nicht erkennen, dass etwas nicht in Ordnung ist, bis es zum}
Geben Sie die Beispiele:
%Vor% Wenn Sie also +
hinzufügen, erhalten Sie dasselbe wie das erste Beispiel, das Sie angegeben haben
Perls Manpage-Eintrag für map () erklärt dies:
%Vor%Damit Sie den Verkettungskludding loswerden können, müssen Sie stattdessen Ihre Syntax auf eine dieser Zeilen anpassen:
%Vor%Die Klammern sind im Kontext der Karte ein wenig mehrdeutig. Sie können einen Block wie gewünscht umgeben oder sie können ein anonymer Hash-Konstruktor sein. Es gibt etwas Fuzzy-Logik im Perl-Parser, der versucht zu erraten, welchen du meinst.
Ihr zweiter Fall sieht eher wie ein anonymer Hash für Perl aus.
Siehe perldoc für map , das erklärt dies und gibt einige Problemumgehungen.
Tags und Links perl dictionary