現在Perlを使ってプログラムを組んでいます。

以前までは連想配列を使って、
Formから得たデータを処理してたのですが、
連想配列はPerlだけ(?)だから
連想配列を使わずにやるように言われました。

いろいろ書店などを回り本を読んでみたのですが、
どれも連想配列を使っています。

どうしたらいいのかさっぱりわからないので、
連想配列を使わないやり方を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (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捨てたほうがいいと思いますけど(笑
    • good
    • 0

すみません。

これは解答ではありません。感想です。

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

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

この回答への補足

そうですね。

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

以上のようなことで、回答できますか?
お願いします。

補足日時:2002/02/05 01:35
    • good
    • 0

直接の答えじゃありませんが。



> 連想配列は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 …
    • good
    • 0

配列にすればよいのでは?


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QPerl連想配列の使い方について

はじめまして。

現在、業務で他人の書いたコード(Perl)を改造しているのですが、その作成者がいなくなってしまっております。

そのコードを見ると、なぜ、このような書き方が可能なのか、理解できないので、動作原理を教えていただけないでしょうか?

以下のようなコードです。

====================================
my @arr = ( "一" , "ニ" , "三" , "四" ) ;
my %data ;

$data->{0} = \@arr ;
$data{0}{test} = "テスト" ;

print ${$data->{0}}[1] . "\n" ;
print $data{0}{test} . "\n" ;
====================================

出力はこのようになります。


テスト

ここからが質問なのですが、$data->{0}という書き方ができる理由が分からないのです。

$dataが例えば、
my %my_hash ;
my $data = \%my_hash ;
というように、ハッシュのリファレンスであるならば、$data->{0}という書き方も分かるのですが、定義した時点でリファレンスではない、$dataに、何故"->"の演算子が使えるのでしょうか?

とはいえ、
ref $data ;
の戻り値がHASHとなるのも確認しています。
これもどうしてそうなるのか、根本的な原理が分かっておりません。

どうか、このコードの動作原理を教えていただけないでしょうか。
抽象的な質問となっている気がしますが、宜しくお願いいたします。

はじめまして。

現在、業務で他人の書いたコード(Perl)を改造しているのですが、その作成者がいなくなってしまっております。

そのコードを見ると、なぜ、このような書き方が可能なのか、理解できないので、動作原理を教えていただけないでしょうか?

以下のようなコードです。

====================================
my @arr = ( "一" , "ニ" , "三" , "四" ) ;
my %data ;

$data->{0} = \@arr ;
$data{0}{test} = "テスト" ;

print ${$data->{0}}[1] . "\n" ;
print $data{0}{test} . "...続きを読む

Aベストアンサー

 自動的に作成されるからです。
 Perl の場合、「未定義の変数にはすべて undef が代入ずみ」という仮定になっています。
 よって、宣言していない $data という変数にも、いきなりアクセスできてしまうのです。

 $data->{0} という記述をすると、Perl は自動的にハッシュのリファレンスを構築します。
 理論上は、10次元配列とかでも宣言なしでアクセス可能です。

QPerlのサブルーチンで連想配列(ハッシュ)を渡す

Perlのサブルーチンで連想配列(ハッシュ)を渡す方法


--------------------------------------

$str=rep::replace(%A,$B,@C);

--------------------------------------

sub refidrep ( \%\$\@ ){
my(%A,$B,@C)=(@_);

}
--------------------------------------


では、上手くいきませんでした。
どのようにしたら、連想配列をサブルーチンに渡せるのでしょうか?
分かる方いらっしゃいましたらご教授ください。

Aベストアンサー

rep::replace がどこにもないからよくわからんのだけど, この refidrep を見る限り受け取り方を勘違いしてる気がする.
プロトタイプにおける \ の意味と, それに対応する引数をどのように受け取るかについて確認してください.

Q配列の連想配列のソート

お世話になります。mooTaihenです。

Perlで配列のソートが出来なくて困っております。
お忙しいところ、誠に申し訳けありませんが、ご教示をお願い致します。

【内容】
 サンプルソースに示した様なデータ構成をソートしたいのですが、思惑通りに行きません。
 期待しているソート結果は、
a1
b3
b4
c2
 です。

 <サンプルソース>
my @data;

$data[0]{name} = "b";
$data[0]{cnt} = 4;

$data[1]{name} = "c";
$data[1]{cnt} = 2;

$data[2]{name} = "b";
$data[2]{cnt} = 3;

$data[3]{name} = "a";
$data[3]{cnt} = 1;

@data2 = sort {chg($a,$b)} @data;
foreach (@data2) {
print $_->{name} . $_->{cnt} . "\n";
}

sub chg
{
my(@s,@d)=@_;
return $s[0]{name} cmp $d[0]{name} and $s[0]{cnt} <=> $d[0]{cnt};
}

 <出力結果>
a1
b3
c2
b4

お世話になります。mooTaihenです。

Perlで配列のソートが出来なくて困っております。
お忙しいところ、誠に申し訳けありませんが、ご教示をお願い致します。

【内容】
 サンプルソースに示した様なデータ構成をソートしたいのですが、思惑通りに行きません。
 期待しているソート結果は、
a1
b3
b4
c2
 です。

 <サンプルソース>
my @data;

$data[0]{name} = "b";
$data[0]{cnt} = 4;

$data[1]{name} = "c";
$data[1]{cnt} = 2;

$data...続きを読む

Aベストアンサー

こんちは
sub chg以降を変更してみてください...

sub chg
{
my($s,$d)=@_;
return ($s->{name} cmp $d->{name} or $s->{cnt} <=> $d->{cnt});
}

Q連想配列の配列の使い方

C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を
perlで表現する場合、連想配列の配列にするのが一般的でしょうか?

以下の様なソースコードなのですが、perlらしさが失われている気がします。
perlらしく書くとしたらどう書くのが良いでしょうか?

[ソース]
@list; #この配列の要素に連想配列を入れる
sub input{
#list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている
open(IN, "list.txt"); 
$i = 0;
while ($xx = <IN>) {
($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx;
$i++;
}
close(IN);
}
sub output{
for($i = 0; $i <= $#list; $i++){
print $list[$i]{"hoge"}, $list[$i]{"fuga"};
}
}

Aベストアンサー

Perl らしいかどうかは別にして、

use strict;
use warnings;

my @list = ();
while ( defined( my $line = <DATA> ) ) {
$line =~ s/\x0D?\x0A?$//; # my chomp
if ( $line =~ /^([^,]+),([^,]+)/ ) {
push @list, { hoge => $1, fuga => $2 };
}
}

for my $hash_ref (@list) {
print "hoge = ", $hash_ref->{hoge}, ", fuga = ", $hash_ref->{fuga}, "\n";
}

__DATA__
aaa,bbb,ccc
111,222,333
AB,CD,EF

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

言語一般の配列や連想配列について
最近どういう解釈をしていいのか
わからなくなってしまいました。
仮に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で話をさせてもらいますと、
連想配列%FORMがあるとき、
個々の要素にアクセスする場合
例えば$FORM{'name'}などと記述しますが、
この$FORM{'name'}を
みなさんはどのように解釈しているでしょうか?
$FORM{' '}にキー nameを
代入しているようなイメージで、
「連想配列%FORMからキー'name'の値を取得する」
という考え方でしょうか?
わたしは最近、
$FORM{'name'}はそれ自体が一つの...続きを読む

Aベストアンサー

こんばんは。私も「$FORM{'name'}」は
「連想配列%FORMからキー'name'の値を取得する」意味だと思っています。

現在の Perl では「連想配列(associative array)」は
「ハッシュ(hash)」と呼ばれていますね。
「hash」とは英語で「こま切れにする」という意味で、
「ハッシュド・ビーフ(ハヤシライス)」でおなじみです。

このアルゴリズムは「ハッシュ法(hashing, hash method)」
で検索すれば多数ヒットします。
ボードゲームの駒・ピースの盤上の位置も二次元配列で表せますので、
高速探索を行うためにハッシュ法が重宝されます。
(と、今検索して知りました^^)

簡単に言えば(詳しく説明する能力はありません(^^;)、ハッシュの要素を
一つ一つ単純な計算式に従って数値に置き換えていくという操作です。
この時、数値の分布(ハッシュテーブル)が一様かつ狭い範囲に
収まるような計算式を選ぶのがミソ。
ちなみに、この操作のことは「写像(mapping)」と言います。

なぜハッシュがはじめ「連想配列」と呼ばれていたのかといえば(元は AWK 用語)、
ハッシュでキーと結び付けられた値を、あたかもコンピュータが人間に代わって
「連想」してくれるように見えるからです。

ハッシュの意味を理解するには、「$FORM{'name'}」の場合
「FORM of name」のように英語読みすると腑に落ちやすいと思います。
日本語で考えると「name に対する FORM」とひっくり返す必要があるので
混乱しやすいのですが。以下はハッシュの説明として手垢がついた例です。

%DAYS = ('January'=>31, 'February'=>30,...,'November'=>30,'December'=>31);

こう置いたとき、「$DAYS{'September'}」は30ですね。
これも「DAYS of September(9月の日数)」と考えればしっくりきます。

>連想配列の場合も
>もし不連続なアドレスに確保されるならば、
>$FORM{'name'} は一つの変数名と
>考えたほうが正しいのではないか

で、私の結論としては、せっかく高級なスクリプト言語 Perl を使っている以上
メモリアドレスのことなど考えなくていいのではないでしょうか。
もちろん、一つの変数として考えたいならそれはそれで結構だと思いますが、

$var = $FORM{'name'};

などと別の変数に代入して使う方が、私としてはすっきりする感じです。

参考URL:http://e-words.jp/w/E3838FE38383E382B7E383A5E6B395.html,http://tortoise1.math.ryukoku.ac.jp/~takataka/cpro/doc/hash.html

こんばんは。私も「$FORM{'name'}」は
「連想配列%FORMからキー'name'の値を取得する」意味だと思っています。

現在の Perl では「連想配列(associative array)」は
「ハッシュ(hash)」と呼ばれていますね。
「hash」とは英語で「こま切れにする」という意味で、
「ハッシュド・ビーフ(ハヤシライス)」でおなじみです。

このアルゴリズムは「ハッシュ法(hashing, hash method)」
で検索すれば多数ヒットします。
ボードゲームの駒・ピースの盤上の位置も二次元配列で表せますので、
高速探索を行うた...続きを読む


おすすめ情報