2 Fragen (Subroutine, kürzere Schreibweise)
xNeTworKx
- perl
Hallo,
ich hab da mal wieder einmal Fragen zu Perl, und zwar hätte ich gerne diesmal gewusst, wie ich 1. folgendes kürzer ausdrucken kann:
zB:
my ($var1,$var2,$var3,$var4,$var5) = (0,0,0,0,0);
Kann ich das nicht irgendwie abkürzen ?
Frage 2 :
Wenn ich Werte einer Subroutine übergebe zB :
&test($wert1,$wert2);
warum kann ich dann von der Subrountine aus die Werte $wert1 und $wert2 nur dann verändern, wenn ich es folgendermaßen schreibe :
sub test {
my ($wert1, $wert2) = @_;
$wert1 = 'neuerWert'; # nur $wert1 der Subroutine ändert sich,
# nicht ausserhalb
$_[0] = 'neuerWert'; # jetzt hat $wert1 ausserhalb der Sr. den Wert
# neuer Wert.
}
ich finde es ziemlich unübersichtlich, wenn ich immer mit $_[0], $_[1], usw arbeiten muss. Kann ich nicht vielleicht irgendwie mit $wert1, $wert2 der Subrountine arbeiten, sodaß ich mit diesen Variablen den Wert verändern kann ?
danke im Vorhinein.
Hoi,
ich hab da mal wieder einmal Fragen zu Perl, und zwar hätte ich gerne diesmal
gewusst, wie ich 1. folgendes kürzer ausdrucken kann:
Schriftgroesse kleiner einstellen ;-))
zB:
my ($var1,$var2,$var3,$var4,$var5) = (0,0,0,0,0);
Kann ich das nicht irgendwie abkürzen ?
Nein.
Frage 2 :
Wenn ich Werte einer Subroutine übergebe zB :
&test($wert1,$wert2);
Bitte(!) nicht &test() schreiben -- test() reicht voellig aus. Das & ist ein
Ueberbleibsel aus Perl4 und hat unter Umstaenden einige negative Auswirkungen.
Fuer mehr Infos, schau dir perldoc perlsub an.
warum kann ich dann von der Subrountine aus die Werte $wert1 und $wert2 nur
dann verändern, wenn ich es folgendermaßen schreibe:
sub test {
my ($wert1, $wert2) = @_;
$wert1 = 'neuerWert'; # nur $wert1 der Subroutine ändert sich,
# nicht ausserhalb
$_[0] = 'neuerWert'; # jetzt hat $wert1 ausserhalb der Sr. den Wert
# neuer Wert.
}
Weil @_ eine Art magische Referenz auf die Orginal-Variable enthaelt. Und mit
my ($wert1,$wert2) = @_;
legst du eine Kopie an.
ich finde es ziemlich unübersichtlich, wenn ich immer mit $_[0], $_[1], usw
arbeiten muss. Kann ich nicht vielleicht irgendwie mit $wert1, $wert2 der
Subrountine arbeiten, sodaß ich mit diesen Variablen den Wert verändern
kann?
Benutze echte Referenzen.
my $x = 'a';
print "a is: $a\n";
doit($a);
print "a is: $a\n";
sub doit($) {
my $ref = shift;
$$ref = 'b';
}
Gruesse,
CK
Hallo,
Benutze echte Referenzen.
my $x = 'a';
print "a is: $a\n";
doit($a);
print "a is: $a\n";
sub doit($) {
my $ref = shift;
$$ref = 'b';
}
Aha =) jetzt verstehe ich schön langsam wobei ich Referenzen gebrauchen kann :)
Übrigens wollte ich mich nochmal für das hier: $text =~ s/(\s\s+)/(' ' x (length($1)-1)) . ' '/eg;
bedanken. Du hast es mir vorigen Monat beim meinem Forum Formatierungsproblem gepostet, und es funktioniert tadellos, nur verstehe ich das mit dem 'e' noch nicht so ganz, da darauf in meinem Buch nicht näher eingegangen wird, aber ich werd mich bei Gelegenheit mal damit beschäftigen.
Hoi,
Übrigens wollte ich mich nochmal für das hier: $text =~ s/(\s\s+)/(' ' x
(length($1)-1)) . ' '/eg;
bedanken. Du hast es mir vorigen Monat beim meinem Forum Formatierungsproblem
gepostet, und es funktioniert tadellos, nur verstehe ich das mit dem 'e' noch
nicht so ganz, da darauf in meinem Buch nicht näher eingegangen wird, aber
ich werd mich bei Gelegenheit mal damit beschäftigen.
'execute' oder 'evaluate' (da streiten sich die Geister :-). Der
Ersetzungs-Ausdruck (in diesem Fall ((' ' x length($1)-1).' ') wird
ausgefuehrt.
Gruesse,
CK
Hi,
'execute' oder 'evaluate' (da streiten sich die Geister :-). Der
Ersetzungs-Ausdruck (in diesem Fall ((' ' x length($1)-1).' ') wird
ausgefuehrt.
achso ist das :) eigentlich ziemlich klar und eigentlich logisch.
Hallo.
Frage 2 :
Wenn ich Werte einer Subroutine übergebe zB :
&test($wert1,$wert2);
Bitte(!) nicht &test() schreiben -- test() reicht voellig aus. Das & ist ein
Ueberbleibsel aus Perl4 und hat unter Umstaenden einige negative Auswirkungen.
Fuer mehr Infos, schau dir perldoc perlsub an.
Kleine Ergaenzung.
Ueberbleibsel ist nicht ganz richtig. Das '&' hat schon seinen Sinn, wenn man in einer Subroutine eine andere ohne Argument aufruft wird durch das '&' davor der aktuelle Array '@_' uebergeben. Oder man ruft eine Subroutine mit 'goto' auf. Dann braucht man auch das '&'.
Aber Du hast recht - wenn man sowas nicht macht, sollte man es sicherheitshalber und korrekterweise weglassen.
Gruss, Thomas.
Moin!
Frage 2 :
Wenn ich Werte einer Subroutine übergebe zB :
&test($wert1,$wert2);
Bitte(!) nicht &test() schreiben -- test() reicht voellig aus.
Das & ist ein Ueberbleibsel aus Perl4 und hat unter Umstaenden
einige negative Auswirkungen. Fuer mehr Infos, schau dir perldoc
perlsub an.
Kleine Ergaenzung.
Ueberbleibsel ist nicht ganz richtig.
Nun -- es *ist* ein Ueberbleibsel.
Das '&' hat schon seinen Sinn, wenn man in einer Subroutine eine
andere ohne Argument aufruft wird durch das '&' davor der
aktuelle Array '@_' uebergeben.
Richtig. Das waren die unangenehmen Nebenwirkungen, von denen ich
sprach.
Aber Du hast recht - wenn man sowas nicht macht, sollte man es
sicherheitshalber und korrekterweise weglassen.
Ich wuerde ehrlich gesagt sagen, im Sinne eines sauberen
Programmierstils sollte man statt
sub blub {
&blah;
}
lieber
sub blub {
blah(@_);
}
schreiben. Das mag zwar etwas weniger performant sein (es muss erst
eine Kopie der Liste angelegt werden, IMHO), aber wenigstens weiss
man auf den ersten Blick, was gemeint ist.
Gruesse,
CK
Hi!
ich hab da mal wieder einmal Fragen zu Perl, und zwar hätte ich gerne diesmal gewusst, wie ich 1. folgendes kürzer ausdrucken kann:
zB:
my ($var1,$var2,$var3,$var4,$var5) = (0,0,0,0,0);
Ein *bisschen* kuerzer, aber nicht sehr:
my ($var1,$var2,$var3,$var4,$var5) = (0)x5;
Wenn Du 80 Variablen hast, denen Du allen den Wert 12345 geben willst, lohnt es sich vielleicht. ;-)
Wie der x-Operator funktioniert? perldoc perlop, Multiplicative operators.
So long
--
Die Aggressivitaet kommt vom Heavy Metal!!! CounterStrike ist doch nur zum Runterkommen!!!!!