Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Perl/CGI » Packages und Our

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.02.2007, 15:50 Uhr
~Alfredo
Gast


Hallo zusammen,

leider verstehe ich wohl den Befehl 'our' oder 'package' nicht ganz.

our:
Jede Variable, die mit our deklariert oder auch ohne eine Deklaration verwendet wird, wird in die Symboltabelle des jeweils aktuellen Packages aufgenommen.

package:
Nach dieser Anweisung ist ein bestimmtes Package aktiv, bis eine neue package Anweisung mit einem neuen Packagenamen erscheint.

In untenstehendem Code habe ich mal probiert, ob dieses Verständnis stimmt. Leider nicht.
Anstatt
2
1
1

kommt
2
1
2

heraus.


Code:
#!/usr/bin/perl
use strict;
use warnings;
use 5.6.0;

# Package 'main' ist standardmässig aktiv
our $v = 1;  # entspricht: $main::v = 1;

# Package 'hallo' ist jetzt aktiv
package hallo;

our $v = 2; # entspricht: $hallo::v = 2;

# Da das Package 'hallo' gerade aktiv ist,
# ist $v und $hallo::v identisch
print "$v\n"; # vermutetes Ergebnis: 2

# Hier muss das Package main explizit genannt werden,
# da gerade das Package 'hallo' aktiv ist
print "$main::v\n"; # vermutetes Ergebnis 1


# Jetzt ist das Package 'main' aktiv
package main;

# $v und $main::v sind nun identisch
print "$v\n"; # vermutetes Ergebnis: 1




Verwende ich aber nach den Package-Befehlen geschweifte Klammern, so erhalte ich mein erwartetes Ergebnis.

2
1
1


Code:
#!/usr/bin/perl
use strict;
use warnings;
use 5.6.0;

# Package 'main' ist standardmässig aktiv
our $v = 1;  # entspricht: $main::v = 1;

# Package 'hallo' ist jetzt aktiv
package hallo;
{
our $v = 2; # entspricht: $hallo::v = 2;

# Da das Package 'hallo' gerade aktiv ist,
# ist $v und $hallo::v identisch
print "$v\n"; # vermutetes Ergebnis: 2

# Hier muss das Package main explizit genannt werden,
# da gerade das Package 'hallo' aktiv ist
print "$main::v\n"; # vermutetes Ergebnis 1
}

# Jetzt ist das Package 'main' aktiv
package main;
{
# $v und $main::v sind nun identisch
print "$v\n"; # vermutetes Ergebnis: 1
}



Woran liegt das? Was bewirken die geschweiften Klammern, so dass sich die letzte Ausgabe ändert?

Wozu braucht man our eigentlich? Meiner Meinung nach ist die Verwendung von our eher zu vermeiden, da es unnötig zu Verwirrungen führt. Besser ist es den Packagenamen explizit zu verwenden, wenn man möchte, dass eine Variable einem bestimmten Package angehören soll.

Wie ist eure Meinung hierzu?

Gruß
Alfredo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.02.2007, 16:18 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Das liegt daran, das our für den aktuellen Scope deklariert. Wenn du die Klammern setzt, änderst du den Scope. Our ist in der Praxis eigentlich nur genutzt, um Variablen wie $VERSION oder @EXPORT von einer Klasse in die main zu transportieren. Beispiel:

foo.pm

Code:
package foo;
our $VERSION = "1.0";

sub new()
{
    my $self = shift;
    my $content = { };
    $content->{test} = "bla";
    return bless $content, $self;
}

1;


foo.pl

Code:
#!/sur/bin/perl -l
use strict;
use warnings;

use foo;

my $foo = new foo();
print $foo->{test};
print $foo::VERSION;

--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.02.2007, 15:28 Uhr
~Alfredo
Gast


Danke für die Antwort. Habe es inzwischen verstanden. Our scheint aber wirklich nur aus Bequemlichkeit zu existieren. Wenn ich dein Beispiel richtig verstehe, so könnte ich anstatt

Code:
our $VERSION = "1.0";



auch


Code:
$foo::VERSION = "1.0";



schreiben und hätte exakt dasselbe erreicht.

Gruß
Alfredo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Perl/CGI ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: