Perl - невозможно вызвать метод "content_type" для неопределенного значения - PullRequest
0 голосов
/ 06 декабря 2011

Итак, у меня есть скрипт на 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.

Есть идеи? Я новичок в Perl.

Ответы [ 2 ]

4 голосов
/ 06 декабря 2011

Если $r исходит от @ARGV, у него не будет content_type метода.

Вы можете потенциально bless $r в какой-то пакет, но это, конечно, не то, что выВы собираетесь сделать здесь.

Я предполагаю, что вы хотите получить параметр CGI, вероятно, POST ed файл загрузки?Таким образом, вы хотите, чтобы $r был CGI объектом, а не параметром.Вы начнете с

 my $r = CGI->new;

Но затем я отсылаю вас к очень хорошему руководству по CGI, http://perldoc.perl.org/CGI.html или perldoc CGI из оболочки.

(Чтобы немного расширить:)

В Perl, $ scalar var содержит «что-нибудь одно».Вещи, поступающие из командной строки, обычно являются строками (возможно, числами в хороший день);это то, что shift получит на верхнем уровне.(Специальная переменная @ARGV содержит параметры командной строки, передаваемые в вашу программу.)

«Одна вещь» также может быть ссылкой на объект.В объектно-ориентированной модели Perl методы пакета ("класс") привязаны к этой ссылке с помощью bless.Это обычно обрабатывается для вас, хотя;специальная подпрограмма (она же функция, метод) CGI::new создаст новый объект CGI с некоторыми данными состояния (например, значения полей формы) и bless его в пакет CGI.

Запись -> при вызове функции будет работать, только если ваша переменная содержит bless ed ссылку.Вы можете «спросить», какая у вас ссылка на переменную, используя ref;вы получите имя его пакета (он же класс).($foo = []; bless $foo => 'Some::Package'; print ref $foo; => Some::Package)

- Но, опять же, для вашего конкретного случая, посмотрите некоторые примеры в руководстве по модулю CGI: -)

0 голосов
/ 06 декабря 2011

Perldoc говорит:

Если ARRAY опущен, сдвигает массив @_ в пределах лексической области видимости подпрограммы и форматы, а также массив @ARGV вне подпрограммы (...)

Это второй случай (@ARGV), который кажется пустым. Попробуйте сбросить @ARGV, чтобы проверить его содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...