perlの引数が不安定になります。
具体的には、
同じ値が返されるはずなのに、返されません。
私の持っている、入門用の本を調べたのですが全くわかりません・・・
分かる方、教えていただけないでしょうか。
宜しくお願い致します。
open IN, 'Testfile.txt'; #Testfile.txtは、ある程度の大きさがあったほうが良いと思うので、ヤフーのトップページのソース全てなどが適当かもしれません。
my @array = <IN>;
close IN;
my $count = "1";
print &test(@array,$count); #何も表示されない
print "<HR>";
print &test2($count,@array); #1が表示される。
sub test() {
my (@array,$count) = @_;
return $count;
}
sub test2() {
my ($count,@array) = @_;
return $count;
}
No.1
- 回答日時:
my (@array,$count) = @_;
@arrayに@_のデータがすべて入り、
$countに入るデータはなし、
my (@array,$count) = @_;
の次にprint $count;
を入れれば検証できると思います。
シロトの考えることですから思いつきで書きました。
No.3ベストアンサー
- 回答日時:
> sub test() {
> my (@array,$count) = @_;
> return $count;
> }
こう書いた場合に何が起こるかというと、まず @_ に引数が列んで入っていますが、それが全部 @array に入ります。で、$count には何も入りません(undefのまま)。
どうしてそうなるのかというと、配列への代入で要素数を指定していないため、残りの要素全部という意味になるからです。
これを防止するには配列に全部入れてから最後の値を pop するとか、あるいは代入部分に配列のスライスを指定すればできます。(my (@array, $count); (@array[0..($#_ - 1)], $count) = @_; です)。
但しこれだと読み辛くなりバグの温床と成り兼ねないと思うので、リファレンスを使って渡した方がいいと思います。
例
&test(\@array, $count);
sub test {
my ($array, $count) = @_;
# この中で $array にアクセスする場合は
# $array->[X] の型式で行なう。
# 配列のスライスは @{$array}[X, Y, Z] の型式で可能。
# (但し内容を変えた場合は呼び出し元の方の内容も変わる)。
return $count;
}
No.4
- 回答日時:
すでに他の方が説明されているように、test2の方はそのままでもいいけど、testの方は書き換える必要があります。
サブルーチンの引数に配列とスカラーを同時に渡すと、それらがコピー代入された@_は、もともと配列やスカラーであったことなどは失われて単純に1つの配列と解釈されます。このようなことは、『初めてのPerl』(第3版) のpp.53-など、入門書の代入操作といったところを確認されるといいのではないかと思います。http://www.unix.org.ua/orelly/perl/learn/ch03_04 …
つまり、サブルーチンで引数を受け取るところで、質問にあるようなコードで書くならば、test2のようにスカラーを先に書く必要があると思います。あるいは、testの引数の順序はそのままに、testの引数を受け取る部分を別の書き方にする必要があります。
# 例1
sub test {
my @array = @_;
my $count = pop @array;
return $count;
}
# 例2
sub test {
my $count = pop; # pop(@_)
my @array = @_;
return $count;
}
# 例3
sub test {
my $count = $_[-1];
my @array = @_[0..($#_-1)]; # @_[0..(@_-2)]
return $count;
}
入門書にはたぶん書かれていないのですが、No.2の方のところで示されているように、プロトタイプ付きでサブルーチンを定義する方法もあります。@array = <IN>となっていて巨大な配列になる可能性もありますし、本当はNo.3の方が説明されているように、リファレンスというものを使うのが一番いいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- PHP PHP ページング データベース 1 2022/06/16 10:30
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl の外部モジュールの利用方法
-
ファイルアイコンの左下に緑の□...
-
perlのプログラミング 部分入れ...
-
ペプシコーラとコカ・コーラとD...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlについての質問
-
Blenderについて
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
秀丸での一括変換について
-
英数文字列のうちの数値を4桁に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Can't use string ("0") as an ...
-
行指向処理でデータの読み込み...
-
サンプルの意味
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
VBAのautofilter、criteriaの配...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
ハッシュ検索はなぜ速い
おすすめ情報