perlでサブルーチンの引数を参照(渡す)する2つの方法
以下はその一例です。
use strict;
# Here are two arrays
my @i =('1','2','3');
my @j =('a','b','c');
# Before we do the processing, let's print them out and see what they look like
print "In main program before calling subroutine:i=". "@i\n";
print "In main program before calling subroutine:j=". "@j\n";
# Then we process it through the subroutine
reference_sub(@i,@j);
print "In main program after calling subroutine:i=". "@i\n";
print "In main program after calling subroutine:j=". "@j\n";
# Here is the subroutine
sub reference_sub
{
my (@i,@j)=@_;
print "In subroutine:i=". "@i\n";
print "in subroutine:j=". "@j\n";
# Here we are using pop, and shift for @_
push(@i,'4');
shift(@j);
}
得られた結果は以下の通りです。
F:\>perl\a.pl
In main program before calling subroutine:i=1 2 3
In main program before calling subroutine:j=a b c
In subroutine:i=1 2 3 a b c
in subroutine:j=
In main program after calling subroutine:i=1 2 3
In main program after calling subroutine:j=a b c
F:\>
この例では、サブルーチンは2つの引数@iと@jを持っています。この2つの引数をサブルーチンに渡すと、サブルーチンはそれらをすべて組み込み配列@_に入れ、@_の中に@iと@jの違いがない、つまり@_の中に混在して区別がつかなくなります。もう一度両方を取得しようとすると、@i = 1 2 3 a b c となり、@j は空になってしまうのです。多くの場合、これは明らかに私たちが望む結果ではないので、参照渡しを使います(ビッグ・キャメル本の第6章では、quot;incoming reference"と訳されています)。
コードに1つだけ変更を加えるだけです。
その手順は以下の通りです。
use strict;
# Here are two arrays
my @i =('1','2','3');
my @j =('a','b','c');
# Before we do the processing, let's print them out and see what they look like
print "In main program before calling subroutine:i=". "@i\n";
print "In main program before calling subroutine:j=". "@j\n";
# Then we process it through the subroutine
reference_sub(\@i,\@j);# where we add the backslash, or pass byreference (pass byreference, translated in chapter 6 of the Big Camel book)
print "In main program after calling subroutine:i=". "@i\n";
print "In main program after calling subroutine:j=". "@j\n";
# Here is the subroutine
sub reference_sub
{
my ($i,$j)=@_;# references are also a special form of data, they are stored as scalar variables in @_
print "In subroutine:i=". "@$i\n"; So here when we refer to them, we add two symbols in front of them, @ for this is an array and $ for it is a secondary reference.
print "in subroutine:j=". "@$j\n";
print "In subroutine:the third element is $$j[2]\n";# When referencing an element in the array the first $$ and the subsequent j[2] represent the third element in the array, while the second $$ represents the secondary reference
# Here we use pop, and shift for @_
push(@$i,'4');
shift(@$j);
}
その結果は以下の通りです。
F:\>perl\a.pl
In main program before calling subroutine:i=1 2 3
In main program before calling subroutine:j=a b c
In subroutine:i=1 2 3
in subroutine:j=a b c
In subroutine:the third element is c
In main program after calling subroutine:i=1 2 3 4
In main program after calling subroutine:j=b c
F:\>
という最終結果を観察することができます。
これは、サブルーチンの中で配列に対して行ったプッシュとシフトの操作が、メインプログラムの中で機能したことを意味しています。
なぜ、このようなことが起こるのでしょうか?
一般的に、サブルーチン内で変数をマイ宣言しているため、サブルーチン内でのみ動作し、メインプログラムでは値が変化しないようになっています。
ここでは、そのバックアップではなく、本当のパラメータであるメインプログラムの値を参照しているので、それに応じて変更されることになります。
関連
-
ディレクトリ内のファイルを再帰的に走査するためのPerlスクリプト
-
Perlの制御構造に関する学習ノート
-
Perlシェルコマンド呼び出しのメソッド概要
-
perlのsrand()とtime関数の使い方の紹介
-
特定の塩基比を持つランダムな配列を生成するための perl コード
-
PerlのSort関数の使い方まとめと使用例
-
[解決済み] Perlで「ハッシュの代入の要素数が奇数である」という警告が出る
-
[解決済み] Perl で bash コマンドを使用して文字列をエコーするにはどうすればよいですか?
-
[解決済み] Perlで環境変数を設定するには?
-
[解決済み] スクリプトからの不正なヘッダー。不正なヘッダー=<!DOCTYPE html> です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Perl uc,lc,ucfirst,lcfirst 大文字・小文字変換関数群
-
Perlは先頭と末尾の空白を削除します(左右の空白文字、空白文字を削除します)。
-
ファイル操作に関するPerl学習メモ
-
Perlの強力な正規表現の例を解説
-
Perl オブジェクト指向の例
-
2つのファイルを比較し、データをフィルタリングするスクリプトコード(perlで実装されている
-
PerlでMIME::Liteを使ったメール送信の例
-
コンストラクタでのPerlメソッド使用法入門
-
[解決済み] 演算子で指定された場所にベアワードが見つかりました。
-
[解決済み] Perl で STDOUT->autoflush(1) は何をするのですか?