Perlで、「ハッシュ」という概念が出てきますが、
どのような意味ですか?

どんなプログラムを作成する時に便利なのでしょうか?

なるべく早くお答えいただいた方からポイントを差し上げます。

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

A 回答 (5件)

上記の人の方の通りハッシュは連想配列という意味です。



で、ハッシュと配列のどちらが良いか、という質問に対しては、どちらも良いし、どちらも悪い。ということです。
ハッシュには、順番の指定が出来ない。(一番最初に呼んだデータが、一番最初に出力されない)
配列は、キーとデータを取得しにくい。ということです。

しかし、ハッシュにデータを格納して、そのハッシュを配列の中に入れてしまえば、ハッシュに順番が与えられるのです。

下記の場所で検索か、質問をしてみると良いです。ためになりますよ。

参考URL:http://www.parkcity.ne.jp/%7Echaichan/bin/qanda. …
    • good
    • 0
この回答へのお礼

なるほど

そういう観点で使えるんですね。

よく分かりました。

お礼日時:2001/03/31 13:22

>私はデータベースは全て配列@で扱っているのです。


>「配列」よりも「ハッシュ」を使ったほうが便利なのは
>どのような時なのでしょうか?

そうですね~。はいれつでやっちまう、といってしまえば、それはそれでOKな気も・・・(というのは、PERL言語の配列は他の言語と違って、えらく柔軟性が高いと言うかなんと言うか、だいたい、型が違うものを配列にできるってどう言うこと? っていうか何の配列? とまぁ、C/C++系出身者などは思ってしまいますのですが・・・)

たとえば、次みたいなときに、ちょろっと使ってみるとか。。。
%ENGINE = (
yahoo => {
url => 'http://search.yahoo.co.jp/bin/search?',
keyword => 'p',
},
goo => {
url => 'http://www.goo.ne.jp/default.asp?',
keyword => 'MT',
},
infoseek => {
url => 'http://www.infoseek.co.jp/Titles?sv=JP&tds=0&',
keyword => 'qt',
},
google => {
url => 'http://www.google.com/search?lr=lang_ja&',
keyword => 'q',
},
fresheye => {
url => 'http://search.fresheye.com/?',
keyword => 'kw',
},
excite => {
url => 'http://www.excite.co.jp/search.gw?c=japan&lk=exc …
keyword => 's',
},
lycos => {
url => 'http://www.lycos.co.jp/cgi-bin/pursuit?cat=jp&',
keyword => 'query',
},
);

とかね。
    • good
    • 0
この回答へのお礼

たびたびすいませんです。
Perlの配列って柔軟性が高いようなんで
いつもそうしてました。

いろいろなアドバイスありがとうございました。

お礼日時:2001/03/31 13:26

ハッシュとは「連想配列」もしくは「セット」といわれるものです。


「連想配列」のような概念が、「既存組みこみの変数」として実現されているのは珍しいかもしれません。Perl言語の特徴がかいまみえます。
C++やJavaなどの言語でも、「組みこみ変数」ではなく、「ライブラリ」として実現されています。

この連想配列とは一般的に「データベース構築」の基礎概念となるものです。

例えば、学校などでは、「学籍番号」なるものがあり、
「何番の生徒?」と問いただせば、「鈴木太郎」などというように、わかりますよね。その逆に「鈴木太郎?」と問いただせば、「何番の生徒」ということもわかります。

このように、それぞれの「学籍番号」とそれに対応した「生徒名」、この組み合わせ(連想)が、数多くある(配列)、ことから、連想配列というのです。
    • good
    • 0
この回答へのお礼

ご丁寧な回答 ありがとうございます。

なかなか使いこなすのは時間がかかりそうです。

私はデータベースは全て配列@で扱っているのです。

「配列」よりも「ハッシュ」を使ったほうが便利なのは
どのような時なのでしょうか?

もしよろしければアドバイスください。

お礼日時:2001/03/29 13:26

ハッシュとハッシュ関数というのは別物ではないのですか。



下はPerl&CGIに関する解説サイトです。

