Perlでアマゾンへのアクセスができない!

このQ&Aのポイント
  • Perlでアマゾンへのアクセスができない問題についての質問です。
  • 質問者はハックスに記載されているスクリプトを実行しようとしていますが、エラーが発生しています。
  • 質問者はPerlの経験が浅く、エラーの原因が特定できない状況です。修正方法を教えてください。
回答を見る
  • ベストアンサー

perlからアマゾンにアクセスできない><

いつもお世話になっております。 ハックスに記載されているスクリプトを実行したいのですが、エラーとなります。 自分でも調べていますが、perl経験が浅く、原因が特定できません。 修正箇所がわからないので、修正できる方教えて下さい(;へ;) 環境は、XP2で、Activeperl 5.8.8を使用しております。 コマンドラインからused_report.pl 4915512371(←ASIN名:例:ハリーポッター)を実行すると・・・ --------コマンドラインエラー箇所-------- Global symbol "$lastPrice" requires explicit package name at C:\hoehoe\used_report.pl line 32. Global symbol "$avgPrice" requires explicit package name at C:\hoehoe\used_report.pl line 41. Can't find string terminator "EOF" anywhere before EOF at C:\hoehoe\used_report.pl line 44. --------------------------------------- ちなみにブラウザ上ではページも存在し表示されております。 http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list/-/4915512371/used/ 以下スクリプト //////////////////////////////////////////////////////////////// #!/usr/bin/perl # used_report.pl # A script to scrape Amazon, retrieve used listings, and write to a file # Usage: perl used_report.pl <asin> #コマンドラインからASINを取得 my $asin =shift @ARGV or die "Usage:perl used_report.pl <asin>\n"; use strict; use LWP::Simple; #URLを作成 my $url = 'http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list'.'/-/' . $asin . '/used/'; #URLをリクエスト my $content = get($url); die "Could not retrieve $url" unless $content; #変数を設定 my $i = 0; my $totalprices = 0; my $thisPrice = 0; my $highPrice = 0; my $lowPrice = 0; #リスティングをループ while ($content =~ m!<b class=price>\$(.*?)</b>!mgis) { $i++; $thisPrice = $1; if ($thisPrice >= $lastPrice) { $highPrice = $thisPrice; } if ($i == 1 || $thisPrice <= $lowPrice) { $lowPrice = $thisPrice; } $totalprices += $thisPrice; } $avgPrice = $totalprices / $i; #結果を表示 print <<"EOF"; Average Used Price: \$$avgPrice Highest Price: \$$highPrice Lowest Price: \$$lowPrice ////////////////////////////////////////////////////////////////

  • Perl
  • 回答数10
  • ありがとう数14

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

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

やっぱり接続できないのは不自然ですね。 ブラウザからは閲覧できるので、perl.exe に通信が許可されていない可能性があります。 ファイアウォールがあるのなら、原因はそこかもしれません。 どのエラーも接続エラーなので、接続を試みたプログラム自体には問題がない可能性が高いです。

yoroshikumail
質問者

お礼

tamahiro22さまご回答ありがとうございます。 やはり職場に原因があるとしたら、 本日帰宅してから、今日教えて頂いたことを実行したいと思います。 ここまで詳細に教えて頂いて、できる気がします! 本当にありがとうございました。 正直、ここまでの問題とは思わず、 tamahiro22さまにはご迷惑をおかけっぱなしで申し訳ありません。 うとい私に、親切丁寧に教えて頂いて、感謝してもしきれません。 心から感謝致します。 今すぐお礼したいのですが、締め切ってしまうと、 帰宅後の実行結果をお教えすることができなくってしまいますので、 詳細は後日報告させて頂きます。 改めて、tamahiro22さまに感謝致します。 ありがとうございました!!!!!!!!!!^^

yoroshikumail
質問者

補足

