Perl コーディング初心者質問コーナー Part33
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
04/03/01 02:46ID:1GeWO7LH【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0809nobodyさん
04/03/30 13:18ID:???Bareword found where operator expected at - line 1, near "$テ"
(Missing operator before e?)
syntax error at - line 1, near "$テ"
Unrecognized character \x83 at - line 1.
な上に、gオプションはいらないだろ。
${'テンプレ'} =~ s/pc2/pc5/;
どうでもいいか・・・
0811nobodyさん
04/03/31 06:09ID:???>Windowsがテキストファイルの文字コードをどのように判別しているか定かではないのですが
Windows 自体は文字コードの判別など「しない」。
ブラウザかテキストエディタか知らんが判別しているのはアプリ側。
つまり自動判別に頼る場合(ロジックが異なる可能性があるから)、
開くアプリによって結果が異なることもある。
先頭数文字で判別するアプリもあれば、どちらかのコードで解釈できなくなった時点で
コードを決定するアプリもあるだろう。
>阿諛追従は文字化けしましたがその他の大半の単語はそうは
>なりませんでした。
「その他の大半の単語」の方は本文(意味)の方もちゃんと読めるのか?
結論としては >>805 の通り、文字コードを統一してから書き込めってことだが。
ActivePerl 最新版(5.8系列)なら use Encode すれば文字コード変換を使えるはず。
0812nobodyさん
04/03/31 08:34ID:???変数の型(HASHやARRAY)を返す関数があったと思うんですが
忘れてしまいました、誰か助けてぇ〜
0813nobodyさん
04/03/31 10:07ID:???0814792
04/03/31 10:48ID:???>>811
どうもありがとうございました。
Encodeではありませんが、jocde.plでEUCJPに統一することで解決しました。
>「その他の大半の単語」の方は本文(意味)の方もちゃんと読めるのか?
はい、何故か本文の方は全く文字化けしませんでした。
0815nobodyさん
04/03/31 11:35ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perldata.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html
0817nobodyさん
04/03/31 16:37ID:msaZKwhoこうじゃなくて
sub hoge{
}
こう書くのが正しいのですか。
sub hoge
{
}
0818nobodyさん
04/03/31 16:53ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlstyle.html
0820nobodyさん
04/03/31 22:18ID:???0823820
04/03/31 22:33ID:???COOKIEの書き込みを行っているんですが、
なぜか$EMV{'HTTP_COOKIE'}にCOOKIEの値として認識されてきません。
もっとも単純なCOOKIEを書き込んで、読み出すだけ、のCGIであれば問題は無いのですが、
なぜかいろいろ付け加えていくウチに、$ENV{'HTTP_COOKIE'}の値を正常に読み込まなくなってしまいます。
何度1から作り直しても同じ事が起きるのですが、これは原因として考えられる部分が他にあるのでは、と考えています
Perlの都合上でCOOKIEの書き込み読み込みに異常を来すような例は考えられますでしょうか
ちなみに、COOKIEに関する部分は至って単純で、ソースは以下の通りです。
これを動作させたところ、COOKIEの中身が表示されるべき所に全く文字は出力されませんでした。
$jcode= './jcode.pl';
$getArg= './getarg.pl';
require $jcode;
require $getArg;
print "Content-type: text/html\n";
print "Set-cookie: style=",$PostARG{'style'}||$CookieARG{'style'},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
print "Set-cookie: access=",$date{'mon'},$date{'mday'},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n\n";
中略
print $CookieARG{'style'};
print $CookieARG{'access'};
print $ENV{'HTTP_COOKIE'}};
後略
0824nobodyさん
04/03/31 22:34ID:fllGa8Oy%GetARG = %PostARG = %CookieARG = ();
($date{'sec'},$date{'min'},$date{'hour'},$date{'mday'},$date{'mon'},$date{'year'},$date{'wday'},$date{'yday'},$date{'isdst'}) = localtime(time);
foreach ( split /[&,]/,$ENV{'QUERY_STRING'} ){
($name, $value) = split /=/;
$value =~ s/\+/ /g;
$value =~ s/%([0-9a-fA-F]{2})/pack("C", hex($1))/ego;
&jcode'convert(*value,'sjis');# コードをShift_JISに
$GetARG{$name} = $value;
}
if($ENV{'REQUEST_METHOD'} =~ /^POST$/i){
read(STDIN , $POST , $ENV{'CONTENT_LENGTH'});
foreach ( split/&/,$POST ){
($name, $value) = split /=/;
$value =~ s/\+/ /g;
$value =~ s/%([0-9a-fA-F]{2})/pack("C", hex($1))/ego;
&jcode'convert(*value,'sjis');# コードをShift_JISに
$PostARG{$name} = $value;
}
}
0825nobodyさん
04/03/31 22:35ID:fllGa8Oyforeach ( @_ ){
($name, $value) = split /=/;
&jcode'convert(*value,'sjis');# コードをShift_JISに
$CookieARG{$name} = $value;
}
foreach ( keys %CookieARG ){
print "Set-Cookie: $_=",$CookieARG{$_},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
}
foreach ( keys %GetARG ){
print "Set-Cookie: $_=",$GetARG{$_},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
}
foreach ( keys %PostARG ){
print "Set-Cookie: $_=",$PostARG{$_},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n";
}
1;
0826nobodyさん
04/03/31 22:52ID:???0827nobodyさん
04/03/31 22:56ID:fllGa8Oy0828nobodyさん
04/03/31 23:13ID:???スレ違いだから答えない。
0829nobodyさん
04/03/31 23:18ID:???取り合えずここじゃないとなると初心者スレなんかなあ……。
0830nobodyさん
04/03/31 23:38ID:???0831nobodyさん
04/03/31 23:44ID:???0832nobodyさん
04/03/31 23:45ID:???0833nobodyさん
04/03/31 23:51ID:fllGa8OyCOOKIE関連のまともなスレなんてWebProg板に無いんですが
0834nobodyさん
04/03/31 23:54ID:fllGa8Oyどこで聞けば分かるんだ
0835nobodyさん
04/04/01 00:01ID:f/d+tf5t単純にCOOKIEに値を書き込んで、それを読み出すくらいは出来てるんです。
ただ、それに肉付けしていったときに読み込めなくなったりしたので、他の部分が影響を及ぼしているのは明らかなので、
どういった部分がCOOKIEへの値書き込みにこういう影響を及ぼすのか、って聞いてるのに、
ス レ 違 い
違わないでしょう
0836nobodyさん
04/04/01 00:07ID:???「Perl コ ー デ ィ ン グ 」スレ。
コーディングの問題ではないのだからスレ違いだろう。
>828を読んでCOOKIEの仕様を勉強しなおしてこい。
0837nobodyさん
04/04/01 00:12ID:???原因はコーディングにある(と本人は言っている)のでコーディングに関しての話なんじゃないの?
と言うかこのスレのコーディングの定義が最近良く解らない……。
0838nobodyさん
04/04/01 00:23ID:???コードとにらめっこしてなさいよ。
0839nobodyさん
04/04/01 00:28ID:???0840nobodyさん
04/04/01 00:29ID:???0841nobodyさん
04/04/01 00:43ID:???2週間が経過してるんだが・・・・・
もうだめぽ
0842nobodyさん
04/04/01 01:00ID:???0843nobodyさん
04/04/01 01:17ID:???$ENV{'HTTP_COOKIE'}を疑う前にCookieファイルの中身はちゃんと確認したの?
セパレータとかエンコードとか。
コーディングを疑う前にCookieのお作法を理解しないと先にすすめないよ。
0844nobodyさん
04/04/01 02:07ID:OWaSi467つまり本当は4月1日のどこかで閉鎖するかもしれない。
実際に広告枠の所に「2004年4月1日に何かある」とあるんだしまだ希望はあるんじゃないか。?
2ch閉鎖実況スレ
http://ex2.2ch.net/test/read.cgi/net/ 1080586834/
↑間を消して
まだ1日ありますぞい
↑コピペyoro
0845nobodyさん
04/04/01 02:34ID:???サーバが食べられるクッキーはクライアントが吐いたものだけ。
自分で吐いたクッキーは食えねえぞゴルァ。
の呪文を100回唱えて、もう一回コードを見直しましょう。
0846nobodyさん
04/04/01 21:54ID:Al4MgY0yブラウザの戻るボタンで戻った時などに、いちいち再読み込みされないようにしたいです。
ヘッダのところに何か追加すればいいのかなというところまでは分かったのですが、
そこから先がどうしても分かりません。
よろしくお願いします。
0847nobodyさん
04/04/01 21:55ID:???△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1078568723/
CGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
まずは過去ログを全部読め
0848nobodyさん
04/04/01 22:11ID:Al4MgY0yキャッシュさせないようにしたいという話は時々見ますが
キャッシュされるようにする方法というのは見つかりませんでした。
でも戻るボタンで戻っても再読み込みされない掲示板とかありますよね。
ああいうのってどうやってるんでしょうか?
すごい初心者ですいませんが、下の例だと何を追加すればいいんでしょう?
#!/usr/local/bin/perl
print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";
(中略)
print "</HTML>\n";
__END__
0849nobodyさん
04/04/01 22:50ID:???キャッシュされるんじゃないかな。
0850nobodyさん
04/04/01 22:53ID:???0851nobodyさん
04/04/01 23:24ID:Al4MgY0y設置したいCGIがあるのですが、ページ移動のたびに読み込まれるのが嫌で
自分で改造したいと思っています。
.cgiのままでもキャッシュさせる方法はないでしょうか?
>>849>>850
どこをどう変えたらいいのでしょうか?
>>848みたいなのでキャッシュさせないのは無理ですか?
0854nobodyさん
04/04/02 00:00ID:???0855nobodyさん
04/04/02 00:02ID:???(仮に)何かを追加してできるようになるとしても、
その何かを調べるのは少なくともこのスレじゃない、気がする。
0856846=851
04/04/02 00:35ID:???ありがとうございました。
0857nobodyさん
04/04/02 11:45ID:???use Digest::MD5 qw(md5_hex);
my $session = md5_hex( time . $$ );
なんかこれじゃ心もとないんですが…
0858nobodyさん
04/04/02 13:14ID:???心許ないと読めるのでそれ前提で言うと。
渡す前の文字列が time.$$ だけだとちょっとって思うのなら
適当に30桁くらいのランダムな文字列作って md5_hex() に送れば良いんじゃないの。
0860nobodyさん
04/04/02 13:30ID:???>>798
ロジックを語るならスレ違い。スレタイ嫁。
802 :nobodyさん :04/03/26 10:51 ID:tN6LIksl
>>800
どこいけばいいですか?
803 :nobodyさん :04/03/26 10:52 ID:???
春休みUZEEEEEEEEEEEE
804 :nobodyさん :04/03/26 10:56 ID:???
>>800
WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。
0861nobodyさん
04/04/02 15:14ID:JAKs1zik私の環境ではサーバで、cgi-bin以下でしかcgiが置けません。
ブラウザで見るときのパブリックディレクトリはhomeのインデックスです。
user/
�歪gi-bin/
�鷲oge.cgi
�鷲ome/
�亙ndex.html
�鷲oge.html
この環境で、画像リンクなどではなく、
直接hoge.cgiをロードすることは出来ますでしょうか?
0863nobodyさん
04/04/02 15:34ID:8MGWWqTy書き込み表示部は予め関数化してあるのですが、この関数によって出力された物をファイルに書き込もうとするにはどうしたら良いのでしょうか?
どなたかご教授して頂けると幸いです(_ _)
0864nobodyさん
04/04/02 15:58ID:???800 :nobodyさん :04/03/26 10:46 ID:???
>>798
ロジックを語るならスレ違い。スレタイ嫁。
802 :nobodyさん :04/03/26 10:51 ID:tN6LIksl
>>800
どこいけばいいですか?
803 :nobodyさん :04/03/26 10:52 ID:???
春休みUZEEEEEEEEEEEE
804 :nobodyさん :04/03/26 10:56 ID:???
>>800
WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。
0865nobodyさん
04/04/02 16:05ID:???ってか、のスレの趣旨をわかってないヤシ多すぎ
正しい質問例:
これこれの配列にこういう値が入っています。
この配列に対してこういう処理をしたいと思っています。
こういう書き方をしたらこういう結果になりました。
こういう結果ではなくああいう結果を返したいと思っているのですが、
_以下略_
このスレってこういうことっしょ?
0866nobodyさん
04/04/02 16:15ID:8MGWWqTyありがとうございます。それを踏まえて書き直してみました。
今、一行掲示板を作っていて負荷軽減の為、一定のhtml($file_html)に書き込み表示部を書き込みの度に出力(上書き)しようとしています。
書き込み表示部は予め関数化(&html)してあるのですが、この関数によって出力された物をファイルに書き込もうとするにはどうしたら良いのでしょうか?
一度、ヒアドキュメントにより関数化した物を代入し、それをファイル出力するという順序で可能かな、とも思い
$html_source = "_EOF_";
${&html}
_EOF_
if (!open(HTML,">$file_html")) { &error(0); }
print HTML $html_source;
close(HTML);
と、してみたのですが何も$file_htmlには書き込まれませんでした。どなたかご教授して頂けると幸いです(_ _)
0867nobodyさん
04/04/02 16:38ID:???test
_EOF_
↑これがめちゃくちゃ。
まず一から勉強し直せ。
もうレスしなくていいから、そんな暇あったら調べろ。
0868nobodyさん
04/04/02 16:43ID:???0869nobodyさん
04/04/02 16:44ID:???調べるというのはそういうライブラリ等あるのでしょうか?
ぐぐってみたのですが、リファレンス等しか見つからないのですが。。。
ご存じでしたら教えて頂けると幸いです。
0870nobodyさん
04/04/02 16:57ID:???ていうかその書き方すら間違いなわけだが。
あんた普段から何作ってもバグだらけでしょ。
0871nobodyさん
04/04/02 16:57ID:???test
_EOF_
0872nobodyさん
04/04/02 17:00ID:???>うぁ、すみません。元は$html_source <<"_EOF_";です。
>うぁ、すみません。元は$html_source <<"_EOF_";です。
0873nobodyさん
04/04/02 17:04ID:???右脳でも鍛えてきます。。。
0874nobodyさん
04/04/02 17:08ID:???0876nobodyさん
04/04/02 17:44ID:???あまりにもつまらないミスだし。
0879nobodyさん
04/04/03 00:08ID:???>>866のこういう書き方する人って他にもいるの?
0880nobodyさん
04/04/03 00:30ID:???同じ意味だから好みだろ
0881nobodyさん
04/04/03 02:51ID:???でもperlをさわりはじめた頃はifでやってたな。
0883未承諾広告※ ◆TWARamEjuA
04/04/03 11:19ID:???低コスト← and 、or、 後置 if、ブロック →高コスト
と教わった。
0884803
04/04/03 13:26ID:???windowsでやっててpath表現が微妙に違うのがいけないのでしょうか?
0885nobodyさん
04/04/03 16:41ID:???中身がある一つの記号だけで区切られてないので、
どのように分ければいいのか分かりません。。
�@ @a = split ('/'or':',$i) とか
�A @a = split ('/'':',$i)
�B @a = split (///:/,$i)
などためしたんですが、
�@だとエラーは起こりませんが表示されず、
�A�Bだとエラーです。
どのような方法があるんでしょうか?
0886nobodyさん
04/04/03 16:55ID:qkOavVtn@datetime = split /\/| |:/, $timestamp;
print join ' ', @datetime;
0887nobodyさん
04/04/03 16:58ID:???0888nobodyさん
04/04/03 17:03ID:qkOavVtn0889nobodyさん
04/04/03 17:08ID:OcvniKR1<form action="http://hogehoge./〜/〜/mail2manager.cgi">
のように呼び出されたくないのですが、
リファラに異常が発生しやすい鯖(?)なので、
HTTP_REFERERによる判定だけではエラーが発生しがちです。
他に防御策はありますか・・・?
この質問ってコーディングじゃない・・・?
0891nobodyさん
04/04/03 17:20ID:???「60秒以内に発行されたIDなら送信可」などとする。
複数CGIサーバーの場合、時刻が同期がされていないと誤爆するけどね。
REFERERは詐称されるからあまり意味ないよ。
0892857
04/04/03 20:03ID:???結局、md5_hex() に渡す文字列がユニークじゃなきゃ意味ないんで、
time . $$ 以外にユニークな文字列を生成する必要アリですね。
なんかいいのないかなぁ…。
みなさんはどうしてます?
0893nobodyさん
04/04/03 20:52ID:???0894nobodyさん
04/04/03 20:56ID:???http://search.cpan.org/src/JBAKER/Apache-Session-1.6/Session/Generate/MD5.pm
0895nobodyさん
04/04/03 22:08ID:???session
>>892
これはどう?
http://search.cpan.org/~mwx/Data-Uniqid-0.11/Uniqid.pm
0896nobodyさん
04/04/04 00:50ID:???できるだけ簡単に共有するにはどうしたらよいでしょう。
モジュール内の関数を呼ぶたびに、その変数を渡すのは面倒なので。
0897nobodyさん
04/04/04 05:30ID:movQ3eovそのファイルを変数$aに入れ、"05"が入っている別の変数$bとの比較を行いました。
if($a eq $b)と言う感じなのですが、真の場合の処理が実行されません。
printしてみると、$aと$bにはちゃんと"05"が入っています。
ファイルにも改行を含まずに"05"とだけ入っているのですが...
ファイルの読み書きを勉強したばかり何ですけど、何が悪いのでしょうか?
0898nobodyさん
04/04/04 05:36ID:???0899nobodyさん
04/04/04 06:17ID:???chompもやってみました。
その前にsplitでも改行コードを削除してみたのですが、やはり元々入っていません。
何か初歩的なミスだとは思うのですが....
0900nobodyさん
04/04/04 06:27ID:qQjuTTgf0901nobodyさん
04/04/04 07:15ID:???my $a = '05';
my $b = 05;
debug_dump("a" => $a);
debug_dump("b" => $b);
exit;
sub debug_dump
{
my ($name, $value) = @_;
print $name, ' = ', join(' ', map{ unpack('H2', $_) } split(//, $value)), "\n";
}
こんな感じでヘキサダンプとってみそ。
0902初心者
04/04/04 10:42ID:dd7frEOF$date = '2004/3/24 13:43:18'
という日付の文字列から年・月・日を 2004、3、24 というように分解して、それぞれを
変数($year、$month、$day)に代入したいのですが、どうすればいいのかご教授
お願いします。
0903nobodyさん
04/04/04 10:46ID:???>885-887
0905nobodyさん
04/04/04 10:50ID:PukJ0Xr/CGIを置いてるサーバーから別のFTPが動いてるサーバーへFTPを使って
ファイルをアップロードするCGI(Perl)を
tp://x68000.startshop.co.jp/~68user/net/ftp-1.html
を参考にして作ってます。
FTPサーバー$ftp_hostに接続し、$local_dirにある$local_fileを
ファイル名はそのままでFTPサーバー上の$ftp_dir上にアップロード
するために以下のようなスクリプトを組んだのですが、うまくアップロードされません。
アップロードできるようにするにはどうしたらよいのでしょうか?
そもそも、CGIスクリプトが置いてあるディレクトリとは違うディレクトリ$local_dir
においてあるファイルをアップロードする方法がよくわかりません。
ちなみに設置しているサーバーではrootでなく一般のユーザーアカウントしか
使えないので、モジュールは標準で組み込まれてるようなものしか使えません。
ご教授願います。
use Socket;
$local_dir = "for_upload"; # 転送元ファイルが置いてあるディレクトリ
$local_file = "test.txt"; # 転送元ファイル名
$ftp_host = "aaa.bbb.com"; # 転送先サーバー
$local_ip = "local.xxx.com"; # 転送元サーバー
$ftp_dir = "/home/hoge/test"; # アップロード先のディレクトリ
$ftp_user = "user"; # 転送先サーバーのアカウント名
$ftp_passwd = "password"; # パスワード
(つづく)
0906905
04/04/04 10:51ID:PukJ0Xr/$port = getservbyname('ftp', 'tcp');
$addr = inet_aton($ftp_host);
$sock_addr = pack_sockaddr_in($port, $addr);
socket(COMMAND, PF_INET, SOCK_STREAM, 0);
connect(COMMAND, $sock_addr);
select(COMMAND); $|=1; select(STDOUT);
print COMMAND "USER $ftp_user\r\n";
print COMMAND "PASS $ftp_passwd\r\n";
for ( $data_port=5000 ; $data_port<65536 ; $data_port++ ){
socket(DATA_WAITING, PF_INET, SOCK_STREAM, 0);
setsockopt(DATA_WAITING, SOL_SOCKET, SO_REUSEADDR, 1);
if ( bind(DATA_WAITING, pack_sockaddr_in($data_port, INADDR_ANY)) ){
last;
}
}
listen(DATA_WAITING, SOMAXCONN);
$local_sock_addr = getsockname(COMMAND);
($local_port, $local_addr) = unpack_sockaddr_in($local_sock_addr);
$local_ip = inet_ntoa($local_addr);
$local_ip =~ s/\./,/g;
printf COMMAND "PORT $local_ip,%d,%d\r\n",$data_port/256,$data_port%256;
print COMMAND "CWD $ftp_dir\r\n";
print COMMAND "STOR $local_file\r\n"; # 問題の箇所?
close(COMMAND);
0907nobodyさん
04/04/04 16:13ID:???その変数が変更される場合があるのかどうかで考え方が変わってくるような気もするが。
とりあえず、$main::hoge で直接アクセスするのはあかんの?
もしくは一度各パッケージの変数にコピーしておくか。
というか、
>モジュール内の関数を呼ぶたびに、その変数を渡すのは面倒なので。
本当に渡すたびに必要なら OO インタフェースにして、オブジェクトが
持つべきだと思うんだがね。
FOO::func1($bar);
FOO::func2($bar);
の代わりに、
$obj = new FOO $bar;
$obj->func1();
$obj->func2();
0908nobodyさん
04/04/04 16:14ID:OYMBylAsCGIを作っていただいたのですが、うまく動かなくなってしまいました。
YYYYMMWというファイル名(2004年4月の第2週の場合は2004042.html)に飛ぶようになっていて
毎週月曜日の午前3時に切り替わるようにしてもらいました。
今日の場合は、2004041.htmlに飛ぶはずが、2004040に飛んでしまいます。
どこを直せばいいか教えてください。以下がソースです。
レス数が900を超えています。1000を超えると表示できなくなるよ。