"Sub"package oder Subroutine

"Sub"package oder Subroutine

am 23.11.2006 15:21:16 von Paul Hink

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

am 23.11.2006 15:23:33 von Daniel Fischer

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

am 23.11.2006 15:31:45 von Paul Hink

Daniel Fischer 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

am 23.11.2006 15:58:49 von Frank Seitz

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