tamahiro22さまお世話になっております。 お返事遅れてしまい申し訳ありません。 「できました!!!!!!!!!!!!!!」 本当にお世話になりました。 いろいろと苦労を重ねましたが、実行することができました。 これもtamahiro22さまのおかげです。 本当に本当にありがとうございました。 めっちゃ感動です^^ こんなに丁寧に指導して頂けて本当にうれしく思っております。 それでは、tamahiro22さま最高の2008年をお迎え下さい♪ また機会がありましたら宜しくお願い申し上げますm(_ _)m

その他の回答 (9)

回答No.9

あら、接続ができていませんね。 回線が繋がっていないはずは無いので、 やはり原因は LWP でしょうね。 http://syu-king.com/~kodomo/sources/used_report2.pl.txt 汚いですが、これを試してもらえないでしょうか。

yoroshikumail
質問者

お礼

tamahiro22さまご回答ありがとうございます。 残念ながら、また通じていませんでした>< もうっっっ><って感じです。 >used_report.pl 4915512371 500 Can't connect to www.amazon.co.jp:80 (Bad hostname 'www.amazon.co.jp') at C: \hoehoe\used_report.pl line 15. これは職場のファイアーウォールのせいなのでしょうか? 外部には禁止?みたいなことでしょうか? 本当に度重なるご指南ありがとうございますm(__)m

回答No.8

エラー処理を少し厳しくしたせいだと思います。 ですがお陰で原因が少し見えてきました。 やはり Amazon 側から正しいレスポンスが返ってきていません。 なので、$i もゼロになってしまったのでしょう。 原因が特定できるかは分かりません。 LWP::UserAgent を use できているので、 環境の違いだとは思いたくはありませんが…。 ひとまず、先ほどお渡ししたスクリプトの、 unless ($res->status_line eq '200 OK') { die "Could not retrieve $url" } の“前”に、 warn $res->status_line ."\n"; を入れて、Amazon 側から何が返ってきているか教えていただけますか。

yoroshikumail
質問者

お礼

tamahiro22さまご回答ありがとうございます。 早速、試してみたところ、 コネクトエラー?みたいなものが返ってきました。 500 Can't connect to www.amazon.co.jp:80 (Bad hostname 'www.amazon.co.jp') Could not retrieve http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list/- /4915512371/used/ at C:\hoehoe\used_report.pl line 13. 上記エラーメッセージでよろしかったでしょうか?

回答No.7

こちらでは、示されたASINで取得できるので、 何かコードが不完全なのかもしれません。 他にも考えられることは色々とありますが、 ひとまず、以下のURLからスクリプトをコピーして、 実行できるか確認いただけますか。 http://syu-king.com/~kodomo/sources/used_report.pl.txt

yoroshikumail
質問者

お礼

tamahiro22さまご回答ありがとうございます。 アップまでして頂いて本当にご迷惑をおかけしてすみません。 感謝しております。 スクリプトをコピーさせて頂いて実行したのですが、 実行できず、次のような出力がされました。 >used_report.pl 4915512371 Could not retrieve http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list/- /4915512371/used/ at C:\hoehoe\last_used_report.pl line 12. またしてもアクセスできないみたいです、なぜでしょう? 原因は特定できるのでしょうか?(((;へ;)))

yoroshikumail
質問者

補足

メッセージにlastと入ってしまいましたが、すみません。正しくは >used_report.pl 4915512371 Could not retrieve ​http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list/-​ /4915512371/used/ at C:\hoehoe\used_report.pl line 12. です!

回答No.6

どうしてそのような事が起こるかと言うと、 ゼロ($i)で数値を割る事が出来ないからです。 正しく価格を抜き出せない場合、$i はゼロになってしまいます。 ASIN が適合して正しいWEBページが表示されないと抜き出せません。 一度ブラウザでその ASIN で表示されるか確認いただけますか。 www.amazon.co.jp/exec/obidos/tg/stores/offering/list/-/[ASIN]/used/

yoroshikumail
質問者

お礼

