68user's page 掲示板

Prev< No. 3888〜3901> Next  [最新発言に戻る] [過去ログ一覧]
No. 3888 # スナフキン 2004/07/24 (土) 17:45:31
自前parseルーチンで以下の様な処理をしています。

foreach(split(/&/, $query)){
    my($name, $value) = split(/=/, $_);

〜日本語処理とかお約束の処理〜

# %FORMに格納
    if(exist $FORM{$name}){;#既に以前の$nameが有れば(2回目以降)
        push($FORM{$name}, $value);#@{$FORM{$name}}の配列に格納
    }else{
        $FORM{$name} = $value;#初めての出現ならば通常通りに格納
    }
}

細かい部分は省略してますが、例えば checkbox などで、

chbox1&val1&chbox1&val2&chbox1&val3

の様なデータが来た場合、

$ALL_VALUE = $FORM{chbox} . " @{$FORM{chbox}}";

として、

$ALL_VALUE = 'val1 val2 val3'

となる事を確認しています。

しかしなぜか、元のデータが複数の時の動作が理解できないのですが、
自分の理解が甘いような気もするので、ぜひとも動作の解説をしもらえない
でしょうか?


以下は確認用のサンプルです。2行目のコメントを外して違いを確認ください。
データの内容によって結果が違います。
変数の内容が判りやすいように print 文を入れています。

$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=1&cbox2=2&cbox2=3);
#$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=a&cbox2=b&cbox2=c);

    foreach(split(/&/, $query)){
        my($name, $value) = split(/=/, $_);
print qq($name=[$value]\n);

        if(exists $FORM{$name}){

            push(@{$FORM{$name}}, $value);
print qq( ->push:<$name>=[$value] count:). $#{$FORM{$name}} . qq(\n);
        }else{

            $FORM{$name} = $value;

        }
    }

print qq(Result1:[$FORM{'cbox1'} @{$FORM{'cbox1'}}]\n);
print qq(Result2:[$FORM{'cbox2'} @{$FORM{'cbox2'}}]\n);

無名配列が $value の内容によって識別できていないように見えます。

Windows版とLinux版のそれぞれ 5.6.1 で確認しました。

No. 3889 # スナフキン 2004/07/24 (土) 17:48:01
書き忘れましたが perl でのお話です。

No. 3890 # 68user 2004/07/24 (土) 18:18:52
>>3888 スナフキン
$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=1&cbox2=4&cbox2=5);
foreach (split(/&/, $query)){
        my($name, $value) = split(/=/, $_);
        print qq($name=[$value]\n);
        if (exists $FORM{$name}){
                push(@{$FORM{$name}}, $value);
                print "\@{$FORM{$name}}=@{$FORM{$name}}\n";
        } else {
                $FORM{$name} = $value;
        }
}
print "\@1=@1\n";


cbox1=[1]
cbox1=[2]
@{1}=2
cbox1=[3]
@{1}=2 3
cbox2=[1]
cbox2=[4]
@{1}=2 3 4
cbox2=[5]
@{1}=2 3 4 5
@1=2 3 4 5

というわけで、最初のループで $FROM{$name} には 1 が入り、
@{$FORM{$name}} はシンボリックリファレンスと解釈され、結局
@1 に push しているわけです。

結局は一度目のループとそれ以降のループを分けず、常に
        push(@{$FORM{$name}}, $value);
すればよいと思いますが、そもそも何をやりたかったのかによりますかね。

No. 3891 # スナフキン 2004/07/24 (土) 20:47:20
!!!なんとなるほど!シンボリックリファレンスと解釈されたとは・・・
すばやい回答大変助かりました。ありがとうございます。

このルーチンはいくつかある他のプログラムの一部なんですが、既に$FORM{〜}
でアクセスする箇所が沢山有ったので、それらを変更する事なくという部分に
こだわりすぎました。

cgi-lib.pl とかを見るとparse時に \0 をセパレータにしてスカラーに入れて
いますが、そうではなく同名変数の配列にぶち込んじゃおうと思ったのですが
他の方法をかんがえてみます。

No. 3892 # じぇぃじぇぃ 2004/07/24 (土) 23:00:26
超初心者の質問でごめんなさい。

コマンドを入力すると、Command not found って、表示されるんです。
スペルは間違っていないのに。何が原因なのでしょうか?

また、コマンドを入力した時に、値段のような文字が、ずらっと表示される事が
あります。例:\245\242\245\257\245\273\245\271\270\242\244\254\244\242。
このようなことが起きる原因は、何でしょうか?

対処方法を教えて下さい。お願い致します。

No. 3893 # has 2004/07/25 (日) 01:15:39
>>3892 じぇぃじぇぃ
ネット上の文字のやりとりだけで環境を把握するのがちょっと大変そうですが…。

> コマンドを入力すると、Command not found って、表示されるんです。
結論から言うと、path変数が正しく設定されていないのが原因とは思いますが…。

とはいえ即解決には至れないので、まず回答にあたって次を教えてもらえますか?
・コマンドを入力するまでにどんな手順を踏むように指示されている?
・それに対しコマンドを入力するまでに実際にはどんな手順を踏んでいる?
・コマンド名は何?

> コマンドを入力した時に、値段のような文字が、ずらっと表示される事があります。
これも次を教えてください。
・使っている機器はPC?
    ・WindowsからTelnetやTeraTermなどを実行して開いたウィンドウで起こっている?
    ・それともPC上では直接Solarisやlinuxが動いていてそこで起こっている?
