Meinews.de  


Zurück   Meinews.de > Forum > Newsgroups de.comp.lang.* Forum > Newsgroup de.comp.lang.perl.misc
Registrieren FAQ Benutzerliste Kalender Suchen Heutige Beiträge Alle Foren als gelesen markieren

Newsgroup de.comp.lang.perl.misc Perl (von Larry Wall).

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 10-29-2009, 11:23 AM
Helmut Schneider
 
Beiträge: n/a
Standard use und Variablen

Hi,

# cat ./test.pl
#!/usr/bin/perl

use strict;
use warnings;

use lib "./";
our $myVarA = 1;
our $myVarB = 2;
use myTest;

print "\$myVarA = $main::myVarA\n";
print "\$myVarB = $main::myVarB\n";
# cat ./myTest.pm
package myTest;

print "\$myVarA = " . $main::myVarA . "\n";
print "\$myVarB = " . $main::myVarB . "\n";

1;
# perl ./test.pl
$myVarA =
$myVarB =
$myVarA = 1
$myVarB = 2
#

Soweit ich "use" verstanden habe, war das zu erwarten, da "use" vor dem
Kompilieren stattfindet. Lösen liese sich das "Problem", indem man
"use" durch "require" ersetzt.
Nun lese ich aber überall, dass man "use" einem "require" wo immer
möglich vorziehen soll. Ist obiges so eine Ausnahme, oder gibt es auch
einen "use"-Weg?

Ziel ist es, in einem package sicher zu stellen, dass bestimmte $main::
Variablen gesetzt wurden.

Danke und Gruß, Helmut

--
No Swen today, my love has gone away
My mailbox stands for lorn, a symbol of the dawn
Mit Zitat antworten
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Meinews.de
Standard Sponsored Links

  #2  
Alt 10-29-2009, 11:48 AM
ReneeB
 
Beiträge: n/a
Standard Re: use und Variablen

Du kannst Die Variablenzuweisungen in einem BEGIN-Block machen, das
wird dann auch zur Compile-Zeit ausgeführt. Dann kommt es nur noch auf
die Reihenfolge von BEGIN-Block und use-Anweisung an (der BEGIN-Block
muss *vor* der use-Anweisung kommen)...


#!/usr/bin/perl

use strict;
use warnings;

use lib "./";

BEGIN{
our $myVarA = 1;
our $myVarB = 2;
}

use myTest;

print "\$myVarA = $main::myVarA\n";
print "\$myVarB = $main::myVarB\n";
Mit Zitat antworten
  #3  
Alt 10-29-2009, 12:10 PM
Helmut Schneider
 
Beiträge: n/a
Standard Re: use und Variablen

ReneeB wrote:

> BEGIN{
> our $myVarA = 1;
> our $myVarB = 2;
> }


Ah, bei BEGIN war ich sogar schon, aber vermutlich stimmte die
Reihenfolge nicht.

Merci, Helmut

--
No Swen today, my love has gone away
My mailbox stands for lorn, a symbol of the dawn
Mit Zitat antworten
  #4  
Alt 10-29-2009, 01:48 PM
Frank Seitz
 
Beiträge: n/a
Standard Re: use und Variablen

Helmut Schneider wrote:
>
> Ziel ist es, in einem package sicher zu stellen, dass bestimmte $main::
> Variablen gesetzt wurden.


Daran, dass es hakelig ist, lässt sich ablesen, dass du ein
untaugliches Konzept verfolgst. Wenn du die Variablenwerte
$myVarA und $myVarB in myTest brauchst, übergib sie
lieber als Parameter.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Homepage: http://www.fseitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2
Mit Zitat antworten
  #5  
Alt 10-29-2009, 03:14 PM
Helmut Schneider
 
Beiträge: n/a
Standard Re: use und Variablen

Frank Seitz wrote:

