perlのソースコードの疑問について

このQ&Aのポイント
  • perlのソースコードの一部についての疑問です。特定の記号についての意味や置換に関して認識が違います。
  • 特定の記号や置換に関しての疑問があり、詳しい意味や使い方を知りたいです。
  • perlのソースコード内の記号や置換について理解が深まらず、質問させていただきます。
回答を見る
  • ベストアンサー

ある書籍で、見つけました、perlのソースについて

ある書籍で、見つけました、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ファイルには、「"<&>"」と表示されます。 以上、よろしくお願いいたします。

  • Perl
  • 回答数3
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • jelfe
  • ベストアンサー率40% (15/37)
回答No.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/ あと、実は付属のマニュアルが市販の本よりずっと性能いいです。

fthk-2010
質問者

お礼

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

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

fthk-2010
質問者

お礼

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

回答No.1

「\」は次の文字が特殊文字のときに次の文字を普通の文字として認識してほしい時に使います。 例えば「\\」は「\」文字を表します。「¥"」は「"」ですし「¥&」は「&」です。 通常「%test」は連想配列を表しますし「;」は文章の終りを表すのでその前に\を置いて perlインタプリタが文字として認識してくれるようにしてます。その他も同様の理由で 「\」を使っています。

fthk-2010
質問者

お礼

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