参考URL:http://www.rfs.co.jp/sitebuilder/perl/03_03.html
    • good
    • 0
この回答へのお礼

このホームページずっと昔、見たことがありました。

あらためて見てみるとよく分かりました。
どうもありがとうございます。

お礼日時:2001/03/29 13:23

こんにちは.


参考URLにリンク張っておきました.
また,CGIのカテゴリに書き込まれているので下のアドレスも参考になると思います(多少ハッシュについても載っています).
http://www.parkcity.ne.jp/~chaichan/src/perl01.htm

参考URL:http://www.math.s.chiba-u.ac.jp/~matsu/gpg/gpg-0 …
    • good
    • 0
この回答へのお礼

なるほど。
ハッシュ関数というのもあるんですね。
参考になりましたがちょっと私のほしい答えと違っちゃいました。
またお願いします。

お礼日時:2001/03/29 13:21

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

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

Q「Perl」ハッシュの使い方について

Perlのハッシュで気軽に多次元配列のようなことをしたいのですができますか?
(下記のコードで一応動きましたが、本当にこういった機能があるのか自信がもてません。)

もし、可能である場合、
$fruits{'apple'}{'甘い'} = "リンゴ";
$fruits{'melon'}{'甘い'} = "メロン";
以外の代入方法があれば教えてください。

また、
print values %$fruits;
が表示されません。
表示させる方法はありますか?

以上、ご存知の方、居られましたらぜひ教えてください。

宜しくお願い致します。






-test.cgi-----------------------------------------
print "Content-Type: text/plain\n\n";

$fruits{'apple'}{'甘い'} = "リンゴ";
$fruits{'melon'}{'甘い'} = "メロン";

print '結果:'.$fruits{'apple'}{'甘い'};
print "\n";
print '結果:'.$fruits{'melon'}{'甘い'};

print "\n";
print keys %fruits;
print values %$fruits;# <<表示されない

exit;
-----------------------------------------

Perlのハッシュで気軽に多次元配列のようなことをしたいのですができますか?
(下記のコードで一応動きましたが、本当にこういった機能があるのか自信がもてません。)

もし、可能である場合、
$fruits{'apple'}{'甘い'} = "リンゴ";
$fruits{'melon'}{'甘い'} = "メロン";
以外の代入方法があれば教えてください。

また、
print values %$fruits;
が表示されません。
表示させる方法はありますか?

以上、ご存知の方、居られましたらぜひ教えてください。

宜しくお願い致します。





...続きを読む

Aベストアンサー

正しい書き方は

$fruits{'apple'}->{'甘い'} = "リンゴ";

です。

$fruits{'apple'}{'甘い'} = "リンゴ";

これは、ハッシュを多次元配列風に表現するための略式、ですね。

$fruits{'apple'} には2次元目のハッシュのリファレンスが入ります。
この場合、「keys %fruits」は、1次元目のキーとなりますが、「values %fruits」は2次元目へのリファレンス(の配列)なので、代入した文字列は表示されません。
keys, valuesで2次元目を取り出すには・・・

2次元目のキー : keys %{$fruits{'apple'}}
2次元目の値 : values %{$fruits{'apple'}}

Q(Perl)ReadParseによるハッシュへの格納について

PerlのReadPerseについて質問させてください。
以下少々長いですが、過程を書きます。


<form>タグにより、入力フォームのページをHTMLで作成したとします(form.html)。
その際、<form method="post" action="form.cgi">
と入力しておいて、別途form.cgiを作成するとします。

form.htmlには、<form>タグ内のname属性で、それぞれ'weight' 'height' 'age'という三種類のデータを入力してもらって、取得するようにしています。

そして<input type="submit" value="登録">による、
登録ボタンを押すことで、
form.cgiに処理をさせるようにしています。


form.cgiの中身ですが、まず、最初の三行を書きます。

#!/usr/local/bin/perl
require 'cgi-lib.pl';
&ReadParse(*form);

となるのですが、わからないのが、
三行目の

&ReadParse(*form);

