サブルーチンの引数として配列を渡す Perl
サブルーチンの引数に配列を渡します。
通常のサブルーチン呼び出しに、
配列を渡すとどうなるでしょう。
つまり、値渡しという形で引数を渡します。
通常のサブルーチン呼び出しに、
配列を渡すとどうなるでしょう。
つまり、値渡しという形で引数を渡します。
配列ではなくハッシュを渡すには、
サブルーチンの引数としてハッシュを渡すをご覧ください。
サブルーチンの引数としてハッシュを渡すをご覧ください。
sub receive_array
{
my ($param) = @_;
foreach (@{$param}) {
print "$_\n";
}
}
@array = (
"item0",
"item1",
"item2",
"item3",
"item4");
&receive_array(@array);
{
my ($param) = @_;
foreach (@{$param}) {
print "$_\n";
}
}
@array = (
"item0",
"item1",
"item2",
"item3",
"item4");
&receive_array(@array);
サブルーチンreceive_arrayは、
引数に渡された配列を全て出力します。
しかし、上記のコードでは出力されません。
引数に渡された配列を全て出力します。
しかし、上記のコードでは出力されません。
サブルーチンreceive_arrayを呼出す際の、
引数
そこで、配列を参照渡ししてみます。
引数
@arrayが値で渡されています。
そこで、配列を参照渡ししてみます。
参照渡しとは、値渡しが変数の値をコピーするのに対し、
渡された変数を直接参照します。
渡された変数を直接参照します。
イメージとしては、サーバからファイルをダウンロードして、
ダウンロードしたファイルを編集するか、
サーバー上のファイルをtelnetクライアントなどで、
直接編集するかの違いのような感じです。
ダウンロードしたファイルを編集するか、
サーバー上のファイルをtelnetクライアントなどで、
直接編集するかの違いのような感じです。
または、書類などをコピーして、コピーした書類に書き込むか、
コピーせず、直接書類に書き込むかの違いです。
コピーせず、直接書類に書き込むかの違いです。
イメージできたでしょうか。
つまり、引数に渡した値は、値渡しの場合には、
呼出し元には影響しませんが、
参照渡しの場合には、影響してきます。
呼出し元には影響しませんが、
参照渡しの場合には、影響してきます。
参照渡しで配列を渡し、
この配列の内容を変更する事ができます。
戻値として配列の代入を行う必要が無いのです。
この配列の内容を変更する事ができます。
戻値として配列の代入を行う必要が無いのです。
参照で渡すには、\(バックスラッシュ)をつけます。
バックスラッシュは、環境によって円マークで表示される場合もあります。
バックスラッシュは、環境によって円マークで表示される場合もあります。
&receive_array(\@array);
とすると、各行にitem0~item4までを出力します。
それでは、配列の要素の値が変更されるかどうかを
調べてみたいと思います。
調べてみたいと思います。
sub receive_array
{
my ($param) = @_;
foreach (@{$param}) {
print "$_\n";
$_ =~ tr/[a-z]/[A-Z]/;
}
}
@array = (
"item0",
"item1",
"item2",
"item3",
"item4");
&receive_array(\@array);
print "\n";
foreach (@array) {
print "$_\n";
}
{
my ($param) = @_;
foreach (@{$param}) {
print "$_\n";
$_ =~ tr/[a-z]/[A-Z]/;
}
}
@array = (
"item0",
"item1",
"item2",
"item3",
"item4");
&receive_array(\@array);
print "\n";
foreach (@array) {
print "$_\n";
}
どうでしょう。
小文字のitem0~item4の下に、
大文字でITEM0~ITEM4と表示されたと思います。
小文字のitem0~item4の下に、
大文字でITEM0~ITEM4と表示されたと思います。
どうやら、
$_は配列の各要素への参照のようです。
配列の要素の値を変更したくない場合には、注意が必要です。
参照で渡された配列を、
別の配列にコピーして利用する事が必要になります。
別の配列にコピーして利用する事が必要になります。
例えば、以下のようになります。
sub receive_array
{
my ($param) = @_;
my (@myArray) = @{$param};
foreach (@myArray) {
$_ =~ /[a-z]/[A-Z]/;
print "$_\n";
}
}
{
my ($param) = @_;
my (@myArray) = @{$param};
foreach (@myArray) {
$_ =~ /[a-z]/[A-Z]/;
print "$_\n";
}
}
上記のサンプルでは、
参照で受け取った配列をmyArray配列にコピーします。
そして、大文字への変換はコピーされた配列に対して
行うので、receive_array関数に渡した@arrayは、
上書きされません。
参照で受け取った配列をmyArray配列にコピーします。
そして、大文字への変換はコピーされた配列に対して
行うので、receive_array関数に渡した@arrayは、
上書きされません。
参照は、通常のスカラー変数、ファイルハンドル、配列、ハッシュ(連想配列)など、
ほとんど全ての物に利用できます。
ほとんど全ての物に利用できます。
また、参照を利用する事で、サブルーチンを配列に格納したり、
連想配列に格納したりする事も可能になります。
連想配列に格納したりする事も可能になります。
| 固定リンク
「Perl」カテゴリの記事
- LWP::Simpleのmirrorをgetに変更した。掲示板監視スクリプト(2014.01.25)
- XMLRPC::Liteで更新Ping(2009.05.29)
- 楽天APIで自動アフィリエイトリンク作成(2009.05.19)
- モジュールをインストールしてみる(2008.01.22)
- Perlでコールバック サブルーチンの引数としてサブルーチンの参照を渡す(2007.11.26)
コメント