Perlのプログラムのエラーです。ローカルでは問題なく動きました。サー
Perlのプログラムのエラーです。ローカルでは問題なく動きました。サーバはさくらサーバで文字コードはEUC-JPです。
CGIから文章をMECAPIという形態素解析APIに送って、品詞ごとにファイルに書き込みます。
Status: 500 Content-type: text/html
Software error:
Can't locate object method "content" via package "HTTP::Response=HASH(0x86e9250)" (perhaps you forgot to load "HTTP::Response=HASH(0x86e9250)"?) at test9.cgi line 49.
#!/usr/local/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use Encode qw/encode decode/;
use utf8;
use CGI;
use CGI::Carp qw( fatalsToBrowser);
my $str;
my $i;
my $j;
&main;
sub main{
my $q = new CGI();
$str = $q->param( "words" );
$str = decode('euc-jp', $str);
my $title = encode('euc-jp', "MeCab APIを呼出す");
my $h1 = encode('euc-jp', $str . "の品詞");
print $q->header( -type =>"text/html", -charset => "euc-jp" );
print "<meta http-equiv=\"refresh\" content=\"5;URL=./test2.html\">";
print $q->start_html( $title ),
$q->h1( $h1 ),
$q->start_ul;
my $esc = CGI::escape($str);
Encode::from_to($esc, "euc-jp", "utf8" );
my $ua = LWP::UserAgent->new;
$ua->agent('PerlSample/0.1');
$ua->timeout(5);
my $response = $ua->get('http://mimitako.net/api/mecapi.cgi?sentence=' . $esc . '&response=surface,feature');
Encode::from_to($response, "utf8", "euc-jp" );
my @res = split(/<word>/, $response->content);
foreach $i (@res){
$i = decode('utf8', $i);
my @wc = ("名詞", "動詞", "形容詞", "助動詞", "助詞" , "接頭詞" , "接続詞" , "記号" );
my @fn = ("N" , "V" , "A" , "MV" , "JOSHI","SETTOUSHI", "SETSUZOKUSHI", "KIGOU");
for($j=0; $j<@wc; $j++){
if($i =~ /<surface>(.+)<\/surface><feature>$wc[$j]/){
$str = encode('utf8', $1);#utf8
my $filename = encode('euc-jp', $fn[$j]);
open(OUT, ">>./dir/$filename.txt");
Encode::from_to($fn[$j], "utf8", "euc-jp" );
print $fn[$j].$str." ";
$str = encode('euc-jp', $1);
Encode::from_to($str." ", "utf8", "euc-jp" );
print OUT "$str\n";
close(OUT);
last;
}
}
}
}
お礼
sakusaker7様へ 夜分に誠にありがとうございます。 >これは元のXMLデータがどのようなフォーマットになっているのか、 また、それを XML::TreePP がどのように解析するかの問題でしょう。 全く同じに取り扱っても、結果が全く違うフォーマットで出力されることがありうるのですね。XMLデータを見ると、どちらも単なる文字データとしか見えないので、TreePPの解析側に原因がありそうです。 >$hash->{title} からたどれるハッシュには '-type' と '#text' という >二つのキーがあるということですね。 -type:#textという1つのキーではなく、 '-type' と '#text' という2つのキーなのですね! (この点を勘違いしていました) >'#text'の方に本体があるっぽいので、 >$titleyou = $hash->{title}->{#text}; >とすればタイトルの文章が取れそうな気がします。 タイトルがとれました! ありがとうございます! >'-type' の方は何かの説明でも入るんですかねえ。 >こっちも >$hash->{title}->{-type}; >で内容が取れるはずなんで、一応チェックしてみてください。 チェックしてみたところ、全て text という文字が返ってきました。 文字データのタイプはtextですよ、という説明の様です。 ということは、文字タイプがtextという説明がある場合、TreePPは リファレンスを返す様にできている様です。 御陰で、今後、リファレンスの問題が起こった時、どうすればよいのかが分かりました(今まで、別のプログラムで、本筋と関係ないところで、偶然?同様の表示を目にしたことがありました)。 これで、 ●ハッシュ変数の謎 ●キーを取り出す方法 ●取り出されたキーの見方 ●キーから要素を取り出す方法 以上4点が分かりました。 これで前に進む事ができます。 この度は、丁寧に指導いただき、誠にありがとうございました! 心より感謝致します。