print 2D-Array, auf "perlish"
print 2D-Array, auf "perlish"
am 14.03.2006 16:10:11 von Mirco Wahab
Hallo,
ich versuche gerade ein 2D-Array mit Hilfe
eines Perl-Idioms auszugeben, bekomme es
aber nicht schön hin. Wie war das denn nochmal ...
$array =
[
[ 'a1', 'b1', 'c1', 'd1', 'e1' ],
[ 'a2', 'b2', 'c2', 'd2', 'e2' ],
[ 'a3', 'b3', 'c3', 'd3', 'e3' ],
...
[ 'an-1', 'bn-1', 'cn-1', 'dn-1', 'en-1' ],
];
wenn man nur eine Spalte des 2D Array ausgeben wollte,
würde man ja "idiomatisch" mit
print "$_->[0]" for ( @{$array} );
sein Ziel erreichen.
Wie gebe ich nun die anderen Spalten mit aus?
print map { ... } @{$_} . "\n" for ( ... );
Hmmm ... so also nicht!?
("Zwei Zeilen" zu verwenden erschiene mir hier "unelegant" ;-)
Hab gerade irgendwie den Faden verloren ;-)
Viele Grüße
M.
Re: print 2D-Array, auf "perlish"
am 14.03.2006 16:27:46 von Christian Lackas
* Mirco Wahab [2006-03-14]:
Hallo Mirco,
> $array =
> [
> [ 'a1', 'b1', 'c1', 'd1', 'e1' ],
> [ 'a2', 'b2', 'c2', 'd2', 'e2' ],
> [ 'a3', 'b3', 'c3', 'd3', 'e3' ],
> ...
> [ 'an-1', 'bn-1', 'cn-1', 'dn-1', 'en-1' ],
> ];
> wenn man nur eine Spalte des 2D Array ausgeben wollte,
> würde man ja "idiomatisch" mit
> print "$_->[0]" for ( @{$array} );
> sein Ziel erreichen.
>
> Wie gebe ich nun die anderen Spalten mit aus?
> print map { ... } @{$_} . "\n" for ( ... );
meinst du sowas wie
print "@$_", "\n" for @$array;
Gruß
Christian
--
Es ist ganz leicht, sich das Rauchen abzugewöhnen;
ich habe es schon hundert Mal geschafft.
(Mark Twain, am. Schriftsteller, 1835-1903)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: print 2D-Array, auf "perlish"
am 14.03.2006 16:29:12 von Wolf Behrenhoff
Mirco Wahab schrieb:
> Hallo,
>
> ich versuche gerade ein 2D-Array mit Hilfe
> eines Perl-Idioms auszugeben, bekomme es
> aber nicht schön hin. Wie war das denn nochmal ...
>
> $array =
> [
> [ 'a1', 'b1', 'c1', 'd1', 'e1' ],
> [ 'a2', 'b2', 'c2', 'd2', 'e2' ],
> [ 'a3', 'b3', 'c3', 'd3', 'e3' ],
> ...
> [ 'an-1', 'bn-1', 'cn-1', 'dn-1', 'en-1' ],
> ];
>
>
> wenn man nur eine Spalte des 2D Array ausgeben wollte,
> würde man ja "idiomatisch" mit
>
> print "$_->[0]" for ( @{$array} );
>
> sein Ziel erreichen.
>
> Wie gebe ich nun die anderen Spalten mit aus?
Wie wäre es mit
print join("\t",@$_),"\n" for @$array;
Wolf
Danke fuer den Wink - was: print 2D-Array, auf "perlish"
am 15.03.2006 10:16:02 von Mirco Wahab
Hallo Wolf & Christian,
ja, manchmal hat man einen solchen
Tag, - da fällt einem nix mehr ein.
Aber mit Euren freundlichen Hinweisen
fielen mir wieder die "Idiome" zu ;-)
> $array =
> [
> [ 'a1', 'b1', 'c1', 'd1', 'e1' ],
> [ 'a2', 'b2', 'c2', 'd2', 'e2' ],
> [ 'a3', 'b3', 'c3', 'd3', 'e3' ],
> ...
> [ 'an-1', 'bn-1', 'cn-1', 'dn-1', 'en-1' ],
> ];
Ich komme hier auf vier adäquate Varianten
1) print join("\t", @$_),"\n" for @$array;
2) map { print join("\t", @$_), "\n" } @$array;
3) { local($,="\t",$\="\n"); print @$_ for @$array; }
4) map { local ($,="\t",$\="\n"); print @$_ } @$array;
Wobei mit #1 (Wolf) als "günstigster Kompromiss"
zwischen "perlism" und Lesbarkeit erscheint.
Was mir hier nicht klar ist - gint es
bei 3/4 am angegebenen Kontext einen
Unterschied zwischen
local $var=val
und
local($var=val) ?
Wie ist es richtig?
Viele Grüße
M. Wahab
Re: Danke fuer den Wink - was: print 2D-Array, auf "perlish"
am 15.03.2006 11:09:45 von Christian Lackas
* Mirco Wahab [2006-03-15]:
Hallo Mirco,
> Unterschied zwischen
> local $var=val
> und
> local($var=val) ?
ja, die Klammern hebeln die Bedeutung von local für $var auf. Man muss
da ein bisschen vorsichtig sein, auch
local $b = 'b', $c = 'c';
macht nicht unbedingt das was man erwartet.
Hier ein Beispiel:
#! perl -w
# use strict; # erspart einem viel Ärger
$a = 'a'; $b = 'b'; $c = 'c'; $d = 'd';
{
local $a = 'over a';
local $b = 'over b', $c = 'over c';
local ($d = 'over d');
}
print "$a, $b, $c, $d\n";
Das ergibt:
a, b, over c, over d
Die Variablen $c und $d werden also überschrieben, statt das eine Kopie
innerhalb des Blocks angelegt wird.
> Wie ist es richtig?
local $a = 'a'; local $b = 'b';
Einer der Gründe, warum man 'local' sparsam einsetzen sollte (und
eigentlich auch nur, wenn man weiss was es tut und wie es genau
arbeitet).
Gruß
Christian
--
Ein Optimist ist in der Regel der Zeitgenosse, der am
ungenügendsten informiert ist.
(John Priestley, engl. Schriftst., 1894-1984)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: Danke fuer den Wink - was: print 2D-Array, auf "perlish"
am 15.03.2006 11:19:28 von Frank Seitz
Christian Lackas wrote:
> * Mirco Wahab [2006-03-15]:
>>
>>Wie ist es richtig?
>
> local $a = 'a'; local $b = 'b';
Oder so:
local ($a,$b) = ('a','b');
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: Danke fuer den Wink - was: print 2D-Array, auf "perlish"
am 15.03.2006 11:30:49 von Frank Seitz
Mirco Wahab wrote:
>
> Ich komme hier auf vier adäquate Varianten
>
> 1) print join("\t", @$_),"\n" for @$array;
> 2) map { print join("\t", @$_), "\n" } @$array;
> 3) { local($,="\t",$\="\n"); print @$_ for @$array; }
> 4) map { local ($,="\t",$\="\n"); print @$_ } @$array;
Ich würde nur die erste Variante als adäquat bezeichnen.
In 2) und 4) wird map() im Grunde falsch angewendet.
Und das Umsetzen von $, und $\ in 3) bringt es einfach nicht.
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: Danke fuer den Wink - was: print 2D-Array, auf "perlish"
am 15.03.2006 11:33:00 von Daniel Tiefnig
Christian Lackas wrote:
> * Mirco Wahab [2006-03-15]:
>> local($var=val) ?
>
> ja, die Klammern hebeln die Bedeutung von local für $var auf.
Wow, gibt es dafür eine einfache schlüssige Erklärung? Auf den ersten
Blick sieht das sehr buggy aus.
perldoc perlsub schreibt außerdem:
| If more than one variable or expression is given to "local", they
| must be placed in parentheses.
Das ist ja auch ok, solange man keine Werte zuweißt. Da steht aber
weiters:
| The argument list may be assigned to if desired, which allows you to
| initialize your local variables.
Und dabei handelt es sich - falls das Verhalten von local() so
gewünscht ist - um einen Bug in der Dokumentation, oder?
lg,
daniel
Re: Danke fuer den Wink - was: print 2D-Array, auf "perlish"
am 15.03.2006 12:10:00 von Ingo Menger
Frank Seitz schrieb:
> Mirco Wahab wrote:
> >
> > Ich komme hier auf vier adäquate Varianten
> >
> > 1) print join("\t", @$_),"\n" for @$array;
> > 2) map { print join("\t", @$_), "\n" } @$array;
> > 3) { local($,=3D"\t",$\=3D"\n"); print @$_ for @$array; }
> > 4) map { local ($,=3D"\t",$\=3D"\n"); print @$_ } @$array;
>
> Ich würde nur die erste Variante als adäquat bezeichnen.
> In 2) und 4) wird map() im Grunde falsch angewendet.
> Und das Umsetzen von $, und $\ in 3) bringt es einfach nicht.
Stimmt. 2) könnte man u.U. folgendermaßen retten:
print join("\n", map { join("\t", @$_) } @$array);
Re: Danke fuer den Wink - was: print 2D-Array, auf "perlish"
am 15.03.2006 12:10:01 von Daniel Tiefnig
Daniel Tiefnig wrote:
> Wow, gibt es dafür eine einfache schlüssige Erklärung? Auf den
> ersten Blick sieht das sehr buggy aus.
Hmm, auf den zweiten Blick dann wiederum nicht, wenn ich mir das
Posting von Frank ansehe und darüber nachdenke... Die Klammern sind
einfach falsch gesetzt.
lg,
daniel