Perl文字列置き換えについて

このQ&Aのポイント
  • PerlとCGIにおいて、文字列の置き換えについての質問です。
  • ~s///;で文字列の置き換えができますが、変な数字しか出てこないという問題が発生しています。
  • また、日本語の変換ができないという問題もあります。ぷららのサーバが重たい時の対処法も教えていただきたいです。
回答を見る
  • ベストアンサー

Perl文字列置き換えについて

今日は、PerlとCGIについて、お聞きしたいことがあります。 ~s///;で、文字列の置き換えが出来ますよね? 実行しても、変な数字しか出てこないのです。^^; つまずいてしまいました。 以下、コードです。(プロバイダはぷららです) 実行URL http://www9.plala.or.jp/mura001/form2.html =============================================== #!/usr/local/bin/perl -w require "jcode.pl"; require "cgi-lib.pl"; $host=$ENV{'REMOTE_HOST'}; #IP取得 $addr=$ENV{'REMOTE_ADDR'}; $bo=$ENV{'HTTP_UER_AGENT'}; $http=$ENV{'HTTP_HOST'}; #アクセス元URL $access=$ENV{'HTTP_REFERER'}; &ReadParse; #秒、分、時、日、年、月、曜日 ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime; $mon++; $year += 1900; #曜日を日本語化 @week=('日','月','火','水','木','金','土'); $wday=$week[$wday]; #<input type>のnameを読み込む。 $name = $in{'han'}; $text = $in{'text'}; #日本語レコード &jcode'convert(*name,'euc'); &jcode'convert(*text,'euc'); #文字列置換 $name = ~s/</555/; #改行二つ書かないといけないみたい。 print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>テスト</title>\n"; print "</head>\n"; print "<body>\n"; print "テストです。<br>\n\n"; if($in{'han'} eq ''){ print "何も入力されていません。<br><br>\n"; exit(); } print "貴方が入力した名前は $name ですね。<br><br>\n\n"; print "$text<br><br>\n\n"; print $ENV{'PATH'},"<br><br>\n\n"; &file2(); print "書き込みリスト<br><br>\n\n"; &file(); print "</body>\n"; print "</html>\n"; sub file{ open(IN,"test.txt"); while(<IN>){ print; } close(IN); } sub file2{ open(IN,">>test.txt"); print IN "<hr>訪問者:$name $year年$mon月$mday日($wday)$hour:$min:$sec<br><br>\n\n"; print IN $text,"<br><br>"; print IN "IPアドレス:$addr<br><br>\n\n"; print IN "アクセス元:<a href=\"$access\">$access</a><br><br><hr>\n\n"; close(IN); } ========================== $name = ~s/</555/; が、 4294967295 にどうしてもなります。^^; (置き換え後の文字列を他のに変更しても必ず、 4294967295 になります!) 分かる方、いらっしゃいますか? あと、日本語の変換が出来ません。(汗) それと、ぷららのサーバがかなり重たいのですが、どうすれば宜しいでしょうか? ご迷惑をおかけいたしますが、どうか、宜しくお願いいたします。

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6633/9396)
回答No.1

単純な記述ミスですね。 「指定変数に対する操作」を示す演算子は、「=~」です。 あなたの記述では「= ~」と間にスペースが入っていますので、これをperlがどう解釈するかというと、 「s/</555/」 の 「~」(否定) の結果を、「=」(代入)する、 となってしまいます。(「s/</555/」がどんな数値結果になってるのか、ちょっと想像つかないですが ^^;) でもたぶん、そこだけっぽいです。

chiguru2011
質問者

お礼

大変、素早い御返事、ありがとうございました。 私もこのあと自分でもう一度調べたら(数字で検索)、記述ミスであることが 分かりました。 本当にありがとうございました。 ご迷惑をおかけして、すいませんでした。 s///は、=~s///とセットだったんですね。^^; これからも宜しくお願いいたします。

その他の回答 (1)

  • asciiz
  • ベストアンサー率70% (6633/9396)
回答No.2

※余談です 4294967295 は、16進数で表すと 0xFFFFFFFF でした。 ということは、ビット反転した物は 0x00000000 です。 そこから考えると「s/</555/」の値は、「何も置換されなかった false」 (=ゼロ) だったわけですね。 $name = (~0 ) により 0xFFFFFFFF が入り、10進数表示でその数字が出てきたということでした。

