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

しかし、ハッシュ名は紛らわしいです。これは table ではなくhashです。

hash を反復処理する別の解決策:

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;

keysとの両方からのハッシュ要素の順序valuesは半ランダムですが、それらは一貫して半ランダムであり、互いに同じ方法であるため、これはループと同じことを効果的に行います。私が言ったように、それはかなり無意味な演習であるため、これがあなたがやろうとしていることだとは思えません.

ハッシュに割り当てる場合:

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 に答える