Leser: 30
1 2 3 4 5 6 7 8 9 10 11
#!/usr/bin/perl -w use strict; use warnings; no strict 'refs'; my $test = 'hallo'; testsub(); sub testsub { print $test; }
QuoteUse of uninitialized value in print
2009-08-24T11:38:53 freddyWie kann ich denn erreichen, dass auch per require "eingebundene" subs auf die übergreifenden Variablen zugreifen können, ohne dass ich diese im Aufruf explizit übergeben muss?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package ausgelagertes::modul;
use warnings;
use strict;
our $global = 'default';
sub foo {
# nutze $global
}
1;
# ----- skript
use ausgelagertes::modul;
local $ausgelagertes::modul::global = 23;
ausgelagertes::modul::foo();
1
2
3
<script type="text/javascript">
document.namederform.namedesfeldes.focus();
</script>
2009-08-24T11:57:22 pqleider will solche ratschläge am anfang niemand hören
2009-08-24T12:23:43 freddyAber mal einen Fall angenommen: Du hast eine zentrale Konfig im Hash %config stehen. Wäre doch toll und codesparend, wenn man projektweit auf diese %config zugreifen könnte, ohne für jede sub übergeben zu müssen.
use my::config qw/ $conf /; # hashref
2009-08-24T13:44:53 pqkannst du bitte zuerst mal die frage beantworten, die ich weiter unten im thread gestellt habe? was hat das hier mit perl 6 zu tun?
2009-08-24T12:23:43 freddyDa habt Ihr bestimmt Recht.
Aber mal einen Fall angenommen: Du hast eine zentrale Konfig im Hash %config stehen. Wäre doch toll und codesparend, wenn man projektweit auf diese %config zugreifen könnte, ohne für jede sub übergeben zu müssen.
my $config = $c->config
QuoteDa als Prämisse festgelegt ist, das es nirgendwo ein zweites config geben darf, würde das doch passen, oder?
1 2 3 4 5 6 7 8
# ... my $conf=myConf->new($file) or die "ERROR LOAD CONF ($!)\n"; # ... my $obj=myObj->new($conf,@sonstiges); # ... my $result = $obj->tue_was();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
package myObj; sub new { my $class=shift; my $conf=shift; my @rest=@_; return undef unless($conf); # weitere Tests der Parameter ... my $self={CONF=>$conf, rest=>\@rest}; return bless($self,$class); } sub conf { return $_[0]->{CONF}; } sub tue_was { my $self=shift; if( $self->conf->has('irgendwas') ) { return 'Ich tue was'; } else { return 'Ich tue nichts'; } }
2009-08-24T11:44:40 pqwenn es unbedingt sein muss und du es aus irgendeinem grund *nicht* als parameter übergeben kannst, dann nimm eine package-variable des moduls und setze diese mittels local();
es gibt jedoch nur wenige gründe, etwas nicht als parameter übergeben zu können. dafür sind subroutinen ja schliesslich da.
2009-08-24T11:44:40 pqder eigentliche weg wäre, die variablen als parameter an die sub zu übergeben.
in einem modul auf globale variablen zuzugreifen, ist ein no-go. denn so verlierst du die kontrolle
2009-08-24T21:20:43 LanX-ich kann deinen Standpunkt nicht nachvollziehen die Variable $test ist nicht global sondern lexikalisch auf das Modul gescopt.
1 2 3 4 5 6 7 8 9 10 11
#!/usr/bin/perl -w use strict; use warnings; no strict 'refs'; my $test = 'hello'; sub testsub { print $test; }
2009-08-24T12:13:37 pqups, das war ja ne frage für perl 6.
bist du sicher, oder sollte das für perl 5 sein?
2009-08-24T11:38:53 freddyHi!
Wenn ich nun die sub in eine externe Datei auslagere und diese mit require einbinde, erhalte ichQuoteUse of uninitialized value in print
2009-08-24T21:14:55 LanX-2009-08-24T11:38:53 freddyHi!
Wenn ich nun die sub in eine externe Datei auslagere und diese mit require einbinde, erhalte ichQuoteUse of uninitialized value in print
nicht bei mir, funktioniert alles!
poste mal deine beiden Dateien zum nachvollziehen.
nachtrag: siehe msg #124722
1 2 3 4 5 6 7 8
#!/usr/bin/perl -w use strict; use warnings; no strict 'refs'; require 'testvarsub.pl'; my $test = 'hallo'; testsub();
1 2 3 4 5 6
#!/usr/bin/perl use strict; use warnings; require 'testvarsub.pl'; testsub('hallo');
1 2 3 4 5 6 7 8 9 10
use strict; use warnings; sub testsub ($) { my $test=shift(@_); print $test; } return 1;
2009-08-25T08:48:39 topegDie bessere Lösung in deinem Beispiel währe der Funktion Parameter mit zu geben:
2009-08-25T09:46:01 topegKommt darauf an ... ;)
2009-08-25T11:50:03 LanX-Datenkapselung erreicht man locker und leicht ohne Objekte, siehe msg #124722
2009-08-25T12:17:30 LanX-Ich schrieb "dass es schon komisch ist" nicht dass DU komisch bist.
Ihr ersetzt das Extremum der globalen Variablen mit dem Extremum der Parameterübergabe, es gibt aber den Mittelweg der gescopten Variablen.
Und ich finde es nicht übertrieben Anfänger auf Geltungsbereiche hinzuweisen, weit weniger speziell als den Fall paralleler Aufrufe zu konstruieren, denn man dann immer noch abfangen kann.
Mein Code erfüllt 100% von Freddys (mageren) Aufgabenstellung auf elegantere und wartbarere Weise.
So hat jeder seinen Stil, du propagierst deinen ich meinen. Wo ist das Problem?
Nur weil unisono vom "eigentlichen Weg" gesprochen wird, darf ich nicht meinen Weg vertreten?
Komisch...
2009-08-25T12:21:14 freddyWoher kommt diese allgemeine leichte Gereiztheit hier in diesem Forum? Ist mir jetzt schon in mehreren Threads aufgefallen. Selbst beim Setzen von Smilies werden hier manche trotzdem mopsig.
2009-08-25T12:29:30 sid burnUnd LanX- versucht immer zu Provizieren, und meint alles besser zu wissen.
2009-08-25T12:52:02 LanX-2009-08-25T12:29:30 sid burnUnd LanX- versucht immer zu Provizieren, und meint alles besser zu wissen.
Wow!!!
30000 Googletreffer für "Provizieren" ... =)
QuoteErgebnisse 1 - 10 von ungefähr 2.190 für Provizieren. (0,05 Sekunden)
2009-08-25T12:29:30 sid burnpq füllt sich bei allem gleich persönlich angegriffen und interpretiert alles negativ.
Und LanX- versucht immer zu Provizieren, und meint alles besser zu wissen.
;)
2009-08-25T13:18:07 freddyWas muss passieren, dass sich die Kräfte ausschließlich auf die Sache beziehen?
2009-08-25T09:37:21 LanX-Die beste Lösung wäre anständig zu kapseln,...