-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;

输出:

schmoe2smith3simpson4

我期待着到达2345...

我怎么了foreach

4

3 回答 3

2

因为您只更改了值,甚至没有更改哈希的键...

如果要更改键和值,可以执行以下操作:

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

但是我觉得没多大意义...

于 2012-11-18T15:59:32.640 回答
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";
}
于 2012-11-18T16:06:04.167 回答
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" );

您无法更改密钥,只能删除它们并制作新密钥。如果你这样做了,你的任务就毫无意义了。

于 2012-11-18T17:42:54.450 回答