• 締切済み

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; } } } }

みんなの回答

回答No.5

元の質問にあったエラーと話がそれて来て混乱しているのですが、とりあえずなんか書いてみました。パスとか修正して下さい。あと空白2文字を全角空白にしてます。 #!/usr/bin/perl -T use strict; use warnings; use utf8; use CGI; use CGI::Carp qw(fatalsToBrowser); use CGI::Pretty; use Encode; use LWP::UserAgent; my $q  = CGI->new(); my $text = $q->param("text"); if ( defined $text ) {   my $utf8  = Encode::is_utf8($text) ? $text : Encode::decode_utf8($text);   my $escaped = CGI::escape($utf8);   my $ua   = LWP::UserAgent->new;   $ua->agent('PerlSample/0.1');   $ua->timeout(5);   my $res     = $ua->get( 'http://mimitako.net/api/mecapi.cgi?sentence='       . $escaped       . '&response=surface,feature' );   print $q->header( -type => 'text/plain', -charset => 'UTF-8' );   print $res->status_line, "\n";   print $res->message,   "\n";   print $res->code,    "\n";   if ( $res->is_success ) {     binmode STDOUT, ":encoding(utf8)";     print $res->content, "\n";   }   else {     print $res->error_as_HTML, "\n";   } } else {   print $q->header( -charset => 'UTF-8' ),     $q->start_html( -title => "test", -lang => 'ja', ),     $q->start_form( -method => 'GET', -action => $q->script_name ),     $q->textfield( -name => 'text', -default => 'Input text' ),     $q->submit("Send"),     $q->end_form,     $q->end_html; }

dai_gokuh
質問者

補足

ありがとうございます。 なんとかなりそうなのですが、XMLページを表示できませんとなってしまいます。 クロームだと表示できるのですが、IEでは表示できません。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

ちょっと試したところ再現しました。一番最初に回答された方が指摘した問題が原因のようです。修正しても直りませんでしたか? use strict; use warnings; use LWP::UserAgent; use Encode qw/encode decode/; use CGI; my $str = "test string"; my $esc = CGI::escape($str); 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' ); # Can't locate object method "content" via package ... と出力し、エラーになる Encode::from_to( $response, "utf8", "euc-jp" ); my @res = split( /<word>/, $response->content ); # 成功する # my $content = $response->content; # Encode::from_to( $content, "utf8", "euc-jp" ); # my @res = split( /<word>/, $content );

dai_gokuh
質問者

補足

すみません、どうしてもエラーがでます。 以下はローカルのエラーで、サーバ環境では500番で全く動きません。 --- 実行開始 [>perl untitled3.pl] [Mon Nov 8 05:34:31 2010] untitled3.pl: Use of uninitialized value $str in concatenation (.) or string at untitled3.pl line 24. [Mon Nov 8 05:34:31 2010] untitled3.pl: Use of uninitialized value $esc in concatenation (.) or string at untitled3.pl line 38. Content-Type: text/html; charset=utf-8 <meta http-equiv="refresh" content="5;URL=./test2.html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> <head> <title>MeCab API繧貞他蜃コ縺・/title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <h1>縺ョ蜩∬ゥ・/h1><ul> --- 実行終了 (0)

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

> つまり、HTTPリクエストを送って、なにも返答が帰ってきてないということですね。 違いますよ。モジュールがちゃんと入っているかという意味です。 content メソッドは HTTP::Response が 継承している HTTP::Message で実装している ようなので、HTTP::Message が正しく入っていないかもしれません。 use HTTP::Response; if (HTTP::Response->can('content')) { print 'HTTP::Response can content', $/; } else { print 'HTTP::Response can not content', $/; } if (HTTP::Response->can('content_dummy')) { print 'HTTP::Response can content_dummy', $/; } else { print 'HTTP::Response can not content_dummy', $/; } 入っていれば以下のようになります。 HTTP::Response can content HTTP::Response can not content_dummy でも、 HTTP レスポンスが帰ってきてない可能性もありますね。レスポンスをチェック するのもよいでしょう。 if ( $response->is_success ) { print "HTTP response success\n"; }_ else { print "HTTP response fail\n"; }

dai_gokuh
質問者

補足

