no
am 08.07.2006 20:06:24 von Torsten Mohr
Hi,
zum Befehl "no" steht unter "perldoc -f" daà es das Gegenteil
von "use" ist.
### Datei ASD.pm:
package ASD;
use Exporter;
our @ISA = qw( Exporter );
our @EXPORT = qw( &say_hi );
sub BEGIN { print "in BEGIN()\n"; }
sub END { print "in END()\n"; }
sub say_hi { print "Hi\n"; }
1;
### Datei no_asd.pl:
#! /usr/bin/perl -w
#use ASD;
no ASD;
say_hi();
Ich hätte erwartet daà say_hi() nicht funktioniert, zumal ich
das "use" auskommentiert habe.
Auch daà BEGIN und END ausgeführt werden hätte ich nicht erwartet.
Kann man die Funktion von "no" genauer beschreiben als "das Gegenteil
von 'use'"?
GrüÃe,
Torsten.
Re: no
am 09.07.2006 09:18:20 von Frank Seitz
Torsten Mohr wrote:
> zum Befehl "no" steht unter "perldoc -f" daà es das Gegenteil
> von "use" ist.
....was sicherlich keine sonderlich geeignete Beschreibung ist.
> Kann man die Funktion von "no" genauer beschreiben als "das Gegenteil
> von 'use'"?
Am Ende der Dokumentation von use steht es: use ruft nach dem
Laden des Moduls import() auf, wohingegen no nach dem Laden
(sofern es noch nicht geladen ist) unimport() aufruft.
Ob ein Modul diese Subroutines definiert und was diese
genau tun, ist seitens Perl völlig freigestellt.
Exporter z.B. definiert import(), aber nicht unimport().
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
Re: no
am 10.07.2006 11:59:03 von Ferry Bolhar
Torsten Mohr:
> zum Befehl "no" steht unter "perldoc -f" daß es das Gegenteil
> von "use" ist.
Das ist sehr allgemein ind IMHO ziemlich ungenau formuliert.
> Ich hätte erwartet daß say_hi() nicht funktioniert, zumal ich
> das "use" auskommentiert habe.
Grundsätzlich hängt es davon ab, welche Funktionalität ein Modul
bereitstellt, ob und wie es mit "no" verwendbar ist.
Ist diese Funktionalität lexikalisch beschränkt, kann man sie mit "use"
aktivieren und mit "no" in einem anderen lexikalischen Scope temporär
deaktivieren. Davon wird zB. häufig mit "use strict" Gebrauch gemacht:
use strict;
..... # 'strict' aktiv
{
no strict;
..... # Kein 'strict' aktiv
}
..... # 'strict' aktiv
Innerhalb des Scopes (= Blocks), der durch die geschwungenen
Klammern begrenzt ist, ist die Wirkung von "strict" abgeschaltet,
davor und danach nicht.
Hat aber die durch das Modul bereitgestellte Funktionalität, die
durch seine "import"-Methode aktiviert wird, keine lexikalische,
sondern globale Auswirkung, so ist das "no" wirkungslos, weil
das Modul dann meistens entweder gar keine "unimport"-Methode
(diese wird mit "no" aufgerufen) bereitstellt, oder manche mit "import"
gemachten Änderungen nicht mehr rückgängig gemacht werden
können. Manche Module laden zB. weiteren Perl-Code oder
auch XS-Code nach oder manipulieren andere Komponenten
des Perl-Interpreters. Soetwas kann man dann natürlich mit
einem "no" nicht mehr rückgängig machen. Daher sollte in der
Beschreibung eines Moduls angegeben sein, ob es eine "unimport"
Methode und damit den Aufruf mit "no" unterstützt; ist das nicht
der Fall, kann man davon ausgehen, dass ein solcher Aufruf nicht
sinnvoll ist bzw. nichts bewirkt (wie das auch bei dem von dir
verwendeten "Exporter"-Modul der Fall ist):
> Ich hätte erwartet daß say_hi() nicht funktioniert, zumal ich
> das "use" auskommentiert habe.
Ich auch bzw. funktioniert es bei mir auch nicht. Überprüfe deinen
Code; wenn ich dein gepostetes Beispiel mit cut & paste übernehme,
bekomme ich beim Aufruf von "no_asl.pl" erwartungsgemäß die
Meldung "Undefined subroutine &main::say_hi".
> Auch daß BEGIN und END ausgeführt werden hätte ich nicht erwartet.
Das ist etwas anderes. Zunächst: damit ein "no" die "unimport" Methode
eines Moduls aufrufen kann, muss es dieses - wie mit "use" - zuerst laden.
Ein
no hugo qw(a b c);
macht intern daher:
BEGIN {
require hugo;
'hugo'->unimport(a,b,c);
}
Das heißt, es wird der _gesamte_ Perl-Code des Modules eingelesen
und kompiliert.
BEGIN und END sind keine Befehle, sondern es sind Deklarationen
von benannten Blöcken, die man nicht aufrufen kann, sondern die von
Perl selbst zum gegebenen Zeitpunkt aufgerufen werden. Deklarationen
sind aber etwas, was der Compiler beim Einlesen des Codes verarbeitet.
Das heißt, unabhängig davon, ob jetzt der Code des Moduls mit "use"
oder "no"eingelesen wurde, werden BEGIN und END-Blöcke (wie auch
CHECK, INIT, AUTOLOAD und DESTROY, falls vorhanden), compi-
liert und ihr Vorhandensein wird in internen Tabellen (eigentlich in Arrays;
pro "Blocktype" gibt es ein Array) registriert. Und daher erfolgt auch die
Ausführung solcher Blöcke _immer_, egal ob jetzt ein "use" oder "no" zum
Einlesen des Modulcodes verwendet wurde; du kannst statt "use" sogar
selbst ein "require" verwenden, es wird genauso funktionieren. Der einzige
Unterschied ist, dass in diesem Fall der Aufruf von "import" unterbleibt und
daher nichts importiert wird, weil der Exporter nicht läuft.
Oft findet man ein Modul mit "require" statt mit "use" eingebunden. Die
beiden Anweisungen sind ident (naja, fast ident), wenn das Modul keine
"import" Methode bereitstellt und auch keine (meistens die des "Exporters")
erbt.
> Kann man die Funktion von "no" genauer beschreiben als "das Gegenteil
> von 'use'"?
Siehe oben. Lädt im Context eines BEGIN-Blocks mittels "require" den
Modulcode und ruft danach dessen deklarierte oder ererbte "unimport"
Methode mit den angegebenen Liste (falls eine vorhanden ist), auf. Die
jeweilige Wirkung ist daher modul-spezifisch.
LG, Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at
Re: no
am 11.07.2006 01:09:44 von Torsten Mohr
Hallo,
erstmal vielen Dank für alle eure Antworten.
>> Ich hätte erwartet daß say_hi() nicht funktioniert, zumal ich
>> das "use" auskommentiert habe.
>
> Ich auch bzw. funktioniert es bei mir auch nicht. Überprüfe deinen
> Code; wenn ich dein gepostetes Beispiel mit cut & paste übernehme,
> bekomme ich beim Aufruf von "no_asl.pl" erwartungsgemäß die
> Meldung "Undefined subroutine &main::say_hi".
Seltsam, wenn ich das Beispiel hier zu Hause ausführe komme ich zu
dem gleichen Ergebnis. Da muà ich im Büro noch irgendwas anders
gemacht haben, das muà ich noch mal testen.
Viele GrüÃe,
Torsten.