2010-03-30 13 views
8

Ich sah nur einen Code in unserem Code-Basis (und es ist OLD Code, wie in Perl 3 oder Perl 4 Tage), die wie folgt aussieht (ich vereinfacht stark):Was macht Perl mit diesem Argument in diesem Fall?

@array; 
push(array, $some_scalar); 

Beachten Sie, dass die array in Die push() hat keine @. Ich würde annehmen, dass der Code hinter Push weiß, dass das erste Argument Array sein soll, so dass das Array aus dem array typeglob ergreift. Ist das mehr oder weniger das? Wenn Perl das ohne Probleme tun kann, warum sollten Sie die @ überhaupt mit einbeziehen?

+1

Führen Sie diesen Code mit 'Warnungen verwenden 'aus und prüfen Sie, ob das Ihre Frage beantwortet. – mob

+1

Das Aktivieren von Warnungen für diesen alten Code wäre ein totales Desaster, aber ich verstehe Ihren Standpunkt. – Morinar

+2

@Monirar: Wenn Sie diesen Code pflegen müssen, könnte die Verbesserung für die Ausführung mit Warnungen sehr nützlich sein. –

Antwort

9

Dies ist ein altes 'Merkmal' des Parsers. Das @ ist bei einem Push nicht obligatorisch, wenn die Variable eine Paketvariable ist. Dies wird von vielen als ein Fehler angesehen, der behoben werden sollte. Du solltest das wirklich nicht tun.

+0

Hm, es scheint aber nicht wirklich den Push durchzuführen. Mit diesem: 'perl -e 'mein @array =(); drücken (Array, "foo"); print "@array \ n"; "Ich bekomme keine Ausgabe. Würde ich etwas Dummes tun? – Cascabel

+2

Vielleicht hat es dann etwas mit Typeglobs zu tun. Der obige Beispielcode von Jefromi gibt nichts aus, aber wenn Sie das 'my' entfernen, dann tut es das. – mob

+1

Ja, du hast Recht. Es scheint nur für Paketvariablen zu funktionieren. –

4

Dies ist ein zweifelhaftes "Merkmal" von Perl, veraltetes Verhalten; Es sollte ein Fehler sein, aber es funktioniert.

Wenn Sie auf die Warnungen des Compilers drehen (perl -W, sehr zu empfehlen), warnt:

Array @aa missing the @ in argument 1 of push() at xx.pl line 2.