みなさん、はじめまして。青山和光と申します。
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>