[#4754] Now,I am starting ruby. — mamoru@... (Mamoru Matushita)

先日、初めて投稿したつもりだったのですが間違えて

14 messages 1997/10/02

[#4891] mixin - singleton method inheritance, const etc... — shugo@... (Shugo Maeda)

前田です。

13 messages 1997/10/10

[#5000] ruby 1.0-971015 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

14 messages 1997/10/15

[#5056] RubyでOODB — hisanori@...

松尾です。

20 messages 1997/10/20
[#5057] Re: RubyでOODB — matz@... (Yukihiro Matsumoto) 1997/10/20

まつもと ゆきひろです

[#5065] Re: RubyでOODB — hisanori@... 1997/10/20

松尾です。

[#5066] Re: RubyでOODB — matz@... (Yukihiro Matsumoto) 1997/10/20

まつもと ゆきひろです

[ruby-list:4817] cgi-lib.rb

From: 青山 和光 <PXN11625@...>
Date: 1997-10-07 00:28:39 UTC
List: ruby-list #4817
みなさん、はじめまして。青山和光と申します。

FGALTS で ruby の存在を教えていただき先週入れてみたのですが、これは面
白いですね。

私は Perl でワンライナーというのが主なのですが、ruby ならちょっと大き
な物に取り組んでみようかという気になります。

とりあえず、簡単で大きくなりやすい CGI を試してみました。CGI では長い
テキストを良く扱いますが、ヒアドキュメントってどのように記述するのでし
ょうか? マニュアルには無いようなのですけれど。

もう一つマニュアルで引っ掛かったのが、後方参照。これも記述が無いんです
ね。こちらは幸いにも、組み込み変数の所で「最後に成功したパターンマッチ
でn番目の括弧にマッチした値が格納されます.」という記述をみかけたので
$1... で使えるらしいとわかりました。

そして cgi-lib.rb を試してみると、CGI.pm にはあったオフラインモード(コ
マンドラインから CGI スクリプトを起動した場合、各値をコマンドラインか
ら入力するようにしてくれる機能)が無く、ちょっと不便でした。

そこで、とりあえず CGI.pm の該当部分を移植しました。より良い記述の仕方
等ありましたらよろしくお願いいたします。

また、REQUEST_METHOD が GET の時に QUERY_STRING が無いと str が nil に
なり、str.split(/&/) でエラーが起きるようでしたから、QUERY_STRING が無
いときには "" を返すようにしました。


*** cgi-lib.rb.org	Fri Oct 03 00:57:09 1997
--- cgi-lib.rb	Tue Oct 07 09:07:59 1997
***************
*** 11,25 ****
  
  class CGI
    attr("inputs")
    
    def initialize
!     str = if ENV['REQUEST_METHOD'] == "GET"
!             ENV['QUERY_STRING']
!          elsif ENV['REQUEST_METHOD'] == "POST"
!            $stdin.read ENV['CONTENT_LENGTH'].to_i
!          else
!            ""
!          end
      arr = str.split(/&/)
      @inputs = {}
      arr.each do |x|
--- 11,52 ----
  
  class CGI
    attr("inputs")
+ 
+   # original is CGI.pm
+   def read_from_cmdline
+     require "shellwords.rb"
+     input = ''
+     query_string = ''
+     if ARGV[1] then
+       input = ARGV.join(' ')
+     else
+       STDERR.print "(offline mode: enter name=value pairs on standard input)
\n"
+       input = readlines.join(' ')
+       input.gsub! /\n/, ''
+     end
+     # minimal handling of escape characters
+     input.gsub! /\\=/, '%3D'
+     input.gsub! /\\&/, '%26'
+ 
+     words = shellwords(input)
+     if words then
+       if words.join('') =~ /=/ then
+         query_string = words.join('&')
+       else
+         query_string = words.join('+')
+       end
+     end
+     query_string
+   end
    
    def initialize
!     str = if ENV['REQUEST_METHOD'] == "GET" then
!             ENV['QUERY_STRING'] or ""
!           elsif ENV['REQUEST_METHOD'] == "POST" then
!             $stdin.read ENV['CONTENT_LENGTH'].to_i
!           else
!             read_from_cmdline
!           end
      arr = str.split(/&/)
      @inputs = {}
      arr.each do |x|


# shellwords.rb
# original is shellwords.pl
#
# Usage:
#       require 'shellwords.rb'
#       words = shellwords(line)

def shellwords(line)
  return '' unless line
  line.sub! /^\s+/, ''
  words = []
  while line != ''
    field = ''
    while TRUE
      if line.sub! /^"(([^"\\]|\\.)*)"/, '' then
        snippet = $1
        snippet.gsub! /\\(.)/, $1
      elsif line =~ /^"/ then
        STDOUT.print "Unmatched double quote: $_\n"
        exit
      elsif line.sub! /^'(([^'\\]|\\.)*)'/, '' then
        snippet = $1
        snippet.gsub! /\\(.)/, $1
      elsif line =~ /^'/ then
        STDOUT.print "Unmatched single quote: $_\n"
        exit
      elsif line.sub! /^\\(.)/, '' then
        snippet = $1
      elsif line.sub! /^([^\s\\'"]+)/, '' then
        snippet = $1
      else
        line.sub! /^\s+/, ''
        break
      end
      field += snippet
    end
    words += field
  end
  words
end


青山 和光 Wakou Aoyama <pxn11625@niftyserve.or.jp>

In This Thread

Prev Next