Avatar billede kernelx Juniormester
14. november 2005 - 09:58 Der er 8 kommentarer og
1 løsning

array i hash

Hi,

jeg har et perlscript:
......................
#!/usr/bin/perl

my %hash;
my @array = ('test1','test2','test3','test4');

$hash{'v1'} = 'value1';
@hash{'v2'} = @array;
$hash{'v3'} = 'value2';

print $hash{'v1'}."\n";

my $value;

foreach $value (@hash{'v2'})
{
    print $value."\n";
}

print $hash{'v3'}."\n";

...................
scriptet giver:
value1
test1
value2

Hvordan kan jeg få scriptet til, at den viser alle værdier i arrayet?
Altå sådan at scriptet giver:
value1
test1
test2
test3
test4
value2


med venlig hilsen
KernelX
Avatar billede erikjacobsen Ekspert
14. november 2005 - 10:22 #1
#!/usr/bin/perl

my %hash;
my @array = ('test1','test2','test3','test4');

$hash{'v1'} = 'value1';
@hash{'v2'} = \@array;
$hash{'v3'} = 'value2';

print $hash{'v1'}."\n";

my $value;

foreach $value (@{$hash{'v2'}})
{
    print $value."\n";
}

print $hash{'v3'}."\n";
Avatar billede erikjacobsen Ekspert
14. november 2005 - 10:23 #2
Og så ville jeg nok også¨

  $hash{'v2'} = \@array;
Avatar billede kernelx Juniormester
14. november 2005 - 11:02 #3
#!/usr/bin/perl

my %hash;
my @array = ('test1','test2','test3','test4');
my @testArray;

$hash{'v1'} = 'value1';
$hash{'v2'} = \@array;
$hash{'v3'} = 'value2';

$testArray[0] = {%hash};


@array = ('test11','test12','test13','test14');

$hash{'v1'} = 'value1';
$hash{'v2'} = \@array;
$hash{'v3'} = 'value2';

$testArray[1] = {%hash};

print $hash{'v1'}."\n";


my $value;
my %testHash;


##########################################

%testHash = %{$testArray[0]};

foreach $value (@{$testHash{'v2'}})
{
    print $value."\n";
}

##########################################

%testHash = %{$testArray[1]};

foreach $value (@{$testHash{'v2'}})
{
    print $value."\n";
}

##########################################


print $hash{'v3'}."\n";

....................
Problemet med en pointer er, at den altid peger på samme sted.
så værdierne test1, test2, test3 og test4 vil ikke eksistere pga. at de bliever overskrivet af test11 ... test14 (i ovenstående eksempel).
Findes der en mulighed uden at bruge pointer?
Avatar billede kernelx Juniormester
14. november 2005 - 11:17 #4
$etEllerAndetArray[0] = {%enEllerAndenHash}; # det burde virke

# findes der ikke en mulighed, for at lave det den omvendte vej?
$enEllerAndenHash{'v1'} = {@etEllerAndetArray}; # virker ikke som det skal!?
Avatar billede erikjacobsen Ekspert
14. november 2005 - 12:30 #5
Umiddelbart ville jeg bare lade være med at bruge samme variabel.
Avatar billede kernelx Juniormester
14. november 2005 - 13:00 #6
det er ikke muligt.
i scriptet, som jeg vil komme til at skrive, ved jeg ikke hvor mange variabler det er. Skriptet skal være flexibel i dette punkt.
Avatar billede kernelx Juniormester
14. november 2005 - 13:52 #7
#!/usr/bin/perl

my %hash;
my @array = ('test1','test2','test3','test4');
my @testArray;

$hash{'v1'} = 'value1';
$hash{'v2'} = [@array];
$hash{'v3'} = 'value2';

$testArray[0] = {%hash};


@array = ('test11','test12','test13','test14');

$hash{'v1'} = 'value1';
$hash{'v2'} = [@array];
$hash{'v3'} = 'value2';

$testArray[1] = {%hash};

print $hash{'v1'}."\n";


my $value;
my %testHash;


##########################################

%testHash = %{$testArray[0]};

foreach $value (@{$testHash{'v2'}})
{
    print $value."\n";
}

##########################################

%testHash = %{$testArray[1]};

foreach $value (@{$testHash{'v2'}})
{
    print $value."\n";
}

##########################################


print $hash{'v3'}."\n";

--------------------------------
--------------------------------
$hash{'v2'} = [@array];

det virker.
Mange tak for hjælpen. Husk at skrive svar.
Avatar billede erikjacobsen Ekspert
14. november 2005 - 14:13 #8
Hvis du ikke skal have en variabel kan du

  $hash{'v2'} = [('test1','test2','test3','test4')];

Men ellers tak, jeg samler slet ikke på point.
Avatar billede kernelx Juniormester
14. november 2005 - 15:09 #9
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester