[Megoldva] Perl összetett adatszerkezet

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?

Hozzászólások

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

Honnan kéne jönni a 7-nek?

zászló, zászló, szív

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;
 

Szerkesztve: 2022. 03. 18., p – 13:05

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