Merkwürdiges Verhalten

Merkwürdiges Verhalten

am 14.03.2007 11:31:09 von Ferry Bolhar

Hallo liebe NG, ich habe folgenden Code:

use warnings;

sub hallo(*) {
my $val = shift;
print "val = $val\n";
}

hallo(test);

Da ich Warnings enabled habe, erhalte ich nicht unerwartet:

Unquoted string "test" may clash with future reserved word at...
val = test

So weit, so gut.

Nun füge ich die Zeile

use strict; (oder "use strict 'subs';")

nach (oder auch vor) dem "use warnings" ein.

Die Ausgabe ist jetzt nur mehr

val = test

d.h., die Warnungsmeldung ist verschwunden.

Ist dieses Verhalten (das Unterdrücken dieser Warnung
mit "use strict 'subs'") irgendwo dokumentiert bzw. weiß
jemand, warum das passiert?

Perl-Versionen: 5.8.6, 5.8.8, 5.9.4.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Merkwürdiges Verhalten

am 14.03.2007 12:14:13 von Frank Seitz

Ferry Bolhar wrote:

> use warnings;
>
> sub hallo(*) {
> my $val = shift;
> print "val = $val\n";
> }
>
> hallo(test);
>
> Da ich Warnings enabled habe, erhalte ich nicht unerwartet:
>
> Unquoted string "test" may clash with future reserved word at...
> val = test

Ich erwarte diese Meldung wegen der Prototype-Deklaration
eigentlich nicht:

| A "*" allows the subroutine to accept a bareword, constant, scalar
| expression, typeglob, or a reference to a typeglob in that slot.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Merkwürdiges Verhalten

am 14.03.2007 15:57:45 von Ferry Bolhar

Frank Seitz:

> Ich erwarte diese Meldung wegen der Prototype-Deklaration
> eigentlich nicht:

Ich weiß nicht, ob das etwas damit zu tun hat - man bekommt
die Meldung ja mit open (das intern als Prototype "*;$@"
verwendet) auch:

use warnings;
use strict;
open in,'x.x';

gibt die "may clash" Meldung aus - auch mit "use strict". Nur bei
eigenen Funktionen mit Prototype "*" wird sie unterdrückt.

Ohne Prototype-Deklaration würde "strict subs" Barewords
überhaupt nicht erlauben, egal ob klein oder groß:

use strict 'subs';
open IN,'x.x';

gibt:

Bareword "IN" not allowed while "strict subs" in use

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Merkwürdiges Verhalten

am 14.03.2007 16:25:12 von Frank Seitz

Ferry Bolhar wrote:
> Frank Seitz:
>>
>>Ich erwarte diese Meldung wegen der Prototype-Deklaration
>>eigentlich nicht:
>
> Ich weiß nicht, ob das etwas damit zu tun hat - man bekommt
> die Meldung ja mit open (das intern als Prototype "*;$@"
> verwendet) auch:
>
> use warnings;
> use strict;
> open in,'x.x';
>
> gibt die "may clash" Meldung aus - auch mit "use strict". Nur bei
> eigenen Funktionen mit Prototype "*" wird sie unterdrückt.

open() ist eben ein Builtin, da kann die Sache etwas
anders aussehen und tut sie offenbar auch. Filehandles
werden per Konvention ja groß geschrieben.

> Ohne Prototype-Deklaration würde "strict subs" Barewords
> überhaupt nicht erlauben, egal ob klein oder groß:
>
> use strict 'subs';
> open IN,'x.x';
>
> gibt:
>
> Bareword "IN" not allowed while "strict subs" in use

Bei mir kommt

Name "main::IN" used only once: possible typo at ...

was normal ist, da IN hier ja nicht weiter verwendet wird.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel