-4

次のコードが Perl にあり、ハッシュ参照が main 関数から func1 に渡され、次に func2 に渡されます。func2 ではハッシュが更新されます。メイン関数で更新されたハッシュにアクセスしたい。また、main 関数には while ループがあり、反復ごとにハッシュが更新されることを期待しています。コードは論理的に見えないかもしれませんが、コードの骨組みを書きました。メイン関数でハッシュを出力しようとすると、常に空のハッシュが得られます

sub main {
      my %hash1;
      while (some condition)
      {
        my $i=0;
        if($i==0)
        { 
          func1($i,\%hash1);                      
          $i=1;
        }
        else
        {  
          func1($i,\%hash1);                      
          $i=0;
        }
      }
      foreach my $a (keys %hash1)
      {
        print "$hash1{$a}";
      }       
}
sub func1
{    
my ($i,$hash1)=@_;
----
if($i==0)
{ 
   func2($hash1);       
}

}

sub func2
{
my ($hash2)=@_;
$hash2->{key1}=1;
$hash2->{key2}=2;
}
4

1 に答える 1

1

ああ、なるほど。ハッシュが空であるため、何も出力されていないと思います。しかし、実行するものを何も与えていないため、実際には何も印刷していませコンパイルするものを与えていますが、実行するものは何もありません。

sub mainPerl では何の意味もありません。それを実行するには、メインラインのどこかに配置する必要があります。main();次に、25 行目をコメントアウトすると、---期待どおりの出力が得られます。

これが、自分で印刷することが 1) もう少しタイピングが必要か、2) 信頼性が低いかのいずれかである理由です。何も表示されず、ハッシュが空であると考えました。実際には、コードは宣言に到達することさえありませんでした。したがって、コマンドラインでのヒントは次のとおりです。

 cpan Smart::Comments

そして、あなたのコードで:

use Smart::Comments;
...

### %hash1

そうすれば、空のハッシュは次のようになります。

### %hash1: {}

そして、あなたが期待するものは次のようになります:

### %hash1: {
###           key1 => 1,
###           key2 => 2
###         }

サブルーチンを呼び出さないと、main出力は次のようになります。

(はい、空白です)

それ以外の場合は、ハッシュを渡すことに問題はありません。

于 2011-06-02T12:41:12.940 に答える