#99 Article 983 Posted at 1995/12/05 23:53:34 by Mick'n (MAP1406) [SAHOU.1]

Subject: Re:*8 プログラミングお作法の話 /982 .... /941 /940

頼まれていないのに解説します。まず、perl での変数は $ ではじまります。
$a とか $b などですね。$_ とか $' など、記号が続くものは特殊な意味をもって
ますが、以下の例では $_ のみが使われてます。

1 行目:
($#ARGV>=0)||die "you must specify argument.\n";

  $#ARGV>=0 は引数の数を check してます。C で同様のことを記述してみる
ならば、

if (!(argc >= 1)) {
   printf("you must specify argument.\n");
   exit(1);
}

というところでしょうか。die というのはメッセージを表示してプログラムを
終了させるステートメントです。|| は OR 演算子ですが、
  expression || statement
で、expression が成立しなければ、statement を実行する、という風に使う
ことがよくあります。C などでの || の評価の仕方を理解していればわかる
と思います。

2 行目:
grep(printf("%s\n",($_==3||$_==5||$_==$ARGV[0])?"にゃん"x$_:$_),
     (1 ... $ARGV[0]));

これを分解してみるならば、

2-1: grep(
2-2:  printf("%s\n",
2-3:        ($_==3 || $_==5 || $_ == $ARGV[0])
2-4:            ? "にゃん" x $_
2-5:            : $_),
2-6:  (1 ... $ARGV[0])
2-7: );

となりましょうか。まず、2-6 行目から解説しますと、
  (1 ... $ARGV[0])
で、1 からはじまり、$ARGV[0] で終るリストを作ります。$ARGV[0] は一番目の
引数を表します。$ARGV[0] が 5 ならば、この行は (1, 2, 3, 4, 5) としたこと
に同じです。

で、grep というのは、grep(EXPRESSION, LIST) という構文で、
   LIST の各構成要素を $_ に代入した上で、EXPRESSION を評価し、
   それが真であれば、それを取り出し、リストを返す
というものです。

$ARGV[0] が 5 ならば、LIST は (1, 2, 3, 4, 5) になりますから、
  $_ に 1 を代入し、2-2 ~ 2-5 行を実行
  $_ に 2 を代入し、2-2 ~ 2-5 行を実行
                 :
  $_ に 5 を代入し、2-2 ~ 2-5 行を実行
というように実行されます。2-2 から 2-5 行は、3 項演算子と printf の
組合せで、C を使った経験のある方ならわかると思います。

で、これですべてです。

  Mick'n (MAP1406)