2011-12-06 16 views
-1

ので、未定義の値にメソッド「CONTENT_TYPE」を呼び出すことはできません、それは次のように起動します。Perlの - 私は私が実行しようとしていますPERLスクリプトを持って、

use strict; 
use a; 

use CGI 'param'; 
use URI::Escape; 
use HTML::FromText 'text2html'; 
use XML::Simple; 
use LWP::UserAgent; 
use Data::Dumper; 
use URI::Escape; 
use DBI; 
use Tie::DBI; 
use Digest::MD5 'md5_hex'; 
use MIME::Base64; 
use Encode; 

my $r = shift; $r->content_type("text/html; charset=utf-8"); my $tmp = a::tmp(); 

それが得るのをどこCONTENT_TYPE部分に()関数が呼び出されると、このエラーメッセージで失敗します。

Can't call method "content_type" on an undefined value at script.pl line 18. 

アイデアはありますか?私はまったく初心者です。

+0

の例のいくつかをチェックしてくださいあなたがから値を引くしようとしていることを混同される可能性があります'@ _ '。 'my $ r = shift(@ARGV);を試してください。 –

+1

@JackManey:ここではそうではありません。 '@ _ 'はsubsの内部にあります。 'shift 'はどのサブの中にもないので' @ ARGV'に作用します。それは明示的にする必要はありません。 – Zaid

+0

@JackManey - 実際はそうではありませんが、ARRAYは省略され、 '@ _'配列はサブルーチンと形式の字句範囲内にシフトし、' @ ARGV'配列はサブルーチン外にあります。私の答え。 – Xaerxess

答えて

4

$r@ARGVからのものである場合、content_typeメソッドはありません。

あなたは潜在的にbless$rをいくつかのパッケージに入れることができますが、これはあなたがやろうとしているものではありません。

私はおそらく、あなたはCGIパラメータを取得することPOST編アップロードファイルを推測していますか?したがって、$rCGIオブジェクトであり、パラメータではありません。あなたは、その後、

my $r = CGI->new; 

で始まるでもしたい、私はシェルからCGIhttp://perldoc.perl.org/CGI.htmlまたはperldoc CGIのために非常に細かいマニュアルにあなたを参照してください。

(ビット:) perlで

を展開するには、$スカラーvarが "任意の一つのことを。" を保持しますコマンドラインから入ってくるものは一般的に文字列です(良い日には多分数字です)。それはshiftがトップレベルになることです。 (特殊変数@ARGVには、プログラムに渡されるコマンドラインパラメータが含まれています)。

「1つのこと」は、オブジェクトへの参照でもあります。 Perlのオブジェクト指向モデルでは、方法パッケージ(「クラス」)のblessを使用してそのリファレンスに接続されています。それは通常、あなたのために処理されます。特別なサブルーチン(別名関数、メソッド)CGI::newは、いくつかの状態データ(フォームフィールドの値のようなもの)を持つ新しいCGIオブジェクトを作成し、 CGIパッケージに入れます。

->関数呼び出しを行う表記は、変数にbless ed参照が含まれている場合にのみ機能します。 refを使って、変数にどのような参照があるかを "尋ねる"ことができます。あなたはそのパッケージ(別名クラス)の名前を得るでしょう。($foo = []; bless $foo => 'Some::Package'; print ref $foo; =>Some::Package

- しかし、再び、あなたの特定のケースのために、CGIモジュールのマニュアル:-)

+1

あなたは間違っていると思います。 '$ r'はmod_perlプログラミングにおける[RequestRec](http://p3rl.org/Apache2::RequestRec)オブジェクトの一般的な名前です。 – daxim

+0

ああ、うわー、それは考えていませんでした:-D これはCGIスクリプトではなく、 'mod_perl'モジュールであることを意図しているなら、エントリーポイントサブルーチンのように、 – BRFennPocock

0

Perldocは言う:

ARRAYが省略された場合、 サブルーチンやフォーマットの字句範囲内@_配列、及びサブルーチン外部@ARGV配列(...)

をシフト

これは空のように見える2番目のケース(@ARGV)です。 @ARGVをダンプして内容を確認してください。

+4

私は '@ ARGV'が' bless'edオブジェクト参照を含んでいないことはほとんど確信しています:-) – BRFennPocock

+0

@BRPocock '$ r'をそこに置くことは可能ですが、おそらく正しいでしょう)+1あなたの答え。 – Xaerxess

+0

私はたぶん私の人生のある時点で '@ ARGV'に物を詰め込んだと思うのですが、目的のために' @ARGV => CGI :: new'を押す人は徹底したスパンキングと夕食が必要です。 – BRFennPocock

関連する問題