[Cologne-pm] sauberes/sicheres Programmieren mit strict

Michael Lamertz mike at lamertz.net
Tue Jun 17 13:31:12 CDT 2003


On Tue, Jun 17, 2003 at 07:54:57PM +0200, Christian Schneider wrote:
>
> aber global für das Script würden es doch auch einfache mit my 
> deklarierte Variablen tun, oder nicht? Dann braucht's auch kein 
> Pfefferspray :-) .

*smack* 'mal wieder kein Testprogramm geschrieben, 'was?  >:->

    ---------- bastel.pl ----------
    #!/usr/bin/perl

    use strict;
    use warnings;

    package main;
    our $our = 'our';
    flimm::showme();

    package flimm;
    sub showme { print "our: $main::our\n"; }
    1;
    ---------- bastel.pl ----------

und

    ---------- snip ----------
    nijushiho:/tmp$ ./bastel.pl 
    our: our
    nijushiho:/tmp$ perl -pi -e 's/our/my/g' bastel.pl 
    nijushiho:/tmp$ ./bastel.pl 
    Name "main::my" used only once: possible typo at ./bastel.pl line 11.
    Use of uninitialized value in concatenation (.) or string at ./bastel.pl
    line 11.
    my: 
    nijushiho:/tmp$ 
    ---------- snip ----------

Ooops.  'our' ist *nicht* dasselbe wie 'my'.

    ---------- perldoc -f our ----------
    An "our" declares the listed variables to be valid globals within
    the enclosing block, file, or "eval".  That is, it has the same
    scoping rules as a "my" declaration, but does not create a local
    variable.
    ---------- perldoc -f our ----------

'my' ist also, hmm, "enger" als our.  Mit 'my' sagst Du im aktuellen
Scope "Dies ist *MEINS*", waehrend 'our' die Variable als vom aussen via
Package-Namen erreichbar definiert.  'perldoc -f our' hat noch ein paar
mehr Details.


Das Pepperspray gab's uebrigens fuer den Wunsch aus einem Package heraus
auf globale in main zuzugreifen, nicht fuer die falsche Funktion.

Noch ein Kuriosum:  Laesst Du das 'main::' einfach weg, so kannst Du
trotz des Package-Wechsels auf die my-Variable zugreifen, da das Package
kein echter Scope ist, sondern nur den aktuell benutzten Namespace
definiert.  Hier greift also 'file' als Scope umd somit ist die Variable
im ganzen File sichtbar.  *grusel*

-- 
	    Well, then let's give that Java-Wussie a beating... (me)

Michael Lamertz                        |     +49 2234 204947 / +49 171 6900 310
Sandstr. 122                           |                       mike at lamertz.net
50226 Frechen                          |                 http://www.lamertz.net
Germany                                |               http://www.perl-ronin.de 



More information about the Cologne-pm mailing list