tamahiro22さまご回答ありがとうございます。 そうなんですよね、値がないとゼロになるのは理解したんですが。 ブラウザでは、確認できます^^ ​www.amazon.co.jp/exec/obidos/tg/stores/offering/list/-/[ASIN]/used/ [ASIN]の箇所に4915512371と入れて http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list/-/4915512371/used/ とすると確認できています>< 試しに他のASINも入力してみたのですが、同様にとれませんでした。 tamahiro22さま、どうしてでしょう(;o;)?

yoroshikumail
質問者

補足

なんだか、文字化けしてしまいましたすみません。 [ASIN]の箇所に4915512371と入れての前後のURLは同じです。 perlって奥が深いです><

回答No.5

LWP::UserAgent を利用した例を示します。 できるだけ、元のソースを変更しないようにするので、 効率的とは言えない箇所もありますが、参考にして下さい。 use LWP::Simple; を use LWP::UserAgent; に変更します。 次に、以下の部分を変更します。 ~~~~~~~~~~~~ #URLをリクエスト my $content = get($url); ------ ↓ ↓ ----------- #URLをリクエスト my $ua = new LWP::UserAgent; my $responce = $ua->get($url, 'User-Agent' => 'Mozilla/4.0'); my $content = $responce->content; このような感じに変更すれば、アクセスは成功すると思います。 ただし、こちらで試した限り、どうもそのサンプルコードでは正しく動きません。 というのも Amazon のWEBページの出力が少し変更されているので、価格の抜き出し(後半での処理)が上手にできないようです。 結果表示もドル表示ですし、適したサンプルではなさそうです。 日本版 Amazon を使用するので、以下のように変更すると良いでしょう。 while ($content =~ m!<b class=price>\$(.*?)</b>!mgis) { を、 while ($content =~ m!<span class="price">.+?(\d{1,})</span>!mgis) { に変更します。 その手前で、 my $lastPrice = 0; my $avgPrice = 0; という処理は入れていますね?これは必須です。 ただし、0 で初期化する必要は特にありません。 結果表示も、¥表示に変えておきましょう。 print <<"EOF"; Average Used Price: \\$avgPrice Highest Price: \\$highPrice Lowest Price: \\$lowPrice EOF このように変更した後、改めて実行すれば、 Average Used Price: \234.32 Highest Price: \450 Lowest Price: \1 のように結果が表示されると思います。 どうでしょうか。うまくいくことを願っております。

yoroshikumail
質問者

お礼

tamahiro22さまご回答ありがとうございます。 このような私に粘り強く接して頂き本当にありがとうございます。 修正までして頂き、喜びの報告をしたかったのですが…、 結果惜しい感じでできませんでした>< tamahiro22さまのおかげでもうちょっとの手ごたえを感じるのですが、本当に残念です。 エラー項目です。 Illegal division by zero at C:\hoehoe\used_report.pl line 44. 実際に44行目を見てみると、 $avgPrice = $totalprices / $i; とあり、問題はないように見えます。 ここをコメントアウトすると、全て¥0で実行されました^^; 本当に申し訳ありません。最後のご指南願えますでしょうか? つくづく自分が無力で情けないです><

回答No.4

長文を書いて送信したのですが、消えてしまいました。 出来る限り、要約して解答させて頂きます。 こちらで試した結果、Amazon から 204 エラーが返ってきました。 何も取得できていないので、 die "Could not retrieve $url" unless $content; の処理($content が空ならエラー表示)で“正しく”停止しています。 どうも、Amazon が LWP::Simple で使われるユーザエージェントを弾いているように思えます。 試しに、ユーザエージェントを一般的な、【Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)】のように変更するとアクセスは成功しました。 ここで問題となるのは、LWP::Simple でのアクセスはユーザエージェントを書き換えられないことです。 LWP::Simple に拘らないのならば、LWP::UserAgent の使用をお薦めします。 LWP::Simple でも内部的に LWP::UserAgent を呼び出す場合もあるので、恐らく利用できる環境にあると思います。 書かれたサンプルコードが少し変わってしまいますが、どうされますか。