・機器はPCではなく大学の研究室かどこかのワークステーション?
・機器はワークステーションではなくX端末?


なお、この書き込みに関係なくすでに解決した場合でも、何をどうしたらうまく
できたのか、必ずここに書き込みしてください。

とりあえず今回は、質問するというだけでも一苦労だったとは思いますが、
回答する側もスムーズかつ効率的に解決する技術を習得しようとしている面も
あるので、質問する側としてもその時点でわかっていることをできるだけ
きちんと伝えることが大切かと思います。ぜひ実践していってください。

# まあそうは言っても、何が前提で、伝えるべき情報がどれなのかがわからなくて
# 余計困っているんだとは思いますが

No. 3894 # 68user 2004/07/26 (月) 00:11:55
ネットワークプログラミングの基礎知識に
    「*BSD で kqueue・kevent を使ってみよう」
          http://X68000.q-e-d.net/~68user/net/c-kqueue-1.html
を追加しました。

>>3892 じぇぃじぇぃ
> コマンドを入力すると、Command not found って、表示されるんです。
こちらもご参考に。
http://X68000.q-e-d.net/~68user/unix/pickup?Command+not+found

No. 3895 # じぇぃじぇぃ 2004/07/26 (月) 01:03:07
has 様。

ご丁寧なお返事ありがとうございます。

・コマンドを入力するまでにどんな手順を踏むように指示されている?
・それに対しコマンドを入力するまでに実際にはどんな手順を踏んでいる?
→サーバーにログインして、プロンプトを表示させる。
    (ここまではOK)その後、以下のような操作(コマンドの入力)を
    実行しています。
    
    nslookup www.○○○○○○.ne.jp
                                    ↓
                        (見つからない)
                                    ↓
    find /usr/bin -name nslookup -print
                                    ↓
                        (見つからない)
                                    ↓
    find /usr -name nslookup -print
                                    ↓
                        (見つからない)

・コマンド名は何?
→nslookup

・使っている機器はPC?
→Windows Xp

No. 3896 # じぇぃじぇぃ 2004/07/26 (月) 01:05:34
追記。


・機器はPCではなく大学の研究室かどこかのワークステーション?
→自宅PCです。

・機器はワークステーションではなくX端末?
→ワークステーション・X端末とは何でしょうか??


ほんとに、まぬけな答えをしてたら、ごめんなさい。
よろしくお願い致します。

No. 3897 # has 2004/07/27 (火) 04:06:18
>>3896 じぇぃじぇぃ
困っている内容:
Windows XPのPCから[telnet等のソフト]で[UNIX系のOS]マシンにログインし
「nslookup www.○○○○○○.ne.jp」を実行したが「Command not found」
と表示され正しく実行できない([]内は未だ不明)。

さらに教えてください。

1.nslookupが実行できない理由を調べる
  (ログイン先のマシンにnslookupコマンドが存在するか)
  (a)OSに依存しない確認
    ・ログイン先のマシンはどこのもの?(学校?自宅?レンタル?)
    ・ログイン先のマシンでnslookupが実行できた人は?できないのは1人だけ?
  (b)OSを特定してどこにあるか推定
    ・「uname -a」の実行結果は?

2.メッセージが正しく表示できない原因を調べる
  (1)文字コード種類を推定する
    「\???」は3桁の8進数であり、質問されたメッセージはEUCと思われる。
    (アクセス権があ)
  (2)リモートマシンでの言語設定を確認する
    「env | grep LANG」の実行結果は?

なおワークステーション・X端末については、別の機会としましょう。
我慢できなければ是非google等で調べてみてください。

No. 3898 # zsh 2004/07/27 (火) 12:36:47
>>3895 じぇぃじぇぃ
findコマンドでnslookupコマンドを検索されたようですが、
ここでの「見つからない」は、findコマンドが見つからなかったのか
findの結果、nslookupが見つからなかったのか判らないですね。
こういう場合は、実行ログを貼り付けた方が伝わり易いですよ。

No. 3899 # jeiu 2004/07/27 (火) 19:41:04
68user殿
ご回答ありがとうございます。返事がおくれて失礼しました。
しつこいようですがまた質問をさせてください(これで最後にします)。

教えていただいた暗号スイートですが、SSL_CTX_set_cipher_listで
複数指定はできないのでしょうか(リストというからには複数できるような...)。

No. 3900 # 68user 2004/07/27 (火) 23:01:40
>>3899 jeiu
> SSL_CTX_set_cipher_listで複数指定はできないのでしょうか
できます。マニュアル読んでますか?

>>3880 68user
で複数指定する例をあげていますし、さらにそこで
> 書き方は OpenSSL のマニュアル ciphers(1) に載っています。
とも書きました。ciphers(1) には
      The cipher list consists of one or more cipher strings
      separated by colons.
とあります。

なのにこういう質問が出てくるのはなぜですか?

No. 3901 # スナフキン 2004/07/28 (水) 01:30:56
不要かもしれませんが結果報告です。

受け取ったデータを一次ファイルに格納して再読み込みする仕組みだったので、
配列に格納せず他のデータをタブで区切って追加させて、再読み込み時に

my($name, $value)=split("\t", $record, 2);

と split オプションを追加して、複数のデータを処理させましました。

cgi-lib.pl では \0 で、この掲示板では "," で区切っているので、別の方法を
と思いましたが、変更箇所を最小限にするために結局この形にしました。

リファレンスは苦手なんで敬遠してましたが、これをきっかけにまじめに勉強
しようと思います。助言ありがとうございました。

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