tattyan3
@tattyan3 (tatsuji shimo)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Ruby 正規表現 1回目にマッチした部分を入れたい

解決したいこと

GETで受け取ること
1行を抜いて動くこと

例)
Ruby on RailsでQiitaのようなWebアプリをつくっています。
記事を投稿する機能の実装中にエラーが発生しました。
解決方法を教えて下さい。

発生している問題・エラー

Error 500 書式エラー

array2[1].gsub(/%([0-9a-fA-F][0-9a-fA-F])/(1).hex.chr) #1回目にマッチした部分を1に入れて処理したいだけなのだが。


または、問題・エラーが起きている画像をここにドラッグアンドドロップ

### 該当するソースコード
```言語名
ソースコードを入力

例)

#!C:/Ruby32_x64/bin/ruby

print "Content-type:text/html","\n","\n"

print "<!DOCTYPE html><html lang=\"ja\"><head><meta charset=\"UTF-8\"><title></title></head><BODY BGCOLOR=\"#ffffff\"><h1>test decoder</h1>","\n"
#   print "it test."
# decode            #デコードをcoll
# def decode
# end

in_d = {
    "apple" => "iphon",
    "banana" => "150",
    "cherry" => "200",
    "name" => "",
    "email" => "",
    "subm" => "",
    "comment" => "",
    "url" => ""
  #  "password" => ""   #最後は,を付けてはいけない
}
# come = in_d["comment"]

 print "りんごは",in_d["apple"],"円<br>","\n"
in_d["apple"] = "110" #要素の値の変更
 print "支払いりんごは",in_d["apple"],"円<br>","\n"
#
print "ローカルに来たよ。<br>\n","\n";
# buf = STDIN.read(ENV["CONTENT_LENGTH"])
 buf = ENV["QUERY_STRING"]      #これは、解決した。全部アドレスバーに出る。
 print buf,"<br>","\n"

array = buf.split("&")
n=0
for i in 0..(array.length-1) do
array2 = array[n].split("=")


 array2[1].gsub(/%([0-9a-fA-F][0-9a-fA-F])/(1).hex.chr) #1回目にマッチした部分を1に入れて処理したいだけなのだが。



print array2[0], array2[1]," koko<br>","\n"
in_d = { array2[0] => array2[1] }
print in_d[array2[0]]," hashy<br>","\n"
n += 1
end
key_array = in_d.keys
n=0
key_array.each do |element|
#  puts(element)
  print n," ",element,"<br>","\n"
  print n," ",element," in_d[element]=",in_d[element],"<br>","\n" #配列なのか連想配列なのか見た目区別がつかない test=[0,1,2,] test {"1" =>1,"2"=>2,"3"=>3}
  n += 1
end

print "ここはきたよ<br>\n","\n";


# print "it test.3"
# form    #フォーム書き出しcoll


# def form

#print (日本語テスト<br>ENV "SCRIPT_NAME" <br>\n);

# print "<form action=\"http://127.0.0.1/my_ruby/ruby_test.cgi\" method=\"POST\">","\n"
print "<form action=\"http://127.0.0.1/my_ruby/ruby_test.cgi\" method=\"GET\">","\n"
print "<table border=0 cellspacing=1>","\n"
print "<tr><td><b>name</b></td><td><input type=text name=name size=28 value=\"",in_d["name"],"\" maxlength=\"12\" class=f></td></tr>","\n"
print "<tr><td><b>email</b></td><td><input type=text name=email size=28 value=\"",in_d["email"],"\" maxlength=\"36\" class=f></td></tr>","\n"
print "<tr><td><b>submit</b></td><td><input type=text name=subm size=36 value=\"",in_d["subm"],"\" maxlength=\"36\"class=f></td></tr>","\n"
print "<tr><td colspan=2><b>comment</b><br><textarea cols=70 rows=7 name=comment wrap=\"soft\" class=f>",in_d["comment"],"</textarea></td></tr>","\n"
print "<tr><td><b>url</b></td><td><input type=text size=52 name=url value=\"",in_d["url"],"\" maxlength=\"60\" class=f></td></tr>"+"\n"
print "<tr><td><b>password</b></td><td><input type=password size=28 name=password value=\"",in_d["password"],"\" maxlength=\"12\" class=f></td></tr>","\n"
print "<tr><td><input type=submit value=\"submit\"></td><td><input type=reset value=\"reset\"></td></tr>","\n"
print "</form></table><br>","\n"

print "name=",in_d["name"],"<br>",come,"<br>It OK?<br>","\n"
# print()内に改行してはいけない(テキスト的に) html <!-- -->コメントを入れてはいけない {}の文字として書き出しには\{\}としなければならない ""を使ってはならない\"\" \nと次の先頭をくつけてはならない。
# \n をやると、終わらねばならない。print は機能が高すぎる。変数が変数として区別できるか?

# end
key_array = in_d.keys
# key_array << in_d.keys     # key_array[] += [in_d.keys] #変数か配列か区別がつかないだろう? arr[1]1の要素を除く?3つが2つに
# key_array.push(in_d.keys)
m =key_array.length-1
print key_array.length,"length",in_d.keys,",",m,"<br>","\n" # (0)="[]"?

print "key_array[2]=",key_array[2],"<br>","\n"   #"\n"は中身を変数としてh0d0aとして、展開している。\n=h0d0aである違いは出力として使う

n=0
key_array.each do |element|
#  puts(element)
  print n," ",element,"<br>","\n"
  print n," ",element," in_d[element]=",in_d[element],"<br>","\n" #配列なのか連想配列なのか見た目区別がつかない test=[0,1,2,] test {"1" =>1,"2"=>2,"3"=>3}
  n += 1
end

print "<br>next1<br>","\n"

n = 0 #変数に再定義いうか内容を変えられない?
 for i in 0..(key_array.length-1) do  #ループの自己変数を使い間違いてかえられるのを特徴とするかバグとするかだけ
#	print n,"<br>","\n"
    print n,"=",key_array[n],"は:",in_d[key_array[n]],"<br>","\n"
	n += 1
 end

print "</body></html>","\n"
exit

```メモリー食ってごめん。

