
$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$変数; }
上記のような形で取得可能でしたら物凄く短く済ませられそうに感じてしまいます。
先輩方のお知恵をお借りできましたら幸いです。ご教授宜しくお願い致します。
No.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;
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
お忙しい中ご掲示頂きまして有難うございました。
当初の予定は短くすませられないか・・でしたが(今回は記載していなかったのですが)その前提としまして200を越える数字以外に1_1や1_1_1などのケースも考えられる状況でしたので、そうなってくるとハッシュを使ってどのようにすれば解決できるのか・・・を他の方からご掲示頂いても私としては中々案を見出せませんでした。
その為、別途スレッドを正規表現についてで立ち上げ、正規表現で解決できないかと思考を変えてみたような状況でしたのです。
今回は何とか正規表現を使って1~200までの数値と1_20や1_1_14などのケースにも対応させる形を作る事ができました。
今回頂きましたご意見そのものは、ハッシュを使う形の一つの実現の仕方として参考にさせて頂きました。
また仰る通り短くすませるという目的で今回私が提示した条件を抜きにすれば200行余分に入る事にはなりますがroot139 様の掲示された方法でも良いかと思います。
ちなみに短くする事の理由ですが、関数にした場合毎回呼び出し毎に200行又は400行近くあればその呼び出し回数に比例して負荷がかかるのではないかと考えた為でした。
正規表現でその問題を回避したとしても逆に効率が落ちるようであれば、200行ないし400行余分になってもそうするべきなのかな・・とは思います。この件については別途スレッドを立ち上げて質問し皆様の意見を伺ってみたいと思います。
有難うございました。
No.4
- 回答日時:
私だったら、途中の変数は排除して直接 $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;
}
}
皆様大変参考になりますアイデアや方法論につきましてご掲示頂きまして有難うございます。
最初にご掲示頂きました方法ですが、
もし、数値が入ってない場合や数値が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"; }
当初の目的でした簡単にできないか・・・という目標は何とかクリアできました。
沢山の参考アイデア有難うございました。
No.3
- 回答日時:
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?とかやったことがなくて、よくわかりませんが。
お忙しい所ご掲示頂きまして有難うございます。
こちらにご掲示頂きました例ですが
my $num = $FORM{CMD};
として
${"Print$num"}
で代入する所が「そっか!」と思わされる瞬間でとても為にになりました。
ですが、良く良く考えてみました所、200以上の数値や$FORM{CMD}に値が入っていない場合を想定しますと
まだもう一工夫欲しい所でした。
しかし当初の目標を達成できましたので、少し前進できたように感じます。
有難うございました。
No.2
- 回答日時:
手っ取り早く、イメージに近いやり方は、evalを使うのが良いかと。
sub _Test{
my $Print;
eval "\$Print=\$Print".$FORM{CMD}.";"; ##ここ
print <<HTML;
HTML
}
深夜にもかかわらずご掲示いただきまして有難うございました。
eval構文で代入する方法というのがあったんですね。
先日も別の件で「ほえ~なるほど~」みたいな感じに思わされる瞬間だったのですが、今回も同様にとても参考になる考えでした。
ですが、当初予定していなかった200以上の数値や値が入っていない場合を想定しますと、いささか不安といいますかエラーになるケースも出てきてしまう為、もう少し思考してみたいと思います。
でもおかげさまで当初の問題を解決する事ができましたので一歩前進する事ができました。
有難うございました。また何かのおりにはご掲示頂けましたら幸いです。
No.1
- 回答日時:
配列を使えばいいんじゃないでしょうか?
下のコードはちゃんと動かしてないので動くかどうかわかりません(笑
イメージだけ感じ取ってください。
// 初期化
@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;
}
}
お忙しい中ご掲示頂きまして有難うございます。
配列を使うという考えですね。
問題は$FORM{CMD}に200以上の数値や空だった場合をどうするか・・だと思いました。
工夫すれば出来るかとは存じますが、まだ私の技術や知識レベルでは直ぐに解決案が見出せず今回は一つの参考にさせて頂くに留まりました。
ゆくゆくは色々な構文を使って自由に条件分岐させられるようになれれば・・と思わせられる一瞬でもありました。
このたびは有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- その他(コンピューター・テクノロジー) Pythonの np.indicesに関する質問です。 2 2023/02/07 08:19
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォームデータをハッシュで返...
-
Perlでいうハッシュとはどのよ...
-
短くできないでしょうか
-
正規表現を使ってコードを短く...
-
VBAにハッシュ関数はないのです...
-
[perl] $xxx == 1 or $xxx == 5...
-
CGI入門者に適した本を教えてく...
-
サブルーチンでファイルの内容...
-
ハッシュリストって単にハッシ...
-
Perlのハッシュ変数のソートに...
-
チェックデジットについて
-
JSを使ったタブの別ページから...
-
ハッシュのソート
-
ハッシュのハッシュを実現したい。
-
検索するプログラミング
-
ActivePerl がハングアップ
-
ハッシュ検索はなぜ速い
-
複数の変数を持つ値のsort
-
chomp( shift(@array) )
-
プレースフォルダで複数の型を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
ハッシュ値によるファイルの同...
-
ハッシュ値が一致したデータは...
-
Perlは戻り値で、ハッシュや配...
-
まったく同じファイルのハッシ...
-
ハッシュとツリー構造
-
短いハッシュの作り方
-
*(アスタリスク)の意味
-
アンカークリックで2ヶ所のリ...
-
一意(ユニーク)かつ、ソート...
-
Perl初心者ですが
-
英語でのシャープとコメの呼び...
-
VBAにハッシュ関数はないのです...
-
Perlのサブルーチンの引数に配...
-
rubyであるサイトのデータを自...
-
サブルーチンの引数としてハッ...
-
ハッシュにおける値の取り出し
おすすめ情報