• ベストアンサー

Perlのクラス(*.pm)からuseする側の*.cgi内ののスカラやハッシュ、配列の参照は可能でしょうか?

 Perlのクラス(*.pm)からuseする側の*.cgi内ののスカラやハッシュ、配列の参照は可能でしょうか? いろいろなサーバに対応させやすくするため 1行目(Perlのパス)や各種モジュールのパスや設定情報を*.cgiに書いてプログラム本体は*pmに置きたいのです。 それとももっといい方法がございますでしょうか。  教えて!ください。

noname#179638
noname#179638
  • Perl
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
回答No.2

モジュールに渡したい変数をハッシュにしておいて、 モジュールのほうで、 sub new{ my $class = shift; my %param = @_; my $self = { param => \%param}; return bless($self,$class); } useする側では、 my $hoge = new hoge(%in); とすると、$hoge->{param}でnewで渡したパラメータが読めます。 これを利用すれば大丈夫ではないでしょうか。

noname#179638
質問者

お礼

 ご回答ありがとうございました。 とても参考になりました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

状況が良く判りませんが、 例えばnew するときの引数として、必要な参照を渡す あるいは、モジュール変数に必要な参照を設定する とかすればいいんじゃないでしょうか

関連するQ&A

  • perl niftyについて。use CGI;

    画像アップロードのスクリプトを作ろうと思っているのですが、 use CGI; という記述をすると、ここでエラーに引っかかります。 下はperl checkerでのエラー表示です Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5/5.00503/sun4-solaris /usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/site_perl/5.005/sun4-solaris /usr/local/lib/perl5/site_perl/5.005 .) at a.cgi line 10. BEGIN failed--compilation aborted at a.cgi line 10. 参考URLはここ http://www.topstudio.co.jp/~kmuto/html/node38.html niftyでは使えないようになってしまっているのでしょうか? また、CGI.pmを使わないファイルアップロードの仕組みを解説しているサイトを知っている方がいたら、教えてくださいませ。

    • ベストアンサー
    • CGI
  • CGI.pmを別の複数の自作モジュールでそれぞれuse。標準入力STDINのCGI.pm経由での間接的な複数回読み込みは大丈夫?

     CGI.pmを別の複数(少なくとも2つ)の自作モジュールで それぞれのuseします。 別の複数の自作モジュールは 別のcgiファイルから一回のcgiのプロセスで 両方(あるいは全部)useします。 この場合、標準入力STDINのCGI.pm経由での 間接的な複数回読み込みは大丈夫でしょうか? 通常はSTDINは一回のcgiのプロセスで一回しか読めないはずですよね? 各モジュールから重複useしても (もちろん複数の各モジュールで重複useしているのであり一つのモジュール内ではuse CGI;は一回のみです) CGI.pmのほうでうまく処理して複数回読んでくれるのでしょうか?

    • ベストアンサー
    • Perl
  • Perlのサブルーチンの引数に配列やハッシュをCall by Valueすることはできない?

     タイトルどおりなんですが・・・。  Perlのサブルーチンに配列やハッシュを実体渡ししようとしたんですが,どうやってもできません.あきらめて,参照渡しにしたら,なんかうまくいっている模様です.  これは,そもそも,はじめから参照渡ししか用意されていない、ということでしょうか?.それとも,何か実体渡しする方法があるのでしょうか?.  後,余談なんですが,配列やハッシュの要素に別の配列やハッシュの実体を入れることはできるのですか?.これもちょっと試してみたらできなさそうだったのですが,あちこちのWebにある入門マニュアルみたいなページを見ても,その辺の話が「できる」とも「できない」ともほとんどの場合かいてなくて,自分の試し方が悪いのか,それとも無駄なことを延々とやっているのかがわからなくて疲れます.

  • CGI_Lite.pmは,Perl6.5.1 で使えますか?

     私は初心者です。本を見ながら付属CDに入っていた掲示板セットをアップロードしましたが正常に動作しませんでした。いろいろ試行錯誤をした結果、どうやら「CGI_Lite.pm」というものが原因らしく、それはPerlのバージョン4では使えないということまでは知りました。  私のアップロードしているレンタルサーバのバージョンは6.5.1ですが、「CGI_Lite.pm」は機能しないのでしょうか?初心者故に的外れな質問かもしれませんが、どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI
  • パッケージとモジュールについて

    こんにちは。Perlを学習し始めた初心者です。 Perl 5.87を使っており、標準モジュールを使う方法を書籍で読みました。 例えば、フォームに入力、送信されたデータを処理するために use CGI; と最初に記述して使うことができますが、 別のエラー処理の構文を見ると $CGI::POST_MAX と1行目に記述してあります。 パッケージとモジュールの概念が、よく分かっていないので戸惑って います。 C:\perl\lib にある、CGI.pmというモジュールを使用していると思う のですが、use CGI;と記述するときと $CGI::と記述するとき、何が異なるのでしょうか? 後者はCGI.pmの中にある、POST_MAX変数を使うということでしょうか? パッケージという言葉を見ても、よく分からずネットで随分調べましたが、余計に分からなくなってしまいました。 お忙しいところ申し訳ありませんが、よろしくお願い致します。

    • ベストアンサー
    • Perl
  • [Perl] CGI_Lite.pmでファイル名取得できない

    CGI_Lite.pmを使用してファイルをアップロードするCGIを書いていますが、ファイル名によっては、名前の途中までが消えてしまいます。 cgiとhtmlは、以下のとおりです。EUC、Shif-JISの両方で、また、LinuxとWindowsXPの両方で試してみました。 例 「可能性.txt」というファイルをアップすると、 「性.txt」というファイル名になります。 環境: CGI_Lite.pmは、2つのバージョンを試してみました。 (1), CGI_Lite 2.02 http://search.cpan.org/~smylers/CGI-Lite-2.02/Lite.pm (2), CGI_Lite 1.8 http://search.cpan.org/dist/CGI_Lite/ OSなど (1), WindowsXP + AnHTTPd + Perl5.8.8 (2), SuSE Linux + Apache2.0 + Perl5.8.3 ■アップするHTML <html> <form action='test.cgi' ENCTYPE='multipart/form-data' method='post'> <input type="file" name="file1"> <input type="submit"> </form> </html> ■アップされるCGI(test.cgi) #!/usr/bin/perl use CGI::Lite; my $cgi=new CGI::Lite; $cgi->add_timestamp(0); $cgi->set_directory('./') or die $!; $cgi->set_platform ('Unix'); $cgi->set_buffer_size (10000); my %in = $cgi->parse_form_data(); print"Content-type: text/html\n\n"; print"-->$in{'file1'}\n"; 以上、よろしくお願いします。

    • 締切済み
    • CGI
  • Perl:CGI.pm:入力ボックスのクリア?

    お世話になります。 下のサンプルコードは、CGI.pmのperldocに載っていたサンプルを改造したものです。 #! /usr/bin/perl # # simple.cgi -- CGIフォームの実験 use CGI qw/:standard/; use CGI::Carp qw/fatalsToBrowser warningsToBrowser/; print header( -expires=>'-1d', -pragma => 'no-cache', 'Cache-Control' => 'no-cache'), start_html('Simple Script'), h1('Simple Script'), start_form, "What's your name? ",textfield(-name=>'name', -default=>""),p, submit, end_form, hr,"\n"; if (param) { print "Your name is ",em(param('name')),p, } print end_html; 改造点はheader関数にexpires、pragma、Cache-Controlを入れてみたこと、 textfieldに-default=>""を入れてみたこと、 UIと表示項目を1つに減らしたことです。 やりたいのは、上のテキストボックスに名前を入れて、submitを押した瞬間に、上のtextboxをクリアすることです。 ぼくの理解では、最初に上記のCGIがあるURLにアクセスしたときにはプログラムは全部走ってしまう、paramがゼロだからそのときは入力表示を出すだけ、 実行を押した後もう一度このプログラムは最初から走る、paramに値があるから出力が表示される、というものです。 となれば、2度目に(入力を得て)実行されるときは、headerのcache関係の項目や、textfieldのdefaultが効いて空白になりそうな気がしますが、現実には最初に入った値がそのまま動き続けます。 これをPerl側で空白になるように制御できるでしょうか。 サーバーはFreeBSD(レンタル)、Perlは5.12、WebサーバーはApacheです。 クライアントはWindows7でIE9、Firefox22、Chrome28を使っています。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • homeにインストールしたperlモジュールを使用する方法

    linuxのレンタルサーバーを使っているのですが、 root権限が無いためperlモジュールをhomeにインストールしました。 perlスクリプトからhome下にあるモジュールを呼び出すとき ef)lib use '/home/perl/'; use CGI; のように"lib use"を使うことなく   use CGI; だけでhome下のモジュールを呼び出すことはできないでしょうか? 良い方法があれば教えてください。

  • <Perl>参照配列の出力に失敗する。

    <Perl>参照配列の出力に失敗する。 お世話になります。 配列の出力部で以下のエラーが出力されます。 Use of uninitialized value in print at test2.pl line 12. -----コーディングは以下の通りです。----- #!C:\perl use strict; use warnings; my @l = (); #----------- #GetDataへCSVファイル名と、格納用配列を渡す #----------- my $cnt = &GetData("test.csv", \@l); print "COUNT -> ".$cnt; for(my $i=0; $i < $cnt; $i++){ print $l[$i]; } ################################################################## # 概   要:指定したCSVファイルをオープンしCSVデータを配列に取得する。 # パラメータ:ファイル名, CSVデータ格納用配列 # 戻 り 値:データ取得件数 ################################################################## sub GetData { my ($f, @bf) = @_; my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @bf = split(/,/, <FP>); close(FP); $rcnt = @bf; print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } -----実行結果は以下の通りです。----- D:\>perl test.pl FILE NAME -> test.csv FILE OPEN -> success. CSV GET COUNT -> 5 Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. COUNT -> 5 -----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)----- あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの 配列の要素数が取れているので、配列内にデータは格納されているとは思っています。 出力方法をどのように正せばよいがご教示お願い致します。

    • ベストアンサー
    • Perl

専門家に質問してみよう