です。
サブルーチンReadParseを引数*formで、
cgi-lib.plから呼び出しているということはわかるのですが、いきなり*formという形で、ハッシュを登場させているあたりがわかりません。(この際、ハッシュ名の前の%を*に変えなければならないことは、一応知っております。理由はわかりませんが。)

そこで質問なのですが、
いきなり、ハッシュであるformを登場させていいものなのでしょうか??

以下、form.cgiの内容です。


#!/usr/local/bin/perl

require 'cgi-lib.pl';
&ReadParse(*form);

$name=$form{'weight'};
$sex=$form{'height'};
$megane=$form{'age'};

print "Content-type: text/html\n\n";
print "<html>\n";
print "<body>\n";

print "体重:${weight}<br>\n";
print "身長:${height}<br>\n";
print "年齢:${age}<br>\n";

print "</body>";
print "</html>";

_END_

PerlのReadPerseについて質問させてください。
以下少々長いですが、過程を書きます。


<form>タグにより、入力フォームのページをHTMLで作成したとします(form.html)。
その際、<form method="post" action="form.cgi">
と入力しておいて、別途form.cgiを作成するとします。

form.htmlには、<form>タグ内のname属性で、それぞれ'weight' 'height' 'age'という三種類のデータを入力してもらって、取得するようにしています。

そして<input type="submit" value="登録">による、
登録ボタンを押すこ...続きを読む

Aベストアンサー

まずは動いてよかったですね。

というか、ケアレスミス・・・
私の書いたソースでは%formではなくて、%inにデータが代入されます。

> $in{$key} = $value;

ここです。ここを、

> $form{$key} = $value;

にすれば%formになりますが。

以前にも申し上げましたが私はAN HTTPDはよくわかりません。
私は基本的にFreeBSDとApacheな人なので・・・
このサービスは便利ですが、ちゃんと勉強したいと思ったらメーリングリストへの参加をお勧めします。
多少厳しい世界なので、あまりの「教えて君」は叱られますけどね。

コピペは・・・コピー元によるのではないでしょうか。
テキストファイルから普通にコピーするのは特に問題ないと思いますが、
ブラウザ上からのコピーなどはあまり思わしくないかもしれないです。

これからいろいろと勉強してみてください。
PerlだけじゃなくPHPやDBなど面白い事はいろいろありますよ。
頑張ってくださいね。

QperlのCGIのハッシュを使った、比較・削除について

@array1 = ("a","b","c");
@array2 = ("a","y","oo","pp");

二つを比較すると、aが重複しているので削除する。

