eachとイテレーター
each関数について質問させていただきます。perl5.8.0です。
eachに渡す引数を、ハッシュ“変数”ではなくハッシュ記法を直接指定する方法はないでしょうか。
具体的には、
%hash = (a=>1,b=>2);
while (($k,$v)=each %hash) { ~
ではなく、
while (($k,$v)=each (a=>1,b=>2)){ ~
というように、eachに直接キーと要素を渡したいのです。
以下のようにいろいろ試したのですが、うまくいきません。
【1】 perl -e 'while (($k,$v)=each (a=>1,b=>2)){print "$k:$v\n";}'
Type of arg 1 to each must be hash (not list) at -e line 1, near "2)"
Execution of -e aborted due to compilation errors.
【2】 perl -e 'while (($k,$v)=each %{a=>1,b=>2}){print "$k:$v\n";}'
syntax error at -e line 1, near "%{"
Execution of -e aborted due to compilation errors.
【3】 perl -e 'while (($k,$v)=each %{(a=>1,b=>2)}){print "$k:$v\n";}'
(何も出力されない)
【4】 perl -e 'while (($k,$v)=each %{{a=>1,b=>2}}){print "$k:$v\n";}'
a:1
a:1
a:1
a:1
:
(無限ループ)
予想では【3】の書き方が正しいような気がしましたが出力されず、そして【4】は少なくとも参照はできているようなのに、イテレーターが正しく動作していないような感じです。
(そもそもイテレーターというのは変数じゃなく無名ハッシュのようなものでも有効なのでしょうか?)
また、試しにkeysで同じことをしてみると、
【5】 perl -e 'foreach (keys (a=>1,b=>2)){print "$_\n";}'
Type of arg 1 to keys must be hash (not list) at -e line 1, near "2)"
Execution of -e aborted due to compilation errors.
【6】 perl -e 'foreach (keys %{a=>1,b=>2}){print "$_\n";}'
syntax error at -e line 1, near "%{"
Execution of -e aborted due to compilation errors.
【7】 perl -e 'foreach (keys %{(a=>1,b=>2)}){print "$_\n";}'
(何も出力されない)
【8】 perl -e 'foreach (keys %{{a=>1,b=>2}}){print "$_\n";}'
a
b
keysでは【8】が期待どおりの動作をします。
どうぞよろしくお願いいたします。