関連するQ&A

  • Perlソースを2つのファイルに分ける

    2つ以上のCGIファイルを使う方法を教えてください。 例えば、 #!/usr/bin/perl (1.cgi) print "Content-type: text/html\n\n"; print '<html><body>'; $t1 = 'abcd'; $t2 = 'EF'; $t1 = &fnc($t1,$t2); sub fnc{  $s1 = @_[0];  $s2 = @_[1];  return $s1.$s2; } print $t1; print '</html>'; このソースの  'abcd' (2.cgi) と  $t2 = 'bc'; (3.cgi) と  sub fnc{ (4.cgi)   $s1 = @_[0];   $s2 = @_[1];   return $s1.$s2;  } の3つのタイプを外部ファイルとして、全部で4つのCGIに したいと思っていますが、可能か不可能か、可能であれば それぞれのCGIファイルのソースを教えてください。

    • ベストアンサー
    • Perl
  • Perlのファイルのアップロードの方法についてお聞きします。

    Perlのファイルのアップロードの方法についてお聞きします。 &ReadParseを用いた方法で、 $file = $in{'TENSOU'};で$file自体にデータが入るので 簡単だなと思っていましたが、送信元と送信後のファイルが若干違っていました。 使い方が間違っているのでしょうか? 以下、サンプル ◆HTML側 <FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"><P> ファイル: <INPUT TYPE="file" NAME="TENSOU" SIZE="32"><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> ◆Perl側 &ReadParseの例を用いた方法 #!/perl/bin/perl #!/usr/local/bin/perl use CGI; use CGI::Carp qw(fatalsToBrowser); #--->エラー対策 require 'cgi-lib.pl'; require 'jcode.pl'; $BUFSIZE = 2048; &ReadParse; # ==> 強力な変換 $file = $in{'TENSOU'}; # ==> 実態自体がデータなので、取り扱いしやすい $file_size = length($file); $file_size *= ($BUFSIZE / 1024); open(OUT, "> test.jpg"); print(OUT $file); close(OUT); print "Content-type: text/html\n\n"; print "$file_size(KB)<br>\n"; print "<a href=\"test.jpg\">テスト</a>\n"; exit;

    • ベストアンサー
    • CGI
  • CGIでhtmlを作成するもブラウザに表示されない(ソース表示あり)

    PerlでHTMLを表示するCGIを作成しました。 ローカルPCで試しているのですが、ブラウザは真っ白な表示で、ステイタスバーには「ページが表示されました」のメッセージがでます。 ソースを表示するとちゃんと指定したHTMLタグがあります。 何が正常な表示の妨げになっているのでしょう。 ちなみにPerlのコードはそんなに難しいものではなく #!/usr/local/bin/perl require "./lib/cgi-lib.pl"; &ReadParse(); print <<END; content-type: text/html <html> <head> <TITLE>送信処理</TITLE> </head> <body bgcolor="#cccccc"> <center> $in{'data'}<BR> </center> </body> </html> END 程度のものです。 ・マシンは富士通FMVでOSはWinXP ・WebサーバーソフトはAN HTTPD Daemon Version 1.41g ・CGIはCygwinのPerl5.8.0です。 ・ブラウザはIE6-SP2です。 この様にブラウザで真っ白な表示になるのは1つのCGIファイルだけで、他のCGIファイルは正常にブラウザ表示されます。

    • ベストアンサー
    • Perl
  • perl パラメータ

    このようなソースがあります。 require "test.cgi"; これはperlを読み込めますが、 require "test.cgi/path"; としますと、500Errorです。 .cgiの後ろのPATH_INFOをrequireで読み込むperlのパラメータとして渡す方法はありますか。

    • ベストアンサー
    • Perl
  • perlで以下の動作が出来る機能を作っています。

    perlで以下の動作が出来る機能を作っています。 1.ファイル名が載っているfname.txtを読み込む。 2.読み込んだファイル名を開く。 3.ファイルの内容を変換。 4.変換したファイル内容をnew_fileディレクトリに保存。※ファイル名はそのまま。 1~4までを作ったのですが、fname.txtで指定した全てのファイル名を変換して保存したいのに、一番最初に記載されてあるファイル名しか置換されません。書籍などで調べてもわからないのと今日中に製作したいのでここで質問しました。 ご教授お願いします。 以下にソースを貼ります。 #!/usr/local/bin/perl -w use strict; my $x = 0; my $y = 0; my $z = 0; open(IN,"<"."fname.txt")or die "cannot open txt_file: $!";#fname.txtを開く while(<IN>){ #chomp $_;#改行してファイル名を書き込んでいるので、改行を消去 my $fn = $_; my @F = $fn; foreach my $FNAME (@F){ open(FILE,"$FNAME")or die "cannot open txt_file: $!";#fname.txtに記載してあるファイルを開く open(OUT,">". "new_file/$FNAME")or die "cannot write txt_file: $!";#new_fileを開いて書き込む while(<FILE>){#以下、ファイルの置換内容 my @d; if (m/^[X1-9]+ (.*)/s) { ($y,$z)=(0,0); $d[0] = ++$x; $d[1] = 0; $d[2] = 0; $_ = $d[0] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+ (.*)/s) { $z=0; $d[0] = $x; $d[1] = ++$y; $d[2] = 0; $_ = $d[0] . "." . $d[1] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+\.[X1-9]+ (.*)/s){ $d[0] = $x; $d[1] = $y; $d[2] = ++$z; $_ = $d[0] . "." . $d[1] . "." . $d[2] . " " . $1; } print OUT $_; } } close(IN); close(FILE); close(OUT); exit ; }

  • Perl からbashを呼び出したい

    Perlからbashのファイルを呼び出そうとしています。 sendmail2.cgiは、呼び出せていまが、 sendmail3.cgiは、呼び出せません。 bashのファイル自体は、./(bashファイル)とやると実行できます。 パーミッションは、 sendmail3.cgi 655 mail_plain.sh 755 sendmail2.cgi 705 mailsend.sh 705 です。 パスの設定の問題かとも思ったのですが、よくわかりません。 宜しくお願いします。 ===sendmail2.cgi============= #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<P>sendmail test</P>\n"; print "mailtest\n"; print "</HTML>\n"; exec('/home/httpd/wwwroot/yoshida/mailsend.sh'); exit(0); ============================== ===sendmail3.cgi============= #!/usr/bin/perl exec("/home/httpd/wwwroot/bbstest/mail_plain.bash"); exit(0); ==============================

    • ベストアンサー
    • Perl
  • perlで特定行から特定行までを抜き出しor置換

    perlで以下のようなことをしたいと考えています。 以下のことを、コマンドラインから「perl ~」という形で 実行したいのですが、どのよにすればよいでしょうか。 1.特定行から特定行までを抜き出し 2.特定行から特定行の範囲で文字列置換 例えば、次のようなテキストファイルがあったとします。 example.txt ================================== #START aaaa hogehoge test okok perl script #END ================================== 上記ファイルを読み込んで、 1.「#START」から「#END」の間に挟まれた行だけ抜き出し 2.「#START」から「#END」の間で、「test」を置換 のです。 sedで言うところの sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt をやりたいのです。

    • ベストアンサー
    • Perl
  • perlにてスペースの削除に苦労してます。

    perlにてテキスト書き出しをしをしたとき 書き出したテキストファイルの先頭にどうしてもスペースが入ってしまうので そのテキストを別のcgiにて読み込み表示するときに 先頭のスペースを削除しようとしていますがうまく行きません 多分スペースをパターンマッチさせるのだろうと思うのですが いまいち私の理解が足らないようでぜひどなたか教えてください。 (1つ目のcgi)------------------------------- フォームから入力$title $subtitle $contentsとしそれを下記のような形で読み込み(途中省略) use CGI; $query = new CGI; $title = $query->param('title'); $subtitle = $query->param('subtitle'); $content = $query->param('content'); #タブ区切りにし@memoryに代入 @memory="$meday\t$title\t$subtitle\t$content\t$number\t$namberc\n"; open(FILE,">>../data/memory.txt")||&error("$datafile 外部ファイルが開きませんでしたエラー"); print FILE"@memory"; close(FILE); ----------------------------- それを違うcgiのソースで読み込み------------------------------------ (2つ目のcgi) open(IN, "< sys/data/memory.txt"); eval{flock(IN,1)}; @inbun=<IN>; for($i=0;$i<@inbun;$i++){ @retudata=split(/\t/,$inbun[$i]); $inbun[$i] =~ s/^\s+//g; $retu =~ s/^\s+//g; @retudata[$i]='$retu[0]\t$retu[1]\t$retu[2]\t$retu[3]\t$retu[4]\t$retu[5]\n'; ; }@data=@inbun; open(FILE,">sys/data/memory.txt")||&error("../data/memory.txt 外部ファイルが開きませんでしたエラー"); print FILE"@data"; close(FILE); close (IN); --------------------------------------------------- 追加するとなぜか先頭にスペースが入りどうしてもとれないんですが どうしたら良いでしょうか? ちなみに結果は下記のとおりです。 20121122 test1 test1 test1あいうえおABCDEFG 1 112223157 20121122 test2-r test2-r test2-rあいうえおABCDEFG 2 1122231647 20121122 test3 test3 test3あいうえおABCDEFG 3 112223254 乱筆乱文ご容赦ください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • PerlとHTML

    Perlを始めたばっかりのひよっこなのですが。 本当にPerlとはなんぞやからわかっていない状態です。初めて3日目なのですが。。 しかしながら、ボスからPerl,Apahe,MySQLを使用して、映画紹介サイトを製作しろとの命令が出ました。 Perl、HTML等に詳しい方。教えてください! PerlとHTMLはどのようにつなぐのでしょうか? Perlをターミナル(私はMacを使用しているので)で製作したのち、どのように保存し、どのようなフォルダ構成をすべきなのか?? CGIと同じよう、別フォルダにし、パーミッションの設定等で繋げればいいのでしょうか? LAMPとHTMLの関係はわかるのですが、それをどのように繋げれば、サイトを作る事ができるのかが、わかりません。 参考になるサイトや、ソースを教えて頂けないでしょうか? わかる方。現在製作している方。 どうか教えて頂けないでしょうか? よろしくお願い致します。

  • cgi(perl)を実行のみしたい

    HTMLよりCGI(PERL)を起動し、ログファイルの読み書きを実行し、そのまま終了させることは出来ないでしょうか? CGIからデータを戻す必要は無く、ブラウザへの表示はHTMLファイルがそのまま表示される形で問題ありません。 宜しくお願いします。

専門家に質問してみよう