• ベストアンサー

文字列変換すると、数字に変わる

CGIで、 $hensu = ~ s/\r\n|[\r\n]/<br>/g; を実行すると、 18446744073709551615 と、書き出されます。 ・・・これは、何なのでしょうか? http://okwave.jp/qa/q1653502.html などを参考にしたのですが、いまいちよく分かりません。 すいませんが、ご存知の方がいらっしゃいましたら、ご教示いただけないでしょうか?

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

これだけでは何のことかさっぱり。 > CGIで、 ・「CGI」はしくみであって言語ではありません。どのプログラミング言語のこと? > $hensu = ~ s/\r\n|[\r\n]/<br>/g; > を実行すると ・元の$hesuの内容は? ・どこで実行?どんなタイミングで実行? ・=と~の間のスペースはわざと? > 18446744073709551615 > と、書き出されます。 ・なにに書き出される? ・$hensuとの関係は? ・期待している結果は? まあ、おそらくPerlでしょう。 で、$hensuの改行文字をbrタグの置き換えて表示したいのに、数字が出てくる、ということでしょう。 正規表現の対象を指定する演算子は「=~」です。間を空けてはいけません。 $hensu = ~ s/\r\n|[\r\n]/<br>/g; だと $hensu = (~ (s/\r\n|[\r\n]/<br>/g)); と解釈され、次の様に計算されます。 1) デフォルトの対象$_に対して s/\r\n|[\r\n]/<br>/g → スカラーのコンテキストなので、 成功で1/失敗で0に。おそらく 0になるケースが多い 2) 単項演算子~はビット反転 →0のビット反転で 0xff...f に(64bitなら2進64桁、32bitなら2進32桁のオール1) 3) =で $hensuの値は 2)に。 → 64bit符号無し整数だと 18446744073709551615 何かの資料を見様見真似で書き写したのでしょうが、プログラムを変えようと思うなら、それがどんな意味なのかは知っておいた方がよいでしょう。=~のことを知っていれば、こんな間違いはしないと思います。

mogeraccho
質問者

お礼

ご回答ありがとうございます。 おっしゃるとおり、Perlです。 独学で、少しずつ進んでいるので、まだまだコピーアンドペーストの域を出ておりません。 なので、こういうミスに陥ってしまいました。 今回は、分かりやすい解説とご意見本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

かぶった

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

たぶんタイプミスです。"=スペース~s///"となっていませんか? このタイプミスをすると置換演算子を式として評価すると0になり、さらにビットを反転 するので、数値のビットが全て立ちます。結果としてPerlの数値の取り得る最大値になります。 以下のスクリプトは私の環境だと4294967295になりました。 $var = ~s/\r\n|[\r\n]/<br>/g; print $var, "\n"; # 4294967295 質問者さんの環境は64ビットだと考えられるので、さらに大きい数になったんでしょう。

mogeraccho
質問者

お礼