### 自分で試したこと
検索していろいろやってみたが解決に至らず。
1

2Answer

Comments

  1. @tattyan3

    Questioner

    あれは「python」でこれは「ruby」ですよ。未解決だからrubyをやってます。
    ちなみに分かったら
    in_d = { array2[0] => array2[1] }

    in_d.push = { array2[0] => "my.",array2[1],"yen" }#これ

    も、お願いします。定型にはめ込むってやつ。無理なら"yen"を付けるだけでも。

  2. @tattyan3

    Questioner

    もう、どんずまりだから、同じのPerl5で書いてみようかな?
    ひまだし。。。

  3. あれは「python」でこれは「ruby」ですよ。未解決だからrubyをやってます。

    そうですか、失礼しました。

    前のスレッドでお願いしたことをやってもらえませんか?

    ちなみに分かったら
    in_d = { array2[0] => array2[1] }
    in_d.push = { array2[0] => "my.",array2[1],"yen" }#これ
    も、お願いします。

    何の話か意味不明です。

    array2[1].gsub(/%([0-9a-fA-F][0-9a-fA-F])/(1).hex.chr) #1回目にマッチした部分を1に入れて処理したいだけなのだが。

    ruby とか触ったこともないのでググって調べただけですが、

    instance method String#gsub
    https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html

    を見ると文法的に間違っているように見えるのですが。

    あと、「1回目にマッチした部分」だけを置き換えるなら gsub ではなくて sub を使うそうですが?

    【Ruby】 gsubで複数の文字パターンを置換する方法
    https://qiita.com/s_tatsuki/items/ebf431eaa99ec5acb509

    ハズレだったらすみません。

  4. @tattyan3

    Questioner

    ありがとうございます。すんません。
    ''''''
    [Sun Dec 03 12:10:41.744380 2023] [cgi:error] [pid 6028:tid 1860] [client 127.0.0.1:57718] AH01215: Warning: Failed to create a system wide 'gemrc' file, making Rubygems possibly insecure: no implicit conversion of nil into String\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    [Sun Dec 03 12:10:41.744380 2023] [cgi:error] [pid 6028:tid 1860] [client 127.0.0.1:57718] AH01215: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi:39:in block in <main>': undefined method gsub' for nil:NilClass (NoMethodError)\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    [Sun Dec 03 12:10:41.744380 2023] [cgi:error] [pid 6028:tid 1860] [client 127.0.0.1:57718] AH01215: \tfrom C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi:35:in each'\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi [Sun Dec 03 12:10:41.744380 2023] [cgi:error] [pid 6028:tid 1860] [client 127.0.0.1:57718] AH01215: \tfrom C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi:35:in '\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    ''''
    そして
    '''''
    127.0.0.1 - - [03/Dec/2023:12:10:41 +0900] "GET /my_ruby/ruby_test.cgi?name=&email=%E3%81%9F%E3%81%A3%E3%81%A1%E3%82%83%E3%82%93&subm=&comment=&url=&password=0000 HTTP/1.1" 200 319 "http://127.0.0.1/my_ruby/ruby_test.cgi" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"
    '''''
    試したコードは
    '''''
    array2[1].gsub(/%([0-9a-fA-F][0-9a-fA-F])/,'\1.hex.chr')
    '''''
    不慣れなもので引用符が出来ません。記事に対して。
    お手数、ありがとうございます。

  5. 試したコードは
    array2[1].gsub(/%([0-9a-fA-F][0-9a-fA-F])/,'\1.hex.chr')

    それで結果はどうなったのですか? 少なくともエラーは出なくなったのですか?

    エラー無く実行できたとすると、上に紹介した記事によれば、gsub は array2[1] という文字列を、その中で正規表現 /%([0-9a-fA-F][0-9a-fA-F])/ にマッチする部分を \1.hex.chr に置き換えた文字列を生成して返すというです。

    なので、

    #1回目にマッチした部分を1に入れて処理したいだけなのだが。

    の「1に入れて」というのが意味不明ですが、何にせよ、上に書いたことが合っていれば、上のコードは何も意味のないことをしているはずです。

    基本的な文法が分かってないということはありませんか?

  6. @tattyan3

    Questioner

    エラーもなくWarning:で、止まっているようです。画面がそこで出てこないから。
    試しにperl5でやらせても、そこでないループの所で止まります。
    遅くなったのは、perl5をやっていたからです。ただし、動いているものの移植ですが。
    お手数をおかけした、お礼は言います。ありがとうございました。
    スクリーンショット 2023-12-03 154758.png
    ruby が連想配列に追加してくれないのです。
    100と入ってきたら100yenとして保存出来たらなと、2行で書けばいいのだろうけど。
    パスワードのwindows.sysロックがかかっている感じローカル変数にして目蔵にしないと、外部に漏れるセーフティーロックかも知れません。GETで送るの自体が間違いなんだけどね。まぁ、疑いだすとhttpsじゃ、ないし、前にも動かない経験はありますが。

  7. 基本的なことが分かってなくて話が通じてないように思えます。それなのに、回答を無視して、Python がダメだから Ruby で、Ruby でもダメだから Perl でということをして余計に発散方向に向かっているような気がします。

    話が通じる程度には基本的なことを勉強されてから、出直された方が良さそうな気がしますが、いかがですか?

  8. @tattyan3

    Questioner

    そのとおりです。
    ''''''
    #!C:/XAMPP/xampp/perl/bin/perl5.32.1
    #!C:/Perl64/bin/perl
    print "Content-type:text/html\n\n";

    print '

    test decoder

    '."\n";
    print "it test1.
    \n";

    %in_d = (
    apple => 'iphon',
    banana => '150',
    cherry => '200'
    );

    come = in_d["comment"]

    print "りんごは$in_d{'apple'}円
    \n";
    $in_d{'apple'} = "110"; #要素の値の変更
    print "支払いりんごは$in_d{'apple'}円
    \n";

    &decode();

    sub decode{
    local($query,$saizu,@array);
    print "ローカルに来たよ。
    \n";
    if($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
    } else {
    $query = $ENV{'QUERY_STRING'};

    if ($get_no ==1 && $query ne ""){&error("エラー・GET 禁止");}

    }
     ($saizu)=length $query;
    

    if ($saizu > $max_size){&error("エラー・サイズオーバー");}

    @array = split(/&/, $query);
    print "it test.2.1
    \n";
    foreach my $array1(@array){
    my($my_key,$my_valu) = split(/=/,$array1);
    $my_key =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; #key
    $my_valu =~ tr/+/ /;
    $my_valu =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; #vallu

    if ($my_key eq 'name'){
    $name=$my_valu;
    };
    if ($my_key eq 'subm'){
    $subm=$my_valu;
    };
    if ($my_key eq 'comment'){
    $come=$my_valu;
    };
    };
    };
    print "it test.2
    \n";
    foreach $key (keys %in_d) {
    print "$key $in_d{$key}
    \n";
    };

    print $in_d{'apple'}.' '.$name."ここはきたよ2
    \n";

    print "it test.3
    \n";

    form #フォーム書き出しcoll

    def form

    #print (日本語テスト
    ENV "SCRIPT_NAME"
    \n);

    print qq|

    \n|;

    print qq|

    \n|;
    print qq|\n \n \n \n \n
    name
    submit
    comment
    $come

    \n|;

    print "name=".$name."
    $subm
    ".$come."
    It OK?
    \n";

    print()内に改行してはいけない(テキスト的に) html コメントを入れてはいけない {}の文字として書き出しには{}としなければならない ""を使ってはならない"" \nと次の先頭をくつけてはならない。

    \n をやると、終わらねばならない。print は機能が高すぎる。変数が変数として区別できるか?

    end

    @key_array = keys %in_d;

    foreach $key (keys %in_d) {
    print "$key,$in_d{$key}
    \n";
    };
    print "\n";
    exit;
    '''''
    2023-12-03.png
    すみませんでした。動いたerlを載せときます。お手数をお掛けしました。

