• 締切済み

データの受け取り方

現在Perlを使ってプログラムを組んでいます。 以前までは連想配列を使って、 Formから得たデータを処理してたのですが、 連想配列はPerlだけ(?)だから 連想配列を使わずにやるように言われました。 いろいろ書店などを回り本を読んでみたのですが、 どれも連想配列を使っています。 どうしたらいいのかさっぱりわからないので、 連想配列を使わないやり方を教えてください。

  • Perl
  • 回答数5
  • ありがとう数2

みんなの回答

  • Sephy
  • ベストアンサー率35% (7/20)
回答No.5

効率の良し悪しは別として どんなやり方でもいいと言うのなら・・・ foreach(split(/&/,$ENV{'QUERY_STRING'})) { ($name,$value) = split(/=/); push(@FormName,$name); push(@FormValue,$value); } みたいにすれば多分 $FormName[0] に変数名 $FormValue[0] に値 みたいに使えるとおもいます。 確認してないのでわかりません。 配列二つが嫌だったら配列の配列で 構造体をエミュレートしても構いませんし。 でもこれだとバリアント型であることを 利用することになりますから どんな言語でもってわけには行かないですかね・・・ ま、その辺の判断は任せます(笑 あとはforeachで@FormNameをぐるぐる回して 欲しいキーのところに来たら そのインデックスの@FormValueを見る、と。 foreach無い言語もあるでしょうから forで書き換えてください。 (forも無い場合はまた別ので) それからsplit関数とpush関数も無い環境の場合は 自分で実装してください。 ここまでやるならPerl捨てたほうがいいと思いますけど(笑

  • nak205
  • ベストアンサー率60% (40/66)
回答No.4

すみません。これは解答ではありません。感想です。 普通Perlでフォームからデータを受け取るばあい、$ENV{'CONTENT_LENGTH'}か、$ENV{'QUERY_STRING'}という連想配列をつかってフォームのデータを受け取っているので、実は連想配列を使わないで処理するのは難しいのではないかと思います。

  • kawa-sin
  • ベストアンサー率0% (0/0)
回答No.3

やり方はいくらでもあると思いますが、どういうことをしたいか具体的に書かないとなんとも言えないんじゃないでしょうか?

yakumo1010
質問者

補足

そうですね。 具体的にはエントリーフォームを作って、 名前、メルアド、住所などをフォームから 送信して、その情報を配列で処理する って具合です。 あまり、具体的ではなかったですね。 収得する情報はなんでもいいんですが。 以上のようなことで、回答できますか? お願いします。

  • aton
  • ベストアンサー率47% (160/334)
回答No.2

直接の答えじゃありませんが。 > 連想配列はPerlだけ(?)だから 誰がこんなことを言っているんですか? 例えばJavaには標準ライブラリーに,java.util.Properties というクラス(参考URL)があって,そこでPerlの連想配列と同様のkey-valueペアをサポートしてますし,Unix環境にはdbmという,やはりkey-valueペアを扱うCのライブラリーが有ります(そもそも,Perlの連想配列自体がdbmを下敷きにしていたと思う…ちょっと自信なし)。 Windowsは詳しくないんですが,OSの極めて重要な構成要素であるレジストリーも同様のkey-valueペアのデータ構造ですので,MFC/WFCのようなライブラリー群にこの手のkey-valueペア型データ構造をサポートするライブラリーがないとは思えません。 プログラミングの修業としてなら解りますが,そうでなければこの程度の知識も無い人の言うことを聞くのはやめたほうがいいと思います。

参考URL:
http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/util/Properties.html
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

配列にすればよいのでは? $form[n][0] に ハッシュキー $form[n][1]に値 で、 $val = &getval (@form, $#form, $key); で取得できるサブルーチンを作って $keyをキーワードに検索。 サブルーチン化しておけば perlでは 連想配列、その他の言語では配列検索で値を取得するというようにしてはどうでしょうか?

関連するQ&A

  • 配列や連想配列について

    言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVデータをDBに移行するには

    Perlを使ってCSVデータをDBに移行して格納したい のですが、流れはCSVファイルを開いて、CSVファイルを連想配列に書き込んで、 DBを開いて、連想配列データをデータベースに書き込んで、DBを閉じるという 流れの考えでよろしいのでしょうか?

    • ベストアンサー
    • CGI
  • HTMLの<form>タグ内の値について

    フォーム上にクリックボタンを2つ表示してそれぞれ違う処理を実行したいと考えて います。HTML<form>タグを2つ作成して1つ目に処理1のプログラム、2つ目の <form>タグに処理2の処理を実行したいと考えています。 <form>処理1</form><form>処理2</form> 処理1にPHPを埋め込みクリッカブルボタンをプログラムで書き込みます。 <?php for($ctr=0;$ctr<MAX;$ctr++){ ?> <input type="radio" name="area" value=<?=$area[$ctr][0]?> onClick="area.value = <?=$area[$ctr][0]?>"><b><?=$area[$iCnt][1] <?php } ?> ※情報が格納されたPHPの連想配列の情報を元にクリッカブルボタンを作成し、  チェックされた情報を保持したいと考えています。 上記の場合、保持したデータを上記の処理1では利用できますが、 処理2の方ではareaにアクセスしてもデータがありません。 これはformが異なるためデータを読むことができないのでしょうか? 別フォーム内で取得したデータを別フォームで参照することはできないのでしょうか? もしかしたら私の質問が意味不明かもしれませんが ご存知の方がいらっしゃいましたら宜しくお願いいたします。

  • PHPで、相対的な変数名の場合のデータの扱い方

    とても説明しずらいのですが、 例えば、ある処理によって連想配列データを受け取るという プログラムがあります。 $hoge = Array (     [deta1] => 大阪市     [deta2] => カツ丼     [deta3] => 男 ) このデータを利用して 出身:<?= $hoge[deta1] ?> 好物:<?= $hoge[deta2] ?> 性別:<?= $hoge[deta3] ?> のようなことを施すわけですが、ここで問題なのは[deta1]という連想配列名が 絶対的な名前ではなく、出力結果によって相対的に変わってしまうという点なんです。 つまり、ある日処理項目を足して $hoge = Array (     [deta1] => 大阪市     [deta2] => 釣り     [deta3] => カツ丼     [deta4] => 男 ) のようになった場合 出身:<?= $hoge[deta1] ?> 好物:<?= $hoge[deta2] ?> 性別:<?= $hoge[deta3] ?> では、おかしくなってしまい、 ズレてきてしまうのです。 もちろん本来なかったデータを追加するわけですから 最終的に、表示部分も取得した出力結果に応じて いじらないといけないわけですが、 何十、何百という配列数、しかも多次元配列とかになってきたら ひとつ追加しただけで、表示部分への影響が 大規模になってきますし、管理もしづらくなってきます。 そこで、このような相対的な連想配列名を扱う場合の 表示処理部分が管理しやすく、影響を受けにくい設計があれば、 アドバイスをお願い致します。

    • ベストアンサー
    • PHP
  • Perlで二次配列は可能?

    毎度御世話になっております。 Perlスクリプトで二次配列のような配列の使い方は可能でしょうか? (A*B)種類の変数を配列の形で操作したいと考えています。 A,B共に8~256ぐらいで、処理の途中で増やせる様にしたいのです。 連想配列を用いればそれらしいことが出来るのではないかと思ったのですが、 うまく行きません。どうかお知恵を御貸し下さい。

    • ベストアンサー
    • Perl
  • Perlで配列に設定した値が関数に引き継がれない。

    レンタルサーバ上でPerlのプログラムを作成しているの ですが、動作でよくわからないことがあるので、教えてください。 Perlのプログラムがあるサーバで動作していて、それを 他のサーバに移したのですが、正しく動作しなくなりました。 調べてみると、関数を呼んでいるところで配列の値がうまく 引き継がれていませんでした。 呼び出しの処理は次の通りです。 ●呼び出し元 ret= &SubModule(*DATA1); ●呼び出し先 sub SubModule { local(*DATA1) = @_ if @_; while(($key, $value) = each(%DATA1)) { #配列に対する処理 } #以下省略 このような処理の時に呼び出し元では配列DATA1に 値が入っているのに呼び出し先のSubModuleでは 空になりwhile文を素通りして「#配列に対する処理」 を実行しません。 いろいろ試しているうちに、呼び出し先に1つ余計な whileを入れると配列DATA1に値が入ってきました。 つまり次のように変更すると、うまくいきました。 呼び出し先 sub SubModule { local(*DATA1) = @_ if @_; while(($key, $value) = each(%DATA1)) { } while(($key, $value) = each(%DATA1)) { #配列に対する処理 } #以下省略 こうすると 「#配列に対する処理」が実行されました。 教えていただきたいのは以下の2点です。 (1)元のサーバでは問題なく動作していたのですが、  別のサーバでは、配列の引数がうまく引き継がれ  なくなりました。どういう原因が考えられるでしょうか。  処理上何かまずいところがあるのでしょうか。 (2)呼び出し先でwhile文を一つ入れることで、配列の  値が参照できるようになったのですが、これは  なぜでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlで列の抜き出し

    a,b,c,d 1,2,3,4 5,6,7,8 以上のような配列のデータを読み込んだときに、 c 3 7 のように縦の列のデータを抜き出すプログラムを考えています。 これはどのように記述すればよいでしょうか。 二次元配列はperlでは不可能と言うことであまりperlでは難しいでしょうか。

  • VB6.0で連想配列は可能?

    VB6.0で、perlの連想配列のように、配列の添字として文字列を使うことは可能でしょうか?

  • 条件に一致した塩基配列を含むデータを抽出するには?

    条件に一致した塩基配列を含むデータの抽出方法を教えて下さい。(perl) 下記のように、塩基配列(ACTTC…)と、その上に配列名(>id_000)が 数百万配列ならんだデータがあります。 (fasta形式) >id_001 CGCTGCCGGGGAACGGTCTGGTCAGGGATCTATCATGAGG CGTGGGAATTTCGCCCCGGACAGTGAGGATTTGGGTGCTT CCTTTGCTGTGATTTTAAGTTACCTCACCAAA >id_002 GCAGTCCTTCGCCTGAAGTGCAGGACGGGTAGTAACGTAG AGAGATCTTGCTTAGTTACTACTGC >id_003  ・  ・ この中から、指定した塩基配列(例:TGAAGTGCA)を含むデータを、 下記のように別名のファイルに、配列名と塩基配列を一緒に出力したいのですが、 どのようにすればよいかが、分からず困っています。 >id_002 GCAGTCCTTCGCCTGAAGTGCAGGACGGGTAGTAACGTAG AGAGATCTTGCTTAGTTACTACTGC >id_015 ATGTGAAGTGCAGTGTGTTAGT  ・  ・ 「BioPerl」のSeqIOオブジェクト?を使用することで、 何とか同じ結果を出せるようにはなったのですが、 実際に、どのような処理がされているのかは、理解できていません。 今後、色々なパターンに活用できるよう、perlだけの記述では どのような記述をすればよいのか、理解したいのです。 perl初心者なので、より基本的な記述だと助かります。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 大量データから抽出する効率よいperlプログラムは

    以前も質問させていただきましたが、 大量データから抽出する際の効率よいperlプログラム作成について また、教えてください。 例) 大量データ Aファイル 3列 可変値(数値、URL、数値)タブ区切り 重複値あり 123 http://www.XX.co.jp/XX 4567 1111 http://www.XX.co.jp/XX 3333 3 http://www.XX.co.jp/YZ 4567 1111 http://www.YYY… 116 … 抽出対象データ Bファイル 1列(URL)重複なし http://www.XX.co.jp/X http://www.YYY.co.jp … BファイルにあるURLで始まるURLがAファイルにある場合 Aファイルのその行を抽出したい。 grepで実施すると すごい時間がかかってしまうため、効率よい抽出方法をおしえてください。 今回は、完全一致ではなく、Bファイルに入っているリストのURLから始まるものにしたいと考えているので、前の手法(hash連想配列)が使えないと考えております。 Aファイルが容量大きいため、grep処理では1週間たっても終わらないのです。

    • ベストアンサー
    • Perl

専門家に質問してみよう