• ベストアンサー

変数名の動的な付け方?

久しぶりにPerl/CGIを使って 今、少し変わったプログラムをPerl/CGIで作成しています。 そこで、悩みの種がでてきたのでご相談させていただきます。 例 log.cgi ------------------------------------ id<>hogehoge<> pass<>hogehoge<> time<>09/01/01<> ipad<>127.0.0.1<> ... というログファイルがあるとします。 何行あるかは状況によって変わりますので指定できません。 ただ、それはforeach等で対応できるかな?と思いました。 ここで私のやりたいことなんですが。 test.cgiというメインプログラムで上記ログを開いてから 前の項「id<>hogehoge<>」で言う「id」の部分をそのまま変数名にしてやりたいのです。 ログファイルを読み込む → 一行目を読み込み $id = "hogehoge"; とする → 二行目を読み込み $pass = "hogehoge"; とする ... foreachで対応できるかなーと山勘を探って見たのですが 動的に変数を定義するようなことってできるのでしょうか? お答え頂ければ幸いです。

  • CGI
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • atse
  • ベストアンサー率83% (36/43)
回答No.2

$str = "id<>hogehoge<>"; ($key,$val) = split(/<>/ , $str); ${$key} = $val; print "Content-type: text/plain\n\n"; print '$id = ' . $id;

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4845/10256)
回答No.1

evalでできると思いますが、そもそも、変数名にする必要は無いのでは? 普通は、ハッシュのキーにすると思います。