> Helmut Schneider wrote:
> >
> > Ziel ist es, in einem package sicher zu stellen, dass bestimmte
> > $main:: Variablen gesetzt wurden.

>
> Daran, dass es hakelig ist, lässt sich ablesen, dass du ein
> untaugliches Konzept verfolgst. Wenn du die Variablenwerte
> $myVarA und $myVarB in myTest brauchst, übergib sie
> lieber als Parameter.


package myLdap;
sub connectToLdap ($$$$$) {
my $_ldapDomain = shift;
my $_DC = shift;
my $_port = shift;
my $_ldapBindUser = shift;
my $_ldapBindPass = shift;
[...]
}

Jetzt will ich ein zufälliges Passwort erstellen und benötige hierfür:

*alphanumeric = ('a'..'z', 'A'..'Z', 0..9, '!', '?', '$', '/', '.',
'.', '-', '+', '=');
$pwLength = 10;

Ausserdem soll Net::LDAP $retries mal versuchen, sich mit dem Server zu
connecten:

$retries = 5;

Von den obigen 3 Werten sind aus meiner Sicht mindestens eine konstant
(*alphanumeric), die müssen nicht unbedingt jedesmal einer Subroutine
übergeben werden. Das kostet doch auch Ressourcen, oder nicht (Objekt
übergeben, Kopie erstellen, Kopie wieder löschen)?!

--
No Swen today, my love has gone away
My mailbox stands for lorn, a symbol of the dawn
Mit Zitat antworten
  #6  
Alt 10-30-2009, 03:12 PM
Helmut Schneider
 
Beiträge: n/a
Standard Re: use und Variablen

"J. Strübig" wrote:

> Helmut Schneider schrieb:
> > package myLdap;
> > sub connectToLdap ($$$$$) {
> > my $_ldapDomain = shift;
> > my $_DC = shift;
> > my $_port = shift;
> > my $_ldapBindUser = shift;
> > my $_ldapBindPass = shift;
> > [...]
> > }
> >
> > Jetzt will ich ein zufälliges Passwort erstellen und benötige
> > hierfür:
> >
> > *alphanumeric = ('a'..'z', 'A'..'Z', 0..9, '!', '?', '$', '/', '.',
> > '.', '-', '+', '=');
> > $pwLength = 10;
> >
> > Ausserdem soll Net::LDAP $retries mal versuchen, sich mit dem
> > Server zu connecten:
> >
> > $retries = 5;
> >
> > Von den obigen 3 Werten sind aus meiner Sicht mindestens eine
> > konstant (*alphanumeric), die müssen nicht unbedingt jedesmal einer
> > Subroutine übergeben werden. Das kostet doch auch Ressourcen, oder
> > nicht (Objekt übergeben, Kopie erstellen, Kopie wieder löschen)?!
> >

>
> In dem Fall kannst du da auch default Werte in die Funktion (oder
> Modul) einbauen, aber dazu musst du doch keine Variabeln global
> zugänglich machen.


Ich dachte mir, es macht die Sache vielleicht übersichtlicher, wenn ich
das in main definiere.

> Und was die Performance angeht.
>
> Wenn du diese Funktion millionenmal in dem Skript aufrufst,


Unwahrscheinlich.

--
No Swen today, my love has gone away
My mailbox stands for lorn, a symbol of the dawn
Mit Zitat antworten
  #7  
Alt 10-31-2009, 11:30 AM
Peter J. Holzer
 
Beiträge: n/a
Standard Re: use und Variablen