yoroshikumail
質問者

お礼

tamahiro22さまご回答ありがとうございます。 コードチェック本当にありがとうございます。 私としては結果が得られれば、コード変更は問題ありませんっ。 Amazon が LWP::Simpleが手軽という認識だけで、 LWP::UserAgentのデメリットや使い方がわかってませんでした。 tamahiro22さまがご推奨されるLWP::UserAgentで実行したいのですが、 このLWP::UserAgentをLWP::Simpleと差し替える以外に ドコをどのように変更すれば稼動しますでしょうか? tamahiro22さまが成功された一般的な方法の記入箇所が>< 年末のお忙しい最中、ここまで面倒をお掛けしてしてしまい 本当に申し訳ありません。m(__)m

回答No.3

以下の部分に注目してください。 print <<"EOF"; Average Used Price: \$$avgPrice Highest Price: \$$highPrice Lowest Price: \$$lowPrice これらは、それぞれの行を、print で出力する場合と同じ意味を持ちます。 「ヒアドキュメント」と言いますが、使用には決まりがあります。 print <<"EOF"; なら、 ヒアドキュメントの終わりを指す印として、 EOF というのを書いてあげなければいけません。 つまり、 print <<"EOF"; Average Used Price: \$$avgPrice Highest Price: \$$highPrice Lowest Price: \$$lowPrice EOF というのが正しい形になります。 print <<"TEXT"; ならば、最後に、TEXT を入れてあげるということです。

yoroshikumail
質問者

お礼

tamahiro22さま、おはようございます。 本当にありがとうございます。 大変勉強になりました!ヒアドキュメントの勉強を重ねたいです。 結果として・・・別のエラーがでました(;へ;) 凹みます。。。せっかくtamahiro22さまにご丁寧に教えて頂いたのに。。。 ブラウザでは見られるのにどうして取得できてないのでしょうか? perlの設定をどこかいじらないといけないのでしょうか? ↓エラーメッセージです。 Could not retrieve http://www.amazon.co.jp/exec/obidos/tg/stores/offering/list/- /4915512371/used/ at C:\hoehoe\used_report.pl line 18. 甘えてばかりで申し訳ありません。 tamahiro22さまの優しさに心から感謝しています。

回答No.2

No.1 です。訂正します…。 use strict; を書いているから、エラーが出ています(笑) ですが、それらのエラーは警告してくれる、味方のようなものです。 次回書く時も、use strict; を入れておいてOKです。

yoroshikumail
質問者

お礼

tamahiro22さま、重ねてありがとうございます。 わざわざ訂正させてしまってすみません^^; use strict;って大切な味方だと思うようになりました! 今後もまずはuse strict;ですよね^^

回答No.1

Amazon ではなく、スクリプトに問題があります。 コンパイル自体に失敗しているので Perl が停止しています。 恐らく理由は、$lastPrice と $avgPrice のパッケージ名が明示されていないからだと思います。 my $lastPrice; のように、使用する前に宣言すると良いでしょう。 また、このようなミスを防ぐために、 次回、Perl スクリプトを書く機会があれば、use strict; をして堅く書くことをおすすめします。 3つ目のエラーは、print <<"EOF"; に対応する、EOF で終わる行が記入されていないからです。

yoroshikumail
質問者

お礼

tamahiro22さま迅速なご回答ありがとうございます^^。 言われた通りに変数化致しました。 しかし、3つ目のエラーの「EOFで終わる行が記入されていないから」 というのが具体的にどう処理してよいのかわかりません。 (うとくてすみません^^;) どこにどう記入してよいのか? をご指摘頂けると助かります。m(__)m 本からのスクリプトでしたが、スクリプト間違いってあるんですね... tamahiro22さまにお返事頂いたからには、絶対に動かしたいです!

