68user's page 掲示板

Prev< No. 2241〜2244> Next  [最新発言に戻る] [過去ログ一覧]
No. 2241 # ふくし [E-mail] 2001/11/01 (木) 10:30:56
すいません

下で
foreach (a..c) {
と書いているのは
foreach ('a'..'c') {
と書かないと怒られます。(警告だけで、動作はするようです)

ようは、a、b、c は変数の名前でなく文字列で、
%aa、%bb、%cc というハッシュのキーですね。
%aa というハッシュの、キーが 'a' の値にアクセスするには
$aa{'a'} と書きます。ただしこの場合 a はハッシュのキーであると
はっきりしているので $aa{a} と省略形で書けます。

同じハッシュでキー x の値に 550 を、キー y の値に 660 を入れるには
キーと値を交互に指定するリストを使って
%aa = ('x', 550, 'y', 660);
と書きますが、キーと値の関係をはっきりさせるために
カッコの変わりに => という記号を使えば
%aa = ('x' => 550, 'y' => 660);
と書けます。で、この場合は => の左側はハッシュのキーなので
省略して
%aa = (x => 550, y => 660);
とも書けるわけです。
でも、この '' 省略方式だと、
空白を含むキーが使えません。
%kg = ('yamada tarou' => 80, 'satou tamao' => 50);
だと
$kg{'yamada tarou'} に 80 が、$kg{'satou tamao'} に 50 が
入りますが、
%kg = (yamada tarou => 80, satou tamao => 50);
だとエラーが出て動きません。
$kg{yamada tarou} も怒られて動きません。

下のプログラムで a, b, c というのは、
ハッシュのキーで「文字列」であることを覚えておいてください。

No. 2242 # mo 2001/11/01 (木) 23:53:58
ふくしさん、 こんにちわ

map の使い方はまだ理解できませんが
★のコードは理解できました。

ありがとうございました。

No. 2243 # sio 2001/11/02 (金) 17:35:45
はじめまして。
2日前から調べているのですが、解決できずにここにたどり着きました。

CGIからCGIへデータを渡す際に
  print "Location: test.cgi?data=1\n\n";
ではなくPOSTでデータを渡したいのですが
Socketを使うというのを発見し、いろいろ試したのですが
まるで駄目です。(Socket自体、今まで使用したことも無いので(^^;)
具体的には送信元のCGIをindex.cgi、受信するCGIをtest.cgiとしますと
index.cgiに下記のような記述をしてみたのですが
test.cgiには何を書いてよいのかすら分かりません。
ご教授頂けないでしょうか
よろしくお願いします。
================================
#!/usr/local/bin/perl

use Socket;
$server='www.*****.com';
$port = 80;
$port = getservbyname($port,'tcp') unless $port =~ /^\d+/;
$iaddr = inet_aton($server)
                or die "$serverは存在しないホストです。\n";
$sock_addr = pack_sockaddr_in($port,$iaddr);
socket(SOCKET,PF_INET,SOCK_STREAM,0)
                or die "ソケットを生成できません。\n";
connect(SOCKET,$sock_addr)
                or die "$serverのポート$portに接続できません。\n";
select(SOCKET); $|=1; select(STDOUT);

$file='test.cgi';
$query='data=1';
$len=length($query);

print SOCKET "POST $file HTTP/1.0\r\n";
print SOCKET "Content-Length: $len" . "\r\n\r\n";
print SOCKET "$query";

================================

No. 2244 # iwta 2001/11/03 (土) 03:48:28
こんな感じでは?

if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }

@pairs = split(/&/, $buffer);
foreach $pair(@pairs){
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $FORM{$name} = $value;
}

$data = $FORM{'data'};

って、よくある掲示板のパターンですけど。(はずしてたらごめんなさい)
というより、index.cgi は普通にフォームを使うだけでことは足りないのでしょうか? (Socket を使わずに)

Prev< No. 2241〜2244> Next  [最新発言に戻る] [過去ログ一覧]