Thread Bad name after... (52 answers)
Opened by bianca at 2015-02-19 12:08

rosti
 2015-02-19 20:46
#179747 #179747
User since
2011-03-19
3492 Artikel
BenutzerIn
[Homepage]
user image
Quote
Wie erreiche ich das unter der Prämisse, dass nur der Code in der Schleife geändert werden darf?


Meine Anmerkung $ref is not blessed hast Du wahrscheinlich nicht verstanden. bless segnet eine Referenz mit dem Namen einer Klasse (Package). Dein $ref ist lediglich eine Hash-Referenz. Des Weiteren definierst Du mehrere Funktionen im gleichen Scope, daher die Warnung redefined. Deklariere Deine Packages in den Dateien welche mit require eingebunden werden, damit landen gleichnamige Funktionen/Methoden in einem unterschiedlichen Scope.

Fei von OOP:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Datei Foo.pm
package Foo;
sub foo{}
1;

# Datei Bar.pm
package Bar;
sub foo{}
1;

# Datei Baz.pl
package Baz;
sub foo{};
1;


require Foo;
Foo::foo();

require Bar;
Bar::foo();

require "Baz.pl"; # beachte den Unterschied, weil nicht .pm
Baz::foo();


Es ist also doch ein bischen mehr, was Du ändern musst. Wenn Du mit blessed Referenzen arbeiten willst, kommt OOP ins Spiel. Auch hier ist wieder die Package-Deklaration entscheidend:

Code (perl): (dl )
1
2
3
4
5
6
7
8
require Foo; # Datei siehe oben
my $foo = bless{}, 'Foo'; 
   # unschön, nur zur Veranschaulichung!!!
   # Besser: class Foo definiert einen Konstruktor
$foo->foo(); # Aufruf über eine Instanz der Klasse Foo

# Oder Aufruf der Funktion foo() als Klassenmethode
Foo->foo();


Fazit: Die Package-Deklaration legt den Scope einer Methode fest, sie sind damit nicht redefined. Sie werden aufgerufen
a) als Klassenmethode ClassName->method_name;
b) mit dem Namen der Package PackageName::funktion_name();
c) über eine Instanz der Klasse $instanz->method_name;
Last edited: 2015-02-19 20:48:12 +0100 (CET)

View full thread Bad name after...