関連するQ&A

  • perl内のhtml文を、ループさせたいのですが、これってできないんでしょうか?

    たびたび申し訳ありません。周りに聞く人もいなく、まったくの初心者ですので、なにとぞお願いいたします。 下記の「ここから~ここまで」の$iの値を変えながらループさせたいのですが、まったくうまくいきません。なにかいい方法あったら教えてください。 それとも、こんな書き方じゃダメなんでしょうか? #!/user/bin/perl open(IN,"data.csv"); #flock IN,2; @line = <IN>; #flock IN,8; close(IN); $cnt = 0; foreach(@line){ ($sina[$cnt],$jpg[$cnt],$pr[$cnt],$kakaku[$cnt]) = split(/\,/,$_); $cnt++; } print<<"EOF"; Content-type: text/html <HTML> <HEAD> <TITLE>やぁ!</TITLE> </HEAD> <BODY> EOF ###################ここから print<<"EOF"; <TABLE border="1"> <COL span="4" width="100"> <TBODY> <TR> <TD width="300">$sina[$i]</TD> <TD width="300">$jpg[$i]</TD> <TD width="300">$pr[$i]</TD> <TD width="300">$kakaku[$i]</TD> </TR> </TBODY> </TABLE> EOF ##################ここまで print<<"EOF"; </BODY> </HTML> EOF

    • ベストアンサー
    • CGI
  • perl 5.8.8 日本語マッチ

    perl5.8.8を使っています。 日本語にマッチする正規表現を書きたいのですが、どうしてもマッチしません。 例えば、以下のファイルtest.txtから「さしすせそ」だけを抽出し、表示させたいです。 ---------test.txt-------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------- ----------test.pl-------------------------------- use strict; use warnings; open(FILE, 'test.txt') or die "$!"; my @file = <FILE>; close(FILE); foreach my $line (@file){ if($line =~ /^さ/){ print "$line\n"; } } ------------------------------------------------ このtest.plを実行しても「さしすせそ」を抽出することが できません。 どうしたらよいのでしょうか? 自宅の新しいバージョンのperlだとできるのですが 会社のperlは5.8.8で顧客環境でもあるのでバージョンアップも できません。 すみませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • MeCab(和布蕪)をPerlで使うには

    MeCabをPerlから使おうと思い、MeCab本体であるmecab-0.93.exeと mecab-perl-0.93.tar.gzをダウンロードしました。 mecab-perl-0.93ディレクトリにあるtest.plをWindowsのコマンドプロンプトにて実行してみたのですが、エラーがでてしまいます。プログラムとエラーは以下の通りです。どういったエラーなのか良く分かりません。アドバイスお願いします。 <プログラム> #!c:/perl/bin/perl use lib $ENV{PWD} . "/blib/lib"; use lib $ENV{PWD} . "/blib/arch"; use MeCab; print $MeCab::VERSION, "\n"; my $sentence = "太郎はこの本を二郎を見た女性に渡した。"; my $c = new MeCab::Tagger (join " ", @ARGV); print $c->parse($sentence); for (my $m = $c->parseToNode ($sentence); $m; $m = $m->{next}) { printf ("%s\t%s\n", $m->{surface}, $m->{feature}); } <エラー内容> % test.pl Can't locate loadable object for module MeCab in @INC (@INC contains: /blib/arch /blib/lib C:/Perl/lib C:/Perl/site/lib .) at MeCab.pm line 8 Compilation failed in require at C:\Program Files\MeCab\mecab-perl-0.93\test.pl line5 BEGIN failes--compilation aborted at C:\Program Files\MeCab\mecab-perl-0.93\test.pl line5 以上です。

  • <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
  • perl jcode::convert 半角>全角

    perlでjcode::convertで 半角を全角に変換すると 正しく変換される時とされない時があります。 例えば、 sample1.plとsample2.plの my $message = 'の次の「ハンカク」の4文字は半角の文字です。 (注)ここにアップロードすると全角で表示されてしまいます。   この4文字を半角にして確認してください。 sample1.plではこの4文字が全角に変換されるのですが sample2.plではこの4文字は半角のままです。 なぜ全角に変換されないのでしょうか。 (Windows7, ActivePerl v5.16.3) ---sample1.pl------------ require "jcode.pl"; my $message = 'ハンカク文字は使えるかな?'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- ---sample2.pl------------ require "jcode.pl"; my $message = 'ハンカク文字'; jcode::convert(\$message,"sjis","", "z"); print "$message\n"; --------------- なお、どちらも以下のようなメッセージが表示されています。 これは何を意味しているのでしょうか。 defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 684. (Maybe you should just omit the defined()?) defined(%hash) is deprecated at C:/Perl64/site/lib/jcode.pl line 693. (Maybe you should just omit the defined()?)

    • ベストアンサー
    • Perl
  • perlの構文について、読み方を教えて下さい。(1)

    はじめまして、perl初心者です。基礎を勉強した段階ですが1人でやっていてわからない文章に行き当たりました。どうしてもわからないのでどうか先輩の皆さまにお教え頂きたくお願い申し上げます。いくつかあるので今後もどうか愛想をつかさずに御付合い下さい。では、以下に理解の出来ない文章を書きます。 if($tag eq "meta"and $attr->{"http-equiv"}eq "refresh"){ my ($delay,$url)=split";URL=",$attr->{content},2; $attr->{content}="$delay;URL=".$self->encode($url); ●my @attribs=map{"$_=\"$attr->{$_}\""}@$attrseq; $new_text="<$tag @attribs>";} ●の行が特にわかりません。$_は何を指すのでしょうか、$attrseq->@の要素になるのですか?$_を書くのはどうしてなのか教えて下さい。全行の解釈も書いて下さい。それと入力する時に\の半角のがキーボードで出ないのですがどうやったらよいのでしょうか。宜しくお願いします。

    • ベストアンサー
    • Perl
  • perlでhtmlファイルを取得したいのですが

    perlでmixiなどログイン処理のあるサイトのhtmlファイルを取得したいのですがなかなか上手くいきません。 どなたかご教授をお願いします。 ----------------------------------------------------------------- #!/usr/bin/perl use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request::Common; use LWP::Simple; my $mixi_email = 'メールアドレス@yahoo.co.jp'; my $mixi_password = 'パスワード'; my $login_url = 'http://mixi.jp/login.pl'; my $home_url = 'http://mixi.jp/home.pl'; my $mixi = LWP::UserAgent->new($mixi_email, $mixi_password); #Cookieを有効にする# my $cookie = sprintf('cookie_%s_%s.txt', $$, time); my $cookie_jar = HTTP::Cookies->new(file => $cookie, ignore_discard => 1); $mixi->cookie_jar($cookie_jar); #ログインする# my @form = ('email' => $mixi_email, 'password' => $mixi_password, 'next_url' => $home_url);#POSTで送る内容の配列 my $request1 = &HTTP::Request::Common::POST($login_url, [@form]); #リクエストヘッダの生成 my $response1 = $mixi->request($request1); #ログインする getstore("http://mixi.jp/search_community.pl?from=global(取得先の指定)", "test.html"); ---------------------------------------------------------------------- 試しに書いてみたのですがうまくいきませんでした

  • PerlでのCSV書き込みについて質問です。

    perl初心者です。 perlで投票のプログラミングを作ってるのですが、 どうもうまく動きません。 やりたいことは ・投票されたら  1)csvを読み込む  2)該当するNOのカウントをアップ  3)csvに書き込む という単純なことなのですが、 投票してもカウンタは0のままになってしまいます。 書き込み部分のプログラムが間違っているとは思うのですが 何が間違っているのかがどうしてもわかりません。 どなたかお知恵を貸してくださいm(__)m プログラムは下記のようになっています。 ================= foreach my $key (@key) { $val = $in{$key}; $in{$key} = &Jcode::convert(\$val, 'sjis'); } # データオープン open(DAT,"+< $datfile"); flock(DAT, 2); my @data; while (<DAT>) { push(@data,$_); if (eof) { last; } } # データ書き込み truncate(DAT, 0); seek(DAT, 0, 0); my $i=1 while (i<11){ my ($no,$name,$count) = split(/,/, $data[$i]); if($val eq $no){$count++;} if (eof) { last; } $i++; print DAT "$no,$name,$count,\n"; } close(DAT); ================= どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • perl print文で日本語表示するには

    perlのプログラムで use utf8が宣言されていない時(test1.pl)は、 print文で日本語が正しく表示されるのですが、 use utf8が宣言されている時(test2.pl)は、 print文で日本語が正しく表示されないかエラーになります。 encode('utf-8', $string)やencode('cp932', $string) も試してみましたがうまくいきませんでした。 どのようにすればよいでしょうか。 ---test1.pl------------------------------------------------ #!C:/perl/bin/perl use strict; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n"; print $string; ----------------------------------------------------------- 実行結果 OK 2018年12月26日 9時36分6秒 ----------------------------------------------------------- ---test2.pl------------------------------------------------ #!C:/perl/bin/perl use strict; use utf8; use Encode; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n"; print $string; #print encode('utf-8', $string); #print encode('cp932', $string); --------------------------------------------------- 実行結果 NG (PC1 Windows7 ActivePerl) Wide character in print at D:\test\test2.pl line 11. Global symbol "$year年" requires explicit package name (did you forget to declare "my $year年"?) at D:\test\test2.pl line 8. Global symbol "$mon月" requires explicit package name (did you forget to declare "my $mon月"?) at D:\test\test2.pl line 8. Global symbol "$mday日" requires explicit package name (did you forget to declare "my $mday日"?) at D:\test\test2.pl line 8. Global symbol "$hour時" requires explicit package name (did you forget to declare "my $hour時"?) at D:\test\test2.pl line 8. Global symbol "$min分" requires explicit package name (did you forget to declare "my $min分"?) at D:\test\test2.pl line 8. Global symbol "$sec秒" requires explicit package name (did you forget to declare "my $sec秒"?) at D:\test\test2.pl line 8. Execution of D:\test\test2.pl aborted due to compilation errors. ----------------------------------------------------- 実行結果 NG (PC2 Windows7 ActivePerl) Malformed UTF-8 character (unexpected continuation byte 0x94, with no precedingstart byte) at C:\test\test2.pl line 8. (略) Malformed UTF-8 character (unexpected continuation byte 0x95, with no precedingstart byte) at C:\test\test2.pl line 8. 2018 N12 26 9 5 4 b ----------------------------------------------------- 期待している実行結果 2018年12月26日 9時36分6秒 ----------------------------------------------------- よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl:Unicodeプロパティ作れない

    お世話になります。 Unicodeの文字プロパティの使い方を学ぶために、以下のようなスクリプトをUTF-8で保存しました。 ============ #! /bin/perl # # utf8_unireg.pl use 5.010; use strict; use warnings; use utf8; binmode STDOUT, ":encoding(shift_jis)"; my $str = "a:b:c:"; say join "|", ($str =~ /\p{ASCII}/g); say join "|", ($str =~ /\p{AsciiAlpha}/g); sub AsciiAlpha { return <<END; 0041 005A # A-Z 0061 007A # a-z END } ============ 実行するとこうなります。 ============ C:\Perl\perl>utf8_unireg2.pl a|:|b|:|c|: Can't find Unicode property definition "AsciiAlpha" at C:\Perl\perl\utf8_unireg2.pl line 14. ============ \p{AsciiAlpha}というプロパティの作成に失敗しているようです。。 なぜか分かりますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう