![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.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 したことになりますから、もとのプログラムの意味が明らかになったかと思います。
また何かありましたら補足してください。
なるほど~、とてもわかりやすい。。。
コマンドライン引数からshiftしているわけですね。
$hoge = shift;という形の使い方はほうぼうで見るのですが、意味がわからず困っていました。
ありがとうございます
No.4
- 回答日時:
shift は
・(指定した) 配列の要素を 1つずつ (添え字の小さい方に) ずらす
・押し出された (元) 先頭要素を返す
わけだから, 厳密にいうと「配列から値を取り出す」とはちょっと違う.
No.3
- 回答日時:
> ||演算子は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にはそれしかありません。
No.2
- 回答日時:
一応、日本語訳も。
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;
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- TOEFL・TOEIC・英語検定 英語 文法 1 2023/02/27 14:01
- その他(パソコン・周辺機器) XnViewにwebpを「いつも開く」に関連付けるとブラウザが開く 4 2023/05/15 12:26
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- その他(プログラミング・Web制作) Pythonでこのプログラミングを作りたいのですが 1 2022/10/24 18:56
- その他(プログラミング・Web制作) パイソンのプログラムで continue と passの違い 3 2022/03/25 07:38
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
delphi の 標準偏差のプログラ...
-
Excel VBA ユーザーフォームの...
-
VBA 多次元配列を用いてグルー...
-
エクセルVBAでTransposeの不思議
-
リストボックスに縦スクロール...
-
Dim flag(4) as boolean で配列...
-
perl 配列の要素数について
-
perlで配列の要素が空なのを知...
-
二次元配列のインデックスについて
-
Python IndexError:list index ...
-
チェックボックスのperlでの値...
-
クラスに配列を渡す方法
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
VBのReturnの使い方
-
VBAでの一時停止と再開の方法
-
アクティブセルから、A列最終行...
-
エクセル関数で1〜12の数字がル...
-
Do whileでExitせず、ループの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dim flag(4) as boolean で配列...
-
VBAのautofilter、criteriaの配...
-
二次元配列のインデックスについて
-
二次元配列における要素数のは...
-
エクセルVBAでTransposeの不思議
-
クラスに配列を渡す方法
-
リストボックスに縦スクロール...
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
文字の整列(printf)
-
perlで配列の要素が空なのを知...
-
perl 配列の要素数について
-
Strawberry Perl for Windows ...
-
VBA 二次元配列の1つ目を増...
-
チェックボックスのperlでの値...
-
perl 初等プログラミングについて
-
DBIを使ってSelect文 複数のカ...
-
複数のキーで配列をソートする...
-
Excel(VBA)で配列の要素数を...
-
newで個別に生成した配列にNULL...
おすすめ情報