最初の質問への回答ですが、こちらでいかがでしょうか。

array2[1].gsub(/%([0-9a-fA-F][0-9a-fA-F])/) { $1.hex.chr }
0Like

Comments

  1. @tattyan3

    Questioner

    ありがとございます。エラーも出ませんが期待した答えも出ていません。
    '''''
    [Mon Dec 04 21:52:01.390915 2023] [cgi:error] [pid 6028:tid 1856] [client 127.0.0.1:64592] AH01215: Warning: Failed to create a system wide 'gemrc' file, making Rubygems possibly insecure: no implicit conversion of nil into String\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    [Mon Dec 04 21:52:01.390915 2023] [cgi:error] [pid 6028:tid 1856] [client 127.0.0.1:64592] AH01215: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi:43:in block in <main>': undefined method gsub' for nil:NilClass (NoMethodError)\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    [Mon Dec 04 21:52:01.390915 2023] [cgi:error] [pid 6028:tid 1856] [client 127.0.0.1:64592] AH01215: \r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    [Mon Dec 04 21:52:01.390915 2023] [cgi:error] [pid 6028:tid 1856] [client 127.0.0.1:64592] AH01215: my_val.gsub(/%([0-9a-fA-F][0-9a-fA-F])/) { $1.hex.chr }\r\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    [Mon Dec 04 21:52:01.390915 2023] [cgi:error] [pid 6028:tid 1856] [client 127.0.0.1:64592] AH01215: ^^^^^\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    [Mon Dec 04 21:52:01.391912 2023] [cgi:error] [pid 6028:tid 1856] [client 127.0.0.1:64592] AH01215: \tfrom C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi:35:in each'\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi [Mon Dec 04 21:52:01.391912 2023] [cgi:error] [pid 6028:tid 1856] [client 127.0.0.1:64592] AH01215: \tfrom C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi:35:in '\r: C:/XAMPP/xampp/htdocs/my_ruby/ruby_test.cgi, referer: http://127.0.0.1/my_ruby/ruby_test.cgi
    '''''
    2023-12-04 (1).png
    ありがたく、感謝いたします。

  2. 失礼。こちらでいかがでしょうか。(再代入していないのを見落としていた)

    array2[1].gsub!(/%([0-9a-fA-F][0-9a-fA-F])/) { $1.hex.chr }
    
  3. @tattyan3

    Questioner

    ありがとうございます。空欄入力があると止まることを除けば成功です。
    Animation_ruby2.gif
    大変お手数をおかけしました。
    if コマンドが聞かない「たぶんわたしが悪いんだろうけど」
    ''''''''
    array = buf.split("&")
    n=0
    for i in 0..(array.length-1) do
    print n,"?",array[n]," array_n
    \n"

    (my_key,my_val) = array[n].split("=")
    print my_key,",",my_val," a2
    \n"
    if my_val != ""
    my_key.gsub!(/%([0-9a-fA-F][0-9a-fA-F])/) { $1.hex.chr }
    else
    my_key = ""
    my_val = ""
    end
    if my_val != ""
    my_val.gsub!(/%([0-9a-fA-F][0-9a-fA-F])/) { $1.hex.chr }
    else
    my_val = ""
    end
    ''''''''
    2023-12-05.png
    日本語キーにも対応させて、もう少しフィルター入れて。

Your answer might help someone💌