Lexikalische Variable

Lexikalische Variable

am 22.01.2007 17:10:22 von Ferry Bolhar

Hallo,

ich wollte folgendes Stück Code verwenden:

sub func {
my $fmt = shift;
push my @args, shift while $fmt =~ /%[ds]/g;
sprintf $fmt,@args;
}

Also ein Funktion, die als Argument einen Formatstring und eine
beliebige Anzahl weiterer Argumente entgegennimmt und den damit
befüllten Formatstring wieder zurückliefert (wobei als Format-
bezeichner nur "%s" und "%d" verwendet werden).

Allerdings funktioniert das nicht; ich erhalte - für jedes nach dem
Formatstring übergebene Argument - die Meldung

Use of uninitialized value in sprintf at ....

und der Formatstring wird unbefüllt zurückgegeben. Ein Test zeigt,
dass @args nach dem Abarbeiten der Schleife leer ist.

Schreibe ich aber:

my @args;
push @args, shift while $fmt =~ /%[ds]/g;

funktioniert es. Tja.

Hinweis: die Schleife wird in _keinem_ eigenen Scope durchgeführt:

my @args;
push my @args,...

gibt prompt

"my" variable @args masks earlier declaration in same scope

^^^^

zurück.

Wieso ist also @args nach dem Abarbeiten der Schleife leer?

Danke für eure Antworten und schöne Grüße aus Wien,

Ferry

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

Re: Lexikalische Variable

am 22.01.2007 18:01:31 von Frank Seitz

Ferry Bolhar wrote:
>
> ich wollte folgendes Stück Code verwenden:
>
> sub func {
> my $fmt = shift;
> push my @args, shift while $fmt =~ /%[ds]/g;
> sprintf $fmt,@args;
> }
[...]
> Wieso ist also @args nach dem Abarbeiten der Schleife leer?

Dass der Code nicht funktioniert, leuchtet ein, denn
jedes push operiert auf einem neuen, also leeren, @args.
Dass @args außerhalb der Schleife zugreifbar und
leer ist, statt nicht-existent zu sein, ist vermutlich
hingeschusterte Perl-Magie.

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: Lexikalische Variable

am 23.01.2007 00:04:26 von Ch Lamprecht

Ferry Bolhar schrieb:
> Hallo,
>
> ich wollte folgendes Stück Code verwenden:
>
> sub func {
> my $fmt = shift;
> push my @args, shift while $fmt =~ /%[ds]/g;
> sprintf $fmt,@args;
> }
>
> Also ein Funktion, die als Argument einen Formatstring und eine
> beliebige Anzahl weiterer Argumente entgegennimmt und den damit
> befüllten Formatstring wieder zurückliefert (wobei als Format-
> bezeichner nur "%s" und "%d" verwendet werden).
>
....
>
> Wieso ist also @args nach dem Abarbeiten der Schleife leer?
>
> Danke für eure Antworten und schöne Grüße aus Wien,
>
> Ferry
>
perldoc perlsyn:

NOTE: The behaviour of a my statement modified with a statement modifier
conditional or loop construct (e.g. my $x if ...) is undefined. The value of the
my variable may be undef, any previously assigned value, or possibly anything
else. Don't rely on it. Future versions of perl might do something different
from the version of perl you try it out on. Here be dragons.

Christoph

--

perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"