関連するQ&A

  • 文字化け

    下記のようなcgiスクリプトがあり、test1.cgi から リンクの test2.cgiを呼ぶと 「リンドウ」が文字化けしてしまいます。 文字化けしないようにするには、どうしたらいいでしょうか。 Perl cgi 初心者です。 --------test1.cgi----------------------------------------- #!/usr/bin/perl print "Content-Type: text/html; charset=EUC-JP\n\n"; $name="リンドウ"; print "name=$name<br>"; print "<a href=\"test2.cgi?aaa,${name},bbb\">test2.cgi</a>\n"; ---------test2.cgi------------------------------------------------- #!/usr/bin/perl print "Content-type: text/html; charset=EUC_JP\n\n"; $query = $ENV{'QUERY_STRING'}; print "query=$query\n";

    • ベストアンサー
    • CGI
  • メールフォームの訪問者情報取得について

    ある会員専用サイトをつくってます。 こんな事を考えているのですが、うまく行きません。 (1)メールフォームから名前・メールアドレスを入力しを送信。 (2)送信を押すと名前・アドレスなどと一緒に以下の情報を取得 ●IPアドレス ※$ENV{'REMOTE_HOST'}) ●OS・ブラウザ情報※$ENV{'HTTP_USER_AGENT'} ●携帯識別番号(携帯会社別) (3)上記の情報より、 LパソコンでアクセスするとIPアドレスをチェックし会員を判別 L携帯電話からだと携帯識別番号で判別 といった仕組みをつくろうと思っています。 メールフォームは自力では無いですが、オープンソースを使用し作成しました。 ※Copyright (C) 1996-2005 杜甫々 様 とほほのWWW入門>メール送信フォーム より $ENV{●●●}を組み込めば入力情報と同時に取得できると思ったのですが、うまく取れません。 十分に理解せず他人様のソースを安易に利用しようとする私が悪い事は多分に承知しておりますが、何卒ご教授お願いします。 ---以下ソース--- #!/usr/local/bin/perl #セッティング require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*in); $name = "$in{'name'}"; $from = "$in{'from'}"; $subject = "$in{'subject'}"; $body = "$in{'body'}"; $to = '●●●@●●.ne.jp'; #送信前処理 &jcode'convert(*name,'jis'); &jcode'convert(*subject,'jis'); &jcode'convert(*body,'jis'); #sendmail open(MAIL, "| /usr/sbin/sendmail -t"); print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n"; print MAIL "Content-Type: text/plain;\n\n"; print MAIL "お名前:$name\n"; print MAIL "本文:$body\n"; close(MAIL); #HTML表示の前処理 &jcode'convert(*name,'sjis'); &jcode'convert(*subject,'sjis'); &jcode'convert(*body,'sjis'); $body =~ s/[\r\n,\n]/<BR>/g; #HTMLに表示 print "Content-type: text/html\n\n"; print "<HTML><BODY>\n"; print "以下のメールを送信しました<HR>"; print "お名前:$name\n<BR>"; print "メールアドレス:$from\n<BR>"; print "題目:$subject\n<BR>"; print "本文:$body\n<BR>"; print "</BODY></HTML>\n"; exit;

    • ベストアンサー
    • Perl
  • perl cgi 文字コード変換について

    掲示板でログファイルへの書き出しの際に文字コードをshift-jisに変更したいのですが, #投稿された値を受け取る if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); } else { $alldata = $ENV{'QUERY_STRING'}; } foreach $data (split(/&/, $alldata)) { ($key, $value) = split(/=/, $data); $value =~ s/\+/ /g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg; $value =~ s/\t//g; $in{"$key"} = $value; } #ヘッダの表示 print "<html>\n"; print "<head><title>掲示板</title></head>\n"; print "<body>\n"; #受け取ったデータをファイルに書き込む if ($in{'handle'} ne '' && $in{'message'} ne '') { if (open(FH, "bbs.txt")) { @file = <FH>; close(FH); use CGI; $cgi=new CGI; $name1=$cgi->param('handle'); $name2=$cgi->param('number'); use Encode; use Encode::Guess qw(euc-jp shiftjis 7bit-jis); encode("shiftjis",decode('Guess',$name1)); encode("shiftjis",decode('Guess',$name2)); unshift(@file, "$name1\t$name2\n"); ##この部分で if (open(FH, ">bbs.txt")) { print FH @file; close(FH); } else { print "<p>ファイルに書き込めません。</p>"; } } else { print "<p>ファイルを読み込めません。</p>"; } } #投稿フォームの表示 print "<form method=\"post\" action=\"bbs.cgi\">\n"; print "<p>\n"; print "ハンドルネーム<br>\n"; print "<input type=\"text\" name=\"handle\" size=\"20\" value=\"\"><br>\n"; print "メッセージ<br>\n"; print "<input type=\"text\" name=\"message\" size=\"20\" value=\"\">\n"; print "</p>\n"; print "<p><input type=\"submit\" value=\"送信する\"></p>\n"; print "</form>\n"; #記事の一覧表示 if (open(FH, "bbs.txt")) { while ($data = <FH>) { ($handle, $message) = split(/\t/, $data); print "<p>\n"; print "投稿者:$handle<br>\n"; print "メッセージ:$message\n"; print "</p>\n"; } } else { print "<p>ファイルを読み込めません。</p>"; } #フッタの表示 print "</body>\n"; print "</html>\n"; exit; このような感じでかいたのですが文字コードを変更し,unshift(@file, "$name1\t$name2\n");と記述すると何も書かれずに空白になってしまいます..なぜでしょうか?困っています.教えて下さい. ちなみにunshift(@file, "$in{'handle'}\t$in{'message'}\n"); と文字コードの変更を意識しなかった場合にはちゃんとファイルに書かれています. jcode.plなどは使わずにencodeで行いたいです.

    • ベストアンサー
    • Perl
  • perlの質問

    #!/usr/local/bin/perl require 'jcode.pl'; # 漢字コード変換ライブラリ #********** データを受け取る $query = $ENV{ 'QUERY_STRING' }; &parse_param( $query ); $name = $param{ 'name' }; # 投稿者 $email = $param{ 'email' }; # メールアドレス #********** 結果の出力 print "Content-type: text/html\n\n"; print "投稿者:".$name."<BR>"; print "メールアドレス:".$email; exit; #********** 入力したデータの分解 ********** sub parse_param {  local( $name, $value );  local( $parse_data ) = @_;  @in_params = split( /&/, $parse_data );  foreach $in_param ( @in_params ) {   ( $name, $value ) = split( /=/, $in_param );   $value =~ tr/+/ /;   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;   &jcode'convert( *value, 'sjis' );   $param{ $name } = $value;  } } の $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack の部分だけ、何の処理をしているかがいまいちわかりません。 わかる方お願いします。

    • ベストアンサー
    • Perl
  • sendmailの文字化け

    フリーのショッピングカートのCGIをダウンロードして使ってみたところ、カート自体は問題なく動きましたが、sendmailで送信した内容が文字化けしています。 件名は $subject = &mail64encode($subject);sub mail64encode { local($subject) = $_[0]; &jcode'convert(*subject, "jis"); …省略… の形でエンコードしているので日本語で表示されています。 本文は if( open(MAIL,"| /$mail_pass1/$mail_pass2/sendmail $email")) { &conv; print MAIL "From: $email\n"; print MAIL "To: $user\n"; print MAIL "Subject: $subject\n"; print MAIL "注文年月日\n"; print MAIL "$date\n"; print MAIL "お名前 $regname\n"; ・・・省略… print MAIL "---------------------------------------------------------------\n"; print MAIL "Remote addr: $ENV{'REMOTE_ADDR'}\n"; print MAIL "Remote host: $ENV{'REMOTE_HOST'}\n"; print MAIL "User Agent : $ENV{'HTTP_USER_AGENT'}\n"; close(MAIL); となっています。 print mail の中身はそのまま出力されるのではないのですか? 別にエンコードが必要ですか? 英数字は問題なく出力されるようですが、日本語は全滅です。 jocode.plを使用しています。 どなたかご教示下さい。

  • perlがうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n"; print "まずい$in{'form2'}\n"; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。 perlの場所も正確です。

    • ベストアンサー
    • Perl
  • 投稿内容が文字化けして記録されてしまう。

    #!C:/Perl/bin/perl require 'cgi-lib.pl'; &ReadParse(*answer); $data="$answer{'name'}\n$answer{'mail'}\n$answer{'sex'}\n$answer{'how'}\n$answer{'corner'}\n$answer{'kansou'}\n\n\n\n"; require 'jcode.pl'; &jcode'convert(*data,'euc'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time()); $mon=$mon+1; @youbi=('日','月','火','水','木','金','土',); $time="$mon月mday日youbi[$wday]曜日hour時$min分$sec秒$\n"; open(ANSWER,">>answer.dat"); flock(ANSWER,2); print ANSWER"$time$data"; flock(ANSWER,8); close(ANSWER); print"Content-type:text/html\n\n"; print<<EOF; <html> <head> <title>ありがとうございました</title> </head> <body> <center> <font size="2"> <coloe="black"> ご協力ありがとうございました<br><br><br> </font> </center> </body> </html> EOF exit; -------- 課題をだされたので、以上のような内容の アンケートフォームを作りました(作ったというか テキストをほとんど写しただけですが) 使用エディタは秀丸です。 実際、これをform.htmlから動かすと、answer.datに 記録される内容が文字化けしてしまい、読めないの です。 テキスト通りにやったつもりですが、「文字コードを EUCで保存」とあったのですが、EUCで保存すると 上述したスクリプトの日本語が文字化けしてしまう ため、そのまま(shift-jis)で保存しています。 課題が出せないと困るので、どうすれば記入した ものが文字化けせずに出力されるか教えていただけ ないでしょうか?

    • ベストアンサー
    • CGI
  • perlで作った掲示板、エラーが出てしまう。

    課題でperlの掲示板を作成したのですが、動作せず困っています。間違いを教えてください。 #!C:/Perl/bin/perl require 'html_data.pl'; require 'cgi-lib.pl'; require 'jcode.pl' if($ENV{'REQUEST_METHOD'}eq"POST"){ &ReadParse(*answer); $name=$answer{'name'}; $mail=$answer{'mail'}; $title=$answer{'title'}; $text=$answer{'text'}; $name=~s/,/,/g; $name=~s/&/&/g; &name=~s/"/"/g; $name=~s/<</g; $name=~s/>/>/g; $mail=~s/,/,/g; $mail=~s/&/&/g; &mail=~s/"/"/g; $mail=~s/<</g; $mail=~s/>/>/g; $title=~s/,/,/g; $title=~s/&/&/g; &title=~s/"/"/g; $title=~s/<</g; $title=~s/>/>/g; $text=~s/,/,/g; $text=~s/&/&/g; &text=~s/"/"/g; $text=~s/<</g; $text=~s/>/>/g; $data="$name,$mail,$title,$text"; &jcode'convert(*data,'sjis'); if($name ne""&& $title ne""&& $text ne""){ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time()); $mon=$mon+1; @youbi=('日','月','火','水','木','金','土'); $time="$mon月$mday日$youbi[$wday]曜日$hour時$min分"; $all_data="$time,$data\n"; open(ANSWER,"<answer.dat"); @all=<ANSWER>; close(ANSWER); unshift(@all,$all_data); open(ANSWER,">answer.dat"); flock(ANSWER,2); print ANSWER @all; flock(ANSWER,8) close(ANSWER); } } &form; open(ANSWER,"<answer.dat"); @all=<ANSWER>; foreach(@all){ ($time,$name,$mail,$title,$text)=split(/,/,$_); &toukou; } close(ANSWER); &footer; exit;

    • ベストアンサー
    • Perl
  • Perlがサーバー上でうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n; print "まずい$in{'form2'}\n; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。

    • ベストアンサー
    • Perl
  • cgi出力での文字コードについて

    下記のソースをsjisで作っていて、出力するdata.txtをuft-8で保存したいです。 どのようにすればよいでしょうか? 下記ソースでは、data.txtはsjisになっています。 尚、htmlはsjisなのでそのまま使用したいです。 どなたか教えてください。 宜しくお願いします。 ############################# #!/usr/local/bin/perl require 'jcode.pl'; require 'cgi-lib.pl'; &ReadParse; $datafile='data.txt'; ←これの保存のみutf-8にしたい open(FH,">$datafile"); print FH "$in{'name'}"; close(FH); rint "Content-type:text/html\n\n"; print "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>"; print "<html><head></head><title>テスト</title><body>\n"; print "<center>入力完了しました。</center><hr /><br>\n"; print "<b>名前:</b>$in{'name'}<br>\n"; print "<hr />\n"; print "</body></html>";

    • 締切済み
    • CGI

専門家に質問してみよう