これまでのところ、ここにある他のすべての返信はかなり複雑に思えます。Perl 関数を書くとき、私は通常、渡されたすべての引数を関数の最初の行で「展開」します。
sub someFunction {
my ( $arg1, $arg2, $arg3 ) = @_;
これは、関数を次のように宣言する他の言語と似ています。
... someFunction ( arg1, arg2, arg3 )
そして、そのようにしてハッシュを最後の引数として渡すと、トリックや特別な魔法がなくても問題ありません。例えば:
sub testFunc {
my ( $string, %hash ) = @_;
print "$string $hash{'abc'} $hash{'efg'} $string\n";
}
my %testHash = (
'abc' => "Hello,",
'efg' => "World!"
);
testFunc('!!!', %testHash);
出力は期待どおりです。
!!! Hello, World! !!!
これが機能するのは、Perl では引数が常にスカラー値の配列として渡され、ハッシュを渡すと、そのキー値/ペアがその配列に追加されるためです。上記のサンプルでは、配列 ( ) として関数に渡される引数@_
は、実際には次のとおりです。
'!!!', 'abc', 'Hello,', 'efg', 'World!'
と '!!!' は単純に に割り当てられますが、他のすべての引数%string
を%hash
「飲み込み」、常に 1 つをキーとして解釈し、次の引数を値として解釈します (すべての要素が使い果たされるまで)。
そのように複数のハッシュを渡すことはできず、ハッシュを最初の引数にすることはできません。そうしないと、すべてを飲み込み、他のすべての引数が割り当てられないままになります。
もちろん、最後の引数として配列に対してもまったく同じことが機能します。ここでの唯一の違いは、配列がキーと値を区別しないことです。それらの場合、残ったすべての引数は値であり、配列にプッシュされます。