電子書籍の厳選無料作品が豊富!

Perl初心者です。
簡易なタイマーのプログラムです。

(1)$s=shift||60;
この部分の shift と || はどういった意味合いを持っているのでしょうか。

(2)for(1..$s)
このfor構文の括弧内はどういった意味合いを持っているのでしょうか。

$s=shift||60;
$|=1;
for(1..$s){
sleep 1;
print"$_\r"
}
print"\n"

A 回答 (5件)

なぜ誰も質問に回答しないのでしょう?


http://search.cpan.org/~rjbs/perl/pod/perlsyn.pod
"Many of Perl's syntactic elements are optional. Rather than requiring you to put parentheses around every function call and declare every variable, you can often leave such explicit elements off and Perl will figure out what you meant. This is known as Do What I Mean, abbreviated DWIM. It allows programmers to be lazy and to code in a style with which they are comfortable."
とあるとおり、Perl は省略の多い言語なので読みづらいと思います。
ご質問のプログラムを省略せずに書くと次のようになります。

$seconds = shift(@ARGV) || 60;
$| = 1;
for $_ (1 .. $seconds) {
sleep 1;
print "$_\r";
}
print "\n";

$s を $seconds に変えてみました。
@ARGV は argument vector の略称で、コマンド プロンプトから
>perl timer.pl 180
のようにプログラムを実行した場合に、コマンドライン引数である「180」が格納される配列です。

shift は配列の先頭の要素を取り除いて返す関数ですが、配列を何も渡さないと @ARGV を shift します。
つまり shift() は shift(@ARGV) と同じです。かっこは省略可能なので単に shift と書いても同じです。
(ただしサブルーチンの中での shift は shift @_ を意味します。)

したがって
$s = shift || 60;
というのはコマンドライン引数が渡されたらコマンドライン引数、渡されなかったら「60」を $s に代入するという意味になります。
この書き方はコマンドライン引数を受け取りつつ、デフォルト値も設定したいときによく使われます。

$| = 1; については説明は不要でしょう。

for (1 .. $s) {
# ここに繰り返したい処理を書く
}
の 1 .. $s というのは「1 から $s までの整数のリスト」を意味します。
この .. というのは範囲演算子と呼ばれるもので、たとえば 1 .. 10 と書くと (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) というリストを簡単に作ることができます。

しかし、この場合は「1 から $s までのリストを作る」というよりかは、「要素数 $s のリスト」を作って、それを for 文でループすることにより、「$s 回ループさせる」ことを目的としています。

たとえば同じ処理を 10 回繰り返したいときは

for (1 .. 10) {
# ここに処理
}

と書けばよいわけですが、それと同じで

for (1 .. $s) {
# ここに処理
}

と書くことで同じ処理を $s 回繰り返すことができるわけです。
繰り返すごとに $_ に 1 から $s までの整数が順番に代入されていきます。
sleep 1; を $s 回繰り返せば $s 秒 sleep したことになりますから、もとのプログラムの意味が明らかになったかと思います。
また何かありましたら補足してください。
    • good
    • 0
この回答へのお礼

なるほど~、とてもわかりやすい。。。
コマンドライン引数からshiftしているわけですね。
$hoge = shift;という形の使い方はほうぼうで見るのですが、意味がわからず困っていました。
ありがとうございます

お礼日時:2012/08/06 10:37

shift は


・(指定した) 配列の要素を 1つずつ (添え字の小さい方に) ずらす
・押し出された (元) 先頭要素を返す
わけだから, 厳密にいうと「配列から値を取り出す」とはちょっと違う.
    • good
    • 0

> ||演算子はorの用法であるというのは分かるのですが… or die みたいのはよく目にします。

そういった感じでしょうか?

そうです。違いは優先順位です。
この式に括弧を付けるなら
$s = (shift || 60) ;
です。
$s= shift or 60 ; だと ($s = shift) or 60 ;の意味になります

「左被演算子が真であれば、右被演算子は評価さえ 行なわれないということです」
にしたがって
(1)まず shift を評価する。→ (デフォルトの)配列から先頭要素を取り出す。取り出した値が「評価結果」
(2) (1)が真ならば右側は評価しない。(1)が最終結果
(3) (1)が偽ならば右被演算子である 60 が評価→定数なので、そのままの60が評価結果
となります。

A or die も同様に
(1) Aを評価.成功すると真/失敗すると偽になる
(2) Aが真ならそこまで
(3) Aが偽なら dieを評価→プログラム強制終了
となります。

and, &&も真偽が逆なだけで、同様な処理をします。

> shiftには、配列から値を取り出す以外の使い道があるんですか?

shiftにはそれしかありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2012/08/06 10:35

一応、日本語訳も。


http://perldoc.jp/docs/perl/5.14.1/perlop.pod

shiftは関数なんでperlfuncですね
http://perldoc.perl.org/functions/shift.html
http://perldoc.jp/docs/perl/5.14.1/perlfunc.pod


ちょっと難しいのは、|| の説明にある「左被演算子が真であれば、右被演算子は評価さえ 行なわれないということです」くらいです。
あとは読めばわかると思います。

この回答への補足

回答ありがぞうございます。
||演算子はorの用法であるというのは分かるのですが… or die みたいのはよく目にします。そういった感じでしょうか?
shiftには、配列から値を取り出す以外の使い道があるんですか?

$s=shift||60;

補足日時:2012/07/30 23:58
    • good
    • 0
    • good
    • 0
この回答へのお礼

英語は難しいです・・・><

お礼日時:2012/08/06 10:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!