"Sub"package oder Subroutine
Moin!
Wie ist zu erklären, dass folgender Code:
---schnipp--
#!/usr/bin/perl
print "A: ";
Foo->A();
print "B: ";
Foo->B();
package Foo;
sub A{ Foo::Bar->Blech(); }
sub Bar{ print "{Foo}::Bar\n"; }
sub B{ Foo::Bar->Blech(); }
package Foo::Bar;
sub Blech{ print "{Foo::Bar}::Blech\n"; }
---schnapp---
....die folgende Ausgabe produziert?
| A: {Foo::Bar}::Blech
| B: {Foo}::Bar
| Can't call method "Blech" without a package or object reference at ./subpackage.pl line 13.
(Perl "v5.8.4 built for i386-linux-thread-multi" unter Debian sarge)
Offenbar ist die Interpretation von "Foo::Bar->Blech();" davon
abhängig, ob es im Sourcecode vor oder nach der Subroutine "Bar"
auftaucht.
Kann ich Perls Interpretation dieses Funktionsaufrufs (insbesondere im
zweiten Fall) irgendwie beeinflussen ohne die Reihenfolge der
Subroutines zu ändern?
Paul
Re: "Sub"package oder Subroutine
Paul Hink!
> sub Bar{ print "{Foo}::Bar\n"; }
> sub B{ Foo::Bar->Blech(); }
sub B{ 'Foo::Bar'->Blech(); }
> Kann ich Perls Interpretation dieses Funktionsaufrufs (insbesondere im
> zweiten Fall) irgendwie beeinflussen ohne die Reihenfolge der
> Subroutines zu ändern?
S.o.
Gruß
Daniel
Re: "Sub"package oder Subroutine
Daniel Fischer <spam [at] erinye.com> wrote:
> Paul Hink!
>
>> sub Bar{ print "{Foo}::Bar\n"; }
>> sub B{ Foo::Bar->Blech(); }
>
> sub B{ 'Foo::Bar'->Blech(); }
Super, danke!
Paul
Re: "Sub"package oder Subroutine
Paul Hink wrote:
> package Foo;
>
> sub A{ Foo::Bar->Blech(); }
^^^^^^^^
wird als Paketname interpretiert
> sub Bar{ print "{Foo}::Bar\n"; }
> sub B{ Foo::Bar->Blech(); }
^^^^^^^^
wird als Subroutine-Aufruf interpretiert
Das ist eine sehr unschöne Mehrdeutigkeit.
> Kann ich Perls Interpretation dieses Funktionsaufrufs (insbesondere im
> zweiten Fall) irgendwie beeinflussen ohne die Reihenfolge der
> Subroutines zu ändern?
Der Tip von Daniel Fischer ist ein Workaround, aber
keine allgemeine Lösung, wenn Du den Klassennamen nicht immer
in Anführungszeichen setzen willst, um auf der sicheren
Seite zu sein.
Ich würde Dir empfehlen, Subroutine- und Methodennamen
klein zu schreiben, wenigstens mit dem ersten Buchstaben,
um solche Nameclashes von vornherein zu vermeiden.
Das ist auch üblicher Perl-Style.
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