関連するQ&A

  • 正規表現による検索

    正規表現によって文字列を検索し、該当する文字列が存在する場合には存在する旨のメッセージを出力し、存在しない場合には存在しない旨のメッセージを出力するようなプログラムを作りたいのですが現在うまくいっておりません。ソースは以下になります。 #!/usr/bin/perl $logfile = './log_euc.log'; # ログファイル @logs = &read_file($logfile); foreach $log (@logs) { if ($log = ~/hogehoge/ ){ $log_stg = " 変数に文字列hogehogeは含まれています。 "; }else{ $log_stg = " 変数に文字列hogehogeは含まれていません。 "; } print " 判定結果\n "; print " $log_stg\n "; } sub read_file { local($logfile) = $_[0]; open(IN,$logfile); local(@files) = <IN>; close(IN); return @files; } 検索対象のファイル「log_euc.log」は以下です。 hogehoge mugemuge riri ari siri siursoiu sojowijugo hfsoiehrohogehoge sjhoisjofhoge osihojfhoge hsoghsoehogehogesoijggggg 検索結果は以下です。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。

    • ベストアンサー
    • Perl
  • リファラを取得するためのCGI

    アクセスログを取るためのcgiをPerlで作っています。 例えば、 hogehoge.html というページのアクセスログを取るためにlog.cgiというスクリプトを用意します。 hogehoge.htmlからは、IMGタグを使用して、<IMG src="log.cgi">のようにcgiを呼び出しています。 log.cgiからは、ダミーのgifファイルを返します。 ここで、log.cgiでは訪問者のリファラを取得して記録するようにしていますが、この仕組みだとhogehoge.htmlがリファラとして記録されてしまいます。(hogehoge.htmlが呼び出したのだから、当然ですね) hogehoge.htmlへアクセスしたブラウザが持ってたリファラを取得するには、どのようにすればよいでしょうか? 今回はIMGタグでcgiを呼び出していますが、特に手段は選びません。 ちなみに、使用しているサーバーではSSIは使えません。

    • ベストアンサー
    • CGI
  • 外部ファイルでの変数設定について

    下記外部ファイル[conf.php]に書きました変数(?)で index.phpに <?= TITLE ?> は読み込みますが こちらは $log-id = "$log-id"; 読見込めませんでした。 アドバイスいただけると幸いです。 ------------------------ index.php ------------------------ <?php require("conf.php"); ?> <title><?= TITLE ?></title> <? $log-id = "$log-id"; virtual ('./cgi-bin/count.cgi?LOG=$log-id&MODE=n'); ?> ------------------------ conf.php ------------------------ <?php $log-id = "log-id"; // サービス名 define("TITLE", "サービス名.jp"); ?> ------------------------ お忙しいと存じますがよろしくお願いします。

    • 締切済み
    • PHP
  • この変数はどういう扱い?

    とある書籍で簡単なアクセスログの作り方について勉強しているperl初心者です。 下記のコードで2行目までは理解できるのですが、3行目の++$freq[$hour];が理解できずに困っています。ここまでに $freq や@freq という変数や配列など出てきていないのですが、この場合のfreqはどのような命令実行になるのかが理解できずにいます。 while($ln = <FILE>) { ($hour,$min,$host,$refer,$agent) = split(/\t/, $ln); ++$freq[$hour]; } 1行目、ハンドル名FILEで開かれているファイルの1行目を読み込んで変数lnに代入。 2行目、split関数で、$lnの変数値を\t 区分毎に分解し、各変数に代入。 3行目を実行。 最初に戻る。 1行目2回目で、ハンドル名FILEで開かれているファイルの2行目を読み込んで変数lnに代入。 2行目で、split関数で・・・・・・・ ・ ・ 1行目?回目で、ハンドル名FILEで開かれているファイルの?行目から文字列がないので、whileを抜ける。 上記のような形で説明するとすると、3行目ではどのように何が実行されているのでしょうか? アドバイスやご教授をよろしくお願いします。

    • ベストアンサー
    • CGI
  • Perlで特定行から特定行までを抜き出したい

    皆さんのお知恵をお貸し頂ければ幸いです。 Perlで以下のようなことをしたいと考えています。 例えば、次のようなテキストファイルがあったとします。 example.log ================================== aaaa hogehoge test okok perl script ================================== 上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。 イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。 このような場合、どういう風にすればいいのでしょうか? 恐れ入りますが、ご教授頂ければ幸いです。 それでは、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • GETで渡した値の受け取り方

    <a href="xxx.cgi?id=hogehoge">リンク先</a> この"hogehoge"をリンク先のperlのソースで受け取るにはどうすれば良いのでしょうか? PHPでいう $id=$_GET['id']; のようなことをCGIでもやりたいのですが、どなたかご教授下さい。

    • ベストアンサー
    • Perl
  • 受け取った変数がファイルに書き込めない

    Perlで質問があります。 Perlでフォームから受け取った変数の値($title = “333”)を別にCGI 投げます。Printでは問題なく変数の中身が表示されるのですが Txtに書き込もうとするとうまくいきません。 ちなみに行頭で$title = “333”;すると書き込めます。 うまく受け渡しができていないのでしょうか? 以下ソースです。 #!/usr/bin/perl -w require 'lib.pl'; #########i一応lib.plの中身######### $q = new CGI; $q->charset('EUC-JP'); print $q->header; $title = $q->param('title'); ################################## use CGI; my $fname = 'news.txt'; open(FILE, ">>$fname") or die; print FILE $title ; close(FILE);

  • 変数の構造について

    初歩的な質問ですみません。 以下のような変数はどんな構造になっているのでしょうか? 配列の中にハッシュが入っているのかと思っているのですが・・ $list = [ { id => '1', name => 'hoge' }, { id => '2', name => 'fuga' }, { id => '3', name => 'foo' } ]; 上記の$listにあるidを全て出力しようとして以下のようにしても 出力することができません。 foreach ($list) { print $_['id']; print '<br>'; } また「[]、{}」は何を意味するのでしょうか? 当方、PHPには詳しいのですがPerlは最近始めたばかりでよく理解できておりません。 お手数ですが、どなたかお分かりになる方いましたらご教授いただければと思います。

    • ベストアンサー
    • CGI
  • perl 変数 代入

    恐れ入ります。 Perlで、フォームから送信して、変数に代入したいのですがうまくいきません。 print qq!<form action="./xxx.cgi" method="get">!; opendir(DIRHANDLE, "./xxx"); foreach(readdir(DIRHANDLE)){ next if /^\.{1,2}$/; print qq! <input type="checkbox" name="$_" value="$_"> <input type="submit" value="送信"></form> とし、ディレクトリ内のフォルダ名をnameに格納してxxx.cgiへ送信します。 xxx.cgi側では、 #!/usr/bin/perl use cgi; $form = CGI->new; として、送信されたデータを次々と代入したいのですが、どのようにしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • ログの値を出すのに変数を使うには。

    こんな感じののログがあります。 key=0302&030201=あああ&030202=いいい&030203=ううう………#03年02月分 key=0301&030101=あああ&030102=いいい&030103=ううう………#03年01月分 ログからkeyで検索して、あてはまる年月のファイルを表示させるのですが、 1つ1つつくっていたのではファイルが膨大なものになってしまいます。 (面倒だし…。) なので変数を使ってなんとかならないかなぁと思ったのですが。 @wfilelogs = split(/&/,$wfilelog[$i]);     #iは検索した時に出たログファイルの行数の変数 foreach(@wfilelog){ ($wkey,$wvalue) = split(/=/,$_); $WFORM{$wkey} = $wvalue; } #名前と値に分ける。 というような感じになっています。 フォームにログファイルを出す時は $WFORM{'030201'} のようにして出します。 でも毎回03年02月のデータとは限らないので、そのために他にも作成しておくのが大変です。 $WFORM{'変数01'} みたいな感じで出せないかなぁと思ったのですが、できるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう