[Vienna-pm] use strict und dann wieder nicht....

Thomas Klausner domm at zsi.at
Sun Feb 22 14:43:59 CST 2004


Hi!

On Sun, Feb 22, 2004 at 12:54:17PM +0100, Klaus Zahradnik wrote:


> Im Kapitel "Subroutines" wird auch der "namespace" erkl?rt. Dazu gibt es
> dann auch folgenden Code:
> 
> #!/usr/bin/perl
> use warnings;
>                                                                                 
> $main::name = "Klaus Zahradnik";
> $Fred::name = "Fred Flintstone";
> $Barney::name = "Barney Rubble";
>                                                                                 
> print "\$name in package main is $name\n";
> print "\$name in package Fred is $Fred::name\n";
> print "\$name in package Barney is $Barney::name\n";
> 
> 
> So steht der im Buch.

Scheint ein Fehler im Buch zu sein.

Hast du auf ww.oreilly.com die Errata-Section deiner Verion von Learning
Perl gecheckt?

> Ich habe allerdings use strict reingeschrieben. Das hatte dann diese
> Fehlermeldung zu folge:
> [klaus at cujo Scripts]$ ./globals.pl
> Variable "$name" is not imported at ./globals.pl line 9.
> Global symbol "$name" requires explicit package name at ./globals.pl
> line 9.
> Execution of ./globals.pl aborted due to compilation errors.
> 
> Wenn ich Zeile mit der ersten print Anweisung wie folgt ?ndere,
> funktioniert das auch mit use strict:
> print "\$name in package main is $main::name\n";
> 
> Im orignalzustand funktioniert das nat?rlich auch ohne use strict.

Klar. Ohne strict kann man immer&uberall variablen einfach so deklarieren.
Mit strict (bzw use stricts 'vars') muessen Variablen explizit deklariert
werden (mit our, my, use vars oder 'fully qualified', i.e. mit der package.
(siehe perldoc strict))

d.h. ohne strict geht das script, und gibt sogar das gewuenschte aus.


aber wenn du das aenderst auf:
print "\$name in package main is $main::name\n";
print "\$name in package Fred is $name\n";

dann kommt bei Fred der main-Name.

Typischer Bug.

Und genau um solche Bugs zu vermeiden, gibts strict;


> Ich weiss jetzt nicht mehr, was ich machen sollte. To use strict or not
> to use strict?
> Oder anders gefragt, verwendet man das nur um Anf?ngern suberen Stil
> anzugew?hnen?

Ich verwende strict nahezu immer (auch fuer kleine Scripts). Ab und zu (bei
irgendwelchen eher absurden Gelegenheiten) drehe ich fuer genau den Block,
wo ich's brauch, gewisse strictness ab, zb
  no strict 'refs';


Noch ein Beispiel, warum strict so gut wie immer eine gute Idee ist:
(ist zwar Sinnloss, aber was solls..)

1: my $customer_cnt=get_customer_cnt();
2: $custumer_cnt++;
3: set_customer_cnt($customer_cnt):

Hmm, seltsam, der counter wird nicht groesser ...
Weil in Zeile 2 nicht der alte Wert erhoeht wird, sondern ein neuer Wert
initiert wird (wegen eines Typos (und die passieren mir staendig..))

mit strict wird der code erst gar nicht ausgefuehrt, weil:
Global symbol "$custumer_cnt" requires explicit package name at bla.pl line 2


Zur weiteren Lektuere:
http://tachyon.perlmonk.org/tutorials/use_strict.htm

-- 
#!/usr/bin/perl                               http://domm.zsi.at
for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}



More information about the Vienna-pm mailing list