Szeretnék létrehozni perlben egy hash-t, aminek kétdimenziós tömbök az elemei, de bevallom, nem sikerült legyőznöm a problémát.
Valami effélét szeretnék:
#!/usr/bin/perl
my %kod = ( 'KEY1' => [ ( 1,2,3,4,5,6,7,8 )
, ( 9,8,7,6,5,4,3,2 ) ]
, 'KEY2' => [ ( 1,2,3,4,5,6,7,8 )
, ( 9,8,7,6,5,4,3,2 ) ] );
my @values = @{ $kod{ 'KEY1' }[ 1 ] }; # A 8 elemű tömb
printf "%d\n", $#values;
A cél az lenne, hogy a kulcs és az index segítségével megkapjam az előtte kódban megadott hozzá tartozó tömböt. A fenti kód azonban -1 -et ír ki 7 helyett. :(
Tud valaki segíteni benne, hol rontom el, hogyan kellene helyesen?
- 211 megtekintés
Hozzászólások
Bocs, de hol van ebbe a kétdimenziós tömb?
- A hozzászóláshoz be kell jelentkezni
Valamikor az ezredfordulón írtam programokat PERL-ben. Azóta ritkábban szembejön és ekkor mindig megértem, miért nem kezdenék új fejlesztést PERL-ben.
#!/usr/bin/python3
kod = {
'KEY1': [ ( 1,2,3,4,5,6,7,8 ), ( 9,8,7,6,5,4,3,2 ) ],
'KEY2': [ ( 1,2,3,4,5,6,7,8 ), ( 9,8,7,6,5,4,3,2 ) ],
}
values = kod['KEY1'][1]; # A 8 elemű tuple
print ("Teljes:", values) # teljes tuple
print ("2. elem:", values[2]) # 2. elem a 7
print ("Hossza:", len(values)) # 8 elemű
print ("Utsó elem:", values[-1]) # utolsó elem a 2
- A hozzászóláshoz be kell jelentkezni
Perlben a $# a tömb legmagasabb indexét adja vissza. A 8 elemű tömbnél (0..7) ez tehát 7.
- A hozzászóláshoz be kell jelentkezni
jajaja látom.
mondjuk segítene ha nem lennének egyformák a tömbök :)
zászló, zászló, szív
- A hozzászóláshoz be kell jelentkezni
majdnem jo :)
Ne tombot, hanem tombreferenciat tarolj. Perlben a tombok flat-ek, vagyis ha egymas utan irsz ket tombot, akkor az valojaban egyetlen tombnek szamit.
#!/usr/bin/perl
my %kod = ( 'KEY1' => [ [ 1,2,3,4,5,6,7,8 ]
, [ 9,8,7,6,5,4,3,2 ] ]
, 'KEY2' => [ [ 1,2,3,4,5,6,7,8 ]
, [ 9,8,7,6,5,4,3,2 ] ] );
my @values = @{ $kod{ 'KEY1' }->[ 1 ] }; # A 8 elemű tömb
printf "%d\n", $#values;
- A hozzászóláshoz be kell jelentkezni
Nagyon köszönöm!
Ezek szerint ott rontottam el, hogy {}[]-t használtam, amiből nem lehet többdimenziós. Többdimenziós tömb csak referenciával lehet, amit definiálásnál a [] zárójel jelez.
- A hozzászóláshoz be kell jelentkezni
Tobbdimenzios tombot csak referenciaval tudsz, igen. A jeloles meg annyi hogy:
() - tomb vagy hash (a ketto valojaban ugyanaz, a hash egy paros elemszamu tomb key-value parok valtakozva)
[] - tomb referencia
{} - hash referencia
- A hozzászóláshoz be kell jelentkezni
Talán ilyesmit lehetne próbálni:
my %h3= ('KEY1'=>[[111,112],[121,122]], 'KEY2'=>[[211,212],[221,222]]);
my ($k, $i, $j);
for ($k=1; $k<=2; ++$k) {
for ($i=0; $i<2; ++$i) {
for ($j=0; $j<2; ++$j) {
printf "h3{KEY%d}[%d][%d]=%d\n", $k, $i, $j, ${$h3{'KEY'.$k}}[$i][$j];
}
}
}
Kimente:
h3{KEY1}[0][0]=111
h3{KEY1}[0][1]=112
h3{KEY1}[1][0]=121
h3{KEY1}[1][1]=122
h3{KEY2}[0][0]=211
h3{KEY2}[0][1]=212
h3{KEY2}[1][0]=221
h3{KEY2}[1][1]=222
Szerk: csak a kavarás kedvéért csináltam még pár referenciát és tömböt.
my $h3_KEY1REF= $h3{'KEY1'};
print 'h3_KEY1REF=',$h3_KEY1REF,"\n";
my @h3_KEY1= @{$h3{'KEY1'}};
print 'h3_KEY1=',@h3_KEY1,"\n";
my $h3_KEY1_0_REF= ${$h3{'KEY1'}}[0];
print 'h3_KEY1_0_REF=',$h3_KEY1_0_REF,"\n";
my @h3_KEY1_0= @{@{$h3{'KEY1'}}[0]};
print 'h3_KEY1_0=',@h3_KEY1_0,"\n";
Kimenete:
h3=KEY1ARRAY(0x7fffd22ffa28)KEY2ARRAY(0x7fffd2316c60)
h3_KEY1REF=ARRAY(0x7fffd22ffa28)
h3_KEY1=ARRAY(0x7fffd2300688)ARRAY(0x7fffd2300550)
h3_KEY1_0_REF=ARRAY(0x7fffd2300688)
h3_KEY1_0=111112
- A hozzászóláshoz be kell jelentkezni
Illetve elegánsabb így:
print $h3{'KEY1'}->[$i][$j];
- A hozzászóláshoz be kell jelentkezni