On 2009-10-29 11:23, Helmut Schneider <jumper99*gmx.de> wrote:
> # cat ./test.pl
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> use lib "./";
> our $myVarA = 1;
> our $myVarB = 2;
> use myTest;
>
> print "\$myVarA = $main::myVarA\n";
> print "\$myVarB = $main::myVarB\n";
> # cat ./myTest.pm
> package myTest;
>
> print "\$myVarA = " . $main::myVarA . "\n";
> print "\$myVarB = " . $main::myVarB . "\n";
>
> 1;
> # perl ./test.pl
> $myVarA =
> $myVarB =
> $myVarA = 1
> $myVarB = 2
> #
>
> Soweit ich "use" verstanden habe, war das zu erwarten, da "use" vor dem
> Kompilieren stattfindet. Lösen liese sich das "Problem", indem man
> "use" durch "require" ersetzt.
> Nun lese ich aber überall, dass man "use" einem "require" wo immer
> möglich vorziehen soll. Ist obiges so eine Ausnahme, oder gibt es auch
> einen "use"-Weg?


Es ist definitiv eine Ausnahme, dass Du in einem Modul, das mit use
eingebunden wird, Code hast, der sofort ausgeführt wird und nicht nur
der Initialisierung dient. Normalerweise werden in Modulen nur
Funktionen bzw. Methoden definiert und eventuell ein paar Variablen
initialisiert. Wenn Du Dein myTest.pm so umschreibst:

package myTest;

sub print_vars {
print "\$myVarA = " . $main::myVarA . "\n";
print "\$myVarB = " . $main::myVarB . "\n";
}

1;

und dann in test.pl

myTest:rint_vars()

aufrufst, wird es wie gewünscht funktionieren, weil der Aufruf zu einem
Zeitpunkt erfolgt, zu dem $main::myVarA und $main::myVarB schon
initialisiert sind.

Wenn $myVarA und $myVarB der Initialisierung von myTest dienen, dann
ist es vermutlich besser und lesbarer, Du übergibst sie gleich beim use:

use myTest (1, 2);
oder
use myTest (myVarA => 1, myVarB => 2);

und verwendest eine import-Routine in myTest.pm und dort package-globale
Variablen zu setzen.

Oder Du verwendest gleich den objektorientierten Ansatz:

use myTest;

$mytest = myTest->new(myVarA => 1, myVarB => 2);

dann kann die Methode new von myTest damit machen, was sie will (z.B. in
$mytest speichern, oder als package-globale Daten speichern oder
irgendwas damit berechnen und dann vergessen).

Ich tendiere meistens zu letzterem Ansatz.

hp
Mit Zitat antworten
  #8  
Alt 10-31-2009, 11:45 AM
Peter J. Holzer
 
Beiträge: n/a
Standard Re: use und Variablen

On 2009-10-29 15:14, Helmut Schneider <jumper99*gmx.de> wrote:
> Frank Seitz wrote:
>
>> Helmut Schneider wrote:
>> >
>> > Ziel ist es, in einem package sicher zu stellen, dass bestimmte
>> > $main:: Variablen gesetzt wurden.

>>
>> Daran, dass es hakelig ist, lässt sich ablesen, dass du ein
>> untaugliches Konzept verfolgst. Wenn du die Variablenwerte
>> $myVarA und $myVarB in myTest brauchst, übergib sie
>> lieber als Parameter.

>
> package myLdap;
> sub connectToLdap ($$$$$) {
> my $_ldapDomain = shift;
> my $_DC = shift;
> my $_port = shift;
> my $_ldapBindUser = shift;
> my $_ldapBindPass = shift;
> [...]
> }
>
> Jetzt will ich ein zufälliges Passwort erstellen und benötige hierfür:
>
> *alphanumeric = ('a'..'z', 'A'..'Z', 0..9, '!', '?', '$', '/', '.',
> '.', '-', '+', '=');
> $pwLength = 10;


In der Funktion connectToLdap()? Wieso soll die ein zufälliges Passwort
erstellen?


> Ausserdem soll Net::LDAP $retries mal versuchen, sich mit dem Server zu
> connecten:
>
> $retries = 5;


Die Variable würde ich aber auf keinen Fall $main::retries nennen, da
sie spezifisch für Dein myLdap Modul ist. Wenn schon, dann heißt sie
$myLdap::retries. Dann kannst Du sie in myLdap mit

