現在、業務でperlプログラムを書いてます。
perlを初めて2か月、プログラムは ほぼ初です。
よろしくおねがいします。
例えば以下のようなコードで、「sub_func」というメソッド内で「main」メソッド内の配列データを直接編集したいのですが、うまくいきません。
これは、引数で渡しているのは配列の「ポインタ」ではなく「リファレンス」であるため、「sub_func」というメソッド内で、新たに「array_ref」という配列の実態を作成してしまっているのだと認識しています。
そのため、「main」メソッドに戻ったタイミングではデータは元に戻ってしまうのだと思っています。
sub sub_func {
my ($self, $array_ref) = @_ ;
$array_ref = [4,5,6]; # returnはせずに、引数で指定したデータに格納したい
}
sub main {
my ($self) = @_ ;
# メソッドに渡すデータ
my $data = {
array => [1,2,3],
};
my $data2 = [1,2,3];
my @data3 = (1,2,3);
# メソッドの中で、$data->{array}を [4,5,6] に変えたいが・・・
$self->sub_func( $data->{array} );
$self->sub_func( $data2 );
$self->sub_func( \@data3 );
# この時点で、どれも [1,2,3] のまま
}
私の認識は間違っているのでしょうか??
また、どのようにすれば配列の要素を別のメソッド内で編集できるのでしょうか??
御助言をお願いします。
No.1ベストアンサー
- 回答日時:
(ぼそ) 「ポインタ」と「リファレンス」は同じものだと思っていい (endぼそ)
現状では
サブルーチン sub_func で引数をいったん変数 $self, $array_ref にコピーし, この「コピーした」$array_ref を書き変える
という動作です. コピーした時点で $_[0] と $self, $_[1] と $array_ref は「同じ値を持つ別の変数」です. だから, サブルーチン main の変数はどれも変化しません.
ちなみに $_[1] = [4, 5, 6]; だと @data3 以外は書き変わります. まあ, これも妥当かな.
ということで
@$array_ref = (4, 5, 6);
では?
Tacosanさん、ご回答ありがとうございます。
「ポインタ」と「リファレンス」は多少違うものと認識していたので、こういったところで違ってくるのかと思ってました・・・。
$self, $_[1] と $array_ref は「同じ値を持つ別の変数」というのは認識していたのですが、なぜ引数で渡したアドレスをそのまま参照してくれないのか不思議でなりませんでした。
ご指摘の件、試してみたところ、正常に動作するようになりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlでファイルの拡張子を除い...
-
非共通要素を抜き出す
-
プログラミングについて。 1つ...
-
文字列を変数名として扱う方法
-
どなたかこのプログラミングを...
-
ネットワークループとルーティ...
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
二次元配列のインデックスについて
-
イベントの発生を待つ
-
UWSCの終了の仕方
-
Strawberry Perl for Windows ...
-
多重ループの抜けだし方
-
Perlで<select multiple>の複数...
-
ハッシュ検索はなぜ速い
-
*(アスタリスク)の意味
-
【VBA】指定の範囲から特定の文...
-
チェックデジットについて
-
VBA横データを縦にしたいです
-
DOSコマンドのループ内のTIMEコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースから取得したデー...
-
perlで2つの配列を比較する方...
-
DBIを使ってのデータの取り出し...
-
python質問
-
perlでファイルの拡張子を除い...
-
アルファベットn文字の組み合わ...
-
grep関数を用いた複数行からの抽出
-
乱数と順列と組み合わせ
-
半角文字の縦書き表示
-
配列やハッシュで中身が同じか...
-
ループ中でのmy宣言と処理速度
-
桁数指定と四捨五入
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
おすすめ情報