HTTP response success HTTP::Response can content HTTP::Response can not content_dummy と表示されました。 どこが問題なのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

エラーそのままの意味だとHTTP::Responseがないと言っているみたいですが、そこはどうですか?

dai_gokuh
質問者

補足

つまり、HTTPリクエストを送って、なにも返答が帰ってきてないということですね。 ということは、ソースの段階できちんとAPIに命令を送れてないということなんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

> Encode::from_to($response, "utf8", "euc-jp" ); response オブジェクトそのものを文字コード変換するのは おかしくありませんか。 my $content = $responce->content; Encode::from_to($content, "utf8", "euc-jp" ); my @res = split(/<word>/, $content); とかじゃないかと。

dai_gokuh
質問者

補足

Perlのオブジェクトというのがよく分かりませんでした。 教えていただいたとおりに書き直してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Cannot decode string with wide characters

    use utf8; binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; use strict; use Encode; sub main(){ #UTF-8(BOMなし),CRLFのファイルに書いてます。 my $str = "あ"; my $bin = $str; $bin = Encode::encode('euc-jp', Encode::decode('utf8', $str)); $bin = Encode::encode('utf8', Encode::decode('euc-jp', $bin)); print "Content-Type:text/plain;charset=UTF-8\n"; print "\n"; print $bin; } &main; ======================= 希望する出力結果: あ ============================ 結果:Internal Server Error Apacheのエラーログ: [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] Premature end of script headers: 20080109-1.pl [Wed Jan 09 15:07:34 2008] [error] [client 127.0.0.1] at C:/Environment/Perl/v5.8.8/lib/Encode.pm line 166.\r ========================= 質問: どのように修正すればよいか?

  • Perlの文字コードを意識したファイルの読み込み方

    perl5.8でファイルを読み込む場合、文字コードを意識した以下のような呼び方("<:euc-jp")があるのですが この方法で読み込んだ$datの中身はperlの内部コード(UTF8)になっているということでしょうか? それとも、普通に("<")で読み込んで$dat = Encode::decode("euc-jp", $dat);とすべきでしょうか? use utf8; use Encode; my $fname = "test.txt"; # 文字コードがEUC-JP my $dat = ""; open(IN, "<:euc-jp", "$fname) or die "open error!"; flock(IN, 2); while(<IN>){ $dat .= $_; } close(IN);

    • ベストアンサー
    • Perl
  • utf8使用時のフォーム入力文字コード

    use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

    • ベストアンサー
    • Perl
  • 半角→全角変換

    数値、記号、カナのすべてを半角から全角に変換したく Encode::JP::H2Zを利用しサンプルプログラムを書いてみました。 セーブは、s-jisで行っているのですが以下のコードを試しましたがまったく変換されません。何処がいけないのでしょうか? 以下を実行すると、 h2z: 012ABCabc!@#ア??ガダパ h2z: となってしまいます。 #!/usr/bin/perl use Encode; use Encode::JP::H2Z; my $str_h = ' 012ABCabc!@#アイウガダパ'; my $str_2 = '  012AbCabc!@#アイウガダパ'; my $char_conv; $char_conv = Encode::encode("euc-jp", $str_h); Encode::JP::H2Z::h2z(\$char_conv); $char_conv = Encode::decode("euc-jp", $char_conv); print " h2z:" . $char_conv . "\n"; $char_conv = Encode::encode("euc-jp", $str_h2); Encode::JP::H2Z::h2z(\$char_conv); $char_conv = Encode::decode("euc-jp", $char_conv); print " h2z:" . $char_conv . "\n";

    • ベストアンサー
    • Perl
  • Encode と encoding の同時使用で ISO-2022-JP に encode できない

    CentOS を 5.1 から 5.2 にアップデートした頃から PerlCGI からのメール送信が出来なくなって、調べていたら「ISO-2022-JP への encode がおかいぞ問題」に辿り着きました。 以下のコードで、euc-jp が吐かれてしまいます。 #! /usr/bin/perl -w use encoding('UTF8'); use Encode; binmode(STDOUT); my $text = "<全角文字ですよぉ。>"; print encode('ISO-2022-JP', $text), "\n"; 以下のいずれかで正常に jisコードを吐く様になるのですが、こんなものなんでしょうか? 1 「use encoding('UTF8');」 を 「use utf8;」に替える 2 print の直前に "no encoding;" を入れる CentOS 5.1 では多分正常に ISO-2022-JP への変換ができていたのだと思います。 私の使用するバージョンの Cygwin の Perl でも正常です。 問題のある CentOS5.2 と 問題の無い Cygwin版で、関係しそうなバージョンの違いはありません。 CentOS 5.2: Perl 5.008008 Encode 2.12 Encode::JP 2.01 encoding 2.02 Cygwin: CYGWIN_NT-5.1 **** 1.5.25(0.156/4/2) 2008-04-17 12:11 i686 Cygwin Perl 5.008008 Encode 2.12 Encode::JP 2.01 encoding 2.02 できれば、すでに動いているCGIの use encoding('UTF8'); を直す事なく動く様にしたいのです。

  • 文字コードEUCのPerlプログラムが文字化けしてしまいます

    Perlで書かれたCGIを実行しようとしているのですが、プログラムはEUCで記述されているそうです。nkf -g ***とするとEUC-JPとなります。 print " <META http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n"; とも記述されているのですが、ブラウザで実行(閲覧)すると文字化けして、ブラウザのエンコードは、Unicode(UTF-8)になっています。 ちなみに、OSはCentOS5.2です。 どうやったら、EUCで記述されたCGIが文字化けせずに実行できるのでしょうか? teratermでサーバに接続語、viコマンドで表示しても文字化けしています。ファイルの文字コードをEUCからUTF-8にして(nkf -w ***)、ブラウザでアクセスしても文字化けしてしまいます。

    • ベストアンサー
    • Perl
  • Perl の use strict に付いて

    ●HTML <html><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>テスト5(UTF-8)</title> </head> <body> <form action="test5.cgi" method="post" > <input type="text" name="f1" value="" size="80"> <button type="submit" >送信</button> </form> </body></html> —————————————————————————————————————— ●Perl #!/usr/bin/perl #use strict; ※問題の行1 use warnings; use CGI; print "Content-type: text/html\n\n"; print "<meta charset=\"UTF-8\">\n"; # POST / GET パラメータを取得------------------------- my $q = new CGI; # パラメータ名を指定して取得する my $param1 = $q->param('name1'); my $param2 = $q->param('name2'); # FORM値の取得----------------------------------- # 全てのパラメータを取得する for my $param_name ($q->param) { print $param_name . ' = ' . $q->param($param_name) ; print "<br>\n"; ${$param_name} = $q->param($param_name); ※問題の行2 } #------------------------------------------------- print "テスト<hr>\n"; print "$f1<br>\n"; exit; —————————————————————————————————————— 【質問】 「※問題の行1」+「※問題の行2」 = エラー 「※問題の行1」のみ = 正常に動きます 「※問題の行2」のみ = 正常に動きます 「※問題の行1」の「use strict; 」と 「※問題の行2」の「${$param_name} = $q->param($param_name); 」 をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • UTF8コードでのメール送信

    現在、以下の内容でメールサーバおよびシステムを運用してます。 レンタルサーバを以下の内容で OS:FreeBsd DB:postgresql (eucコードで運用) PG:perl5.8.8  (eucコードで記述) 最近、当システムから携帯電話(スマートフォン含む)へのメール送信で受信側(携帯)で文字化けが多くなっている。それで、システムの一部のUTF8化しようと思いました。それで、メール送信のライブラリを以下のように修正してみたが、本文が文字化けしてしまいます。なぜ文字するか原因がわかりません。 以下のソースはUTF8Nで記述しています。 ※システム全部をUTF8コード化やDB(POSTGRESQL)もUTF8にする案もありますが、 改修作業が大きくて作業時間が少ない方法も模索しています。 どなたかご教授願います。 binmode(STDOUT, ":utf8"); use Encode; use Encode qw(from_to); use MIME::Base64; use MIME::Entity; use Net::SMTP; use MIME::Words qw (:all); sub sendmail() { my ($mail_date) = @_; <==メールのハッシュ配列(DBに登録されているメールの件名、本文) my $smtp_server = $mail_date->{SMTPsrv}; my $smtp_port = '25'; # 送信者のメールアドレスを設定する。 my $mail_from = $mail_date->{MailFr}; # 宛先のメールアドレスを設定する。 my $mail_to = $mail_date->{MailTo}; # メールの件名を設定する。 from_to($mail_date->{Subjct},"euc-jp","utf8"); #UTF8に変換 $utf8_str_sub = $mail_date->{Subjct}; # メールの内容を設定する。 my $message; my $utf8_str; from_to($mail_date->{Message},"euc-jp","utf8"); #UTF8に変換 $message = $mail_date->{Message}; $utf8_str = $message; # メールヘッダを作成する。 # from、to、件名共にMIME-Header(UTF-8)へエンコードします。 my $mail_header; $mail_header = "From: " .encode('MIME-Header-ISO_2022_JP',$mail_from)."\n"; $mail_header .= "To: " .encode('MIME-Header-ISO_2022_JP',$mail_to) ."\n"; $mail_header .= "Subject: ".encode('MIME-Header-ISO_2022_JP',$utf8_str_sub) ."\n"; # UTF-8とbase64 encodeを使う事を明記します。 $mail_header .= "MIME-Version: 1.0\n"; $mail_header .= "Content-type: text/plain; charset=utf-8\n"; $mail_header .= "Content-Transfer-Encoding: base64\n"; $mail_header .= "\n"; # SMTPでメールを送る。 my $SMTP = Net::SMTP->new($smtp_server,Port=>$smtp_port); $SMTP->mail($mail_from); $SMTP->to($mail_to); $SMTP->data(); $SMTP->datasend($mail_header); $SMTP->datasend(encode_base64(encode('utf8', $utf8_str))); $SMTP->dataend(); $SMTP->quit; }

  • perlで画像をダウンロードしようと思っています

    gazou_element.txtにurlを保存していて、それらを一つずつ取り出してダウンロードするようにしようとしているのですがError:Invalid argument at C:User~~~となってしまいます。 どうすればいいかよろしければお教え下さい。 use Encode; use LWP::UserAgent; use IPC::Open2; use warnings; $file = "gazou_element.txt"; open (IN, $file) or die "$!"; my @url =<IN> ; my $time = time; for(my $i = 0; $i < scalar(@url); $i++){ my $request = HTTP::Request->new('GET', $url[$i]); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/4.0'); my $response = $ua->request($request); my $prefix = get_prefix($url[$i]); my $count = $i + 1; if($response->is_success){ open($OUT, ">","$time$i$prefix") or die("Error:$!"); binmode $OUT; print $OUT $response->content; close $OUT; }else{ } } #拡張子を取得する sub get_prefix{ my $url = shift; my $start = rindex($url, "."); my $end = length($url); my $string = substr($url, $start, $end - $start); return $string; }

  • Perl 文字コードについて

    From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-type: text/plain;charset=\"UTF-8\" Content-Transfer-Encoding: 8bit この時点で、UTF-8を指定しました。 use Encode; use Encode::Guess; Encode::Guess->set_suspects( qw/ euc-jp shiftjis 7bit-jis / ); $name = encode('UTF-8', decode('Guess', $name)); で本文を、UTF-8に変換して送るようなコードを書きました。 これで一応、パソコン、スマホ共に「本文」は文字化けせず送れるのですが、 今度、別の問題が発生してしまったようで、 「件名」が文字化けしてしまうようになりました。 $subject = encode('UTF-8', decode('cp932', $subject)); 件名も、本文と同じように変換コードをしてみたところ、パソコンでは文字化けしませんでしたが「件名」で文字化けしてしまいます。 調べたところ本文と件名では、内容が違い MIMEエンコードを使用するとのことだったのですが、 実際どのように使うのかわからないです。 $subject = encode('ISO-2022-JP', decode('cp932', $subject)); encode('MIME-Header-ISO_2022_JP', $subject) このように記述するとスマホでは文字化けしないのですが パソコンで文字化けしてしまいます。 そこで、件名がパソコンとスマホで文字化けしないようにし、本文はUTF-8で送るようにするにはどのようにすればいいのでしょうか?

    • ベストアンサー
    • Perl