重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

$Print0 = "0.htm";
$Print1 = "1.htm";
$Print2 = "2.htm";
...
$Print199 = "199.htm";
$Print200 = "200.htm";

と200程度変数があったとして

sub _Test{
my $Print;
if($FORM{CMD} eq '0'){ $Print0; }
elsif($FORM{CMD} eq '1'){ $Print = "$Print1"; }
elsif($FORM{CMD} eq '2'){ $Print = "$Print2"; }
...
elsif($FORM{CMD} eq '199'){ $Print = "$Print199"; }
else{ $Print = "$Print200"; }
print <<HTML;

$Print

HTML
}

何とか上記のような形で関数の外にある変数を取得する所まで設定出来たのですが、
このようにすると400行近くになる為、もし$FORM{CMD} eq '1'の値を変数に置き換え取得可能な場合ですと、
少ない行で済ませられるんじゃないのかな・・と考えたのですが可能でしょうか。

イメージとしまして

$Print$変数 = "$変数.htm";

if($FORM{CMD} eq '$変数'){ $Print$変数; }

上記のような形で取得可能でしたら物凄く短く済ませられそうに感じてしまいます。
先輩方のお知恵をお借りできましたら幸いです。ご教授宜しくお願い致します。

A 回答 (5件)

私が思いついたのはハッシュを使う方法でした。



%html_path = (
0 => "0.htm",
1 => "1.htm",
2 => "2.htm",
 ・
 ・
 ・
200 => "200.htm"
);

という感じのハッシュを作って、

sub _Test{
my $Print;
if (defined($html_path{$FORM{CMD}})) {
# 該当する項目が存在した場合
$Print = $html_path{$FORM{CMD}};
} else {
# 該当する項目が存在しない場合
$Print = "";
}
print <<HTML;

$Print

HTML
}

となります。

ハッシュですので、$FORM{CMD} にどんな値が入っていても実行時エラーにはなりません。
また、%html_path のキーはどんな文字列でもOKです。
例 ------------------------------------------------------
%html_path = (
hoge => "0101.htm",
boo => "0202.htm"
);
---------------------------------------------------------

キーや値が連番で構成されている場合は、配列と同じ様にループで初期化することもできます。
例 ------------------------------------------------------
%html_path = ();
for ($i = 0; $i <= 200; $i++) {
$html_path{$i} = $i . '.htm';
}
---------------------------------------------------------

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

お忙しい中ご掲示頂きまして有難うございました。

当初の予定は短くすませられないか・・でしたが(今回は記載していなかったのですが)その前提としまして200を越える数字以外に1_1や1_1_1などのケースも考えられる状況でしたので、そうなってくるとハッシュを使ってどのようにすれば解決できるのか・・・を他の方からご掲示頂いても私としては中々案を見出せませんでした。

その為、別途スレッドを正規表現についてで立ち上げ、正規表現で解決できないかと思考を変えてみたような状況でしたのです。

今回は何とか正規表現を使って1~200までの数値と1_20や1_1_14などのケースにも対応させる形を作る事ができました。

今回頂きましたご意見そのものは、ハッシュを使う形の一つの実現の仕方として参考にさせて頂きました。

また仰る通り短くすませるという目的で今回私が提示した条件を抜きにすれば200行余分に入る事にはなりますがroot139 様の掲示された方法でも良いかと思います。

ちなみに短くする事の理由ですが、関数にした場合毎回呼び出し毎に200行又は400行近くあればその呼び出し回数に比例して負荷がかかるのではないかと考えた為でした。

正規表現でその問題を回避したとしても逆に効率が落ちるようであれば、200行ないし400行余分になってもそうするべきなのかな・・とは思います。この件については別途スレッドを立ち上げて質問し皆様の意見を伺ってみたいと思います。

有難うございました。

お礼日時:2005/05/09 02:10

私だったら、途中の変数は排除して直接 $num.htm の状態で書き出すのですが。



sub _Test{
print $FORM{CMD} .'.htm';
}

または

sub _Test{
# 中身が空の場合は排除する
if($FORM{CMD} == 0 or $FORM{CMD} ne '') {
my $print = $FORM{CMD} .'.htm';
print $print;
}
}
    • good
    • 0
