2016-05-31 8 views
3

Ich bin bei der Verwendung eines Perl-Skripts auf etwas Seltsames gestoßen. Es geht darum, einen Punkt zu verwenden, der andere Ergebnisse liefert.Punkt am Anfang einer "Print" -Anweisung?

perlop drehte nichts, oder vielleicht blies ich gerade vorbei. Ich war auf der Suche auf Operator Precedence and Associativity

print "I'd expect to see 11x twice, but I only see it once.\n"; 
print (1 . 1) . "3"; 
print "\n"; 
print "" . (1 . 1) . "3\n"; 
print "Pluses: I expect to see 14 in both cases, and not 113, because plus works on numbers.\n"; 
print (1 . 1) + "3"; 
print "\n"; 
print "" + (1 . 1) + "3\n"; 

Putting Zitate zu Beginn ist eine akzeptable Lösung zu bekommen, was ich will, aber was hier mit der Reihenfolge der Operationen geschieht, die ich vermisst habe? Welche Regeln gibt es zu lernen?

+1

'perldoc perlfunc':.„Jede Funktion in der Liste unten verwendet entweder mit oder ohne Klammern um ihre Argumente werden (. Die Syntaxbeschreibungen die Klammern weglassen) Wenn Sie Klammern verwenden, die einfache, aber gelegentlich überraschend Regel ist das: Es sieht wie eine Funktion aus, daher ist es eine Funktion und der Vorrang spielt keine Rolle. " –

Antwort

14

Wenn Sie in Klammern das erste Argument an print setzen, sieht Perl es als Funktionsaufrufsyntax.

So folgt aus:

print (1 . 1) . "3"; 

als diese analysiert:

print(1 . 1) . "3"; 

oder äquivalent:

(print 1 . 1) . "3"; 

Daher Perl prints "11" ist, nimmt dann den Rückgabewert von diesem print Anruf (der 1 ist, wenn es erfolgreich war), verkettet 3 dazu, und - da der gesamte Ausdruck im leeren Kontext ist - tut nichts mit dem resultierenden 13.

Wenn Sie Ihren Code mit Warnungen aktiviert laufen (über -w auf der Kommandozeile oder der use warnings; Pragma), werden Sie diese Warnungen identifizieren Ihre Fehler:

$ perl -w foo.pl 
print (...) interpreted as function at foo.pl line 2. 
print (...) interpreted as function at foo.pl line 6. 
Useless use of concatenation (.) or string in void context at foo.pl line 2. 
Useless use of addition (+) in void context at foo.pl line 6. 

Wie Borodin unten im Kommentar weist darauf hin, Sie sollten sich nicht auf -w (oder das In-Code-Äquivalent $^W) verlassen; Produktionscode sollte immer das Pragma warnings verwenden, vorzugsweise mit use warnings qw(all);. Während es in diesem speziellen Fall keine Rolle spielen würde, sollten Sie auch use strict;, obwohl anfordern, moderne Funktionen über useVersion; für eine Perl-Version von 5,11 oder höher automatisch schaltet auch strict.

+0

Danke! Ich benutze streng; Verwenden Sie Warnungen; für größere Projekte, aber mit zehn-Linern oder weniger hack ich nur durch. Also meine Frage ist der Wendepunkt für eine kleine Vorlage für alle meine neuen Perl-Dateien groß oder klein. Dazu gehören Header-Kommentar und verwenden Sie strikte; verwenden Sie Warnungen, um Probleme wie diese zu fangen. – aschultz

4

Wenn ein benannter Operator (oder ein Unteraufruf) von Parens gefolgt wird, begrenzen diese Parens die Operanden (oder Argumente).

print (1 . 1) . "3";  ≡ (print(1 . 1)) . "3"; 
print "" . (1 . 1) . "3"; ≡ print("" . (1 . 1) . "3"); 

Beachten Sie, dass Perl haben Sie Ihre Probleme aufmerksam gemacht würde, wenn Sie (use strict; und) use warnings qw(all); wie Sie sollten mit worden.

print (...) interpreted as function at a.pl line 2. 
print (...) interpreted as function at a.pl line 6. 
Useless use of concatenation (.) or string in void context at a.pl line 2. 
Useless use of addition (+) in void context at a.pl line 6. 
I'd expect to see 11x twice, but I only see it once. 
11 
113 
Pluses: I expect to see 14 in both cases, and not 113, because plus works on numbers. 
11 
Argument "" isn't numeric in addition (+) at a.pl line 8. 
14