print 2D-Array, auf 'perlish'

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 ( [at] {$array} );

sein Ziel erreichen.

Wie gebe ich nun die anderen Spalten mit aus?

print map { ... } [at] {$_} . "\n" for ( ... );

Hmmm ... so also nicht!?
("Zwei Zeilen" zu verwenden erschiene mir hier "unelegant" ;-)

Hab gerade irgendwie den Faden verloren ;-)

Viele Grüße

M.
Mirco Wahab [ Di, 14 März 2006 16:10 ] [ ID #1229382 ]

Re: print 2D-Array, auf 'perlish'

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 ( [at] {$array} );
>
> sein Ziel erreichen.
>
> Wie gebe ich nun die anderen Spalten mit aus?

Wie wäre es mit
print join("\t", [at] $_),"\n" for [at] $array;

Wolf
Wolf Behrenhoff [ Di, 14 März 2006 16:29 ] [ ID #1229383 ]

Re: print 2D-Array, auf 'perlish'

* 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 ( [at] {$array} );
> sein Ziel erreichen.
>
> Wie gebe ich nun die anderen Spalten mit aus?
> print map { ... } [at] {$_} . "\n" for ( ... );

meinst du sowas wie

print " [at] $_", "\n" for [at] $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
Christian Lackas [ Di, 14 März 2006 16:27 ] [ ID #1229384 ]

Danke fuer den Wink - was: print 2D-Array, auf 'perlish'

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", [at] $_),"\n" for [at] $array;
2) map { print join("\t", [at] $_), "\n" } [at] $array;
3) { local($,="\t",$\="\n"); print [at] $_ for [at] $array; }
4) map { local ($,="\t",$\="\n"); print [at] $_ } [at] $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
Mirco Wahab [ Mi, 15 März 2006 10:16 ] [ ID #1231184 ]

Re: Danke fuer den Wink - was: print 2D-Array, auf 'perlish'

* 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
Christian Lackas [ Mi, 15 März 2006 11:09 ] [ ID #1231185 ]

Re: Danke fuer den Wink - was: print 2D-Array, auf 'perlish'

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
Frank Seitz [ Mi, 15 März 2006 11:19 ] [ ID #1231186 ]

Re: Danke fuer den Wink - was: print 2D-Array, auf 'perlish'

Mirco Wahab wrote:
>
> Ich komme hier auf vier adäquate Varianten
>
> 1) print join("\t", [at] $_),"\n" for [at] $array;
> 2) map { print join("\t", [at] $_), "\n" } [at] $array;
> 3) { local($,="\t",$\="\n"); print [at] $_ for [at] $array; }
> 4) map { local ($,="\t",$\="\n"); print [at] $_ } [at] $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
Frank Seitz [ Mi, 15 März 2006 11:30 ] [ ID #1231187 ]

Re: Danke fuer den Wink - was: print 2D-Array, auf 'perlish'

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
Daniel Tiefnig [ Mi, 15 März 2006 11:33 ] [ ID #1231188 ]

Re: Danke fuer den Wink - was: print 2D-Array, auf 'perlish'

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
Daniel Tiefnig [ Mi, 15 März 2006 12:10 ] [ ID #1231189 ]

Re: Danke fuer den Wink - was: print 2D-Array, auf 'perlish'

Frank Seitz schrieb:

> Mirco Wahab wrote:
> >
> > Ich komme hier auf vier adäquate Varianten
> >
> > 1) print join("\t", [at] $_),"\n" for [at] $array;
> > 2) map { print join("\t", [at] $_), "\n" } [at] $array;
> > 3) { local($,=3D"\t",$\=3D"\n"); print [at] $_ for [at] $array; }
> > 4) map { local ($,=3D"\t",$\=3D"\n"); print [at] $_ } [at] $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", [at] $_) } [at] $array);
Ingo Menger [ Mi, 15 März 2006 12:10 ] [ ID #1231190 ]
Perl » de.comp.lang.perl.misc » print 2D-Array, auf 'perlish'

Vorheriges Thema: Probleme mit Zeichencodierung
Nächstes Thema: Definiertheit einer Variable überprüfen,oder wie?