この回答へのお礼

皆様大変参考になりますアイデアや方法論につきましてご掲示頂きまして有難うございます。

最初にご掲示頂きました方法ですが、
もし、数値が入ってない場合や数値が200以上だった場合はエラーになるようです。

2番目の方法論ですけれども、中身が空の場合については良いのですが、数値が200を越える場合を想定しますと
もう一工夫必要に感じてしまいます。

現在は下記のような形で止まっているのですが、文字列検索を行う形で条件分岐できないかと思考中でございます。

my $Print;
if($FORM{CMD} eq ''){ $Print = "00.htm"; }
else{ $Print = "$FORM{CMD}.htm"; }


my $Print;
if($FORM{CMD} =~ /a|b|c|d|e|f/){ $Print = "$FORM{CMD}.htm"; }
else{ $Print = "$FORM{CMD}.htm"; }

当初の目的でした簡単にできないか・・・という目標は何とかクリアできました。

沢山の参考アイデア有難うございました。

お礼日時:2005/05/07 18:49

sub _Testのブロックは単純に下のような感じにすればいいと思います。



sub _Test {
my $num = $FORM{CMD};
print <<HTML;

${"Print$num"}

HTML
}

でも200程度の変数$Print数字も用意する必要がない気がします。${"Print$num"}の代わりに$num.htmではだめなのかもしれないですけど、"$num.htm"?、eval($num.htm)?
CGI?とかやったことがなくて、よくわかりませんが。
    • good
    • 0
この回答へのお礼

お忙しい所ご掲示頂きまして有難うございます。

こちらにご掲示頂きました例ですが
my $num = $FORM{CMD};
として
${"Print$num"}
で代入する所が「そっか!」と思わされる瞬間でとても為にになりました。

ですが、良く良く考えてみました所、200以上の数値や$FORM{CMD}に値が入っていない場合を想定しますと
まだもう一工夫欲しい所でした。

しかし当初の目標を達成できましたので、少し前進できたように感じます。

有難うございました。

お礼日時:2005/05/07 18:54

手っ取り早く、イメージに近いやり方は、evalを使うのが良いかと。



sub _Test{
my $Print;
eval "\$Print=\$Print".$FORM{CMD}.";"; ##ここ
print <<HTML;
$Print
HTML
}
    • good
    • 0
この回答へのお礼

深夜にもかかわらずご掲示いただきまして有難うございました。

eval構文で代入する方法というのがあったんですね。
先日も別の件で「ほえ~なるほど~」みたいな感じに思わされる瞬間だったのですが、今回も同様にとても参考になる考えでした。

ですが、当初予定していなかった200以上の数値や値が入っていない場合を想定しますと、いささか不安といいますかエラーになるケースも出てきてしまう為、もう少し思考してみたいと思います。

でもおかげさまで当初の問題を解決する事ができましたので一歩前進する事ができました。

有難うございました。また何かのおりにはご掲示頂けましたら幸いです。

お礼日時:2005/05/07 19:03

配列を使えばいいんじゃないでしょうか?


下のコードはちゃんと動かしてないので動くかどうかわかりません(笑
イメージだけ感じ取ってください。

// 初期化
@HtmlPages = ();
for($i = 0; $i <= 100; $i++){
$HtmlPages[$i] = "$i.html";
}

// 判定
for($i = 0; $i <= 100; $i++){
if($FORM{CMD} eq "$i"){
$Print = $HtmlPages[$i];
last;
}
}
    • good
    • 0
この回答へのお礼

お忙しい中ご掲示頂きまして有難うございます。

配列を使うという考えですね。
問題は$FORM{CMD}に200以上の数値や空だった場合をどうするか・・だと思いました。

工夫すれば出来るかとは存じますが、まだ私の技術や知識レベルでは直ぐに解決案が見出せず今回は一つの参考にさせて頂くに留まりました。

ゆくゆくは色々な構文を使って自由に条件分岐させられるようになれれば・・と思わせられる一瞬でもありました。

このたびは有難うございました。

お礼日時:2005/05/07 19:11

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