ご回答ありがとうございます。 そのとおり、スペースが入っていました。 見易さのために入れていましたが、ダメだったようですね・・・ 今回は、本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 改行の変換がうまく出来ていない?

    perlの更新記録CGIを改造中です。 テキストエリアを数個設置しているのですが、うまく保存が出来ません。 新規情報を入力するときはちゃんと改行したいデータも保存されます。しかし、修正画面で、何もしないでそのまま保存し直したところ、変に改行が入ってしまいます。(情報の途中で改行が入るので、ゴミレコードが増えてしまう。) 修正画面からログに書き込む手前で<BR>の変換をしていますが、何が間違っているのでしょうか? $in{'kouc1'} =~ s/\r\n/<br>/g; $in{'kouc1'} =~ s/\r/<br>/g; $in{'kouc1'} =~ s/\n/<br>/g; $in{'kouc2'} =~ s/\r\n/<br>/g; $in{'kouc2'} =~ s/\r/<br>/g; $in{'kouc2'} =~ s/\n/<br>/g; $in{'kouc3'} =~ s/\r\n/<br>/g; $in{'kouc3'} =~ s/\r/<br>/g; $in{'kouc3'} =~ s/\n/<br>/g; 新規入力のほうもまったく同じ状態ですが、こちらは正常に保存されます。 足りない情報があればすぐに指摘をお願いします。

    • 締切済み
    • CGI
  • テキストエリアが複数あるときの改行変換方法

    CGIを改造中です。 ログに保存するとき改行(<BR>)を変換する必要があると思うのですが、 複数のテキストエリアがある場合はどのようにしたら良いのでしょうか? 現状 $in{'$com1'} =~ s/\r\n/<br>/g; $in{'$com1'} =~ s/\r/<br>/g; $in{'$com1'} =~ s/\n/<br>/g; $in{'$com2'} =~ s/\r\n/<br>/g; $in{'$com2'} =~ s/\r/<br>/g; $in{'$com2'} =~ s/\n/<br>/g; ~~ と言う風に書いていますが、うまく変換されていないようで、ログが崩れてしまっています。 どのように記述するのが良いのでしょうか?

  • CGIで受け取った日本語文字列を正規表現で

    perlでcgiを作っています。 テキストボックスに入れてもらった文字列から正規表現で数字を抽出します。 以下のように、組むと "USA"のような半角英数はただしくマッチしますが、 "アメリカ"や"ドル"などはマッチしません。簡単に解決する方法をお教えください。 my $text = $in_data{'data_text'}; $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; if ($text =~ /USA (\d+) dollars/){ print "USA $1\n"; } if ($text =~ /アメリカ (\d+\.\d+) ドル/){ print "アメリカ $1\n"; } exit;

    • ベストアンサー
    • Perl
  • CGIで改行タグを改行コードに変換ってできますか?

    CGIで改行タグを改行コードに変換ってできますか? $text =~ s/\r\n/<br>/g; $text =~ s/\r/<br>/g; $text =~ s/\n/<br>/g; で確認画面上で表示されるtextareaの文章は改行されるのですが、 届いたメールには<br>と表示されてしまって困ってます。 PHPでは変換できるみたいなのですが、perlでも出来るのでしょうか?

    • ベストアンサー
    • CGI
  • 文字列内の\nで改行表示させるための置換

    すでに他のかたがNo.7770 でなさった質問によく似ていますが、私の場合と微妙に違いますので、質問させてください。たとえば: $data='i.(h, s) \n1. (馬が)速足(はやあし)で走る \n2. (s)[口]急いでいく, 小走りに走る' この$data 内の「\n」を<Textarea>に改行して表示したいので、文字列置換を $data = ereg_replace("\n", "<BR>", $data); とか $data = ereg_replace("\\n", "<BR>", $data); とか $data = ereg_replace("/\\n/", "<BR>", $data); やってみてますが、どうしもPerl の場合には成功した: $data=~ s/\\n/\n/g; と同じ結果が得られません。表示の末尾に<BR>が出たり、\nのままだったりします。何度も行なわれているような初歩的質問ですが、お願いします。

    • ベストアンサー
    • PHP
  • cgi:textareaでの改行を<br>に

    perlでcgiを作成しています。 <textarea>などで投稿されたテキストの改行文字を<br>に変換するために、 $value =~ s/\r\n/<br>/g; $value =~ s/\r/<br>/g; $value =~ s/\n/<br>/g; のように処理していました。が、<textarea>内で最後に何度もenterを押す人がいて、結果、 hoge<br>hoge<br><br><br><br><br><br><br> のようになってしまいます。 hoge<br>hoge のようにしたいのですが、パターンマッチをあまり勉強していないので、 よくわかりせん。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 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 になります!) 分かる方、いらっしゃいますか? あと、日本語の変換が出来ません。(汗) それと、ぷららのサーバがかなり重たいのですが、どうすれば宜しいでしょうか? ご迷惑をおかけいたしますが、どうか、宜しくお願いいたします。

  • 何故?Forbidden

    infoseek/iswebを利用している者です。 FFFTPを使用し、ASCIIモードでcgi-binフォルダに転送、 ブラウザ上からiswebのファイルマネージャーにアクセスし、 アップロードしたファイルを閲覧するとForbiddenエラーになります。 kent-webで配布されているperlのバグチェックのツールを使用すると SyntaxOK と出ています。 こういうようなプログラムです。 #!/usr/local/bin/perl use strict; my $hensu=100; if($hensu == 100){print "hensu = $hensu<br>\n";} my $hensu2 = 'aa'; my $hensu2_1 = $hensu2 + 1; print "hensu2 = $hensu2_1<br>\n"; my $hensu3 = '10A0'; my $hensu3_1 = $hensu3+1; print "hensu3_1 = $hensu3_1<br>\n"; 一体何がおかしいのか分かりません。 どなたか回答お願いします。

    • 締切済み
    • CGI
  • perlで、[ \r\n , \n ]の意味は?

    シンプルなCGI掲示板の勉強中ですが、 $message =~s/[ \r\n , \n ]/<br \/>/g; となっており、 これは改行文字を<br />に置き換えるのだそうですが、 [ \r\n , \n ]の部分というのはどういった意味でしょうか。 [ abc ]だと、a,b,cのうちどれか1文字は入っていれば良いですよね。 [ ]に「,」が入るとよく分からなくなります。 お分かりの方、教えてくださいませんか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • perl cgiで正規表現が無限にマッチする

    perl でcgiを作っています。フォームから受け取ったテキストから、正規表現を用いて、データを切り出そうと思っています。 以下のようなコードを書くと、マッチするのは一か所だけのはずなのに、無限回数マッチしてprintしつづけます。なにが間違っているのでしょうか。ご指導ください。 my $text = $in_data{'data_text'}; #フォームから受け取る $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; # invalidation $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; while ( $text =~ /Line(\d{1}):長さ:(\S+) km/){ print "Line$1: $2<br>"; }

    • ベストアンサー
    • Perl
このQ&Aのポイント
  • すでにユーザー登録をしたのですが、パソコンの使用者が違うため登録したユーザーを変更したいのですが、何かいい方法はありませんか?
  • 購入したZERO スーパーセキュリティを使用していますが、パソコンの使用者を変更するためにはどうすればいいですか?
  • ZERO スーパーセキュリティのユーザー登録を変更する方法を教えてください。
回答を見る