our $retries = 5;

definieren und initialisieren und wenn nötig im main mit

$myLdap::retries = 10;

überschreiben.


Aber das schreit wirklich nach einem anderen Interface:

package myLdap;

sub connect {
my %opt = *_;
croak "no domain" unless $opt{domain};
$opt{port} //= 389;
$opt{retries} //= 5;
$opt{pwLength} //= 10;
...
}

und dann rufst Du

myLdap::connect(domain => 'example.net', user => 'joe', ...);

auf.

Oder Du machst Dir gleich ein myLdap Objekt. Die Wahrscheinlichkeit,
dass Du mal zwei davon brauchen könntest, ist ja nicht so klein ...

hp

Mit Zitat antworten
  #9  
Alt 10-31-2009, 04:50 PM
Frank Seitz
 
Beiträge: n/a
Standard Re: use und Variablen

Helmut Schneider wrote:
>
> Von den obigen 3 Werten sind aus meiner Sicht mindestens eine konstant
> (*alphanumeric), die müssen nicht unbedingt jedesmal einer Subroutine
> übergeben werden. Das kostet doch auch Ressourcen, oder nicht (Objekt
> übergeben, Kopie erstellen, Kopie wieder löschen)?!


Wenn dir die Übergabe zweier skalarer Parameter über den Stack
an eine Subroutine Kopfzerbrechen bereitet, weil dies zu viel Aufwand
sein könnte, solltest du lieber in Assembler programmieren.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Homepage: http://www.fseitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2
Mit Zitat antworten
  #10  
Alt 11-01-2009, 11:25 AM
Frank Seitz
 
Beiträge: n/a
Standard Re: use und Variablen

Helmut Schneider wrote:
> Frank Seitz wrote:
>>
>> Daran, dass es hakelig ist, lässt sich ablesen, dass du ein
>> untaugliches Konzept verfolgst. Wenn du die Variablenwerte
>> $myVarA und $myVarB in myTest brauchst, übergib sie
>> lieber als Parameter.

>
> Von den obigen 3 Werten sind aus meiner Sicht mindestens eine konstant
> (*alphanumeric), die müssen nicht unbedingt jedesmal einer Subroutine
> übergeben werden. Das kostet doch auch Ressourcen, oder nicht (Objekt
> übergeben, Kopie erstellen, Kopie wieder löschen)?!


Untaugliche Konzepte sind oft das Resultat fehlgeleiteter Überlegungen.
So auch hier. Das hört sich vielleicht arrogant an, ist auf
den Punkt gebracht aber der eigentliche Kern des Problems.

Grüße
Frank Seitz
--
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Homepage: http://www.fseitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2
Mit Zitat antworten
 
Antwort


Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen
Es ist dir nicht erlaubt, auf Beiträge zu antworten
Es ist dir nicht erlaubt, Anhänge anzufügen
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten

vB Code ist An
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus

Ähnliche Themen
Thema Erstellt von Forum Antworten Letzter Beitrag
Variablen in Funktion tajloro Newsgroups microsoft.public.de.german.visio 4 06-19-2009 09:54 AM
Variablen mit Variablen bestimmen? Mphak Newsgroup de.comp.lang.perl.misc 8 07-14-2008 05:01 PM
XSS und Variablen Chris Seidel Newsgroup de.comp.lang.javascript 10 04-30-2008 08:29 AM
variablen der reihe nach ansprechen ohne array? findcomponent für variablen? michael mazanek Newsgroup de.comp.lang.delphi.misc 8 04-22-2008 07:07 PM
As New - Variablen übergeben Thomas Hübner Newsgroup microsoft.public.de.german.entwickler.dotnet.vb 3 03-02-2008 01:19 PM


Alle Zeitangaben in WEZ. Es ist jetzt 01:54 AM Uhr.





Powered by: vBulletin Version 3.6.7 (Deutsch)
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Forum SEO by Zoints