2012-11-18 32 views
-1
use strict; 
use warnings; 

my %table = qw/schmoe joe smith john simpson bart/; 
my $da =1; 
my($key, $value); # Declare two variables at once 
while (($key, $value) = each(%table)) 
{ 
    $table{$key} = ++$da; 
} 

print %table; 

輸出:爲什麼我不更改perl中表中的每個值?

schmoe2smith3simpson4 

我期待去2345...

什麼是錯我的foreach

+0

我不太明白程序應該做什麼。原始代碼中沒有foreach。 –

回答

2

我想你誤解了一些東西。

值已更改,但是當您編碼print %table;時,將打印鍵和值。

隨着Data::Dumper模塊,它更清晰:

$ Perl 
Perl Console 0.4 
Perl> use Data::Dumper 
Perl> my %table = qw/schmoe joe smith john simpson bart/; 
6 

Perl> my $da =1; 
1 

Perl> my($key, $value); 
2 

Perl> while (($key, $value) = each(%table)) { $table{$key} = ++$da; } 
0 

Perl> print Dumper \%table 
$VAR1 = { 
      'schmoe' => 2, 
      'smith' => 3, 
      'simpson' => 4 
     }; 
1 

Perl> print %table; 
schmoe2smith3simpson41 

如果你想通過哈希迭代,你可以這樣做:

while(my($key, $value) = each %table) { 
    print "$key=$value\n"; 
} 

但散列名字是混亂的,它不是一個表但是散列

另一種解決方案,通過哈希迭代:

foreach my $key (keys %table) { 
    print "$key=$table{$key}\n"; 
} 
2

由於只是更改了價值甚至沒有哈希的關鍵...

如果要更改鍵和值,你可以這樣做:

while (($key, $value) = each(%table)) 
{ 
    #Remove the previous key 
    delete($table{$key}); 
    #Insert a key and a value (the same) 
    $table{++$da} = $da; 
} 

但我認爲它沒有多少意義...

1

如果你想要做的是改變值的散列的,不管鍵(一個有點意思的鍛鍊,因爲鑰匙進來半隨機的順序),你可以簡單地做:

for my $value (values %table) { 
    $value = ++$da; 
} 

或者短格式:

$_ = ++$da for values %table; 

然後你可以打印值:

print values %table; 

這將有效地做同樣的你的循環,因爲即使來自keysvalues散元素的順序是半隨機的,他們是半隨機的始終如一,彼此相同。我懷疑這就是你想要做的,因爲正如我所說,這是一個毫無意義的練習。

當分配給哈希:

my %table = qw/schmoe joe smith john simpson bart/; 

..然後奇數元素是關鍵,而偶數值,如果你這樣寫:

  # keys   values 
my %table = ("schmoe" => "joe, 
       "smith" => "john", 
       "simpson" => "bart"); 

您不能更改密鑰,你只能刪除它們並製作新的。如果你這樣做,你的任務是毫無意義的。

相關問題