/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
keys på en hash i en hash
Fra : Christian Dannesboe


Dato : 11-05-02 17:25

Hej

Jeg kan ikke få perl til at spytte navnene ud med keys funktionen. Problemet
er at jeg har en hash i en hash

$settings{'navn1'}{'data1'}="1";
$settings{'navn1'}{'data2'}="2";
$settings{'navn1'}{'data3'}="3";
$settings{'navn1'}{'data4'}="4";
$settings{'navn1'}{'data5'}="5";
$settings{'navn1'}{'data6'}="6";
$settings{'navn2'}{'data1'}="7";
$settings{'navn2'}{'data2'}="8";
$settings{'navn2'}{'data3'}="9";
$settings{'navn2'}{'data4'}="10";
$settings{'navn3'}{'data1'}="11";
$settings{'navn3'}{'data2'}="12";
$settings{'navn3'}{'data3'}="13";
$settings{'navn3'}{'data4'}="14";
$settings{'navn3'}{'data5'}="15";
$settings{'navn3'}{'data6'}="16";

keys(%settings) giver ('navn1','navn2','navn3') Det er meget godt, men jeg
skal have den til at spytte navnene ud på de data der ligger bag efter.

Jeg har prøvet med keys(%settings{'navn1'}) og forventede ('data1','data2',
.... 'data6'), men den hopper bare op med en syntax error.

Er der der ved hvad jeg gør forkert?

Christian@Dannesboe.dk




 
 
Adam Sjøgren (11-05-2002)
Kommentar
Fra : Adam Sjøgren


Dato : 11-05-02 17:46

On Sat, 11 May 2002 18:24:56 +0200, Christian Dannesboe wrote:

> $settings{'navn1'}{'data1'}="1"; $settings{'navn1'}{'data2'}="2";

[...]

> Er der der ved hvad jeg gør forkert?

Prøv: print join ", ", keys(%{$settings{navn1}});

?

De første sætninger kan skrives meget pænere:

my %settings=(
    navn1 => {
         data1=>1,
         data2=>2,
         data3=>3,
         data4=>4,
         data5=>5,
         data6=>6,
       },
    navn2 => {
         data1=>7,
         data2=>8,
         data3=>9,
         data4=>10,
       },
    navn3 => {
         data1=>11,
         data2=>12,
         data3=>13,
         data4=>14,
         data5=>15,
         data6=>16,
       },
    );

Så bliver det også klarere hvad er er referencer og hvad der ikke er.


Mvh.

--
"It's beautiful! And I certainly hope Adam Sjøgren
my parents hate this album!" asjo@koldfront.dk

Peter Makholm (11-05-2002)
Kommentar
Fra : Peter Makholm


Dato : 11-05-02 17:56

"Christian Dannesboe" <Christian@Dannesboe.dk> writes:

> $settings{'navn1'}{'data1'}="1";
> $settings{'navn1'}{'data2'}="2";
> $settings{'navn1'}{'data3'}="3";

Perl understøtter ikke multidimensionelle hash-strukturer direkte. Det
der i virkeligheden sker er at $settings{navn1} kommer til at
indeholde en reference til en hash med nøglerne data1, data2, data3 etc.

> Jeg har prøvet med keys(%settings{'navn1'}) og forventede ('data1','data2',
> ... 'data6'), men den hopper bare op med en syntax error.

Prøv med 'keys(%{$settings{navn1}})'.

--
Peter Makholm | Emacs is the only modern general-purpose
peter@makholm.net | operating system that doesn't multitask
http://hacking.dk |

Lars Balker Rasmusse~ (11-05-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 11-05-02 18:28

"Christian Dannesboe" <Christian@Dannesboe.dk> writes:
> Jeg kan ikke få perl til at spytte navnene ud med keys funktionen. Problemet
> er at jeg har en hash i en hash

Nej. Du har en hash med referencer til en hash.

> $settings{'navn1'}{'data1'}="1";
> $settings{'navn1'}{'data2'}="2";
> $settings{'navn1'}{'data3'}="3";
> $settings{'navn1'}{'data4'}="4";
> $settings{'navn1'}{'data5'}="5";
> $settings{'navn1'}{'data6'}="6";
> $settings{'navn2'}{'data1'}="7";
> $settings{'navn2'}{'data2'}="8";
> $settings{'navn2'}{'data3'}="9";
> $settings{'navn2'}{'data4'}="10";
> $settings{'navn3'}{'data1'}="11";
> $settings{'navn3'}{'data2'}="12";
> $settings{'navn3'}{'data3'}="13";
> $settings{'navn3'}{'data4'}="14";
> $settings{'navn3'}{'data5'}="15";
> $settings{'navn3'}{'data6'}="16";

Den bedste måde at skrive det på er:

%settings = (
navn1 => {
data1 => "1",
data2 => "2",
data3 => "3",
data4 => "4",
data5 => "5",
data6 => "6"
},
navn2 => {
data1 => "7",
data2 => "8",
data3 => "9",
data4 => "10"
},
navn3 => {
data1 => "11",
data2 => "12",
data3 => "13",
data4 => "14",
data5 => "15",
data6 => "16"
}
);

Bemærk brugen af { }, der laver en anonym reference til en hash.

Læs "perldoc perlref" og "perldoc perlreftut"

> keys(%settings) giver ('navn1','navn2','navn3') Det er meget godt, men jeg
> skal have den til at spytte navnene ud på de data der ligger bag efter.
>
> Jeg har prøvet med keys(%settings{'navn1'}) og forventede ('data1','data2',
> ... 'data6'), men den hopper bare op med en syntax error.

$setting{navn1} er en reference til en hash. Konverter den til en
hash før du bruger den som en.

keys(%{$setting{navn1}} giver 'data1'..'data6'.

For at tilgå data, kan du bruge $setting{navn1}->{data1} i stedet for
den knap så mundrette ${$setting{navn1}}{data1}.
--
Lars Balker Rasmussen                  "S.M.R.T."

Thorbjørn Ravn Ander~ (11-05-2002)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 11-05-02 18:45

Lars Balker Rasmussen <lars@balker.org> writes:

> Nej. Du har en hash med referencer til en hash.

Dagens reklame: Data::Dumper er rigtig god til at hitte ud af hvad det
egentlig er man har fingre i i en variabel. Specielt med komplicede
datastrukturer er det et hit til at faa sat alle $-tegnene de rigtige
steder.
--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Christian Dannesboe (11-05-2002)
Kommentar
Fra : Christian Dannesboe


Dato : 11-05-02 20:42

Tak, tak tak. Jeg har fået det til at køre nu


Christian@Dannesboe.dk





Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste