Schrift
[thread]7061[/thread]

Einem Schlüssel mehrere Werte ausgeben lassen



<< >> 6 Einträge, 1 Seite
Gast Gast
 2005-06-20 15:32
#55603 #55603
Hallo, vielleicht könnt ihr mir helfen. Es geht um folgendes Problem:

Einem Künstler sollen mehrere Lieder zugeordnet werden. Wie würdet ihr das machen?

Derzeit sieht der Code wie folgt aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
open(LIEDER,'lieder.txt');

%liste;

foreach (<LIEDER>) {
       chomp $_;
       ($künstler, $titel) = split /\: /,$_;
       $liste{$künstler} = $titel;
}

$nr = 0;

foreach (keys %liste) {
       $nr = $nr + 1;
       print "$nr) $_\n\t\ $liste{$_}\n";
}

close (LIEDER);


Die Datei lieder.txt beinhaltet diverse Künstler mit Lieder:

Quote
Madonna: Like a Prayer
Madonna: American Pie
Madonna: Frozen
Michael Jackson: Thriller
Michael Jackson: Bad
Michael Jackson: Billie Jean
[...]


Ich möchte die Ausgabe wie folgt haben:

Quote
1) Madonna
Like a Prayer
American Pie
Frozen
2) Michael Jackson
Thriller
Bad
Billie Jean
3) [...]


Angezeigt wird es bisher aber nur so:

Quote
1) Madonna
Frozen
2) Michael Jackson
Billie Jean
3) [...]


Also nur der letzte Titel. D.h. er nimmt immer nur den letzten Titel-Wert und listet nicht alle nacheinander untereinander auf, um dann beim nächsten Künstler weiterzumachen.

Habt ihr eine Idee, wie ich alle Lieder eines Künstlers angezeigt bekomme?

Gruß
Ronnie
 2005-06-20 15:51
#55604 #55604
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
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
#!/usr/bin/perl

use strict;
use warnings;

my $liste;

while (<DATA>) {
chomp $_;
my ($kuenstler, $titel) = split /\: /, $_;
push @{$liste->{$kuenstler}}, $titel;
}

my $nr = 0;

foreach (keys %$liste) {
print ++$nr, ') ', $_, "\n\t", join("\n\t", @{$liste->{$_}}), "\n";
}

_ _DATA_ _
Madonna: Like a Prayer
Madonna: American Pie
Madonna: Frozen
Michael Jackson: Thriller
Michael Jackson: Bad
Michael Jackson: Billie Jean

Du kannst mit einem Hash of Arrays arbeiten. Ich habe in obigem angepassten Code ein anonymes Hash verwendet. perldoc perlref müsste AFAIR weitere Infos zum arbeiten mit zusammengesetzten Datentypen enthalten.

EDIT1: Verwende besser keine Umlaute in Variablennamen!\n\n

<!--EDIT|Ronnie|1119268564-->
Strat
 2005-06-20 16:16
#55605 #55605
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
was passiert, wenn da im titel ein : vorkommt?
Code: (dl )
my ($kuenstler, $titel) = split(/\s*:\s*/, $_, 2);

ist da meistens vorzuziehen, weil es keine daten verschluckt (und sie hoechstens verschoben zuordnet, wenn im kuenstlerfeld ein : vorkommt)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2005-06-20 16:21
#55606 #55606
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Ronnie: nicht nur perldoc perlref enthält Infos über Verschachtelte Datenstrukturen, sondern auch perlreftut und das ist schon übersetzt hier im Wiki ;)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2005-06-20 16:42
#55607 #55607
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ich würde einfach unter jedem key eine arrayref speichern die als elemente die lieder enthält. untested:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
my %artists = (
'Judas Priest' => ['Breaking the Law', 'Painkiller', 'Ram it Down'],
'Iron Maiden' => ['Number of the Beast', 'Brave New World'],
'Metallica' => ['Master of Puppets', 'One', 'Creeping Death']
);
for my $artist ( keys %artists ) {
for my $song ( @{ $artists{$artist} } ) {
print "$artist: $song\n";
}
}


edit: ups, hatte nicht gesehen, dass das eingabeformat festgelegt war, ausserdem hab ich wohl ein oder zwei posts überlesen. wie dem auch sei, obere for-schleife dürfte besser lesbar (verständlicher) sein als ronnies ansatz.\n\n

<!--EDIT|Taulmarill|1119271557-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Ronnie
 2005-06-20 17:59
#55608 #55608
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
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
#!/usr/bin/perl

use strict;
use warnings;

my $liste;
my $nr;

for (<DATA>) {/^(.*): (.*)$/; push @{$liste->{$1}}, $2;}

foreach my $kuenstler (keys %$liste) {
print ++$nr,
') ',
$kuenstler,
"\n\t",
join("\n\t", @{$liste->{$kuenstler}}),
"\n";
}

_ _DATA_ _
Madonna: Like a Prayer
Madonna: American Pie
Madonna: Frozen
Michael Jackson: Thriller
Michael Jackson: Bad
Michael Jackson: Billie Jean

@taulmarill: Mit ein paar Zeilenumbrüchen im print-Statement sieht es viel besser aus. Dein Musikgeschmack gefällt mit übrigens besser ;)\n\n

<!--EDIT|Ronnie|1119276086-->
<< >> 6 Einträge, 1 Seite



View all threads created 2005-06-20 15:32.