Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6671[/thread]

Array in sub belegen, wie geht das kürzer?



<< >> 9 Einträge, 1 Seite
Crian
 2005-01-28 16:49
#51399 #51399
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Ich habe öfter Code wie diesen:

Code: (dl )
1
2
    my @array;
   fuell_array(\@array);


Meine Frage ist nun, wie könnte man das kompakter (sprich in einer Zeile) formulieren, ohne dass das Array als Rückgabewert übergeben wird (das möchte ich vermeiden aus Zeitgründen)?

Nein, einfach beide Zeilen hintereinanderschreiben ist auch keine akzeptierte Lösung ;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Relais
 2005-01-28 17:17
#51400 #51400
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
my @array = fuell_array();
war nicht gemeint?
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Taulmarill
 2005-01-28 17:30
#51401 #51401
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
also, auch wenn ich jetzt nich weiss, warum du das willst .... :rock:
mir würde spontan in den sinn kommen, ne referenz zurück zu geben. etwa so:
Code: (dl )
1
2
3
4
5
6
7
8
my $ref = fill_array();

print @$ref, "\n";

sub fill_array {
push @_, qw/foo bar foobar/;
return \@_;
}


aber ich werd darüber noch mal nen bischen meditieren.

--edit--
muss das mit use strict; funktionieren?\n\n

<!--EDIT|Taulmarill|1106926342-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
coax
 2005-01-28 17:50
#51402 #51402
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
    sub fuelle_array (\@) {
       @{$_[0]} = qw(aaa bbb ccc ddd eee fff);
   }
   
   fuelle_array(my @array);

   print "$_\n" for @array;


Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
Crian
 2005-01-28 17:54
#51403 #51403
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
@Relais: Ich hatte doch oben geschrieben, dass die Variante aus Zeitgründen ausfällt.
@Taulmarill: Also die Variante eine Referenz auf eine lokale Variable zurückzugeben werde ich nie nie nie wählen! Das ist unter Sprachen wie C++ eine Kathastrophe, weil es Code erzeugt, der meistens funktioniert (weil der Speicher noch nicht abgesammelt wurde) und manchmal eben nicht. Sowas ist einfach ein NO NO NO. Wie das unter Perl gehandhabt wird weiß ich nicht, aber das sollte man sich besser gar nicht erst angewöhnen.

Ja, natürlich soll das unter strict funktionieren ;)

Wenn es keine kürzere Lösung gibt ist es ja auch gut (oder hmmm naja), ich wollte nur nichts übersehen haben, es kommt mir etwas unelegant vor. Man bräuchte im Prinzip etwas wie

Code: (dl )
fuelle_array(\{my @array});


@coax: Ich muss ja eine Referenz an die Funktion übergeben.
Ah ich seh gerade den Prototypen ... =)
Das ist schonmal interessant.
Allerdings finde ich es etwas unschön, dass man dann der Aufrufstelle nicht ansieht, wie die Variable übergeben wird. (Ein Grund, warum ich in C++ lieber Pointer als Referenzen auf Variablen übergebe.)
Aber immerhin gibt es schonmal eine Möglichkeit, danke! :)\n\n

<!--EDIT|Crian|1106927914-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
sri
 2005-01-28 19:45
#51404 #51404
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Crian,28.01.2005, 16:54]Man bräuchte im Prinzip etwas wie

Code: (dl )
fuelle_array(\{my @array});
[/quote]
Umm...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use Data::Dumper;

fill(\my @foo);

warn Dumper \@foo;

sub fill {
my $ref = shift;
push @$ref, $_ for 0 .. 10;
}
esskar
 2005-01-28 22:05
#51405 #51405
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
wie wärs mit
Code: (dl )
my $arrayref = fuelle_arrayref();

?
betterworld
 2005-01-28 22:56
#51406 #51406
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Crian,28.01.2005, 16:54]Also die Variante eine Referenz auf eine lokale Variable zurückzugeben werde ich nie nie nie wählen! Das ist unter Sprachen wie C++ eine Kathastrophe, weil es Code erzeugt, der meistens funktioniert (weil der Speicher noch nicht abgesammelt wurde) und manchmal eben nicht. Sowas ist einfach ein NO NO NO. Wie das unter Perl gehandhabt wird weiß ich nicht[/quote]
Unter Perl wird das anders gehandhabt als in C. Es ist explizit erlaubt, my-Variablen per Referenz aus ihrem Scope herauszukatapultieren. Ich verwende das auch oft. Im Prinzip machen die beliebten Closures ja auch nichts anderes.

Hier ist ein Auszug aus perlsub:
Quote
Unlike local variables in C or C++, Perl's lexical variables don't nec-
essarily get recycled just because their scope has exited. If some-
thing more permanent is still aware of the lexical, it will stick
around. So long as something else references a lexical, that lexical
won't be freed--which is as it should be. You wouldn't want memory
being free until you were done using it, or kept around once you were
done. Automatic garbage collection takes care of this for you.

This means that you can pass back or save away references to lexical
variables, whereas to return a pointer to a C auto is a grave error.


Der Grund, dass es nicht fatal ist wie in C, ist imho, dass in Perl die Skalare selbst nicht im Stack liegen, sondern nur ihre Namen\n\n

<!--EDIT|betterworld|1106945882-->
Taulmarill
 2005-01-29 01:22
#51407 #51407
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@crain: was in der einen sprache ein verbrechen, ist in der anderen eine tugend. die rückgabe einer referenz auf eine lokale variable ist imho sehr perlish. was glaubst du denn, was die ganzen module tun, die referenzen zurückliefern?

aber sri's version würde ich in diesem speziellen fall bevorzugen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< >> 9 Einträge, 1 Seite



View all threads created 2005-01-28 16:49.