Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

連想配列を使ってIDでジャンプ

研究内容

?〜 という形でなにかIDを送り、そのIDでジャンプ先を変えます。 ただし今度は連想配列を使ってみます。

詳細

IDとURLは1対1に対応していますので、こういう時は連想配列が便利かも知れません。 連想配列の方がプログラムがすっきりしそうですし、 テストしたジャンプ先のはyahooとgoogleの2つだけでしたが、 これがもっと数が増えたら if 文だとどんどんプログラムが長くなって気持ち悪いかも? ということで連想配列を使うようにしたいと思います。

結果

連想配列の初期化方法

連想配列に値を入れるには、$連想配列{'名前'}=値 でよかったんですよね。 なので、IDとURLを対応させるには次のようにすればいいわけです。

$url{'yahoo'}  = 'http://www.yahoo.co.jp/';
$url{'google'} = 'http://www.google.co.jp/';

これでもいいんですが、連想配列には「初期化」っていう機能があるんだそうです。 初期化っていうのは、初めからこういうデータを入れておいてくださいっていうことですね。 やり方は、

%連想配列 = (名前, 値, 名前, 値, ...);

とするんだそうです。ですから、今回のプログラムでは

%url = (
	'yahoo',	'http://www.yahoo.co.jp/',
	'google',	'http://www.google.co.jp/',
);

となりますね。

これまで、1つの命令は1行にしていましたが、 このように、命令は複数行に分けても大丈夫です。 最後の ; のところまで、途中に改行があってもちゃんと理解してくれます。 (こういうのを、フリーフォーマット言語っていうらしいです。)

連想配列に値がない場合の処理

if 文のときは、else 〜 のところでエラーの処理をしていました。 連想配列の場合は、その名前に対応する値があるかどうかを調べて、 対応する値が無ければエラーになるようにしないといけません。 これはどうやってやるんでしょうか?

それには、exists というのを使います。 これは、連想配列の中で、その名前に対応する値があるかどうかを調べて、 あれば true、無ければ false を返すというものです。 使い方は、

exists $連想配列{調べたい名前}

です。これの true/false で処理を分けたい場合は、もちろん if 文ですね。

そうそう。今まで、連想配列で「名前」という言い方をしてきましたが、 これ、「キー」というんだそうです。 $連想配列{キー}=値、です。 なので、この exists は、キーの存在を調べる命令っていう言い方になります。

作成したCGIプログラム

gotobyid.cgi
#!/usr/bin/perl

$id = $ENV{"QUERY_STRING"};

%urltable = (
	'yahoo',	'http://www.yahoo.co.jp/',
	'google',	'http://www.google.co.jp/',
);

if (exists $urltable{$id}) {
	print "Location: $urltable{$id}\n";
	print "\n";
}
else {
	print "Content-type: text/html\n";
	print "\n";
	print "ID:$idは登録されていません。";
}

実行結果

次のリンクをクリックしてみてください。

gotobyid.cgi?yahooを実行してYahoo!Japanを開きます!
gotobyid.cgi?googleを実行してGoogleを開きます!
gotobyid.cgi?errを実行してエラーのテストをします!

考察

うん、なかなかいいんじゃないでしょうか。 これなら、URLが増えてもプログラムはスッキリしますね!

研究メモ

  1. 連想配列の初期化は %連想配列 = (名前, 値, 名前, 値, ...); です。
  2. 連総配列でキーの存在を調べるには exists $連想配列{調べたい名前} です。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。