作者: Bruce.
日時: 2006/3/23(08:58)
Bruce.です。

davi writes:

> > 多分、CGIでは有名なサイトのサンプルスクリプト
> 
> を、そのまま貼り付けて使ってあります。

いかんなあ。
こういう風に使われることはわかってるんだから、直すべきところは
直さないと。

> さて、この件に関連して正規表現の初歩的な質問です。
> いつもしっくり来ないのでおせーてください。
> 
> > $dest1 = $dest2 = $src;
> 
> 動作の順番は右端から左へ進んでゆくのでしょうか。
> つまり、日本語プログラム言語MINDじゃないけども、

そうです。括弧をつけるなら

   $dest1 = ($dest2 = $src);

になります。


> $src を $dest2 に 代入する。
> そして
> $dest2 を $dest1に代入する。
> 
> こうなのでしょうか。それとも

$src の値を $dest2に代入し、その式の値(つまりは$srcの値であり
$dest2の値ですが)を$dest1 に代入。となります。

use strict;
my $src;
my $dest;

$src = "hello, ";

print $dest = $src . "world";
print "\n";
print $dest;

CやPerlではBASICなどとは違い、代入は「式」です。
つまり値を持ちます。であるから、while ()なんかの判定部分に
置けるわけですね。

> > $dest1 =~ s/%([a-fA-F0-9]{2})/pack('C', hex($1))/eg;
> 
> のような表記は、
> 
> $dest1の中身「を」s///の左側に放り込んで(代入して)、
> 正規表現に一致した分をs///の右側に置き換え、
> そうしてから
> $dest1に戻す(代入する)

= を使っていますが、この場合代入にこだわらない方が良いでしょう。

たとえば awk では gsub(/hoge/, "fuga", str) のように関数形式で
その第三引数で置換対象を指定します(省略されたときは$0)。

同様に、=~ は 右辺に置かれた式の対象を左辺に置かれたものにする。
というだけのことです。Perlの中の人は s/src/dest/ を実行するときに
置換を行う関数を実行していて、

> > $dest1 =~ s/%([a-fA-F0-9]{2})/pack('C', hex($1))/eg;

を、

gsub(/%([a-fA-F0-9]{2})/, "pack('C', hex($1)", $dest1)

のように解釈していると考えれば良いのでは。
#eオプションはとりあえず忘れてください。
 
> # 遠隔ですが、文学系では定価*印刷数*0.1が印税の標準みたい。
> # 共著はそれを人数頭割りや、汗をかいた割合で分配するのでは?

あの本は元々わたし一人で書くはずのものでした。
で、締め切りが近づいてもペースが上がらないので編集さんが
ヘルプをつけてくれたのです。あの話は、最初に執筆の話が来たときの
ものです。って具体的な提示額はいえませんけどね(笑)

いじょ。