tamahiro22 の回答履歴
- use encodingによって正規表現の結果が変わる?
お世話になります。 webシステムで、画面入力値のチェックをperlで行っているのですが、 今回、perlのバージョンアップ対応を行っており、ソース修正をしたところ、以下のような現象に悩まされて困っております。 (本当のソースはもっと長いのですが、以下の現象により入力チェックが正常に動作しないという点までは突き止めました。) バージョン perl v5.8.0 os Red Hat Linux release 9 現象 use encodingが指定されていると、正規表現の$が効かないようです。 ソースと実行結果1 #!/usr/bin/perl #use encoding "euc-jp"; if ('apple' =~ /e$/) { print ("match\n"); } else { print ("unmatch\n"); } このときは match と表示されます。 ソースと実行結果2 #!/usr/bin/perl use encoding "euc-jp"; if ('apple' =~ /e$/) { print ("match\n"); } else { print ("unmatch\n"); } このときは、unmatch と表示されます。 対処方法のヒントだけでも頂けると助かります。 (他の質問を検索してみましたが、同様なものを見つけることができませんでした。) もしかして、perlのバグなのでしょうか?
- ランダムに1行読込み フォーム文字との同異を 判定するには?
txt ファイル から ランダムに 1行読み込んで それが フォームの入力文字と同じかを 判定し、 同じならば、次のファイルへ飛ぶ には、 どうしたらよいのでしょうか? お教えください。 ------------------------------------------------------ mondai.txt に 問題を 1行に 1題ずつ kotae.txt に 解答を 1行に ひとつずつ 書きました。 mondai.txt の 1行目の 解答が kotae.txt の 1行目 (2行目-10行目、同じ)としました。 001.cgi で 正解すれば 002.cgi を開く 不正解なら もう一度 001.cgi を実行。 問題は ランダムに 表示する。 まず、mondai.txt と kotae.txt を それぞれ 10行にして やってみました。 ------------------------------------------------------ すると、問題は ランダムに表示されました。 しかし、 ##################################################### if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; ・・・ { ##################################################### が、うまくいきません。 ↓こうしてあります。どうしたら、よいでしょうか? ↓解答したことを file.txt に記録しよう、ともしています。 ↓ ################ はじめ ############################## #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon = sprintf("%02d", $mon + 1); $day = sprintf("%02d", $day); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); my $num = ('1267'); my $num2 = $num + 1; my $value = param('answer'); open(FILE, "../../mondai.txt"); my @data2 = <FILE>; close(FILE); open(FILE, "../../kotae.txt"); my @data3 = <FILE>; close(FILE); my $i = int(rand(10)); my $ans = $data3[$i]; if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; open(FILE, '<+file.txt') or die "$!"; my @DATA = <FILE>; close(FILE); open(FILE, '>file.txt') or die "$!"; print FILE ("$num,$ans,$year年$mon月$day日 $hour時$min分$sec秒\n"); print FILE (@DATA); close(FILE); } else { print header(-charset => 'Shift_JIS'); print start_html("$num.cgi"); print ('<font face="century">'); print $data2[$i]; #####---問題表示 print br; print startform( -method => 'POST', -action => "$num.cgi" ); print blockquote( textfield( -name => 'answer', -size => '70', -id => "next", -accesskey => '[' ) ); print <<END; <script type="text/javascript" language="JavaScript"> document.getElementById('next').focus(); </script> END print submit(-value => 'Send ( ↑Alt+[ )'); print endform; } ################ おわり ############################## よろしく、お願いいたします。
- ベストアンサー
- ttaa100kkaa
- Perl
- 回答数3
- パーミッション600でもブラウザからアクセス出来る
いつもお世話になります。 1.FTPでtest.lzhというファイルをアップし、パーミッションを600にしたもの 2.perlで組んだファイルアップロードCGIを使ってtest.lzhを1と同様の場所にアップしたもの(perlでchmodで600に) ブラウザ上から1の場合はアクセス拒否されるのですが、2の場合は普通にアクセス出来てしまいます。 所有者が異なると、同じパーミッションでも違う動きをするのでしょうか? 2のケースでもアクセス拒否させる方法はあるのでしょうか? 基本的な考え方を間違えていたら済みません。 宜しくお願い致します。
- 次のcgiファイルを開くには? もう一度
http://oshiete1.goo.ne.jp/qa3951263.html で質問している者です。 間違って、[回答への補足] に書いてしまいました。 もう一度質問させてください。すみません。 Location を 教えていただき、とても感謝しております。 でも、私の 001.cgi は 以下のように始まっております。 print header(-charset => 'Shift_JIS'); print start_html("001.cgi"); このprint header(-charset => 'Shift_JIS');を消して if (param('answer') eq $ans){ print ('Location:002.cgi\n\n'); } else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { としたのですが、だめでした。 if (param('answer') eq $ans) が 下の方にもう一度出てくるからでしょうか? ###### はじめ ##################### #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); print "Location:1266.cgi\n\n"; ###### おわり ##################### としたら、001.cgi を開くと 002.cgi へ飛ぶことができました。 どこに print "Location:1266.cgi\n\n"; を書けばよいのでしょうか? よろしく、お願いいたします。
- ベストアンサー
- ttaa100kkaa
- Perl
- 回答数3
- 次のcgiファイルを開くには?
すみません。初心者です。 001.cgi というファイルで フォーム に 正解を入力して Enterキー を 押したら 次の 002.cgi を 開く(実行する)ようにするには どうしたらよいでしょうか? 今は↓このようにして 「次のファイルへ」をクリックしてもらっています。 Enterキーを押すだけで 次の002.cgi (=$num2.cgi)へ行きたいのです。よろしく、お願いいたします。 #-------- if (param('answer') eq $ans){ print ('正解'); print ("<a href=$num2.cgi accesskey=]>次のcgiファイルへ (Alt+])</a> "); #--------
- ベストアンサー
- ttaa100kkaa
- Perl
- 回答数2
- copyをしたときの最終更新時間
WindowsXP+cygwinでPerlを使用して、2つのファイルを同期するソフトを練習の為に作っています。ファイルAとファイルBの最終更新時間をstat関数で調べてFile::Copyモジュールのcopy関数でコピーする方法で作っています。ファイルAの方が古い状態で同期を実行すると、その内容がファイルBに上書きされますが、ファイルBの最終更新時間がファイルAと同じ時間ではなくて、copyを実行した時間になってしまいます。copyをした後で、ファイルBの最終更新時間をファイルAと同じにする方法はあるのでしょうか。ご存じの方、いらっしゃいましたらお教えください。よろしくお願いします。
- 画像サイズの指定方法
$img = 'image.png'; open(IMG,"$img"); $byte = -s $img; print "Content-type: image/gif\n"; print "Content-length: $byte\n\n"; print <IMG>; close(IMG); exit; 上記のように画像を表示させているのですが、縦横サイズは どのように調整すればよろしいのでしょうか。 よろしくお願いいたします。
- ベストアンサー
- MASTER-PPC
- Perl
- 回答数3
- perlでコマンドライン文字列受付を終了する方法
下のように何もオプションをつけないでPerlを起動します。すると、文字が打ち込めるようになるので打ち込んでみました。 さて、この状態からどうやってスクリプトを実行して元のプロンプトに戻ればいいのでしょう? とりあえず、Ctrl+Z を押した後 ENTER を押すと終了になるようです。シェル上でのPerlのスクリプト編集状態から抜ける方法がわからないです。 よろしくお願いします。 C:\>perl print "aaaaaaaaaa\n"; ^Z aaaaaaaaaa
- Perlでgoogle newsのRSSを取得する方法を教えて下さい。
Google NewsのRSS情報をperlで取得し、表示するプログラムを作っています。 が、他のサイトのRSS情報は容易に取得できるのに、Google Newsだけは、取得できません。 具体的には、、、 ----------------------------- #!/usr/local/bin/perl use LWP::Simple; use XML::RSS; my $url = 'http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko'; my $data_from_web = get($url); print <<"HTML"; Content-type: text/html <html> HTML print $data_from_web; print $url; exit; ----------------------------- ※URL部分が長すぎて一部省略されている様ですが、 あえて2行で書くと、こうなっています。 http://news.google.com/news?hl=ja&ned=us&ie=UTF-8 &oe=UTF-8&output=rss&q=aiko'; 上記の様な簡単なプログラムで、歌手aikoのニュースに関する RSS情報を取得し、表示できるはずなのですが、実行してみても、 何も表示されません。 ちなみに、my $urlの部分を他のURL、例えば、日刊ゲンダイ http://headlines.yahoo.co.jp/rss/gen_ent.xml に差し替えて実行してみると、きちんと表示されます。 また、ブラウザーのURLの窓に、直接、プログラム内の$url部分である http://news.google.com/news?hl=ja&ned=us&ie=UTF-8&oe=UTF-8&output=rss&q=aiko というURLを入れ、リターンキーを押すと、歌手aikoのニュースに関する RSS情報が直接ブラウザーで表示されます。 なのに、上記のプログラムでは表示されないのです。 (ブラウザー等の情報もPerlで送信しないとGoogle newsはRSS情報を送信してくれない?) どの様にしたら、perlでGoogle NewsのRSS情報を取得できるのか、 教えていただけたら幸です。 尚、参考にしたサイトは以下です。 Google news日本語版 http://news.google.com/news??hl=ja&ned=jp&ie=UTF-8&oe=UTF-8 Googleニュース日本語版のAtom/RSSフィード http://d.hatena.ne.jp/Gimite/20061205/1165287606 Googleニュース(日本語版)のRSSフィード http://blog.fkoji.com/2006/12091315.html Google News日本語版のRSSとAtomを取得してみるテスト http://ryouchi.seesaa.net/article/28534464.html PHPで実現しているGoogle NewsのRSS情報表示サイト http://www.usamimi.info/~ryouchi/googlenews/index.php Googleニュース用RSSジェネレータ http://g.1o4.jp/news-rss.html Google NewsがRSSフィードを採用 http://zen.seesaa.net/article/5748907.html RSSリーダーを使った情報収集術&便利なフィード7選 http://google-mania.net/archives/895 以上、よろしくお願い致します。
- 文字コード変換
送信元のページがShift_JISの場合は正常に動作するのですが、 UTF-8等の場合は文字化けしてしまいます。 &jcode'convert(*val, 'sjis'); ↑のものを use Encode; Encode::from_to( $val, "UTF8", "Shift_JIS", Encode::XMLCREF ); このように書いたところ、UTF-8も文字化けしないのですが、 コードを自動的に認識して自動で振り分けさせる方法がわかりません。 サーバーのPerlのバージョンは5.8.6です。よろしくお願いいたします。
- ベストアンサー
- MASTER-PPC
- Perl
- 回答数3
- Perlのモジュールをインストール後、Apacheの再起動は必要かどうか
ブラウザに出力させるPerlのプログラム(cgi)を書いています。 Perlのモジュールが足りないため、 cpanでインストールをしました。 特に、Apacheを再起動させないで、 ブラウザにメッセージが出力されました。 通常、ApacheでPerlを使う場合、足りないモジュールを インストールした後はApacheの再起動をするべきなのでしょうか? 再起動する・しないの理由が知りたいです。
- 関数「exists」と「defined」の違いは?
関数「exists」と「defined」の違いが分かりません。 「exists」はハッシュにしか使えないため「defined」 より特殊な関数なのでしょうが。 $a{$i} = 0 unless defined $a{$i}; $a{$i} = 0 unless exists $a{$i}; ↑の二つの文は等価ですよね?
- 配列を引数とするサブルーチンに関する質問
配列を引数とするサブルーチンに関する質問です。 Trimと Hex2Decのサブルーチンをインターネットを参考に作りました。 下記のスクリプトは > perl test.pl で期待通りに動きます。 質問は、サブルーチンの中における、 for (@out) { $_=hex; } です。 trimの方では、$_がなくても、きちんと動きます。(あってもOK、$_=~s/^\s+//; $_=~s/\s+$//;) Hex2Decの方は、$_=hex; でないと動きません。 これは、for (@out) { }でひとつずつ処理する対象が、$_に入っている。 処理結果の格納先が、s/^\s+//; の場合は、記述無き時は、 $_と暗黙できまっているのに対し、 hex;の場合は、そうではない。明示的に与えてやらなければいけない。 こういう理解で、良いでしょうか? 他に、やりようはあるのでしょうか? 宜しくお願いいたします。 test.pl ----------------------------------------- $a=10,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n"; $a=20,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n"; @a=('a','b','c','d'); @b=&Hex2Dec(@a); print "Hex=@a --> Dec=@b\n"; $a=' a ',print "org=$a --> trimed =".&trim($a)."xxxxx\n"; $a=' b ',print "org=$a --> trimed =".&trim($a)."xxxxx\n"; @a=(' a ',' a ',' a ',' a '); @b=&trim(@a); print "org=@a --> trimed= @b\n"; sub trim { my @out = @_; for (@out) { s/^\s+//; s/\s+$//; } return wantarray ? @out : $out[0]; } sub Hex2Dec { my @out = @_; for (@out) { $_=hex; } return wantarray ? @out : $out[0]; } ------------------------------------------------
- ベストアンサー
- noname#95859
- Perl
- 回答数1
- ランダムに表示
($title,$mail,$home,$color,$link) = split '<>',$file; foreach (split ',',$color) { print qq|<font color="$_">■</font>\n|; } 上記は先日教えていただいた方法で、$colorに登録されている複数の色を呼び出しているのですが、$colorの内容を全部表示させるのではなく、$colorに登録されている内容をランダムに表示させることも出来ればと考えています。 randを使うところまでは勉強したのですが、分割した$colorの内容をどのように使えばいいのか、素人知識ではさっぱりわかりません。 申し訳ございませんがよろしくお願いいたします。
- ベストアンサー
- MASTER-PPC
- Perl
- 回答数1
- 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 ////////////////////////////////////////////////////////////////
- ベストアンサー
- yoroshikumail
- Perl
- 回答数10
- 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 ////////////////////////////////////////////////////////////////
- ベストアンサー
- yoroshikumail
- Perl
- 回答数10
- 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 ////////////////////////////////////////////////////////////////
- ベストアンサー
- yoroshikumail
- Perl
- 回答数10
- 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 ////////////////////////////////////////////////////////////////
- ベストアンサー
- yoroshikumail
- Perl
- 回答数10
- 1
- 2