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

ある書籍で、見つけました、perlのソースについて
疑問がありまして、お尋ねします。


※下記は、perl/cgiソースの一部です。
ある書籍で見つけたものです。

>require 'cgi-lib.pl';

>&ReadParse(¥%test);
私は、(%test)だと思っているのですが。
()の中の、先頭に「¥」を付けることに、どのような意味
があるのでしょうか

>$test = $test{'test'};
仮に、$testの値が「"<&>"」だったとしまして、以下
をごらん頂きたいのですが、

>open(ファイルハンドル,$fname)
>while(<ファイルハンドル>){
>$test =~ s/¥"/¥&quot¥;/g;
私の認識では、「s/"/&quot;/g;」ではと思うのですが、
「¥」はどのような意味なのでしょうか
以下、3行も同じ疑問です。
>$test =~ s/&/\&testmp\;/g;
>$test =~ s/¥</¥&lt¥;/g;
>$test =~ s/¥>/¥&gt¥;/g;
>print $_;
>}

書籍で上記のソースを見たのですが、
HTMLのフォームのテキストボックスに、「"<&>"」と入力し
submitボタンで、上記コードを含む、cgiを開きます。

そして、「"<&>"」を受取っても正しく、置換し、
cgiから、HTML($fname)を開くプログラムです。

置換後のHTMLファイルには、「"<&>"」と表示されます。


以上、よろしくお願いいたします。

A 回答 (3件)

他の人と同じ内容なんですが、正式名称で説明します。



\をPerlでは[バックスラッシュ](もしくは[逆スラッシュ])と呼びます。
円記号で表示されるのは、日本のWindowsのみで
特にプログラムでは不正確な表記です。


Perlの \[逆スラッシュ] には幾つかの違う意味があります。
  [1]: メタ文字を定義する。
  [2]: インタプリタへの命令文を通常の文字列として解釈させる。
  [3]: リファレンスを抽出する。
これらはPerl文法の1番基本の部分の一つです。


[1]は誰もが(?)何気なく使っているであろう "\n" とかです。
改行文字でもなんでもないのに、メタ文字として解釈され、
内部で改行文字に置き返られます。
こーゆー勝手に違う文字や、違う概念として扱われる文字をメタ文字と言います。


[2]は、s/\"/\&quot\;/g; まさにこれです。
この例では、;[セミコロン] で文が終了されずに通常の文字列として解釈されます。
正規表現中は、通常の場合だと関数展開が行われないので、
& の前方に \ はいらないのですが、プログラムは人間が読む物なので、
関数展開しないと言う事を明示的に示すため、普通は \ を記入します。


[3]は、詳しく言っても分からない予感がするので、適当に説明します。
リファレンスはポインタ(アドレス)のようなものだと思ってください。
全てのデータは、アドレスを持ってます。
アドレスを「持ってる」と言より、アドレス上の「位置」にデータが存在します。
その位置情報(リファレンス)を取り出します。

 /%test;
これは、%test が持っている実体の位置です。
どうゆうことかと言うと、変数は値を保有しているのではなく、
変数は実際のデータ位置を知っていて、自由にアクセスできると言うことです。
その位置(リファレンス)を変数に問い質して入手する時に \ を使います。
なお、そのデータ(リファレンス)にアクセスする時は [デリファレンス]と呼びます。
意味分からないと思いますが、今の段階では絶対分からないと思うのでスルーして下さい。



一応、これらは基本なんでどこにでも書いてあると思いますので、
知りたければ検索するとすぐ出てきます。
あと、今回みたいな疑問が沸いた時、とりあえずコンパイルしてみるといいです。
-cw で起動させると、実行なしのコンパイル、エラー内容が出力されます。

※なお、Perlは適当な書籍を買うと嘘だらけですので気をつけて下さい。
オライリーの本の場合は初心者には難しいかもしれませんが、とりあえず適当な表現と嘘はないです。
サイトだったらそこそこまともな所は多いです。
http://www14.atpages.jp/jelfe/
あと、実は付属のマニュアルが市販の本よりずっと性能いいです。
    • good
    • 0
この回答へのお礼

ご返信、ありがとうございます。
気になっていたんですが、理解できました。

お礼日時:2010/10/08 08:23

まず


&ReadParse(¥%test);
の \ は「リファレンス」を生成しています. サブルーチン ReadParse の中でハッシュ %test の内容を変更しているんじゃないでしょうかね.
あと,
$test =~ s/¥"/¥&quot¥;/g;
の 3個の \ のうち, 本当に必要なのは ; の前の 1つだけです. これは #1 が言われるように「文を終わらせる ; と区別するため」です. 他の 2つはなくても動作します.
    • good
    • 0
この回答へのお礼

ご返信、ありがとうございます。
気になっていたんですが、理解できました。

お礼日時:2010/10/08 08:22

「\」は次の文字が特殊文字のときに次の文字を普通の文字として認識してほしい時に使います。


例えば「\\」は「\」文字を表します。「¥"」は「"」ですし「¥&」は「&」です。
通常「%test」は連想配列を表しますし「;」は文章の終りを表すのでその前に\を置いて
perlインタプリタが文字として認識してくれるようにしてます。その他も同様の理由で
「\」を使っています。
    • good
    • 0
この回答へのお礼

ご返信、ありがとうございます。
気になっていたんですが、理解できました。

お礼日時:2010/10/08 08:21

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