Warum gibt Perl "map" den Fehler "Nicht genug Argumente für map"

7

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?

    
bessarabov 09.01.2014, 22:39
quelle

4 Antworten

12

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.)

    
tobyink 09.01.2014, 22:49
quelle
6

Pro Documentation für map :

  

Da Perl nicht nach dem schließenden } 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 }

kommt

Geben Sie die Beispiele:

%Vor%

Wenn Sie also + hinzufügen, erhalten Sie dasselbe wie das erste Beispiel, das Sie angegeben haben

%Vor%     
chrsblck 09.01.2014 22:48
quelle
3

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%     
James Sneeringer 09.01.2014 23:00
quelle
2

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.

    
harmic 09.01.2014 22:49
quelle

Tags und Links