@array = ("b","c","y",oo","pp");


-------------
こういった操作をする場合(実際の配列は500程度あります)、ハッシュを使うと、簡単にデータを抽出できそうな気がするのですが、自分で作ることができません。
どなたか、教えていただけないでしょうか?
宜しくお願い致します。

Aベストアンサー

やり方は、色々あると思いますが、1つの方法
@a1 = ("a","b","c");
@a2 = ("a","y","oo","pp");

foreach $e (@a1,@a2){ $count{$e}++}
@array = grep($count{$_} < 2, keys %count);

QPerl/CGIプログラムとPHPプログラムはどちらがメジャー?

2000年くらいから自分のWEBページを作成して、Perlで書かれたCGIプログラムを設置していました。
また、2005年くらいからはnucleusなどのPHPで書かれたBlogを運営したりして、現在に至ります。
現在、WEBページ制作代行の仕事をしていますが、Perl/CGIプログラムとPHPプログラムでは、今はどちらがメジャーというか、旬なのでしょうか?
プログラムの内容によって使い分けるのが良いのかとも思いますが、現在はどちらの言語がメジャーであって、使い勝手などが良いのか、教えてください。
単語の用法など間違いがありましたらご了承下さい。
尚、Perl、PHP共に、一からプログラムを作成することはできませんが、作られたプログラムを改造する程度ならできるレベルです。

よろしくお願いいたします。

Aベストアンサー

正直なところ、どちらでも、、、といったところです。
あえて「旬」というならば、PHPなんでしょうね。きっと。
どちらも既に「旬」ではないと思いますが。。。

PHPの場合、CGIで立ち上がるワケではないので、動作はPerl/CGIと比べて軽快です。
ですので、動的なページ生成を考えるならば、PHPのほうが良いでしょう。

正直、PHPはプログラムの一部を改造する程度しかできませんのでなんとも言えませんが、Perlは文字列処理が強力なのは、Webにたくさん情報があるとおりで、私も実感しています。
その一方、グラフィック的な処理は、Perlは不向きです。

Perl5系はオブジェクト指向が、だいぶふわっとした感じで、オブジェクト指向を理解しきれていない私にはちょっと使いづらいです(オブジェクト指向をカチッと勉強するには向いていないと思います)。
Perl6系になったら、もっとしっかりしたオブジェクト指向になるそうですが、、、


で、私自身は、最近はCGIでサーバ上のデータを整形してjavascript(Ajax)に渡すという流れがお気に入りです。
または、javascriptでデータを取得して、CGIに渡して、サーバ上に蓄積する、といったカンジですね。
javascriptはブラウザ上でページ遷移なしに画面を変更できることと、サーバにかかる負荷が低いというのが良い点ですね(あまりすごいことすると、今度はユーザに大きな負担を強いることになりますが、、、)

ただ、javascriptはブラウザによって実装が違うので、その辺が面倒なところです。



結局、用途に合わせて、良いところを組み合わせて使うというのが一番いい方法かなと思っています。
回答になっていますでしょうか?

正直なところ、どちらでも、、、といったところです。
あえて「旬」というならば、PHPなんでしょうね。きっと。
どちらも既に「旬」ではないと思いますが。。。

PHPの場合、CGIで立ち上がるワケではないので、動作はPerl/CGIと比べて軽快です。
ですので、動的なページ生成を考えるならば、PHPのほうが良いでしょう。

正直、PHPはプログラムの一部を改造する程度しかできませんのでなんとも言えませんが、Perlは文字列処理が強力なのは、Webにたくさん情報があるとおりで、私も実感しています。
その一...続きを読む

QPerlプログラム上でアラートを表示

現在、Perlにてチェックプログラム(チェック内容は省かせていただきます)を作っています。

もともとはweb上で「登録」をクリックすると以下のような csh で記述されたcgiが実行され、
------------------------------
#!/usr/bin/csh
echo "Content-type: text/html"
echo ""
~中略~
./既存プログラムA.exe
------------------------------
最終的に「既存プログラムA.exe」が起動するというような物で、今回この「既存プログラムA.exe」が起動される直前にチェックプログラムを実行するというものです。

前置きはこのような感じで、教えていただきたい内容は、
チェックプログラム内の記述に以下のようなチェック項目があります。
------------------------------
if(!(-e $CIRCUIT)){
print"END";
exit(0);
}
------------------------------
「$CIRCUIT」というフォルダが存在するか否か、存在すれば次のチェック項目へ、存在しなければ処理終了というような単純な構文なのですが、
このif文内に、"そのようなフォルダはありません"アラートを表示させるような記述を追加することは可能でしょうか?

サンプルURLや情報等お持ちの方いらっしゃいましたら、
よろしくお願いいたします。

現在、Perlにてチェックプログラム(チェック内容は省かせていただきます)を作っています。

もともとはweb上で「登録」をクリックすると以下のような csh で記述されたcgiが実行され、
------------------------------
#!/usr/bin/csh
echo "Content-type: text/html"
echo ""
~中略~
./既存プログラムA.exe
------------------------------
最終的に「既存プログラムA.exe」が起動するというような物で、今回この「既存プログラムA.exe」が起動される直前にチェックプログラムを実行するというも...続きを読む

Aベストアンサー

ウェブ上でアラートを出すなら
print <<END;
<script>
alert('メッセージ');
</script>
END
とかしてみたらどうでしょう。
(未確認自信なし)


このカテゴリの人気Q&Aランキング

おすすめ情報