人様の作ったスクリプトの解析をしています。
下記のスクリプトについて質問があります。
my $now = zikoku();
print "$now です。\n";
sub zikoku {
my ($sec, $min, $hour) = (localtime)[0..2];
if (wantarray) {
return ($hour, $min, $sec);
} else {
return sprintf "%02d:%02d:%02d", $hour, $min, $sec;
}
}
まず、zikoku(); の部分なのですが、現在自分はサブルーチンは&で呼び出すものとしか認識しておらず、ここではどのような用法で使われているのかがわかりません。();は何なのでしょうか??
また、localtime関数の次の[0..2]の意味が分かりません。
そして、wantarray関数自体の働きは一応理解しているのですが、ここではwantarray関数にどのような意味があるのかが分かりません。
分かる方いらっしゃいましたらご教授頂けると幸いです。よろしくお願いします。
No.1
- 回答日時:
zikoku();
引数無しでサブルーチン zikoku を呼び出しています。
[0..2]
配列 スライス で検索してみて下さい。0..2 の部分は 0, 1, 2 と同じです。
前回質問されていた時には3項演算子で
wantarray ? 真の場合 : 偽の場合
となってましたが、それが if の構文に変わっただけです。
参考URL:http://www.rfs.jp/sb/perl/index.html
回答ありがとうございます!
3つ目のwantarrayですが、すいません、質問の仕方が悪かったです。ここでwantarrayを使って、リストが要求されている場合に真を返し、スカラーが要求されている場合には偽を返すことにどのような意味があるのか分からないという意味だったんです。
また、一つ質問を追加させてください。一つ前の質問のことなのですが、wantarray ? の「?」は一体どのような意味を持っているのでしょう??ご教授よろしくお願いしますm()m
No.2
- 回答日時:
「真を返す」ではなく、
「真の場合には(リストコンテキストの場合)」、($hour, $min, $sec) を返し、
「偽を返す」ではなく、
「偽の場合には(スカラーコンテキストの場合)」、23:33:35 の様な文字列を返すと言うことです。
? は単体で使用されているのではなく、3項演算子
ブール値 ? 真の場合 : 偽の場合
として使用しています。参考URLの条件演算子の項をご覧下さい。
参考URL:http://www.rfs.jp/sb/perl/02/03.html#4.%E8%AB%96 …
No.3
- 回答日時:
アレ?私質問の意味を取り違えたでしょうか?
if (ブール値) {
#ブール値が真の場合
} else {
#ブール値が偽の場合
}
なので wantarray が真偽を返さないと if 構文が動作しない・・・のですが・・
すいません、自分まだまだ基礎知識が足りてないです・・。
wantarrayは、実行中のサブルーチンの戻り値として、リストが要求されている場合に真を返し、スカラーが要求されている場合には偽を返す、とウェブ上のリファレンスには載っているのですが(おそらく、話題のサブルーチンを例にして言えば、戻り値が配列の時は ($hour, $min, $sec) を返し、戻り値が変数の場合は sprintf "%02d:%02d:%02d", $hour, $min, $sec を実行して返すということなのだと解釈してますが合ってるでしょうか??)、そもそも「実行中のサブルーチンの戻り値」とは具体的に何を指しているんでしょうか??そこからして理解してなかったです。「戻り値」の定義自体もちょっとよく分かってないかもしれません。。そして、なぜ時刻をブラウザに表示させるのにwantarrayを使わなければいけないのかが分からないのです。
@yobi = ('日', '月', '火', '水', '木', '金', '土');
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
print "$year年$mon月$mday日($youbi[$wday]) $hour時$min分$sec秒\n";
上のスクリプトでも出来るのに。なぜわざわざwantarrayを使うのだろう・・・?と。
また なぜ (localtime)[0..2] なのだろう?と。[0..2] って何ですか?と聞くよりは (localtime)[0..2] って何ですか?と聞いたほうが早かったかもしれません。
よろしければご教授おねがいします。
No.4
- 回答日時:
>zikoku(); の部分なのですが、現在自分はサブルーチンは&で呼び出すものとしか認識しておらず、ここではどのような用法で使われているのかがわかりません。
();は何なのでしょうか??サブルーチン呼出は、定義がされる前に呼び出す場合、&を付ける必要があります。(単なる文字定数として解釈されてしまうため)
引数無しでサブルーチンを呼び出す場合は、( )は、本来必要ありませんが、この場合、( )があることで、サブルーチン呼出として解釈されます。("()"が付いていることで定数文字列じゃなく関数呼出だとわかる)
>localtime関数の次の[0..2]の意味が分かりません。
配列スライスと言います。
@array[0..2]とすれば
($array[0],$array[1],$array[2])
を表します。
my ($sec, $min, $hour) = (localtime)[0..2];
とすれば、localtimeが返すリストの最初の3つを取り出して左辺のそれぞれに代入することになります。
>ここではwantarray関数にどのような意味があるのかが分かりません。
つまりサブルーチンが配列を要求する場面で使われているか、スカラーを要求する場面で使われているかを判断して、配列の場合配列、スカラーを要求されている場合スカラーを返すために(場面判断のために)使います。
質問文のスクリプトの場合
my $now = zikoku();
は、文字列として要求されているので、サブルーチンは、"hh:mm:ss"を返すということになります。
仮に
my @now = zikoku();
で呼び出されていたら
(h, m, s) を返すということです。
なぜ、わざわざそういうようにするのかというと、この(文字列として要求される)場面だけでなく、他の場面でも使えるように、使い回しが利くように作っているのだと思います。
No.5ベストアンサー
- 回答日時:
戻り値が配列の時・・・というよりは、戻り値として配列を期待されている時に wantarray が真になります。
たとえば No.4 の方が書かれている
my @now = zikoku();
のように、配列に代入する時や、
print zikoku();
の様なケースです。これらはリストコンテキスト(文脈上リストとして解釈される)といいます。
逆に
my $now = zikoku();
はスカラー変数に代入しようとしていますのでスカラーコンテキスト(文脈上スカラーとして解釈される)です。print の例で言うと、
print scalar zikoku();
のように scalar と言う関数を使えばスカラーコンテキストを強制することができます。
戻り値はサブルーチンの中で最後に評価された式の値です。もしくは今回の関数のように return で「これを返すんですよ」と明示してやります。
書物で言えば「初めてのPerl」を読めば用語その他すっきりするのではないでしょうか。(結構歯ごたえがありますが。(^^;)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- Perl perlの構文でカンマの意味が分からない 2 2022/10/30 01:53
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- その他(プログラミング・Web制作) 【Python初学者】以下コードについて教えていただきたいです 4 2023/04/19 13:01
- 英語 英語に詳しい方に質問です。 2 2022/06/21 15:33
- その他(社会・学校・職場) 誰か聞いてください。 社会人6年目ですが、私はポンコツすぎますか? 上司にとあるAファイルの数式を全 1 2023/08/10 18:25
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリから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コ...
-
ハッシュ検索はなぜ速い
おすすめ情報