トップページphp
1001コメント371KB

Perlコーディング初心者質問スレ Part 50

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2006/06/26(月) 00:46:38ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0002nobodyさん2006/06/26(月) 00:47:26ID:???
関連スレ
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/

【 スクリプト改造依頼スレ 】(丸投げ) part5
http://pc8.2ch.net/test/read.cgi/php/1141174205/
0003nobodyさん2006/06/26(月) 00:48:09ID:???
[過去ログ] 1 of 5

Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
0004nobodyさん2006/06/26(月) 00:49:09ID:???
[過去ログ] 2 of 5

Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
0005nobodyさん2006/06/26(月) 00:49:50ID:???
[過去ログ] 3 of 5

part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
0006nobodyさん2006/06/26(月) 00:50:46ID:???
[過去ログ] 4 of 5

part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/
part39 http://pc5.2ch.net/test/read.cgi/php/1101522903/
part40 http://pc5.2ch.net/test/read.cgi/php/1106816922/
0007nobodyさん2006/06/26(月) 00:52:13ID:???
[過去ログ] 5 of 5

part41 http://pc8.2ch.net/test/read.cgi/php/1110383236/
part42 http://pc8.2ch.net/test/read.cgi/php/1116970588/
part43 http://pc8.2ch.net/test/read.cgi/php/1123777607/
part44 http://pc8.2ch.net/test/read.cgi/php/1129477637/
part45 http://pc8.2ch.net/test/read.cgi/php/1134049707/
part46 http://pc8.2ch.net/test/read.cgi/php/1137518266/
part47 http://pc8.2ch.net/test/read.cgi/php/1141195171/
part48 http://pc8.2ch.net/test/read.cgi/php/1146042050/
part49 http://pc8.2ch.net/test/read.cgi/php/1149017548/ (前スレ)

part44-621氏による過去ログ倉庫
ttp://user.ftth100.com/mirrorhenkan/perl/
0008nobodyさん2006/06/26(月) 00:53:27ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0009nobodyさん2006/06/26(月) 00:54:30ID:???
ム板Perlスレより 2 of 2

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0010nobodyさん2006/06/26(月) 01:02:34ID:???
>>1
乙つつつ
0011nobodyさん2006/06/26(月) 10:30:20ID:???
>>11

おちかれー
0012nobodyさん2006/06/26(月) 20:55:18ID:???
1000取っちゃった。
オブジェクト指向より、いい指向ってないのかな。

大き目のプログラム組んで何ヶ月か、又は何年か後に見てみたら
全体の流れとそれぞれの処理を理解するのに数日かかってしまうのがいや。
これはオブジェクト指向とは無関係だけど。

プログラムを専門にやってないから思い出すのとあわせて、いつも
「なんでこんなイケてないんだこれ」
と自己嫌悪に陥る。

オブジェクト指向ってモジュールとか確かにべんりだけどさ。
完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
うんざりする。

もっといいやりかたないのかね。

うんスレ違いだ。すみませんでした。
0013nobodyさん2006/06/26(月) 21:30:04ID:???
>>12
それはプログラムの組み方の問題なんじゃないのかなあ。

プログラム組むときって、ノートに処理の流れとかメモするでしょ?
テキストエディタとかで
編集
 |- 検索
    |- 次を検索
    |- 前を検索
とかってあるけど、これもオブジェクト指向といえばオブジェクト指向だし。
編集::検索->次() みたいな。

これで例えば 「次を置換」 とか改造して入れるために、また一からプログラム全体を把握し直さなきゃわかんない、とかそーないと思うんだけど。
なんか変なとこにこだわりすぎてんじゃない?
0014nobodyさん2006/06/26(月) 21:48:52ID:???
>>12
> 完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
> うんざりする。
> もっといいやりかたないのかね。

Ruby 使っとけ。
0015nobodyさん2006/06/26(月) 22:04:56ID:???
質問。
sub noward {
local($flag);
foreach ( split(/\s+/, $no_wd1) ) {
if (index("$in{'name'} $in{'sub'} $in{'comment'}",$_) >= 0) {
$flag = 1; last;
}
}
if ($flag) { $err .= "不適切な文字が含まれています。"; }
if ($err) { &error($err); }
}
禁止ワードのサブルーチンなんだけどコレを改行で区切る事が出来ないのだがどうすればいいのか教えてほしい。
お願いします。
0016nobodyさん2006/06/26(月) 22:19:27ID:???
その前に、何を改行で区切りたいのでしょうか?そこが分かりません。
文からするとサブルーチンを改行で区切りたいように読めるけど…。
0017nobodyさん2006/06/26(月) 23:07:40ID:???
kentっぽい書き方だな
0018nobodyさん2006/06/26(月) 23:26:42ID:???
いまどきmyですむようなところにlocalだしな。

悪い癖をおぼえる前にもう少しましな手本を探したほうがいいような
気がする。

0019nobodyさん2006/06/26(月) 23:38:21ID:???
kentはそろそろ後方互換性じゃなくて
古くてアレなスクリプトを配布する事による弊害を気にした方がいいね。
いまどきperl4だけの鯖なんてないし。
0020nobodyさん2006/06/27(火) 00:04:59ID:???
当方C/C++/VBは使えますがPerlは難しいですか?
以前使っていたレンタル鯖がCのCGIを許可していたので
Cでゴリゴリ書いていましたが、別の業者に移管されてしまい
そこの業者はCのCGIが不可、Telnet不可とCGIが全て使えなくなってしまいました。
昔、ちょろっとPerlの本を見たことがあるのですが、コードがC以上に記号ばかりでゴチャっとしていて
追いにくいなぁと直ぐに本を閉じてしまった記憶があります。
C12年/C++3年/VB5年程です。。
 
0021nobodyさん2006/06/27(火) 00:10:32ID:???
そんだけコード書いてればPerl覚えるのは余裕。
独特の癖があるので人のコードを読むのは苦労するかもしれんが、
書く分には好きなように書ける。

TIMTOWDIバンザイ
0022nobodyさん2006/06/27(火) 01:00:12ID:???
それだけの経験があるなら1週間perlだけ弄ってればすぐに動くものが作れるt思います。たぶん。

sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、
あまりに自由すぎるのがperlの欠点といったとこでしょか
0023nobodyさん2006/06/27(火) 01:15:43ID:???
とりあえず文字列操作は正規表現メインで。
Cのポインタの概念は無いんで、文字列ポインタ動かしたりはできません。
だからといって文字列は配列でもないので、配列操作にもしないことです。

Cだけの人がとりあえず書いてみたPerlのプログラム読んだ事あるけど
思いっきりCぽくて、全然Perlじゃなかったなあ。

ていうか、Perlのソース読む方が理解が早いかも。
0024nobodyさん2006/06/27(火) 01:38:26ID:???
まず変数の扱いとスコープの違いにつまづいて
次に構文の違い(elsifとかswitchとか)につまづいて
コンテキストの理解につまづいて
関数の仮引数が無いのにつまづいて
リファレンスをポインタだと思い込んでつまづいて

・・・がんばってください。
0025nobodyさん2006/06/27(火) 02:08:24ID:ms3DPBt4
掲示板のプログラムを作っているのですが、
まず、書き込みページを出力して、
データを受け取って文法チェックをして 結果を出力して、
次のデータ受け取りでファイルに書き出しをするプログラムなのですけど、
どうしても原因が見つけれないエラーが出ていて困っています。
ただ、これ自体が大きすぎるので少し違うルートで質問します。

500 Internal Server Error
というのはどのような条件下で出てくるのでしょうか?
細かい説明などをくれるとうれしいです。

それともうひとつ
プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
ファイル書き込み等をしているどこかでエラーが出てくる場合
どういうミスの可能性があるでしょうか?

ずいぶんと分かりにくくなってしまっていますが、お願いします
0026nobodyさん2006/06/27(火) 02:36:42ID:???
よくこういう質問でるけど、なんで自分でわかんないんだろう?
文法ミスならローカルで実行したときわかるし、
違うなら処理の途中でためしに exit して、どこまでならエラーでないか、って突き詰めていけばわかるよな?

それでもどこもエラーないなら、
print "Content-type: text/html\n\n"; の前に何か print してる、くらいしか思いつかない。

>>25
要するに、知らんがな、ってこと。
ブラウザだけでやってんの? ちゃんとエラー文のせようよ。
0027nobodyさん2006/06/27(火) 02:52:04ID:???
>>25
> ただ、これ自体が大きすぎるので少し違うルートで質問します。

お勧めしません。逆効果です。


> 500 Internal Server Error
> というのはどのような条件下で出てくるのでしょうか?

それが、CGI が何なのかを理解せずに書いたプログラムなら、ほとんどどのような条件下ででも。


> ファイル書き込み等をしているどこかでエラーが出てくる場合
> どういうミスの可能性があるでしょうか?

あらゆるミスの可能性、及び誰のミスでもない可能性があります。
どういうミスかはわかりません。ただ、「誰のミスか」であれば、この場合は控え目に言って 99.8% 程度の確立であなたのミスです。

# 助けてあげたくてもこの質問じゃ何もできないよぅ・・・orz
0028nobodyさん2006/06/27(火) 03:53:29ID:H9M/RMpI
#! c:/perl/bin/perl

# CGIヘッダーの出力
print "Content-type: text/html\n\n";

# HTMLの出力
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";
print "<html>\n";
print "<head><title>Hello HTML</title></head>\n";
print "<body><p>こんにちは。これはHTML文書の例です。</p></body>\n";
print "</html>";

というCGIのプログラムがあったんですが
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";はどういう役割をしているんでしょうか??
0029nobodyさん2006/06/27(火) 04:05:08ID:???
HTMLのDOCTYPE宣言。ValidなHTML文書作る時の常識。Perlとは直接関係ない。
板違いなのでWeb制作技術板へ行ってらっしゃい。
0030nobodyさん2006/06/27(火) 04:09:20ID:???
> sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、

何それ?
0031nobodyさん2006/06/27(火) 04:13:07ID:???
>>30
こういう事かな。レキシカルな $s が外から見える。

sub hoge {
my $s = "ababababa";
return \$s;
}

my $s_ref = hoge();
print $$s_ref;
0032nobodyさん2006/06/27(火) 04:54:57ID:???
それなかったらオブジェクトやクロージャもできないなあw
0033nobodyさん2006/06/27(火) 06:30:44ID:???
>>25
基本的にCGIのエラーは500しか出ません。
パーミッションのミスでも文法ミスでも全て500が出ます。

>プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
>ファイル書き込み等をしているどこかでエラーが出てくる場合
>どういうミスの可能性があるでしょうか?
例えば代入式の途中でexit()で終了した場合なんかは
perlがエラー→何も出力されない→500となったりします。
(が、たぶんそのエラーじゃ無い気がしますが・・・

要するに一度にいっぺんに書きすぎて、デバッグできなくなった状況ですよね。
=c
=cut
という技があるのでそれで半分づつエラーの範囲を絞ってみてはどうでしょうか?
(それ以前に全部コメントアウトしprint "\n\n"だけ書いて動くのかとかも要確認。
それが動けばそこから少しずつ増やしていけば何でエラーが起きてるのか特定できるはず・・・
0034nobodyさん2006/06/27(火) 08:42:29ID:???
>>25
perl -c の結果をうpしてよ。
0035nobodyさん2006/06/27(火) 08:46:11ID:???
>32
static宣言見たいのがあればなぁ・・・と思うわけですよ
0036nobodyさん2006/06/27(火) 09:41:13ID:???
>>35
そこで Tie::Static ですよ。
0037nobodyさん2006/06/27(火) 14:12:21ID:XmLciTUK
1: 自分はこういう事がしたい。
・ファイルがなければ新規にファイルを作成し$dataAを書き込んでから$dataBを書き込む。
・ファイルがあれば(すでに$dataAは書き込み済みなので)$dataBを書き込む。

2: それでこんな風にやってみたが・・・
unless ( -e $file ) {
open ( OUT , "> $file" ) or die;
flock ( OUT , 2 );
seek ( OUT , 0 , 0 );
print OUT $dateA;
truncate ( OUT, tell ( OUT ) );
close ( OUT );
}

open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );

3: こんなエラーが出て上手く行かなかった。
エラーは出てないんですが、これって同時アクセスがあった場合に
ファイル壊れる可能性ないですか?
他に良い方法があればアドバイスよろしくお願いします。
0038nobodyさん2006/06/27(火) 14:45:28ID:???
>>37
他にもある気がするが、-eしてから>でopenまでの間に割り込まれると壊れるな。
File::Tempで一時ファイルを作ってリネームするとよさげ。
0039372006/06/27(火) 15:20:15ID:???
>>38
やっぱり壊れる可能性ありますよね。

>File::Tempで一時ファイルを作ってリネームするとよさげ。
ありがとうございます。
一度それでやってみます。

他にもアドバイスがあればよろしくお願いします。
0040nobodyさん2006/06/27(火) 15:28:09ID:???
ひとつロック用のファイルを用意しといて

・ロック用ファイルをロック
・ファイル存在チェック
・無ければ生成
・オープン
・処理
・書き込み
・ロック用ファイル閉じ

モジュール使わずコレでどうでしょう
0041372006/06/27(火) 15:47:13ID:???
>>40
アドバイスありがとうございます。

一連の流れを全てロックしてしまえ、ということですね。
ただ、ロックファイル自体が信用できるかどうか怪しい代物なので
ちょっと二の足を踏んでしまいます。
0042nobodyさん2006/06/27(火) 15:55:10ID:cuOoVNQc
HTML内のフォームからファイルと時間を選択させて、
その時間になったら自動で指定ファイルをFTPで別サーバー
へ移動するという処理は可能でしょうか?
Perlでcrontabに書き出すことができればと思いましたが
レンタルサーバーでそれは許可されておりません。

cronを使用せずにperlにより指定時間になっているかどうかを
チェックして時間になっていたらFTPでファイルを移動
するような処理は可能なのでしょうか?

どなたかご存知の方居られましたら宜しくお願い致します。
0043nobodyさん2006/06/27(火) 15:57:12ID:???
http://pc8.2ch.net/test/read.cgi/php/1024795138/
こっち行ったほうがいいかな。
0044nobodyさんNGNG
もうcron関連の質問秋田
0045372006/06/27(火) 16:32:46ID:???
>>40
勘違いしてました。
flockでロックファイルをロックすれば良いだけでしたね。
ロックファイルが残り続けるのがちょっと気持ち悪いですが簡単に処理できるのは良いですね。

>>43
誘導先見ましたが、どちらかと言うとロックの追究が主のようで、例えば
open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );
このコードのロック自体の有効性についての議論が中心のように見受けました。
わざわざ紹介していただいたのに不躾な言い分ですが、
私は上のようなロックでまず大丈夫という前提に立っているので
誘導先のスレよりもこちらで質問した方が適切だと思いますので
すみませんが、こちらに居させて下さい。
0046nobodyさん2006/06/27(火) 16:38:21ID:???
>もうcron関連の質問秋田
そうおっしゃらずにどうかお願いします。
過去ログ見てみても無かったので…
0047nobodyさん2006/06/27(火) 17:35:31ID:???
過去ログに何度も出てると思うよ。
cron使いたくない(or 知らない)けど定時的に何かしたいってのは。
0048nobodyさん2006/06/27(火) 17:36:54ID:???
>>37
はじめの書き出しの方のseekとtruncateは別に無くても良いと思う
0049nobodyさん2006/06/27(火) 18:26:33ID:???
ファイルをダウンロードした後、サーバ上から自動で消すことって不可能?
Locationでダウンロードするファイルに飛ばした後に
unlinkしてもダウンロードが始まる前にファイルが消えちゃう。
0050nobodyさん2006/06/27(火) 18:29:53ID:???
ダウンロードがきちんとできたかどうか分からないけど
失敗してても消すのならできそう。
0051nobodyさん2006/06/27(火) 18:34:47ID:???
>>49
そこでcronですよ。
削除リストファイルを作ってそこにあるファイルは定期的に起動するcgiで削除する。

で、ファイルのダウンロードはcgiから以外にはできないようにしておく。
一度ダウンロードしたものは2度とできないようにしておく。
0052nobodyさん2006/06/27(火) 18:35:11ID:???
>>50
是非ご教示下さい!
0053nobodyさん2006/06/27(火) 18:40:24ID:???
定期的に削除でいいのか??
Content-type: application/octet-streamで検索
0054492006/06/27(火) 18:49:19ID:???
>>51
やっぱりcronかぁ。
ダウンロード自体の頻度はかなり低い(月に数回程度)ので
すごく無駄な気がしてしまふ・・・。

>ファイルのダウンロードはcgiから以外にはできないようにしておく。
そんなことってできるんスか!?
refererでチェック?でも、簡単に偽装できるから意味ないか。

>一度ダウンロードしたものは2度とできないようにしておく。
これもやり方がさっぱり思い付かない。
パーミッション変更?
でも、いつダウンロードが終了したかは確認できんよな。
これもcron?って、それならパーミッションいじるより削除した方が早いよな。

>>53
ダウンロード頻度が低い、つまり削除の頻度も低いので
定期的に削除というよりは都度削除希望であります。
でも、無理なら仕方ない、といった感じであります。
検索して調べてきます。サンクス!
0055nobodyさん2006/06/27(火) 19:06:41ID:???
そんなに頻度が多くないなら、Location使わずにCGI経由でダウンロードさせるようにすれば?
つまり、CGIがファイルを読み出して出力、全部出力したらファイル削除。

素のファイルには .htaccess などでアクセスできないように設定しておく。
0056nobodyさん2006/06/27(火) 20:19:59ID:???
55の言ってるので出来ますね
print "content-type:MIME-type\n\n";
open fp,"downfile";
print <fp>;
close fp;
unlink "downfile";
ただしMIME typeをちゃんと指定しないと、textで無理やり表示されたり、めんどくさい感じ・・・
あと、ダウンロード→キャンセルでもうファイルが消えてるので、結構使いづらいかも?
.htaccess使うまでもなくパーミッションを600とかにしとけば普通に見えない。

ところで、UPは誰がどういう風にするのかが気になる・・・
それによってはもっといいアイデアがあるかも??
0057nobodyさん2006/06/27(火) 20:42:38ID:???
いや、だから、>>53 が言ったみたいに
Content-Type: application/octet-stream

Content-Type: application/x-download
とでもしてDLさせればいいんでない?
0058492006/06/27(火) 21:36:29ID:???
Content-Type: application/octet-stream
とか初見だったんで最初はよく分からんかったけど。

ファイル読み込み

出力

ファイル削除

で出来ますた!サンクスであります。

>>56
それとほぼ同じ形に収まった・・・2時間以上かけてだけどw
UPは特定の仲間内(?)の任意の誰か、
またはすでにあるログから情報を抽出加工したものを新規ファイルとして作成、
という何とも分かりにくい感じ。深く気にしないでね。

ところで、少し気になったんだけど、
>>53>>55>>56>>57
の言おうとしてる内容はほぼ同じって解釈で合ってるよね??
0059nobodyさん2006/06/27(火) 21:54:28ID:???
合ってる合ってる
0060562006/06/27(火) 22:01:59ID:???
>>57
なるほど、そういうmimeタイプがあるんですね。知らなかったです。
nameを指定するオプションとかも使えそうな感じ・・・(?
0061492006/06/27(火) 22:38:41ID:???
本題とちょっとズレるけど、
open直後にunlinkしても内容は保持されるみたいだね。
てか、UNIXなんかのテンポラリファイル使う場合は常套手段だとか。
>>56の例で言えば、
open fp,"downfile";
unlink "downfile";
print <fp>;
close fp;
って感じだな。
こうした方が、異常終了の際にファイルが消えてないってリスクが減るのでベターなわけだ。
0062nobodyさん2006/06/28(水) 00:23:47ID:???
>>61
お前ぶっとばすよ?
0063nobodyさん2006/06/28(水) 00:32:55ID:???
>>62
やめて
0064252006/06/28(水) 00:51:27ID:Ty2xiiJR
perl -c ではOKでエラーは見つからないです。
localでは、問題が見つからなかったのでサーバにアップロードしたらエラーが出まして
自分が考えれるところを確認しましたが、分からなくなってます。

ttp://hisazin-up.dyndns.org/up/src/11946.txt
再びいろいろといじっているせいで若干おかしなものも混ざっているかもしれませんが、
このような形です。
何の引継ぎなどがない場合には78行目の処理が行われて、
別ルーチンから投稿フォームが出力されます。
その投稿フォームから出力された場合に85行目からの処理が実行されて、問題がなければ
投稿OKかどうかの確認ページの出力
その確認ページからデータを引き継いだら143行目の処理に入るのですが、
143行目の処理の中で
ローカルでは問題なく結果が表示されるのですが、
サーバへアップするとどうしても500エラーとなってしまいます
0065nobodyさん2006/06/28(水) 01:54:52ID:???
こりゃまたけったいなスクリプトがきたぞ
0066nobodyさん2006/06/28(水) 02:00:58ID:???
0067nobodyさん2006/06/28(水) 02:05:10ID:???
500エラーのときは鯖のエラーログ出せよ。

どうせヘッダ出力してないとかそういうのだろうけどな。
0068nobodyさん2006/06/28(水) 02:58:08ID:???
sub nothing_log{
nothing_log: <<<これは一体?
print "その記事はすでに削除されているので書き込みできません\n";
exit;
}
0069nobodyさん2006/06/28(水) 03:28:54ID:???
>>68
ラベル。
0070nobodyさん2006/06/28(水) 03:45:51ID:???
>>25
まず、require文とhtml_head("掲示板")だけで動くのか報告よろ。
どうせ晒すなら全部晒してもらうとこっちでもテストできるんだけど・・・
0071nobodyさん2006/06/28(水) 03:58:15ID:???
あ、わかった。143行目を print "\n\ntest\n"; で解決ですね。たぶん
あるいは html_head("掲示板"); print "test\n"; とか
82行目のifをスルーした場合どこにもヘッダを出力する
ルーチンがないので、普通にエラー・・・・・・・・・・・・
0072nobodyさん2006/06/28(水) 04:19:30ID:???
・・・
form_vew_make($pop_name,$pop_title,$pop_msg,$pop_icon,$pop_color,$pop_password,$pop_mail,$pop_home,$pop_thread);
こういう代入はあまりにも毒々しいので、$popなんとかは全部1つのリファレンスにまとめた方がいい。
あるいは%FORMをそのまま放り込んで、$pop系の変数を全部捨てた方がいい。
$lenなんとかはlenごときで変数作るなよと、wその程度だったら
必要な時にlen_count($なんとか)で取れば十分。
あと$view_flagのgoとbackは、goとbackを代入してるif文のところで
そのまま処理すればよいので不要
0073nobodyさん2006/06/28(水) 08:40:19ID:???
すみません。
BASIC認証するときのサーバの負荷について教えてください。
[ID]:[PASS]
というようなユーザファイルあると思うんですが、
何件ぐらい大丈夫なんでしょうか。
5万、10万件ぐらいは平気な感じでしょうか。
データベースでなく、ただのテキストファイルの検索って
どれぐらい大変なのかわかりません。

レンタルサーバじゃ実験できないし、
apacheのインストールの勉強も途中という
初心者ですので。
よろしくお願いします。
0074nobodyさん2006/06/28(水) 09:22:51ID:???
>>73
perlの話じゃないので、スレ違い。使ってる鯖(apacheなり
なんなり)のスレを探してそっちできけ。
0075nobodyさん2006/06/28(水) 09:34:48ID:???
板違い
0076nobodyさん2006/06/28(水) 10:04:15ID:???
>>74
73です。
たしかに、1をよく読んだら全然違ってました。
初心者、perlつながりで質問してしまいました。

旅に出ます。><
0077nobodyさん2006/06/28(水) 17:08:53ID:???
どこがperl繋がりなんだ…
0078nobodyさん2006/06/28(水) 17:13:29ID:???
perlで.htaccessなり.htpasswdに追加アッー!
0079nobodyさん2006/06/28(水) 17:38:43ID:JW7kjnCG
質問があるんですが「->」って何に使うんですか?
検索エンジンでは記号の検索ができないので、調べようにも調べられずに困っています・・・。
0080nobodyさん2006/06/28(水) 17:43:27ID:???
>>79
「perl アロー演算子」辺りでぐぐる
0081nobodyさん2006/06/28(水) 20:12:24ID:xzEYpxD8
デリファレンス
0082nobodyさん2006/06/29(木) 00:16:50ID:???
$hoge->[10] $hoge は配列へのリファレンス
$hoge->{piyo} $hoge はハッシュへのリファレンス
$hoge->()    $hoge はコードブロックへのリファレンス
$hoge->piyo() $hoge はオブジェクト(メソッドコール)

っていう理解でいいですか?
0083nobodyさん2006/06/29(木) 00:18:42ID:???
まぁ合ってる。
ただリファレンスじゃなくて
リファレンスの参照というか、デリファレンスというか
0084822006/06/29(木) 00:33:58ID:???
$hoge->[10] で要素が参照できるなら $hoge は配列へのリファレンス、というわけではないのでしょうか?
デリファレンスしてるのはアロー演算子ですよね?? 混乱してきた。。。
0085nobodyさん2006/06/29(木) 00:37:48ID:???
ごめん、82を読み違えてた。
合ってる。$hogeは配列へのリファレンス。

0086nobodyさん2006/06/30(金) 00:52:51ID:???
掲示板で無造作な大量リンクのカキコを排除したいと考えています。

  if( $txt にURLが5個以含まれる ){

    はじき処理

  }

の場合は、IF文のカッコ内にどのような文字を入れるとよろしいでしょうか。
よろしくお願いします。
0087nobodyさん2006/06/30(金) 01:03:46ID:???
$text =~ m!(http://.*){5,}!s
とかでいいんじゃね
0088nobodyさん2006/06/30(金) 01:31:11ID:???
>>87
なりました11111111
ありがとうございました   三 三 旦
0089nobodyさん2006/06/30(金) 10:18:19ID:???
perl 5.8.6 で XML::RSS を使って Podcast 情報を取得しようとしていますが、enclosure url が引っ張り出せません。XML::RSS では出来ないようなのですが、他に enclosure url が取得できるものはあるでしょうか。m(_ _)m
0090nobodyさん2006/06/30(金) 10:41:50ID:???
crypt関数について質問です。
#saltはランダムです
$crypted_pass = crypt($password, $salt);

$crypted_passは、$password='1111';$saltはランダムなので毎回違った
文字列になります。すごい疑問なんですが、これをBASIC認証のための
.htpasswdファイルに書き込むと、'1111'でも$crypted_passは毎回違う
文字列ができるのに、何回$crypted_passを作ってもBASIC認証の
ダイアログに'1111'を入れると認証されます。
すごいバカなので全然理解できないです。

わかりにくいとあれですので、やってみたいことを細くします。
フォームから入力されるパスワードを$FORM{'pass'}
.htpasswdファイルにすでに書いてあるパスワードを$pass_htpasswdとします。

パスワードが正しかったら〜するって言うことが目的なんです。
if( crypt($FORM{'pass'}, $salt) eq $pass_htpasswd){hoge処理;}
こういうことがしたい場合は、$saltを固定しないとperlでは
できないんでしょうか?固定するとこの処理で大丈夫みたいです。
ランダムだと毎回違う文字列が出てきてだめです。

サーバだとなんで、'1111'ってわかるんでしょうか。
perlでもなんか処理のしかたありますか。
ちょっと、長い文章で申し訳ないですが、よろしくお願いします。
0091nobodyさんNGNG
ヒント:crypted文字列の前から二文字はsalt
0092nobodyさん2006/06/30(金) 12:01:59ID:???
>>91
cryptの戻り値(digest)にはsaltの情報も含まれているのであとで確認したいときは
それをsaltとしてそのまま食わせればいいことになっている。

When verifying an existing digest string you should use the digest as the salt (like
"crypt($plain, $digest) eq $digest"). The SALT used to create the digest is visible as part of
the digest. This ensures crypt() will hash the new string with the same salt as the digest.
This allows your code to work with the standard crypt and with more exotic implementations. In
other words, do not assume anything about the returned string itself, or how many bytes in the
digest matter.

0093nobodyさん2006/06/30(金) 15:14:17ID:???
>>91
>>92
90です。
ありがとうございます。
できました!!!

saltといっしょだったんですね。
cryptだとパスワードそのまま、saltにできるんですね。
すごく便利です。
ありがとうございました。
0094nobodyさん2006/06/30(金) 15:22:58ID:???
なんか勘違いしてそうな文面だな。
0095nobodyさん2006/06/30(金) 16:17:19ID:???
            第三者                  「通信は傍受される」のがセキュリティの前提で
             ↓
     受信     ↓傍受   送信          この場合、パスワードが傍受されるから
サーバー←←←[パスワード]←←←クライアント     生でパスワードを送るのはダメ


            第三者                 パスワードからハッシュ関数で生成した
              ↓                   ダイジェストを送信すれば、傍受されても
     受信      ↓傍受   送信          ダイジェストからパスワードは復元できない
サーバー←←←[ダイジェスト]←←←クライアント    (できるけど、とてつもなく時間がかかる)ので安全

ダイジェストを受け取ったサーバーは、自分が持っているパスワードをダイジェスト化して
それと送られてきたダイジェストを比べる事で、パスワードが合っているか判断する
っていう理解でおk?
0096nobodyさん2006/06/30(金) 16:20:58ID:???
>>95
それだと、「ダイジェスト」を「パスワード」と読み替えたのと全く同じなのでよくない。
0097nobodyさん2006/06/30(金) 16:38:41ID:???
下手な図だが。要はパスワードの平文をサーバに保存しないのがcryptの一般的な目的かと

 パスワード入力 ランダムなサルト
      ↓    ↓
crypt($password, $salt);
 ↓              登録時
保存(ダイジェスト化されたパスワード)
 ├──────┐    照合時
 ↓            │
照合           │頭にくっついているサルトだけが
 ↑            ↓    自動で取り出される。
crypt($password, $salt);
     ↑     パスワードとサルトが同じであれば
 パスワード入力     出てくるダイジェストが同じものになる
0098nobodyさん2006/06/30(金) 16:45:56ID:???
なるほど。ダイジェストだけ保存しておけば、認証はできるのかぁ。
セキュリティは難しいです>< 結城たんのアリス本でも読もうかな・・・
0099nobodyさん2006/06/30(金) 17:07:50ID:???
>>98
たん付けとは浩に失礼だ。
0100nobodyさん2006/06/30(金) 17:12:00ID:???
>>94
90です
if( crypt($FORM{'pass'}, $pass_htpasswd) eq $pass_htpasswd){hoge処理;}
$saltの文字列が長いときは、crypt関数が、
頭から2文字saltを取ってきてくれて、.htpasswdに記録されている
パスワードをそのまま$saltに入れても大丈夫

っていうことかと思ったのですが。
違いましたでしょうか?
スクリプトは正常に動いてるみたいです。

よくわかりませんが、BASIC認証は通信を暗号化
しないとだめなんですよね。
たしか。
0101nobodyさん2006/06/30(金) 17:18:35ID:???
>>100 勉強してきたようだな。
>>93
> saltといっしょだったんですね。
から>>100の意味は読み取れないぞ。
それに、書くなら、
crypt関数は$saltの先頭2文字をsaltとみなして計算するから、
とかするのが正しいだろう。

ロジックが重要なプログラムの世界で、言葉遣いぐらい、と思っているとひどい目に遭うぞ。
0102nobodyさんNGNG
ミルカさん萌え
0103nobodyさん2006/06/30(金) 17:50:56ID:???
正確には一概に頭二文字とはいえないな。ライブラリ依存。
POSIXやSUSv3の範囲で言えば確かにそうだけど、
拡張として$n$...$形式のsaltに対応している環境も結構ある。
ttp://www.gnu.org/software/libc/manual/html_node/crypt.html
ttp://www.freebsd.org/cgi/man.cgi?query=crypt&apropos=0&sektion=3&manpath=FreeBSD+6.1-RELEASE&format=html
0104nobodyさん2006/06/30(金) 18:21:42ID:u4Lu+yYC
メールアドレス:aaaa@aaaa.ne.kp
### メール投稿設定 ###
@$tmail = '';# 投稿用メールアドレス
A$mailhost = '';# 受信メールサーバー
B$mailid = '';       # メールアドレス(@以下は入れないでください)

って言うのがあったんだけどそれぞれ何入れればいいんですか?
一応番号ふっときました
0105nobodyさん2006/06/30(金) 18:27:54ID:???
>>104
Perlうんぬん以前の問題だな・・・

PC初心者板マジオススメ
http://pc7.2ch.net/pcqa/
0106nobodyさん2006/06/30(金) 18:28:48ID:???
>>104
ここはスクリプトを「作る人」のためのスレだ。使う人はスレ違い。
作者に聞け。
0107nobodyさん2006/06/30(金) 19:33:30ID:???
作者も聞かれても困るけどなw
0108nobodyさん2006/07/01(土) 00:20:37ID:???
@$tmail = 'info@yahoo.co.jp';# 投稿用メールアドレス
A$mailhost = 'pop.mail.yahoo.co.jp';# 受信メールサーバー
B$mailid = 'info';       # メールアドレス(@以下は入れないでください)
とでもやっておけばいいんじゃないの?
シラネ
0109nobodyさん2006/07/01(土) 15:05:13ID:???
ページ移動させたいときに

print "Location: http://google.com/";, "\n\n";

ってやるけど、windowsのローカル+Apache+ActivePerl だと 500エラー返しちゃうんだよね…
eval でもエラーにならないんで、
Location: ができるかどうかって前もって判断することってできる?
0110nobodyさんNGNG
正常に飛びましたが何か?
0111nobodyさん2006/07/01(土) 15:50:23ID:???
>>110
マジでΣ
何かの設定違ってんのかなー。

>>109 なんで &quot; になってんのかわかんないけど。

まあ、ぐぐったら tok2 とか infoseek とかでも Location は 500 るっぽいんだけど、
それは手動で設定変更して HTML吐いての meta タグで飛ばしてた。
プログラム内で自動で判断できれば一番なんだけど、何か対策ないかねえ。
0112nobodyさん2006/07/01(土) 16:43:35ID:???
print "Status: 302 shine\n";
も一緒に吐くとどうなる?
0113nobodyさん2006/07/01(土) 16:44:34ID:???
こうだったorz
print "Status: 302 Shine Compact\n";
0114nobodyさん2006/07/01(土) 18:13:25ID:???
>>113
500だねぇ・・・。
動くとこでやってみたけど、何これ? マジック?
0115nobodyさん2006/07/01(土) 18:23:44ID:???
print "HTTP/1.1 301 Moved Permanently¥n";
こいつを出してからにするとどう?
0116nobodyさん2006/07/01(土) 18:52:35ID:???
>>115
おおおおお(*゜▽゜)

print "HTTP/1.1 301 Moved Permanently\n";


だといかなかったけど、参考にぐぐって、

print "Status: 301 Moved Permanently\n";
print "Content-type: text/html\n";
print "Location: http://google.com/\n\n";

こうしてやったらいきました! すごい! ありがとう!

……っていうか、ひょっとして Content-type: ないからあかんかった……?(;´Д`)
動くとこはなくても動いたんだけどw
0117nobodyさん2006/07/01(土) 19:08:37ID:???
Content-Typeはどんなステータスでも必須だったような。。

>>115
それはnph-*なファイル名でないとあかんやん。
0118nobodyさん2006/07/01(土) 19:09:54ID:???
>>114
CGI/1.1仕様でちゃんと決まってますよ。
0119nobodyさん2006/07/01(土) 19:13:14ID:R0VHYefT
申し訳ないです。

鯖のインストール済モジュールが知りたくて、検索してたら↓の情報がありました。
ttp://antipop.gs/mt/2004/11/21/115534

ただこれを実行すると DBI など複数同一表示されるものがあるのですが、
これを重複をなくすにはどうすれば良いでしょうか?
0120ヽ(´ー`)ノ ◆.ogCuANUcE 2006/07/01(土) 20:57:42ID:???
use strict の後に my %c; を、for の後に grep { !$c{$_}++ } を入れるんだ。
0121nobodyさん2006/07/01(土) 21:38:28ID:???
>>99
お前は呼び捨てかよw
0122nobodyさん2006/07/01(土) 23:52:40ID:???
「9.56」みたいな、小数点付きの数字を画像表示させたいと考えているのですがよく分からず困っています。

小数点さえなければ
------------------------------------------------------
$cout = sprintf("%06d",$cout);

for($i = 0; $i < length($cout); $i++){
$no = substr($cnt,$i,1);
push(@image,"./img/$no.gif");
}

print "Content-type:image/gif\n\n";
binmode(STDOUT);
print &gifcat'gifcat(@image);
------------------------------------------------------
というコードで、数字を画像表示させられるというのは分かるのですが、
なにぶん小数点が含まれるとなると・・・・どうしたらよいか・・・・

ちなみに「img」ディレクトリに「0.gif〜9.gif」という数字の画像と
「point.gif」という小数点を表示する画像が入っています。

どうかよろしくお願いします orz
0123nobodyさん2006/07/02(日) 00:05:54ID:???
>>122
未だにperl4なのがアレだけど…。多分、以下の1行入れるだけでいける。

for($i = 0; $i < length($cout); $i++){
 $no = substr($cnt,$i,1);
 $no = 'point' if ($no eq '.'); ### この行を入れる ###
 push(@image,"./img/$no.gif");
}
01241222006/07/02(日) 00:29:28ID:???
>>123
え・・・>>122は入門書っぽい本を参考にして組んだのですが・・・
何かまずかったでしょうか・・・?

とりあえずありがとうございました orz
0125nobodyさん2006/07/02(日) 04:58:17ID:???
Image::Magickで「9.56」の画像を作ればいいんじゃね
01261192006/07/02(日) 13:06:22ID:???
>>120
ありがとうございました、希望の動作になりました。

Perl はコードが省略化されて読めなかったりするのですが、
119のリンク先では↓の部分が難解でした。もしよければ解説おねがいします。

print qq|<li><a href="http://search.cpan.org/search?module=$_";>$_</a></li>\n|
for sort
map {$_ =~ m/^.+?"Module" (.+?)$/}
qx/perldoc perllocal/;

# printの行は↓に変更、最後にセミコロンを付けるとエラー
# print "<li><a href=http://search.cpan.org/search?module=$_>;$_</a></li>\n"
# for sortの行は理解不能無理、こんなループ見たことない検索しても出てこない
# mapの処理自体は分かるが、左に代入先などがないので出力が分からん・・・
# qxは調べて分かった。でもどういう出力に・・・
0127nobodyさん2006/07/02(日) 13:35:34ID:???
後ろから読んでくと分かるはず。

qx: qxの実行結果を
map: map に通してモジュール名だけ抜く
sort: ↑をソートして
for: そのそれぞれについて(foreach)
print: print
01281192006/07/02(日) 14:16:29ID:???
>>127
ありがとうございます、↓やっと分かってきました。

use strict;
my %c;
my @qx = qx/perldoc perllocal/;
my @module = map {$_ =~ /^.+?"Module" (.+?)$/} @qx;
my @modlist = grep { !$c{$_}++ } @module;
@modlist = sort @modlist;
foreach (@modlist) { print "<li>$_</li>\n"; }
0129nobodyさん2006/07/02(日) 17:13:00ID:???
$_[0]って何だ?
エラーメッセージが一つしか表示されない。
もう一つ表示するはずなんだが・・・。

&error("ダメだ","ダメっす");
コレだと『ダメだ』しか表示されない・・・。
『ダメだ』と『ダメっす』をランダムってか表示させたいんだが
0130nobodyさん2006/07/02(日) 17:36:43ID:???
>$_[0]って何だ?
配列の一番はじめの要素
>&error("ダメだ","ダメっす");
サブルーチンに配列で引数渡してるところ
>コレだと『ダメだ』しか表示されない
アタリマエ
0131nobodyさんNGNG
sub error {
print $_[int(rand(scalar(@_)))];
}

我ながら酷いコードだな
0132nobodyさん2006/07/02(日) 18:36:42ID:n0vd3nFA
ちょっと行き詰ってしまったので質問させてください

今回UTF-8を使用しようと思いjcode.pmでエンコードしようとしたのですが
一部の文字列が文字化けすることに気づきました。

例)心霊

ちなみにエンコード方法は
Jcode::convert (\$value, 'utf8');
としているだけで特に怪しいことはしていないと思います

ちなみにそこを#でコメントアウトしてみると
フォームページ自体をUTF-8で書いているため
さきほどの「心霊」と言った文字列も問題なく表示されるわけですが
フォームページをEUC-JPなどにすると
当然のごとくEUC-8になってしまうため問題があります

何か私自身の書き方に問題があるのでしょうか?
それとも仕様なのでしょうか?
お手数をおかけして大変申し訳ありませんがご教示頂けると嬉しいです

よろしくお願い致します
0133nobodyさん2006/07/02(日) 18:53:53ID:???
129だが解決方法を教えてくれ
0134nobodyさん2006/07/02(日) 18:58:30ID:???
せめて sub error を晒せ。
いまんとこ解決というかそれは当たり前というか。
>>130 も書いている通りなんだが。
>>131 もなんか書いてるし。
それを参考にどうぞ。
0135nobodyさん2006/07/02(日) 19:00:42ID:???
>>131
配列の添え字は整数しかとらないんだし、
randの引数はスカラーコンテキストだからこれで良いじゃないか。
sub error { print $_[rand @_] }

>>132
何をしようとしているときに問題が発生するのかが良くわからんので、問題が発生するときの
・内部エンコーディング(UTF-8ならutf-8フラグはあるのかどうかも出来れば)
・出力/入力するエンコーディング
・どっちの方向に変換しようとしているのか
辺りを詳しく。

スクリプトの内部処理をUTF-8で行って、出力するページのエンコーディングを
EUC-JPにしようとしているわけ?勘では多分、使い方の間違いだ。
Jcode::convert(\$value, '変換先のエンコーディング', '元の文字列のエンコーディング');
ってやって見れ
01361322006/07/02(日) 19:09:39ID:n0vd3nFA
>>135
ごめんなさい、誤解させてしまうような書き方をしてしまいました

基本的には内部においてUTF-8で処理したいのです
eucやsjisに変換する気はありません

ただどんな文字コードでフォームから入力されても
UTF-8に変換したいために
Jcode::convert (\$value, 'utf8');
としています

# 現在のブラウザではフォーム入力ページがUTF-8なら
# UTF-8で文字コードを送信してくれるという話なので(どっかで聞きました)
# Jcode::convert (\$value, 'utf8');
# をしなくても実害はないといえば実害がないのですが
# 万が一sjisとかで送信してくるブラウザ等があった場合にも
# 対応したいと思い変換処理させています

ところでUTF-8フラグはEncodeモジュール以外でも必要なのでしょうか?
(今回の件で色々ぐぐっていたときUTF-8フラグというものについても読んだのですが
Jcodeモジュールを使う時にフラグ云々という話は出てこなかったので不要なのかと思っていました)

続きます
0137nobodyさん2006/07/02(日) 19:10:50ID:???
Jcode::convert (\$value, 'utf8');

jcode($value)->utf8();
にしてみたら?
自動判別が働いて正しく格納されるはず。

入力のエンコードを誤認してたらどうしようもないけどね
0138nobodyさん2006/07/02(日) 19:11:56ID:n0vd3nFA
入力された文字列を処理させる流れは以下のような感じです

sub decode {
my ($buffer, $key, $value);

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}

@pairs = split(/&/, $buffer);
foreach (@pairs) {
($name, $value) = split(/=/);

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

Jcode::convert (\$value, 'utf8');

$in{$name} = $value;
}
}
0139nobodyさん2006/07/02(日) 19:16:54ID:???
あの〜packしてる時点でスクリプトを書いている文字コードへ変換しているはずですが・・・

># 万が一sjisとかで送信してくるブラウザ等があった場合にも
># 対応したいと思い変換処理させています
そりゃおまいさんがどんなコンテンツを管理しているかによる。
UTF8で書かれたページからshiftjisで
しかもフォームデータをエンコードもせずにダイレクトで送ってくるブラウザ
使ってる奴なんて死ねばいいと思うよ
0140nobodyさん2006/07/02(日) 19:19:08ID:???
139の一行目はなんか激しい勘違いなので忘れてw
0141nobodyさん2006/07/02(日) 19:23:43ID:n0vd3nFA
>>137
jcode($value)->utf8();
にしてみたら上手く行ったかと思ったのですが
ためしにフォームページをEUC-JPにして入力してみると
入力された文字列はEUC-JPのまま出力されていました・・・

>>139
>しかもフォームデータをエンコードもせずにダイレクトで送ってくるブラウザ
>使ってる奴なんて死ねばいいと思うよ

もうちょっと正直に書きますと
ある分野のデータベースを作っているのですがその検索フォームを
「自分のサイトにつけたい人はどうぞ」
という風にしたいと考えているのです
ですのでその入力ページがeucもあればsjisもあるかと思うので
鯖側でUTF-8に変換したいなあと・・・

最後まで解決しなければその案は断念しますがw
0142nobodyさん2006/07/02(日) 19:47:20ID:???
>>138
切り分けができてないな。そんなに長いプログラムではどこで
間違ってるか特定できないだろ。

Jcode::convertを疑うのなら、4valueにこの値をいれて
Jcode::convertを呼んだらこれこれこうなったけど
期待している値はこれだというのを示さないと。
0143nobodyさん2006/07/02(日) 20:06:33ID:n0vd3nFA
>>142
えっと・・・このソースの大半は一般的な入力データ処理だと思いますが・・・
とりあえず>>132で書いた通り
Jcode::convert (\$value, 'utf8');
をコメントアウトすれば問題なく処理されます

一応文字化けした結果も載せておくと
「心霊」をUTF-8で記載されたページから入力すると
unpackされた値は「%E5%BF%83%E9%9C%8A」になりそれをpackして
Jcode::convert (\$value, 'utf8');
で変換すると「綽??」(← 文字化けしたもの)
となってしまうというわけです(当然期待している値は「心霊」です)

ちなみに「心」だけでも「霊」だけでも正常に出力されます
0144nobodyさん2006/07/02(日) 20:40:15ID:???
いやだから??とか文字化けしたとかじゃわかんないでしょ。
utf8フラグと文字コードのダンプぐらい示さないと。
0145nobodyさん2006/07/02(日) 20:48:13ID:???
ためしに
Jcode::convert (\$value, 'utf8', 'euc');

Jcode::convert (\$value, 'utf8', 'sjis');
ってやった結果も記してくれんかな
0146nobodyさん2006/07/02(日) 20:55:32ID:???
そもそも他人に使わせるなら日本語限定ではだめじゃん?
ttp://www.russky.net/article/list.asp?id=855
これは gb2312 だけど euc-kr にも日本語のひらがなが入っていたようないないような。
0147nobodyさん2006/07/02(日) 21:13:47ID:???
おおかたencode/decodeを適切にやってないと予想。

0148nobodyさん2006/07/02(日) 21:35:08ID:???
ああ、大体わかった
「綽??」ってのはUTF-8の文字列をEUC-JPとして見たときのものだ。

つまり変換自体には問題はなくて、結果を表示するページを
間違えてUTF-8じゃなくEUC-JPにしてしまっている、と。
0149nobodyさん2006/07/02(日) 21:47:43ID:pDw8h7zX
s/\x0D\x0A/\n/g;
tr/\x0D\x0A/\n\n/;
とかって、改行コードの統一処理はどのタイミングでやるもの?
何かファイルを読み込むごとに毎回するもの?
0150nobodyさん2006/07/02(日) 21:52:43ID:???
混在してるとごちゃごちゃするので、なるべく入り口近くで決めた形式に
統一しちゃうね。場合によっては無駄になることもあるけどわかりやさ
優先。
01511322006/07/02(日) 22:03:39ID:n0vd3nFA
>>144
>>143の??は実際には文字化けの□をもっと縦長にした感じのが出ています
ただここにコピペしたら?に変換されてしまったわけで

>>145
入力ページはUTF-8で記載されていますのでその上での結果です
>Jcode::convert (\$value, 'utf8', 'euc');
「綽??」
>Jcode::convert (\$value, 'utf8', 'sjis');
「蠢?怺」
ちなみに↑の例ですが入力ページをそれぞれeucおよびsjisに変えたら問題ありませんでした
今回の「心霊」のようにそれぞれの文字コードで別の問題ある文字がないとは限りませんが・・・

>>146
そうかもしれません

>>147
その可能性がないとは言えませんが私は適切にやってるつもりなのでなんとも

>>148
ブラウザでのエンコードはUTF-8になっていることを確認した上で見ています
なのでブラウザの問題ではなくむしろ下に書くように
jcode.pmモジュールがUTF-8をEUC-JPに誤読しているのかと・・・

つづく
01521322006/07/02(日) 22:04:39ID:n0vd3nFA
今回試しに下のような形でエンコードしたところ
Jcode::convert (\$value, "utf8", "utf8");
正しく「心霊」と表示されました

また「心」と「霊」は単独で正確に表示できることから
思うに「心霊」と続けて入力したとき
繋がっている部分の文字列から文字コードをEUC-JPと判断された上で
UTF-8に変換しているのではないかと個人的には思っています

例) #文字コードについて調べるのが面倒なので下記のような仮定で・・・
UTF-8 : 心→aaaaaa 霊→bbaabb
EUC-JP : 綽→aaaa ?→aabb ?→aabb


今めちゃくちゃ眠いので
もしかしたら落ちてしまって反応明日以降になっちゃうかも・・・
そのときはごめんなさい

あと、忘れていたのですが、ご回答頂いた方々、ありがとうございます
0153nobodyさん2006/07/02(日) 22:07:24ID:???
>>150
それは、
「コードの最初の方に1箇所だけ統一処理を置いて読み込む度に処理される」
ということを意味してるのか、
「必要不要は置いといて、オープンする度に毎回とりあえず統一処理する」
ということなのか、どっちの意味ですか?
読解力不足ですみません。
01541482006/07/02(日) 22:27:28ID:???
>>151-152
そうか、ごめん。こっちの環境ではちゃんと自動認識できてたもので、つい。

なら、SJISの一バイトカナの問題もあるし、
呼び出し元のフォームでエンコーディングを指定してもらうか、
もしくはフォームに適当なマルチバイト文字列を埋め込んでおいて、
それが何になったかでエンコーディングを調べるってのはどうよ。

# formにはaccept-charsetなんてのもあるのだけれど、IE対応してないんじゃ仕方ない…
01551322006/07/02(日) 22:38:32ID:n0vd3nFA
>>154
ご回答くださり有難うございます
なるほど、その方法がありましたね
ソース見られるとちょっと不恰好だけど・・・

てゆーか素朴な疑問なのですが
jcodeモジュールを使っている人で同じような問題に当たった人って居ないのかなあ・・・
eucで「〜」を入れるとNGというのは発見したのですが

# ちなみに入力ページをEUC-JPにした上で「〜」を入力したところ確かにNGでした

自分一人だとしたら、やっぱり何か私の書き方がおかしいんだろうな・・・
jcode.plではこんなこと一回もなかったのでjcode.pmが嫌いになりそう
0156nobodyさん2006/07/02(日) 22:45:18ID:???
ってか受け取った文字列が utf-8 かどうかなんて自分で1行書いて判別すれば起こらない問題じゃね?
0157nobodyさん2006/07/02(日) 22:49:46ID:???
143の%エンコードっされた文字列をみるに
Jcode::convertには

"\xe5\xbf\x83\xe9\x9c\x8a"

という「心霊」をutf8にしたバイト列を食わしているわけだが、
$Jcode::DEBUG=3にしてこいつを変換すると

>DEBUG:sjis = 6, euc = 2, utf8 = 6 at 〜

と出るので、sjisとutf8のスコアが同点でどっちにも決められない
状態になっていることがわかる。

これは避けられないことなので、普通はhiddenで判定用文字列を
渡してどういうのが来るかで文字コードを決定し、他のパラメタに
ついてはJcodeの自動判定にたよらずその文字コードを入力コード
に指定してやるのが安全。
01581322006/07/02(日) 23:19:43ID:???
ご回答頂きありがとうございます

>>156-157
なるほど、了解しました
とくに>>157さんは細かく調べて頂き深く感謝致します

>>154さんも仰っていたように
判定用文字列を渡してチェックする方向で対処したいと思います

長い時間お付き合い頂き、皆様、本当にありがとうございました
0159nobodyさん2006/07/02(日) 23:58:34ID:???
正直、convertサブルーチンを使う気ならjcode.pl使えばいいじゃん。
Jcode.pmはオブジェクト指向が前提だし、その先にはEncodeへの視野がある。

使いこなせないなら無理すんな
0160nobodyさん2006/07/03(月) 01:25:18ID:???
>159
jcode.plはUTF-8に対応して無いんだが
0161nobodyさん2006/07/03(月) 01:44:49ID:???
>153
答えた本人じゃないけど・・・
>「必要不要は置いといて、オープンする度に毎回とりあえず統一処理する」
だと思う

俺も基本的にはデータファイルを読み込むときに改行を統一 (または不要なら削除) してる

「あれ? このデータは改行付だったっけか?」 なんて迷うことも少なくなるので、
自分でどの段階でまとめておくとか、自分なりのルールを決めておくといいかと思います。
0162nobodyさん2006/07/03(月) 02:25:22ID:???
早く文字コードが統一される時代が来ないかな
もうこのさいUTF-8でもSJISでもなんでもいいからさ
0163nobodyさん2006/07/03(月) 07:23:23ID:???
>>157
utf8の心霊はそんなにもeucっぽいという事?w
でも、実際には文字化けしてるわけで、・・・なんか変な感じだ・・・
0164nobodyさん2006/07/03(月) 07:27:52ID:???
>>129
$_[0]=="ダメだ"
$_[1]=="ダメっす"
自分の経験からするとこういうランダムは、すぐにうっとうしくなるw
0165nobodyさん2006/07/03(月) 09:14:35ID:???
>>162
unicodeはいい機会だったのだが日本語については従来のコード
との対応について統一に失敗したのでだめぽ。まったく当時その
辺で仕事してた奴らは負の遺産を残してくれたものだ。

01661492006/07/03(月) 10:05:01ID:???
>>161
もう誰もレスくれないと思ってたからちょっと感動。

やっぱり、オープンの度にコード統一する癖付けといた方が何かと良さそうですね。
これで改行統一の野望に一歩近づきました。
ありがとうございます!
0167nobodyさん2006/07/03(月) 12:27:50ID:???
sjisで統一されたら面倒くさくて超困るしw
utf8は神。もうちょっとがんばってはほしかったが。

jcode の文字自動判別は前からいろいろ問題あったよね。
length で判定して同じ文字数だったらEUCにするので、
sjis で半角カナだけ書いて文字判別させると文字化けするとかね。
優先順位指定できたらもっと使いやすかったと思う。
0168nobodyさん2006/07/03(月) 12:30:55ID:???
孫がトロン潰しさえしなければなぁ・・・
0169nobodyさん2006/07/03(月) 14:44:46ID:???
>>167
>jcode の文字自動判別は前からいろいろ問題あったよね。
よくしらないので教えて欲しいんだけど、
utf8で文字化けしないencode方法あるの?
googleとかで文字化けしたの見たことないし方法あるのかなあ。
0170nobodyさん2006/07/03(月) 18:36:40ID:???
>>169 > utf8で文字化けしないencode方法あるの?
ごめん、日本語でおk

(フラグのない) utf8 だって見分けるのは簡単でしょ。
最初の文字から最後の文字まで ascii と utf8 だけだったら utf8 てすればいい。
ああいう特徴的な文字の並びはほぼ間違いなく utf8 なんだから。

掲示板とかで sjis で HTML 書いてて、ほとんどそのフォームからデータ送信して受け取るのに、
euc と sjis が候補にあがった場合、わざわざ euc だと推測するのはおかしいでしょ?
その推測を頼りに決定しまってるのが jcode の convert というか getcode の欠点。
半角カナの文字化けだって、sjis 判定に半角カナのコード範囲を入れてないから起こるもの。

だから、何でもかんでも 1行で変換を済まそうとせず、
一旦 Encode::Guess の guess_encoding みたいに推測して文字コードの候補をとり、
複数の候補があった場合、プログラマがどっちを優先して変換するか書いて決めればいいんじゃないかと思うわけ。

長ぇ!
0171nobodyさん2006/07/03(月) 19:43:50ID:???
つーか、普通にパラメータ増やして、文字コード
送信すれば?
<input type="hidden" name="encoding" value="sjis">
バイナリから推測なんてメンドクサイ、ムズカシイ、確実じゃない、いい事何もない。
0172nobodyさん2006/07/03(月) 19:47:02ID:???
たしか質問者は、そのプログラムを他の人のページから使わせる気なんでしょ?
利用者が文字コード知ってて、しかもフォーム書き換えてくれるなんて
あまり期待できないと思うけど。
0173nobodyさん2006/07/03(月) 20:01:53ID:???
検索とかで、ブラウザのアドレスから
http://〜/~.cgi?q=ほげほげ
ってやったときの文字コードなんて何になるかわかんないしな
0174nobodyさん2006/07/03(月) 20:41:54ID:DxhEPLl+
「ファイルの中身の任意の1行だけを書き換える」という処理をする方法なんですが、
open(FH,$FILE);
while(<FH>){
if(マッチ条件){処理}
push(@newdata,$_);
}
とすると、マッチして書き換えた後もファイルの中身を最後まで読み込んで無駄な処理が出てしまいます。
lastとかで飛ばしたいところですが、そうするとファイルの中身が書き換えた行以降消えることになります。
こういうとき、どういう処理をすれば無駄なく完遂できるんでしょうか?
セオリーみたいなものがあれば教えて下さい。
0175nobodyさん2006/07/03(月) 20:50:54ID:???
>>172
自分のページにフォーム作ろうなんて考える利用者はHTMLぐらいかけるでしょ普通
で、文字コード別にフォームのソース置いといて、化けない奴使ってね、て書けばたぶん分かる。
何にも知らない人はそもそも変なフォームから送信してこないので問題ないと思う・・・

>>173
フォームから入力したいって言ってるんだからGETメソッドに対応しなければいいのでは?
どうしてもGETも対応したいって場合も、ばけたら&en=***なんとかを付けて見て下さいみたいな
誘導でなんとかなりそう・・・
そもそも、アドレス欄からクエリー送信してくるのは上級者だと思う
0176nobodyさん2006/07/03(月) 20:51:54ID:???
>>174
読み込みで開いてるので消えない
0177nobodyさん2006/07/03(月) 21:08:28ID:???
ブラウザに送ってくる文字コードを指定する方法があって、すべてのブラウザが
それを守ってくれればいいのだが、とんでもないのが存在するのも現実だ。

一番ひどいと思ったのはhiddenとそれ以外で別のコードで送ってきやがった
某ブラウザ。数年前の話だから今は改善されてるかな。
0178nobodyさん2006/07/03(月) 21:11:39ID:???
>>174
176の指摘はおいとくとしても、偶然同じ長さの行に書きかえるのでない限り
それ以後の内容を前後にずらす必要があるので、そういうことは考えるだけ
無駄ですな。

File::Inplaceの使用をお勧めする。
0179nobodyさん2006/07/03(月) 21:14:39ID:???
>>174
一気に read でファイルの中身全部読み込んじゃって、
あとは s{^(マッチ条件).*}{ 処理 }em; とかして、
一気に書き出せばいいんじゃね?
01801742006/07/03(月) 22:04:52ID:DxhEPLl+
>>176
いや、確かにファイルの中身自体は消えてませんが、そういうことでは…。

>>178
多少の無駄には目をつぶって最後まで走らせておくのが吉なんですかね。
File::Inplaceについては調べてみます。ありがとうございました。

>>179
確かに正規表現で1回マッチ直後に処理すれば、無駄はなくなる…けど、
処理そのものの負担が大きくなってしまうような…。


色んな場面で必要にかられる処理だと思ったので、
他の人はどんな風に処理してるのか適当にCGIを見てみたところ
>>174に書いてあるのが結構多かったかも。
中には
open(FH,$FILE);
my @data = <FH>;
my $loop = @data;
my $i;
while($loop>0){
@temp = split(/ /,$data[$i]);
if(マッチ条件){
処理
last;
}
$i++;
$loop--;
}
ってのも、ありました。ちょっとゴテゴテしてるなぁ。
0181nobodyさん2006/07/03(月) 22:05:46ID:???
KENTを見て育ってる者だ。
よくlocal何て使わないでmyと書いてあるがすべてmyにしたらダメだよね?
ちょっと違いが分からないので教えて欲しい・・・。
0182nobodyさん2006/07/03(月) 22:14:19ID:???
>>180
> 処理そのものの負担が大きくなってしまうような

何でそう思うのかkwsk

my @data = <FH>;
↑こんなことしてる方がよっぽど負担強いてると思うぞw

>>181
コーチ変えたほうがいい。
0183nobodyさん2006/07/03(月) 22:19:42ID:???
>>182
KENTが一番楽だったからそれにしてたいが今更コーチ変えろって
簡単で見やすいスクリプトなんてあるの?
何せKENTのスクリプトをみて覚えてきた人間だから今更となると見やすいスクリプトじゃないの無理な気がする。
0184nobodyさん2006/07/03(月) 22:20:53ID:???
>>183
じゃあそのままでいろよ。
0185nobodyさん2006/07/03(月) 22:24:31ID:???
っていうかKENTが神、ってネタか釣りなんだろ?そうなんだろ?
0186nobodyさん2006/07/03(月) 22:48:13ID:???
KENTがperl5で全部書き直すか、プログラムの配布を止めれば
状況は変わると思う。
0187nobodyさん2006/07/03(月) 22:54:50ID:???
>>174
任意の一行ってことはマッチする行がはじめから一行しかない
事が分かってるってことですかね?
それともマッチした最初の行だけとか、?(それだと174はまずいですよね・・・
ファイルの構造が固定してるなら、該当する行をダイレクトに指定
できる可能性とかはありえない・・・?
0188nobodyさん2006/07/03(月) 23:07:15ID:???
KENTはKENT未満の読むに値しない汚いスクリプトから初心者を守ってるから神。
0189nobodyさん2006/07/03(月) 23:16:27ID:???
つか、皆から見てKENTのソースってどうなん?
初心者のオイラにはなんのこっちゃか分からない行がたくさんあって、ちょっと嫌
0190nobodyさん2006/07/03(月) 23:20:54ID:???
つい最近前スレだかでも話題になったからパス。
セキュリティくらい考えて作れよー。

まあKENT儲は ∩( ´∀`)∩コチラヘ (っ´∀`)っ))ドウゾ

KENT WEB 総合スレ Part2
http://pc8.2ch.net/test/read.cgi/php/1078991985/
0191nobodyさん2006/07/03(月) 23:32:34ID:???
>>181
…向上心があるなら、出来るだけ早い内にPerl5流に馴染んでおいたほうが楽だぞ。本当に…
きっと、各種モジュールに興味が出てきた頃に、矯正するのに時間がかかって苦労する。というか、した。
# 独学だと何がまともなのか、判るようになるまでが難しい

閑話休題。多くの場合では、myに置き換えて大丈夫だと思う。
localとmyの違いは効果の範囲が動的…プログラムの流れに沿ったものか、
静的…ソース上のブロックに対応したスコープか、と言うのが一番の差。
以下、差を顕著にするためのどうしようもない汚い例。
sub fuga { $foo }
sub hoge_my { my $foo = 'hoge'; print 'my: ', fuga(), "\n" }
sub hoge_local { local $foo = 'hoge'; print 'local: ', fuga(), "\n" }
$foo = 'outer'; hoge_local(); hoge_my();
---------------
local: hoge
my: outer

あと型グロブのように、単純にmyに置き換えることの出来ないものもあるけれど、
これも、出来る限りリファレンスを使って書くのがPerl5流。
localの出番はPerlで定義済みの変数($/の類)とか。

何か大事な点がすっぽ抜けてたら、フォロー宜しくお願いします。
0192nobodyさん2006/07/03(月) 23:36:24ID:???
local は変数宣言ではないので、use strictすると
local しただけではエラーになるので注意。my か our などが必要。
0193nobodyさん2006/07/03(月) 23:37:39ID:???
>>191 は親切すぎるぜ…
01941742006/07/03(月) 23:46:28ID:DxhEPLl+
>>182
>何でそう思うのか
いや、単純に感覚的なものなので間違ってたらすみません。
ファイルの中身が数千行とかあった場合で、
該当する行の情報もそこそこ大きい場合、
全部読み込んで正規表現にかけるより
1行ずつチェックした方が良さそうに思っちゃいました。

>>187
>任意の一行ってことはマッチする行がはじめから一行しかない
>事が分かってるってことですかね?
その通りです。でも、その行はどこにあるのかは分からないし流動的。
掲示板とかアクセスログとかのログと同じようなもんですね。
なので、ダイレクトに指定することはできないです。
0195nobodyさん2006/07/04(火) 00:01:32ID:???
>>194
数千行ならさあ、
数千回ループさせて、数千回ファイルからデータとってきて、数千回 @array にその大きいデータを push するのと、
改行の数なんか関係なく 1回 read して $scalar に入れて 1回だけ置換 するのと、
総合的にどっちが良さそうに見える?

まあその数千行のファイルが ウン十Mb とかなら話は変わるけど、そんな規模のデータファイル作ったりはしないよね。
とりあえずいくつか方法で迷ったらベンチでもとっとけばいいと思う。
0196nobodyさん2006/07/04(火) 07:41:17ID:???
DB使ったほうが楽だと思うけどね。途中だけ書き換えるとか
かなり不毛。ファイルを編集するのが目的ならしょうがない
かもしれないが、データ保存用ならいくらでもやりようがある
はずだ。
0197nobodyさん2006/07/04(火) 10:28:25ID:???
こういう話題だとDB使えって人はクライアントの仕事したことないんかね?
0198nobodyさん2006/07/04(火) 12:30:08ID:???
ファイルが大きくなるなら、複数のファイルに分けて、インデックスも作っておく。
掲示板のログと一緒。
0199nobodyさん2006/07/04(火) 12:47:20ID:???
$titleに入っている題名の間隔を空けて表示したいのです
置換でなかなかうまく行きませんでした
良い方法はありますか?
0200nobodyさん2006/07/04(火) 13:02:03ID:???
エスパー頼む
0201nobodyさん2006/07/04(火) 13:11:56ID:???
$title =~ s/([\x80-\xff].|[\x20-\x7e])/$1 /g;
0202nobodyさん2006/07/04(火) 13:27:20ID:???
>>199
css使いなさいな
0203nobodyさん2006/07/04(火) 14:42:27ID:???
>>201
ありがとうございます

CSSの本も2冊買っているのですがじっくり取り組む時間がなくて
これもやってみます
0204nobodyさん2006/07/04(火) 22:40:59ID:???
>>174
もう、納得すみかも知らんが

#!/usr/bin/env perl -w
my @data = ();
my $flag = 0 ;
while ( <> ){
if( /print/ ){ s/print/say/ ; $flag ++ }
push @data, $_ ;
last if $flag != 0 ;
}
push @data, <> ;
print @data ;

これを hoge.pl として保存して
% perl hoge.pl hoge.pl
してみそ?
0205nobodyさん2006/07/04(火) 23:22:36ID:???
foreach $loopsubject(@datname){
foreach(@localsubject){
if($_=~/$loopsubject/){
$localsubjectmatchswitch=1;
last;
}else{
$localsubjectmatchswitch=0;
}
}
}
のようなスクリプトを書いたのですがif($_=~/$loopsubject/)で判定してくれません。
判定後の処理にprint "match";を書いてみると何も帰ってきません。
@datnameの内容は
1152013113.dat
1152013147.dat
のようなものです。@localsubjectには2chのsubject.txtのような内容が入っています。
@loaclsubejctの中に@datnameの中身が入っているか判定したいのです。
入っていたらスイッチを1にしてループを終了させて、ループが全部終わったときに
スイッチが0だったら書き込みの処理をしたいです。

なぜ判定してくれないのでしょうか?教えてください。お願いします。
0206nobodyさん2006/07/04(火) 23:32:02ID:???
2行目に
chomp $loopsubject ;
入れてみるとか…。
02072052006/07/04(火) 23:57:29ID:???
>>206
ありがとうございます!検出はうまくいきました!
でも今度はすでに@localsubjectにあるはずなのに無いと検出されます…なんででしょうか?いろいろ試してみたけどわかりません。
スイッチの検出は
if($localsubjectmatchswitch==0){
$writesubject=$datname[$i]."<>".$threadtitle[$i];
unshift(@localsubject,$writesubject);
}
のようにしてやってます。
0208nobodyさん2006/07/05(水) 00:06:26ID:???
まさか last で外側の foreach ループまで一緒に抜けるとは思ってないよね・・・?
内側の foreach ループのあとに、フラグに関する処理が入ってるんだよね・・・?
0209nobodyさん2006/07/05(水) 00:07:58ID:???
お前さん
>>205 では
$localsubjectmatchswitch=1;
ってマッチしたとき 1 代入してんのに
>>207
では 0 のときの処理を書いてるよ。
0210nobodyさん2006/07/05(水) 00:12:06ID:???
>>205,207 が何やってるか全然わからないのは俺の頭が悪いだけかな?
0211nobodyさん2006/07/05(水) 00:16:10ID:???
変数名が長い
0212nobodyさん2006/07/05(水) 00:29:19ID:???
>>208,209
内側のforeachループでローカルsubject.txtの中身を調べて
マッチしたら1を返してすべてにマッチしてなかったら処理をするようにしています。0の時の処理を書いてるのはそのためです。
外側のforeachループは検索語を順番に処理するようにしてあります。
で、どうしたらいいんでしょうか?理論的には問題が無いように見えるのですが…
なぜマッチしたはずなのにマッチして無いとみなされるんでしょうか?
>>211
変数名長くしないとわからないアホな子なんです。許してやってください。
02132052006/07/05(水) 00:31:21ID:???
>>212>>205です。名前欄入れ忘れました。すいませんでした。
>>208
>内側の foreach ループのあとに、フラグに関する処理が入ってるんだよね・・・?
そのとおりです。
0214nobodyさん2006/07/05(水) 00:42:12ID:???
まさかと思うけど
$localsubjectmatchswitch
の初期化はきちんと入れてるよね。>>205の2行目
(>>206のchompの次の行)あたりに。
0215nobodyさん2006/07/05(水) 00:46:40ID:???
>>214のことは忘れて
02162052006/07/05(水) 00:48:32ID:???
>>214
入れてませんでした。でも入れても結果が変わらない…マッチして無いとみなされてsubject.txtに書き込まれる…
それと、なぜか一回で2重に(同じ内容が2行)書き込まれます。これもforeachあたりの間違いだと思うんだけどどこが悪いのかわからない…
アドバイスください。お願いします。
0217nobodyさん2006/07/05(水) 00:52:05ID:???
つーか$iがどこから来るのかもわからん。
0218nobodyさん2006/07/05(水) 00:56:39ID:???
ソースをうpしてくんないかな。
全容が見えなさすぎ
0219nobodyさん2006/07/05(水) 01:05:56ID:???
配列の数少なくして一回一回内容 print してデバックすればわかるだろ?w
エスパー求めすぎ。
02202052006/07/05(水) 01:23:12ID:???
>>218
http://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42709.txt.html
ソースうpしました。アドバイスお願いします。
>>217
$iは忘れてました。つけたら少しはまともな動作をするようになりましたが求めていたものとは違いました。
0221nobodyさん2006/07/05(水) 01:44:31ID:???
my の変数の羅列で吹いたw
02222052006/07/05(水) 01:50:05ID:???
書き忘れてました。問題の部分は95行目から120行目までです
0223nobodyさん2006/07/05(水) 01:51:31ID:???
>>205 のループってさ、
@localsubject のどれかが、
@datname の最後の値 ( @datname[ $#datname ] ) にマッチしたら 1、マッチしなかったら 0
ってことなんだけど、それは処理としていいの?
どうみても @datname の最後未満の値は、マッチしようがしまいが関係ないって感じだよね。
02242052006/07/05(水) 02:27:35ID:???
>>223
>@datname の最後の値 ( @datname[ $#datname ] ) にマッチしたら 1、マッチしなかったら 0
ってことなんだけど、それは処理としていいの?

@datnameは外側のforeachでまわしてるから全部にマッチしてるかどうか確かめてあるはずですけど…
判定ルーチンが内側のforeachのすぐ後ろに来るから判定はしてくれてるはずです。

いまいろいろやって、とりあえずローカルにsubject.txtを書き出すのはうまくいったみたいです。
あとは、これが2重に書き込まれないようにするためにしないとなんだけど、そこの処理をやってるのが96〜111行目なんですよね。
で、そこがうまくいってないみたいです。$localsubjectmatchswitch=0;になるときの処理に
print "nomatch";を加えたらすでにローカルsubject.txtに書き込んである場合でもnomatchを返されました。
だからif($loopsubject=~/$loopdat/)が問題ですかね?
それとも@datanameの内容が2つあるから違うほうの内容に反応してnomatchを返すことになってるのでしょうか?
でもforeach $loopsubject(@localsubject)で内容全部まわしてるから1つでもマッチしたら2重に書き込みはされないはずですけど…
なんでまずいのかわからないのでアドバイスお願いします。
0225nobodyさん2006/07/05(水) 02:39:35ID:???
>>224
一回寝て朝もっかい考えなさい、このおバカw
0226nobodyさん2006/07/05(水) 02:42:02ID:???
1152013147.dat<>エロゲ実況 黄金の蜂蜜酒で一線越え (290)
こんなの保存して楽しいのか
0227nobodyさん2006/07/05(水) 02:55:40ID:???
どうせ print すんなら print "no match : '$loopdat'" とか書いてやれよ。
02282052006/07/05(水) 02:59:19ID:???
>>225
これが気になって眠れません。寝たほうがいいってか寝ないとなんですけど…
>>226
テスト用の検索ワードが思いつかなかったため適当に目に付いたスレを選んだのです。特に深い意味はありません。

原因が判明したっぽいです。103行目あたり、foreach $loopsubject(@localsubject){
でローカルのsubject.txtを解析するのですが、$loopsubjectをループ内でprintしてみたところ最後の1行しか表示されませんでした。
全部表示されるはずのローカルsubject.txtが表示されないということはマッチも出来ないわけですからnomatchになるということだと思います。
で、どうにかしたいんですがどうしたらいいんでしょうか?foreachで表示されないなんてことは初めてなのでわかりません。アドバイスお願いします。
0229nobodyさん2006/07/05(水) 03:04:35ID:???
> open(F,">>$localsubjectpath")||die"subject.txtをopen出来ません:$!";
> @localsubject=<F>;

これかwwwwwwww
>> とか < とかの区別もできない子だったんですね。
0230nobodyさん2006/07/05(水) 03:07:22ID:???
ただ単に「キーワードが全部含まれる」AND検索がしたいだけちゃうのかと
02312052006/07/05(水) 03:22:39ID:???
>>229
ファイルオープンの時につけるのって>と>>しか知らなかった…今ググってはじめて知った…orz
読み込みは出来るようになりました。迷惑かけて本当すみません。
でも、2重に書き込んじゃうのがどうしてもなくならないんですけどどうしたらいいんですか?
もう散々どこが悪いのか探したけどわからないんです。多分これが最後の質問です。お願いします。
0232nobodyさん2006/07/05(水) 03:33:40ID:???
>>231
直したのはわかったけど、それでマッチするようになったのかマッチしないのかぐらい書いてよ。
どうでもいいけど、 chomp $loopdat; → $loopdat =~ s/[\r\n]+$//; とかのがいいかもね。
0233nobodyさん2006/07/05(水) 04:07:21ID:???
つか、こんなん動かしてたら一瞬でアク禁だけど、その辺の覚悟はできてるんだよね?
0234nobodyさん2006/07/05(水) 04:27:05ID:???
ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42719.txt.html
あ…ありのまま 今 起こった事を話すぜ!
『myの羅列とインデントにくらっと来たと
 思ったらいつの間にか作り直していた』
「今時Perl4」とかそんなチャチなもんじゃあ 断じてねえ
もっと恐ろしいものの片鱗を味わったぜ…

>>231
漏れのところでは開くモードを適切に変更して関連部分を修正すれば一応動くがなぁ…
+<モードで開いた?それとも<で読み込んだ後、一旦閉じて>モードで開きなおし?
もし+<モードなら、seekしてないんでないのか。

あと直接関係無いが、112行目の$iのインクリメント位置が間違ってる。

>>232
いや、そもそも@datnameには改行は入ってこない。
<>でsplitした前半相当だから。
0235nobodyさん2006/07/05(水) 04:35:40ID:???
>>234
オメガワロスwwwww
ようやるわーw
>>205の意見を聞こうッ!!!
0236nobodyさん2006/07/05(水) 04:42:04ID:???
>>234
あるあるwwwwwww 俺もイラッときて書き直してたw
0237nobodyさん2006/07/05(水) 05:00:47ID:???
でもごくたまに、cgi 配布サイト? とかでも my 羅列してたりするよなw
一応 use strict 通るけど、あんなじゃ kent local と変わんないっつー。
0238nobodyさん2006/07/05(水) 07:41:25ID:???
すっかりVIPのスクツになってしまったな
0239nobodyさん2006/07/05(水) 14:04:38ID:???
my羅列ってC厨だろwしかも書けないくせにww
0240nobodyさん2006/07/05(水) 14:08:45ID:???
my羅列って、とにかくmy使えるところには極力myを、ってこと?
それって良くないことなのか?
むしろ推奨!みたいな感じだと思ってたので詳しく教えてくれ。
0241nobodyさん2006/07/05(水) 14:28:40ID:???
>>240
>>220 のソース見ればわかる。
0242nobodyさん2006/07/05(水) 14:35:34ID:???
>>241
その羅列は想定外
0243nobodyさん2006/07/05(水) 14:39:12ID:???
>>240-242の流れにワロタwww
0244nobodyさん2006/07/05(水) 15:12:35ID:???
>>240-242
どひゃー。ぶったまげた。wwww
0245nobodyさん2006/07/05(水) 17:04:50ID:???
ってか205出てこんかーいっ
0246nobodyさん2006/07/05(水) 17:13:00ID:???
たぶん 205は >>234 のソースを3日くらいかけて解読してるとこw
0247nobodyさん2006/07/05(水) 18:10:57ID:???
これはびっくり
0248nobodyさん2006/07/05(水) 18:24:10ID:???
>>234の解析に3日かかったら、>>220の解析は33日かかりそうだw
0249 ◆TWARamEjuA NGNG
(´-`).。oO(むりやりOopにした0chみたいな。。。)
02502052006/07/05(水) 20:56:42ID:???
   $i=0;
   foreach $loopdat(@datname){
   chomp $loopdat;
   $datmatchcheck{$loopdat}=0;
      foreach $loopsubject(@localsubject){
      if($loopsubject=~/$loopdat/){
      $localsubjectmatchswitch=1;
      print "match:$loopdat\n";
      last;
      }else{
      $localsubjectmatchswitch=0;
      print "nomatch:$loopdat\n";
      }
      }
   if($localsubjectmatchswitch==0 && $datmatchcheck{$loopsubject}==0){
   $datmatchcheck{$loopsubject}=1;
   $writesubject=$datname[$i]."<>".$threadtitle[$i];
   unshift(@localsubject,$writesubject);
   }
   
   $i++;
   }
このようにしてみました。しかし、2重に書き込まれてしまいます。
多分@localsubjectの中身を何度もまわすので、それでマッチして無いのがマッチして無いとみなされるみたいです。
2重に書き込まれないようにするにはどのようにチェックしたら良いでしょうか?アドバイスください。お願いします。
$datmatchcheck{$loopsubject}のようにしてみましたがこれではうまくいきませんでした。
0251nobodyさん2006/07/05(水) 21:10:50ID:???
(´-`;).y-。oO (・・・さてどうしたもんやら・・・)
0252nobodyさんNGNG
まず変数名をどうにかしろよw
0253nobodyさん2006/07/05(水) 21:32:17ID:???
わざと
$localmyforeach;
$elsifwhile;
$unshiftopen;
みたいな変数名つけたらエラく読みづらくなるんだろうな…。
0254nobodyさん2006/07/05(水) 21:43:47ID:???
foreach $tmpsub(@loaclsubejct){
  $found = 0;
  chomp;
  foreach $tmpdatname(@datname){
    chomp;
    if($tmpdatname =~ /$tmpsub/){
      $found = 1;
      $founddat = $tmpdatname;
      last;
    }
  }

  if($found){
    push(@founds, "$founddat<>$tmpsub\n");
  }
}
print @founds;

myとかは略した

0255nobodyさん2006/07/05(水) 21:45:05ID:???
てかさ、チェックしようとしてる配列に書き戻すとかありえんだろ
0256 ◆TWARamEjuA NGNG
(´-`).。oO(subject.txtの再構築をしたいのかな?それだったらdatを全部舐めてタイトルを取得した方がよさそうな。。。)
0257nobodyさん2006/07/05(水) 21:48:29ID:???
>>234
ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42797.txt.html
234のをさらにooっぽくしてみました・・・

当の205はまだ解決してないのかなw?
0258nobodyさん2006/07/05(水) 21:54:53ID:???
いやしばらく見てなかったらすごいことになってますね。
久しぶりにくらくら来ました。
0259nobodyさん2006/07/05(水) 21:59:23ID:???
テ、テポドン2...
0260nobodyさん2006/07/05(水) 22:15:12ID:???
テポ丼2イイネェ
0261nobodyさん2006/07/05(水) 22:16:17ID:DDQKgTGL
ファイルがあるかないかをif条件に入れて、ないなら作成したいです。
ファイル名はcontak.lolです。
cgi-binフォルダにあるかないかを調べたいです。

globを使うんですか?
なんか混乱しちゃって。
0262nobodyさんNGNG
if(-f "./contak.lol"){ }
0263nobodyさん2006/07/05(水) 22:31:31ID:???
レースコンディションで死にそうだなw
0264nobodyさん2006/07/05(水) 22:36:23ID:???
-e じゃなくて?
0265nobodyさん2006/07/05(水) 23:19:27ID:???
レースコンディション調べた。
へええ、そうか、ファイルロックと同じように攻撃されるわけかw

結局 perl では安全にファイルを作ったり読んだりするのはどう書けばいいのだろう?
File モジュール使えって? そりゃそうですが。
0266nobodyさん2006/07/05(水) 23:23:45ID:???
sysopenでO_EXCL使えば?
0267nobodyさん2006/07/05(水) 23:59:55ID:???
>>266
use Fcntl; しなくても動くならそうしたい (´・ω・`)
0268nobodyさん2006/07/06(木) 00:02:49ID:???
O_EXCLなんて&O_EXCL()なんだから環境依存のマジックナンバー化してしまえば(ry
0269nobodyさん2006/07/06(木) 00:32:42ID:???
>>268
そうか、君頭イイネ。
・・・
わかるか!ヽ( `Д´)ノ
0270nobodyさん2006/07/06(木) 00:44:34ID:???
'>>'で開けばなければ作るよ。

ファイルを作ったのが自分かどうかはわからないが。
0271nobodyさん2006/07/06(木) 00:59:56ID:FMcswvIH
perlどころかプログラム超初心者で困ってます。

バッチ処理(これはなんとか解決)を実行後に、元のHPでリンクされた
urlを新しいブラウザで開きたいのですが記述方法がわかりません。
どう記述すれば良いのでしょうか?

つまらない質問ですがよろしくお願い致します。m(__)m
0272nobodyさん2006/07/06(木) 01:26:41ID:???
日本語の初心者は
0273nobodyさん2006/07/06(木) 01:30:44ID:???
まず日本語を勉強してください^^
0274nobodyさん2006/07/06(木) 02:13:42ID:???
perl初心者です。
perlって、サーバで動きますよね。
自分のパソコンで動かそうと思ったら、
apache,activeperlとかインストールしないとだめです。

ここで質問ですが、exeファイルみたいなので、
activeperl無しで動かすことってできるんでしょうか?

perlでアプリケーション作ったら、
apacheとactiveperlもいっしょに入れて、
自分でインストールしてください。
ということになるんでしょうか?

たとえば、チャットのクライアントソフトなど
作るときってどうなりますか。
よろしくお願いします。
0275nobodyさん2006/07/06(木) 02:26:05ID:???
ここはコーティングスレですよー。

∩( ´∀`)∩ドウゾ (っ´∀`)っ))アチラヘ

CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0276nobodyさん2006/07/06(木) 02:45:14ID:???
それ以前に何も分かってなさそう・・・
0277nobodyさん2006/07/06(木) 03:58:15ID:???
>>274
こんにちはこんにちは!
この辺を見るといいんじゃないかな…!
http://hamachiya.com/junk/memo_PAR.html
0278nobodyさん2006/07/06(木) 05:20:33ID:???
>>277
うわ、これ便利スw
0279nobodyさんNGNG
はまちやは書いてある事がいい加減だからこっちを見た方が良い
ttp://0xcc.net/diary/20040716.html
0280nobodyさん2006/07/06(木) 14:12:07ID:???
274です。
すごい便利なものがあったんですね。
でも、説明読んでみるとソースコードが
簡単に見れるのと、複雑なコードが正常に
動かないとか書いてありますね。
もうちょっとネットや本の資料探してみます。
0281nobodyさん2006/07/06(木) 16:24:22ID://0K++zo
すんごい初歩的なことでごめんなさい。
変数を区別する記号付けってどうやるのか度忘れしたので教えて下さい。
検索ワードのご教示だけでも良いです。

[例]
$i = 1;
print "hoge$i_code";
等を正しく表示したい。
0282nobodyさんNGNG
${i}
0283nobodyさん2006/07/06(木) 16:26:57ID:???
print "hoge$i","_code";
0284nobodyさん2006/07/06(木) 16:33:30ID:???
print "hoge$i\_code";
0285nobodyさん2006/07/06(木) 16:54:28ID:???
質問です。
OSはWINです。

すごい初心者で変な質問ですみません。
perlで、dosコマンドを実行することって
できるんでしょうか。

たとえば、
print "del a.txt";
というようにファイルを消そうと標準出力しても
実行できませんでした。

可能でしたら、方法ご教授お願いします。
02862812006/07/06(木) 16:56:24ID:gzQtm5v/
>>282
それです!ありがとうございます。

>>283>>284
print <<HTML;
hoge$i_code
HTML
だとどうなんですかね。
汎用性に問題あり?
教えてクレクレ君の分際で偉そうにすみません。
ありがとうございました。
02872572006/07/06(木) 16:57:41ID:???
>>258-260
なんとなく好意的な感想どもです〜^-^/
0288nobodyさん2006/07/06(木) 17:11:28ID:???
>>285
実行するだけならsystem関数、その出力が欲しいならバッククォートまたは、パイプでopen。
だが、そのファイルを消すというのが単なる例じゃないとしたらunlink関数を使うべき

>>286
284はこういう場合に問題ありだな
"${i}nhoge"
0289nobodyさん2006/07/06(木) 17:24:25ID:???
>>288
はやいお返事ありがとうございます。
さっそく勉強します。
0290nobodyさん2006/07/06(木) 17:40:34ID:???
>>288
じゃあ "$i\x6ehoge"

とかいいつつ、俺もいつも ${i} 以外は書かないw
0291nobodyさん2006/07/07(金) 08:16:27ID:???
>>290
いつもって、そんなに使うことありますか。それ使うときって
変数を変数名にする場合ってことであってますか?
0292nobodyさん2006/07/07(金) 08:22:27ID:???
>>291
大人にはいろいろあるのよ。
0293nobodyさん2006/07/07(金) 08:25:50ID:???
>>292
ム板のアリスさんでしょ?僕を大人にしてください。おながいします。
0294nobodyさん2006/07/07(金) 12:05:06ID:???
すいません。本当に初歩的な質問かと思いますが、
Perl5.8で、jcode.plやJcode.pmを使わずに
全角英数と半角英数の変換を行う方法があれば、教えてください。
0295nobodyさん2006/07/07(金) 12:32:03ID:???
ttp://www.kanzaki.com/docs/jcode.html
step1. 文字コードについて理解する
step2. がんばる
02962942006/07/07(金) 14:25:27ID:???
色々Web検索しながら試してみたところ、
下記のようなスクリプトをUTF-8で保存し、
入力テキストファイルもUTF-8で記述したところ、うまく動作しました。
$_ = decode('utf8',$_);
の部分の意味がよくわからないので教えてください。
ここは何をしてるんでしょうか?

use strict;
use utf8;
use Encode qw/ encode decode /;

while (<>){
$_ = decode('utf8',$_);
tr/[0-9]/[0-9]/;
print;
}
0297nobodyさん2006/07/07(金) 15:11:08ID:???
tr/[0-9]/[0-9]/

オアエスゴイナww
0298nobodyさん2006/07/07(金) 15:19:10ID:gJw2prbr
配列の中身全部を全角→半角みたいに変換するには
やっぱforeachとかで中身を展開しながら1コずつ処理するしかない?
jcode.plとかJcode.pmとで配列そのものを扱う方法ってある?

>>294
英数字限定なら正規表現でどぞ。
0299nobodyさん2006/07/07(金) 15:40:01ID:???
それくらい面倒くさがるなよ(´・ω・`)
03002982006/07/07(金) 16:19:58ID:???
>>299
CGI.pmでフォームの内容を配列に入れて文字コードごにょごにょってのは
結構色んなとこで使われそうな処理なんで、実装されてたりするのかなぁ、と思ったもんで。
無いと分かれば、安心して配列回しまくれますわ。さんくす。
03012942006/07/07(金) 16:27:23ID:???
>>297
[]は要らないよ、とおっしゃっているのでしょうか?

>>298
正規表現というと、具体的には?s///を使ってできるという意味ですか?
0302nobodyさん2006/07/07(金) 17:13:35ID:???
>>296
1byte 単位(正確には 8bite 単位)の処理から utf8 の文字列処理に
変換している。
$_ = decode('euc-jp', $_ ) ;
なら、8bite 単位の羅列を euc-jp でエンコードされてると見做
した上で、utf8 に変換。
03032942006/07/07(金) 17:26:00ID:???
>>302
レスありがとうございます。
バイト単位から文字単位へ、という事が必要なので
読み込ませるテキストがUTF8でも必要、という事でしょうか。

読み込ませるテキストの文字コードがわかってない時はややこしそうですね。
0304nobodyさん2006/07/07(金) 17:40:55ID:???
>>303
その通りだと思います。が、perl hacker ではないのでw
03052052006/07/07(金) 20:47:14ID:???
自己解決しました。2重に書き込みされてたのは書き込み部分
open(F,">$localsubjectpath")||die"subject.txtをopen出来ません:$!";
foreach(@localsubject){print F $_;}
close(F);
が追記モードになっていたために2重に書き込んでしまうという症状が起きました。
上書きモードで実行したらうまくいきました。
くだらない質問に答えてくれて本当にありがとうございました。
0306nobodyさん2006/07/07(金) 21:37:02ID:???
>>305
解決おめ。
234で指摘したのとほぼ同じ原因でないか…自力で二日も模索乙
まさか、まだ追記モードを使っていたとは夢にも思ってなかった訳だが。
0307nobodyさん2006/07/07(金) 22:07:16ID:???
>>305
おめ。
俺はがんばって >>234 のコードを読解して新しく書き直してるのかと思ってたw
少しは参考にすればいいのにね。
03082942006/07/08(土) 10:38:42ID:???
すいません。こちらではこれ以上回答がいただけないようなので、
こちらでの質問はこれで終わりとし、
別スレでこちらで回答していただいた事を元に
少しポイントをしぼって質問してみたいと思います。
回答していただいた方々、ありがとうございました。
03092942006/07/08(土) 10:40:49ID:???
あ、ひょっとしたら他所で質問しないかもしれないです。では。
0310nobodyさん2006/07/08(土) 13:48:22ID:???
他所で質問しても無駄だと思うけどwwwww
0311nobodyさん2006/07/08(土) 14:50:57ID:9n4HcMAb
Encodeを使ってメール送信用にUTF8からJISに変換したいのですが、
「〜」の変換がうまくいきません。
変換できずに、「\x{ff5e}」になってしまいます。
JISにも「〜」ありますよね。

どうしたら回避できるでしょうか?
0312nobodyさん2006/07/08(土) 14:58:49ID:???
文字コードも書いてないしなー。
どの文字コでも設定と正規表現で2行だと思うけどw
0313nobodyさん2006/07/08(土) 15:03:12ID:???
>>311
それうちもなった気がする。
「〜」 だけ自分で直せばいいんじゃないかな
0314nobodyさん2006/07/08(土) 15:15:04ID:???
>>311
Unicodeと既存のエンコーディングのマッピングを作る際に、〜のマッピングがメーカーによって
WAVE DASHとFULLWIDTH TILDEの二つに分かれてしまったことに起因する問題。
http://ja.wikipedia.org/wiki/Unicode

事前に"\xEF\xBD\x9E"(\x{FF5E})を"\xE3\x80\x9C"(\x{301C})に変換して統一してやればOK。
ちなみにUTF-8はASCIIとの兼ね合いは勿論のこと、1バイト目の範囲が2バイト目以降の範囲と
重ならないように設計されているから、utf-8フラグを使用しない場合でも、ずれてマッチする心配はしなくて大丈夫。
0315nobodyさん2006/07/08(土) 15:17:56ID:???
>>314
うわぁ、知らなかったナリィ・・・
0316nobodyさん2006/07/08(土) 15:28:25ID:???
>>311
とってもまだるっこしいですが、

encode('iso-2022-jp', decode('shiftjis', encode('cp932', $x)))

とする手もあります。

日本は既存の文字コードとunicodeの対応表をつくるにあたって
統一に失敗して大きく2種類(JISとMS)できてしまったため、こんな
面倒を強いられるのです。恨むなら当時の関係者を恨んでください。

ちなみに「〜」を\x{ff5e}にするのはMS流で、JISだと\x{301c}に対応
させることになっています。

個人的には日本語に関してはunicodeはunicode-jisをunicode-msの
2種類あると思って、それらを自動判定して相互変換するJcode相当の
モジュールが欲しいなと思います。
0317nobodyさん2006/07/08(土) 15:31:47ID:???
みんなEncode使ってるみたいだけど、
そういう面倒を吸収してくれるライブラリがやっぱり必要なんじゃない?
0318nobodyさん2006/07/08(土) 15:39:20ID:???
変換 → 自作モジュ → Encode (5.8の場合)
                  → Jcode (それ以下)

とかやって、その自作モジュのとこで対策すればいいのかもだね
0319nobodyさん2006/07/08(土) 15:40:35ID:???
>>314 リンク先のリンク先 の dan さんのとこで
ttp://search.cpan.org/dist/Encode-EUCJPMS/EUCJPMS.pm
使え的な指摘がありますよ。
0320nobodyさん2006/07/08(土) 15:41:10ID:???
「の」がぬけた orz...
03213112006/07/08(土) 15:41:57ID:9n4HcMAb
みなさんありがとうございます。
〜は事前に\x{301c}に変換したいと思います。

実際、携帯電話からの入力なので、
Encode::from_to( $x, "CP932","UTF8");
としてUTF8に変換してたのですが、CP932→UTF8なので「〜」が\x{ff5e}になってしまうんでしょうか?
0322nobodyさん2006/07/08(土) 15:55:45ID:???
その方向だと、円マーク(\)やオーバーライン(~)は大丈夫なん?
0323nobodyさん2006/07/08(土) 16:11:50ID:???
スカラ変数は白い布で覆った方がいいのでしょうか?
0324nobodyさん2006/07/08(土) 17:22:37ID:H4L43ePp
push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..3;

これを省略せずに書くとどうなりますか?

配列の1番目から4番目まで限定的ではなく
配列内全てをforeachする書き方が分かりません。
@hoge_Aと@hoge_Bの要素数は同じです。
0325nobodyさん2006/07/08(土) 17:40:04ID:???
>>324
> push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..3;
> これを省略せずに書くとどうなりますか?
foreach my $i (0,1,2,3) {
  push @fuga, $hoge_A[$i] . $hoge_B[$i];
}
0326nobodyさん2006/07/08(土) 17:41:41ID:???
>>324
省略せず、じゃなくて一般化の話かな。
まず要素数を取得し、そこから範囲を作る。そのRangeに対してforeachもしくはmap
push @fuga, $hoge_A[$_] . $hoge_B[$_] foreach 0..@hoge_A-1;
or
@fuga = map { "$hoge_A[$_]$hoge_B[$_]" } map 0..@hoge_A-1;

しかし、要素数は同じと言い切れるんだったら、同時に管理されるデータなんだろ?
なら関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
@fuga = map { "$_->{A}$_->{B}" } @hoge;
そうすると、こんな風にできる。詳しくはperllolを参照
0327nobodyさん2006/07/08(土) 17:44:23ID:???
>>326
@hoge_A-1 を $#hoge_A
と書くのがBest Practice。
$#は配列の最後の要素番号を表すから、
配列のインデックスとして使う場合に適している。
03283262006/07/08(土) 17:47:57ID:???
>>327
あースマソ…存在をすっかり失念していた…
あとでここ数ヶ月のスクリプトを確認せにゃ
03293262006/07/08(土) 18:01:09ID:H4L43ePp
>>325
「配列の1番目から4番目まで回す」んじゃなくて
「(0,1,2,3)という配列を回す」ってことだったんですね。
ありがとうございます。

>>326
大変詳しい回答と説明ありがとうございます。
想定通りの結果を得ることができました。
>関連性のある二つのデータを別の配列に入れると言う、その構造を何とかしたほうが良いと思う。
まさにその通りで、そのために今回の処理をしようとしていました。
具体的には(情報の後出しになってしまいますが...)
フォームから「月」と「日」を取得し、「日付」という配列に格納するための処理です。
とにもかくにも、アドバイスまでいただいて本当にありがとうございました。

>>327
より良いコードのためのアドバイスありがとうございます。
勉強になりました。
0330nobodyさん2006/07/08(土) 18:04:13ID:???
珍しく気持ちのいい質問者だw
0331nobodyさん2006/07/08(土) 18:51:46ID:???
perl 5.005 で print "\x{ff5e}"; とかってエラーするんだっけ? 単に文字化けするんだっけ?
環境なくなっちゃって確認できなくて orz
0332nobodyさん2006/07/08(土) 19:08:45ID:???
エラーにはならない
0333nobodyさん2006/07/08(土) 19:13:39ID:???
>>332
ならおk! ありんこー。
0334nobodyさん2006/07/08(土) 20:17:42ID:???
$cnt = @hoge_A ;
1 while $cnt != push @fuga, ( shift @hoge_A ) . ( shift @hoge_B ) ;
つーのを思いついた自分に鬱
0335nobodyさん2006/07/08(土) 21:09:20ID:???
すいません、クエリについて質問があるのですか・・・。

ある掲示板スクリプト(bbs.cgi)があるとします。
自分のWEBサイトではこの掲示板をいくつか設置しているのですが、
そのたびに、「bbs1.cgi」、「bbs2.cgi」、「bbs3.cgi」みたく名前を付けて設置しています。

これをクエリを使用して「bbs.cgi?c=1」や「bbs.cgi?c=2」みたくしたいのですが、考え方が分かりません。
ちなみにできればWEB上から必要な数を必要なだけ作成できるようにしたいと思っています。


アルゴリズムだけで構いませんので、どうかよろしくお願い致します。
0336nobodyさん2006/07/08(土) 21:17:18ID:???
エスパーさん、おながいしまつ
0337nobodyさん2006/07/08(土) 21:59:16ID:???
これは普通に読めるけど?

>>335
そのスクリプトの構造にもよるけど十中八九大改修。
他の掲示板と共有できない点を洗い出すことから始めるといいよ。ログファイルとか。
ファイル名変えてる=同一ディレクトリって所から危なっかしいけどPerl関係ない…
改造スレあたり行くのが無難だと思う。
0338nobodyさん2006/07/08(土) 22:33:57ID:???
CGI上で
print $x;
としようと思うのですが、$xはリファレンスの可能性があります。
リファレンスの場合であってもref関数でチェックなどせずにそのまま表示しようと思うのですが、リファレンスだとメモリの場所がわかるわけですよね。
これが何かセキュリティ上問題になるようなことはあるのでしょうか。
例えば、他の変数の内容を閲覧できてしまう、といったことがあれば考え直そうと思うのですが。
0339nobodyさん2006/07/08(土) 22:38:32ID:???
この程度のこともどうやるか見当もつかないプログラミングスキルでは
無理なのでもうすこし地道に勉強してからの方がいいと思われる。
0340nobodyさん2006/07/08(土) 22:39:14ID:???
あ、すまん。339は335へのレスね。
0341nobodyさん2006/07/08(土) 22:42:45ID:???
>>338
そんなことで悩んでる暇があったら表示されないようにちゃっちゃと
書き直すほうが早い。

メモリの場所がわかっただけで即やられるということはないだろうが、
他のセキュリティホールとの合わせ技でなんかされる可能性を
否定するのは難しい。

0342nobodyさん2006/07/09(日) 05:26:05ID:???
>>338
> これが何かセキュリティ上問題になるようなことはあるのでしょうか。

直接の問題はないと思う。
が、何を「セキュリティ上問題」とするかによるだろうね。
「メモリの場所がわかる」ことも見方によれば問題だろうし。
0343nobodyさん2006/07/09(日) 05:32:57ID:???
>>335
ログ読み込みで
open fh,"log$ENV{QUERY_STRING}.dat";
ログ書き込みで
open fh,">log$ENV{QUERY_STRING}.dat";

・・・不特定多数が来る板だとキケンかもw
0344nobodyさん2006/07/09(日) 05:40:13ID:???
>>338
$xはリファレンスでなかったら何になる可能性があるの?
リファレンスになるかもしれない$xを表示したいwebコンテンツ
って言うのが謎なんだけど・・・w
03453382006/07/09(日) 07:29:33ID:???
>>341-342
ありがとうございます。

>>344
確かにそうですね、、よく考えるとそう思います。
ちょっとアルゴリズムを再考してみます、ありがとうございました。
0346nobodyさん2006/07/09(日) 13:14:05ID:OFKeC9Kg
配列の要素に「その時点で何度目の重複か」という数字を付けたいんですが
そういうことはできますか?
簡単な例で言うと、
@DATA = ('B','A','A','B','A','D','C','D');
という配列を対象とした場合は、
@DATA = ('B0','A0','A1','B1','A2','D0','C0','D1');
といった感じです。

map{$count{$_}++}@DATA;
という風にしていくつ重複があったかを調べることはできたんですが
その都度、数字を振る方法が分かりません。
分かる方、どうぞよろしくお願いします。
0347nobodyさん2006/07/09(日) 13:21:34ID:???
grep { $_ = sprintf("$_%d", $count{$_}++) } @DATA;
0348nobodyさん2006/07/09(日) 13:24:03ID:???
@data = map { $_ . $count{$_} ++ } @data ;
>>347
何故に grep ?
0349nobodyさん2006/07/09(日) 13:36:33ID:???
346です。

>>347さん
>>348さん
即回答ありがとうございます!
どちらの方法でもうまくいきました。
348さんの記述の方がより簡潔なのでそちらの方を使わせてもらおうと思いますが
347さんの記述も参考にして勉強します(恥ずかしながら記述の内容が理解できてないので)。
ありがとうございました!
0350nobodyさん2006/07/09(日) 15:12:46ID:???
>>348
それだと 0 が付かないと思ったら、ちゃんと付くんだね。
++ で空の値が 0になる方が. の連結より評価が先になるってことか。

grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
>>348 のを grep で書くと
grep { $_ = $_ . $count{$_}++ } @data;
0351nobodyさん2006/07/09(日) 15:29:54ID:???
>>350
>grep 使うのは @data に書き戻さないで良いから(@dataを直接書きかえる)。
いや、map でも無精しなければ…。s/grep/map/ してみ?
0352nobodyさん2006/07/09(日) 15:42:53ID:???
$_ = $_ . $count{$_}++ for @data;

でよくね?

# TMTOWTDI
03533512006/07/09(日) 15:45:39ID:???
>>352
># TMTOWTDI
そだね。
0354nobodyさん2006/07/09(日) 16:19:00ID:???
こういうのを見てしまうとPerlに戻りたくなるなぁ
制御構文の後置って書いていて気持ちいいんだよな
0355nobodyさん2006/07/09(日) 16:29:17ID:Grc/Miyg
質問です。

以下のようなハッシュと配列があります。

my %sex = (
'm' => '男性',
'f' => '女性',
);

my @list = ('name','age','sex','mail','addr', ・・・);


プログラム中で、
while (my($key,$val) = each(%sex)){
 ・・・
}

という処理を行いたいのですが、%sexの'sex'という文字列を、@listから拾いたいのです。

while (my($key,$val) = each(%{$list[2]})){
 ・・・
}

というふうに。
もちろん上記の例では「ハッシュではありません・・・」という意味のエラーが出るのですが、
やりかたがわからず困っています。

each(eval ('%' . "$list[2]")

でもやっぱりダメで、他に考え付きません・・・
よろしくお願い致します。
0356nobodyさん2006/07/09(日) 16:39:01ID:???
my @list = (\%name,\%age,\%sex, ・・・); これじゃあかんのかいな?

ってか普通は %sex とかを $hash->{sex} = {}; とかってやる気がする。

ちなみに eval でやるなら
each(eval ('%' . "$list[2]") → each(eval ("\\%$list[2]") こうじゃね。
0357nobodyさん2006/07/09(日) 16:46:51ID:???
\ 多いて orz
0358nobodyさん2006/07/09(日) 16:46:54ID:???
eval "each %$list[2]"
03593552006/07/09(日) 19:33:47ID:???
>>356
配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。

>>358
evalの使い方を間違えていたのですね。
ありがとう。その例でできました。
0360nobodyさん2006/07/09(日) 20:03:39ID:???
>>359
>配列@listには、"配列やハッシュに使う「名前」"だけを格納してるのです。。
どういう経緯でそうなったかは知らないけど、
eval使いまくりで効率悪くなる事この上ないなぁ。

my %var = (
 'sex' => {
  'm' => '男性',
  'f' => '女性',
 },
 ...
);

みたいにして
each %{$var{$list[2]}}
とすると、eval使わなくていいけど。
0361nobodyさん2006/07/09(日) 20:04:15ID:???
どうしてこう変数名を使ってなにかをしたがる奴が多いのだろうか。
デバッガ作るんでもなけりゃ名前をキーにしたハッシュにしとけよ。
0362nobodyさん2006/07/09(日) 20:39:33ID:???
てぃむどぅでぃはいいけど、せめて use strict 通るのにしたいね。
0363nobodyさん2006/07/10(月) 09:14:03ID:???
perlでサービスというか常駐プログラムを作りたいんだが
メモリの取得とか開放とか 変数使ったときの内部の挙動が
いまいち心配なのですがどうしたらよいでしょうか
0364nobodyさん2006/07/10(月) 09:41:10ID:???
>>363
perlのGCはリファレンスカウントなので循環参照を作って使い
捨てるとメモリリークになる。これに注意すれば無限に太り続ける
ことはないだろう。

perlは基本的にosからとったメモリは返さないので、一度でも大量に
メモリを使うと太ったままになる。それが困るようならたまにexecする
ぐらいしか手はない。

例外もあるがくわしくはperlfaq3の

How can I free an array or hash so my program shrinks?

参照。
0365nobodyさん2006/07/10(月) 16:54:29ID:kBFNwS+A
2つの配列に同じ要素を代入したいんですが
pushで複数の配列に同時に要素を代入する方法ってありますか?
0366nobodyさん2006/07/10(月) 17:07:07ID:???
>>365
pushにそんな機能は無い
0367nobodyさん2006/07/10(月) 17:18:03ID:kBFNwS+A
>>366
ありがとうござました。
おとなしく、2つ目の配列に1つ目の配列を代入します。
0368nobodyさん2006/07/10(月) 17:46:11ID:???
それより同じ配列を二つ用意しない方法を考えた方がいい気がするけど
0369nobodyさん2006/07/10(月) 18:08:23ID:kBFNwS+A
>>368
数字を、片方はそのまま(データ処理用)、
もう片方はコンマ付き(ブラウザ表示用)、
と分けようとしたとき、その過程でどこかに
同じ配列を用意しないといけないと思っていました。
そうしなくても良い方法ってありますか?
0370nobodyさん2006/07/10(月) 18:14:45ID:???
「同じ要素」 って言ってなかったっけw
0371nobodyさん2006/07/10(月) 18:16:43ID:???
ブラウザ表示する時にはじめてカンマつけて出力すれば?
どうせカンマ付きはそこで使い捨てになるんだろうし。
同じ配列2つだと整合性の問題もある。
0372nobodyさん2006/07/10(月) 18:24:39ID:kBFNwS+A
    @       A        B       C
数字のデータ → 配列A → 素のデータ  →   処理
         → 配列B → コンマ付きデータ → ブラウザ出力

という流れを想定しての質問でした。

>>370
確かに結果的には別の要素になりますが、その過程(Aの時点)では
同じ要素を入れる必要があると考えていたので、その局所的な点から
「同じ要素」と言ってしまいました。誤解を与えたならすみません。

>>371
ブラウザに表示するのは1度ではないので、その都度コンマを付けるより
初めから別に配列のデータを作って代入した方が良いかと思っていました。
整合性の問題については具体的には良く分かりません。
0373nobodyさん2006/07/10(月) 18:27:23ID:???
>>372
(3) の時点で配列のコピーつくればいいんじゃ?
var Array2 = Array1.concat(); とかして
0374nobodyさん2006/07/10(月) 18:33:57ID:???
>>372
>整合性の問題については具体的には良く分かりません。
途中で素のデータの方に変更がかかると
コンマ付きの方と値がズレるかも、ということ。
素のデータを更新したら、その都度、コンマ付きの方も更新しないといけない。
そういう心配をするなら、一つにしといた方が間違いが無い。
0375nobodyさん2006/07/10(月) 18:50:46ID:kBFNwS+A
>>373
(2)の段階で配列を2つ作ることと
(3)の段階で配列のコピーを作ることとの違いが分かりません。

>var Array2 = Array1.concat();
こういうのは見たことがないんですが、
配列のコピーというのはそういったテンポラリファイルとしてコピーする
モジュールか何かがあって、それを使うということでしょうか?

>>374
ご説明ありがとうございます。
配列に代入した後にデータを変更することはないので
その点については大丈夫です。
ただ、そういう考え方は重要ですね。
03763632006/07/10(月) 18:52:56ID:???
>>364
ありがとうございまんこ
変数はローカル変数でも消費しちゃうのかな
とりあえず、perlでデーモンはいったんあきらめてみます
0377nobodyさん2006/07/10(月) 19:12:46ID:???
>>375
> 配列に代入した後にデータを変更することはないので
今の処理ではそうでも、何か拡張したときに変更するかも知れない。
データは1つだけ持っておき、出力時に変換関数を通すほうが安全。

同一データを変換する処理が数百回にも及ぶため、変換後のデータをキャッシュしておきたい、
というような要求に見えるが、安全性からはオブジェクトにして、データへの変更時には、
キャッシュも必ず更新されるようコーディングすべき。
0378nobodyさん2006/07/10(月) 19:41:21ID:kBFNwS+A
>>377
アドバイスありがとうございます。

例えば、ブラウザに直接表示される部分はコンマ付きの値を
同時にフォームのhiddenでコンマ無しの素の値を、それぞれ置いておく
と言った場合には、局所的にせよ、やはり同じ配列を用意して
片方だけをコンマ付きにする必要があると思うんですが、
どうでしょうか?
0379nobodyさん2006/07/10(月) 19:46:27ID:???
もうどっちでもいいよ、君の好きなようにすればいい。
0380nobodyさん2006/07/10(月) 19:51:23ID:???
なんで一時的にしか使わないコンマ付きの値を、
配列全体に渡って作ろうとしているのか、そこが不明。

どうせ表示して終わりなんでしょ?
だったら、テンプレートにフィルタかけて、
表示側だけコンマ付きにすることもできるのに。

まぁ重複管理したければどうぞ。
0381nobodyさん2006/07/10(月) 20:01:11ID:???
初心者スレとは思えない厳しさだな。おまえらw
0382nobodyさん2006/07/10(月) 20:11:58ID:kBFNwS+A
>>379
はぁ・・・そうですか。
気分を害されたようでしたらすみません。
別段口答えしようというわけではなく、
指摘されたようなデータの保持の仕方は
理想的で、常にそうあるよう心掛けるべきだとは思いましたが、
どんな場面でも適用できるのか疑問に思ったので
しつこく質問してしまいました。
すみませんでした。

>>380
>なんで一時的にしか使わないコンマ付きの値を、
>配列全体に渡って作ろうとしているのか、そこが不明。
例えば、「数字をフォームに入力し、その数字について確認する
確認時には見やすいようにコンマ付けされた数字をブラウザには表示する
しかし、それとは別にhiddenで素の数字を置いておく」
といった場合のやり方をするためには、同じ配列を用意して
片方の配列のみコンマ付け仕様にする、という方法しか思いつかなくて
そうしていました。
ちなみに、配列内全てが入力された数字の情報なので、配列全体に渡って
コンマ付きの値を作る必要があるという流れになりました。

>だったら、テンプレートにフィルタかけて、
>表示側だけコンマ付きにすることもできるのに。
この方法については知りませんでした。
具体的にどういうことかはよく理解できませんが、
これ以上の質問はスレ汚しになりそうですし
お怒りを買いそうなので、これにて失礼します。

レス下さった方々ありがとうございました。
気を悪くされた方々、悪意はありませんでした。すみませんでした。
0383nobodyさん2006/07/10(月) 20:24:53ID:???
>>382
379だけど、
別に気分害したわけでもなく、単にどっちでもいいと思っただけw
好きなように書かないと楽しくもないし、そっちのがお手軽なら、そうすればいいんじゃね? みたいな。
せっかく perl なんだから、1つの方法にこだわることないし。
>>380 とかだって、よりいいやり方もあるよ、って示しただけだしね。
0384nobodyさん2006/07/11(火) 00:36:18ID:???
要は保存用の配列と表示用の配列ってことでしょ?

メモリ上の配列を弄ってもデータファイルには影響ないのだから、データ保存完了後に
好き勝手弄ればいい
0385nobodyさん2006/07/11(火) 10:15:27ID:???
mod_perlか何かで、カンマ付きの値もずっと持ち回るなら、
あるいはパフォーマンス上、別データとして保存する利点もある。

しかし、同一の値を1回だけ出力するという今回の質問では不要。
元データだけ持っておき、出力時に変換すれば十分。
というか、メモリの無駄使い。
0386nobodyさん2006/07/11(火) 10:33:29ID:???
配列や変数を見直すより、出力部分を考えたほうがいい。
大抵はテンプレートファイルを読み込んで
決めておいたタグ部分を変数に置換するものだと思う。
その時に「カンマをつけるタグ」を別途用意しておいて
カンマつける関数かまして置換すればいいと思う。
自力で考え出した時俺は天才かと思ったwwwナツカシス
0387nobodyさん2006/07/11(火) 12:28:46ID:???
Template Toolkit用のプラグインで

Template::Plugin::Comma - TT Plugin to commify numbers

ってのがまさしくそういうの。CGIじゃTTは重いかもしれんけどね。
0388nobodyさん2006/07/11(火) 12:34:16ID:???
TT使ったことがあれば出力時に処理すればいいだけだとわかる
モジュール使わずに自分で書いてるとなかなか思いつかないかもね
俺も最初は変数コピーしてカンマつけてその変数を出力してた
>>386みたいにすればテンプレートをいじるだけでOKだから管理が楽
0389nobodyさん2006/07/11(火) 15:26:39ID:???
var Array2 = Array1.concat();
で、なんでだれもココ突っ込まないんら?
0390nobodyさん2006/07/11(火) 15:33:00ID:???
>>389
シッ! 見ちゃいけません!
0391nobodyさん2006/07/11(火) 15:38:05ID:???
>>389恐ろしい子っ!!!
0392nobodyさん2006/07/11(火) 19:27:03ID:D6pM+gvD
流れぶったぎってスマソ

6桁の数字の連続060711とあったら
$yaer = 06;
$mon = 07;
$day = 11;
というように分けるにはどうすれば良いんでしょ?
06.07.11みたいに区切り入れてsplitするしかない?
0393nobodyさん2006/07/11(火) 19:28:51ID:P82+nFT5
my $temp = qq|Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)|;
print @{[split /;/,$temp]}->[1];

これってどういう理屈でしょうか。
splitがリストを返してきてそれを一旦無名リファレンスにしてますよね?
で、あとはそれをデリファレンスだけですが。

う〜ん・・・無名のデリファレンスってこんなのだっけなぁ
03943932006/07/11(火) 19:30:40ID:P82+nFT5
print [split /;/,$temp]->[1];

やっぱり普通はこうですよね。
で、両方できるみたいだけど。。。
初めのやつはどんな理屈なんでしょうか。
03953932006/07/11(火) 19:32:35ID:P82+nFT5
もしかして初めのやつは

[split /;/,$temp] これで無名配列リファで
{[split /;/,$temp]} これでさらに無名ハッシュリファにしてますか??

それでハッシュの中に入ってる配列のリファのデリファをするのに
print @{[split /;/,$temp]}->[0];
ってなるのかなぁ。
でもなんで初めに%じゃなくて@になるんでしょう
0396nobodyさん2006/07/11(火) 19:38:55ID:???
>>392
my($year, $mon, $day) = unpack("A2A2A2", "060711");
0397nobodyさん2006/07/11(火) 19:39:59ID:???
>>982
my @date = ( '060711' =~ /(\d{2})/g ) ;
0398nobodyさん2006/07/11(火) 19:47:57ID:???
>>393
>print @{[split /;/,$temp]}->[1];
多分、それを書いた人はデバッグしてる時に
print "@{[split /;/,$temp]}";
↑こんな感じでsplit後のデータを表示してた。

配列リファレンスのデリファレンスをすると、ダブルクォートの中に入れられる。
その名残が残ってるだけだと思う。
別に深く気にする事はない。
03993922006/07/11(火) 19:52:07ID:D6pM+gvD
>>396-397
サンクル!
unpackって関数知らなかった。色々使えそうだわいわい。
正規表現ってホント色んなことできるなぁ。
やり方は全然思い付かないけど・・・。
04003932006/07/11(火) 19:59:25ID:P82+nFT5
>>398
なるほど。HTMLに埋め込む時の手法ですね
@{[]}とか${\[]}だったかな。

>配列リファレンスのデリファレンスをすると、ダブルクォートの中に入れられる。
これはどういうことでしょう。

あ、つまりHTMLの中に入れられるみたいな意味ですね。
納得です。
04013932006/07/11(火) 20:08:51ID:P82+nFT5
すみません、久しぶりに来たのでもう一つ質問したいのですが。
宜しくお願いします。

アクセス解析を自分で遊びで作ったのですが、たまにアクセスから1分以内とかのだけみたいときがあります。

sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->([gmtime(time+32400)]->[5,4,3,2,1,0]);

このフォーマットで、作ってる現在時間と記録されてる過去の時間の時間的比較ってどうやればいいですか?
今は1分なら100とかでやってしまてるのですが。

変換関数とかあるのでしょうか?mistyでは見つかりませんでしたが。
04023932006/07/11(火) 20:20:59ID:P82+nFT5
モジュールがあるようですね。datetimeっていう。
使わない場合はやはり簡単ではないようで。
数学の世界ですねきっと。
0403nobodyさん2006/07/11(火) 20:35:09ID:???
>>401
待て待て待て
そのフォーマットなら単純に文字列比較するだけで良いはずだが。

my $limit = sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->([gmtime(time-60)]->[5,4,3,2,1,0]);
if ($limit lt $date) { }
で一分以内になるはず。試してないが

後、この場合じゃ無駄だがgmtimeの逆をする関数ならTime::Localにある
ttp://search.cpan.org/~drolsky/Time-Local-1.12/lib/Time/Local.pm
0404nobodyさん2006/07/11(火) 20:42:15ID:???
use POSIX qw(strftime); # とかなんとか
でいろいろ使えると思うけど。1900足したりしなくていいし。
0405nobodyさん2006/07/11(火) 20:44:44ID:???
まさに「データファイルを見直せ」の典型ですね
04063932006/07/11(火) 21:22:41ID:P82+nFT5
>>403
おお!
モジュールを使うと、フォーマットやら細かい部分が変わってしまって
色々手を入れないといけなくなりそうだったので嫌だったのですが。

盲点でした。60秒前の設定で作り直せばよかったんですね。
それもltなんて知りませんでした。
いまさらltまで発見させてもらって最高です。
04073932006/07/11(火) 21:24:30ID:P82+nFT5
ところで
ltと>ってどうやって使い分けるんですか?

そもそも文字列を数値比較するなら>,==とかでいいとおもうのですが。
0408nobodyさん2006/07/11(火) 21:29:11ID:???
数値比較しかないと、数値じゃない文字列の比較ができないことになる
04093932006/07/11(火) 21:37:58ID:P82+nFT5
>>408
???
a ne a
はわかるのですが、
1 lt 1
がわからないのです。
1 > 1とどういう差があるのか・・・
0410nobodyさん2006/07/11(火) 21:42:41ID:???
>>409
だからなんで数値だけの文字列と比較するんだよ。

"hoge" と "1234" 比較して、"hoge" の方が大きい事を
判断したい場合もあるだろうが。
数値比較しか無いなら、"hoge"はいつでもゼロになる。
04113932006/07/11(火) 21:48:06ID:P82+nFT5
>>410
hogeに数字を与えるのですか?
hageとも違う数字を?

ちょっと実験してきます。
04123932006/07/11(火) 21:50:40ID:P82+nFT5
!!!!!

print "左辺の方が小さいです。" if "hage" lt "hoge";
print "左辺の方が小さいです。" if "hoge" lt "hage";

どうやら"hage"の方が小さいようです・・・・
どうなってるのですか?これ。
0413nobodyさん2006/07/11(火) 22:06:01ID:???
a lt o だから
0414nobodyさん2006/07/11(火) 22:06:29ID:???
簡単に言えば、
・一文字目は両方ともhで同じ('h' eq 'h')。
・二文字目はaよりもoのほうが後にある('a' lt 'o')
ので、hageよりもhogeのほうが大きい、と判断される。
この一文字一文字の比較はバイト列として行われるから、詳しくはASCIIコード表をじっくり眺めてくれ。

ちなみに、数値しか入ってこないはずの日時の比較になぜ文字列比較をしたのかと言うと。
この場合はまだ良いんだけど、後数桁増えた場合、数値として扱うと誤差が発生するため、固定長の場合は習慣的に。
> print 20060711213959123456;
2.00607112139591e+19
> print 20060711213959123456 < 20060711213959123455
1
0415nobodyさん2006/07/11(火) 22:24:42ID:???
よくわからんがごちゃごちゃ変なことやらずにはじめからunix timeで(timeの戻り値をそのままで)
保持しておけば比較も簡単だと思うのだが、なぜわざわざ話をややこしくしたがる奴が多いの
だろうか。
0416nobodyさん2006/07/11(火) 22:51:13ID:???
DARK SIDE OF TIMTOWTDI
0417nobodyさん2006/07/11(火) 23:02:30ID:???
初心者スレだからあえて突っ込こんどく。

ほんとに誤差がでるの?@5.8.8
-------------
$\ = "\n" ;
print 20060711213959123456;
print 20060711213959123456 > 20060711213959123455
-------------
2.0060711213959e+20
1

自分の環境に合わせて、lt を使うかどうか判断しましょう
0418nobodyさん2006/07/11(火) 23:07:10ID:???
>>415 に同意
書くときに localtime なりすればいいわけで、
これならたとえ 西暦 から ともだち暦 に変わったってデータの変更とか必要ないしな。
0419nobodyさん2006/07/11(火) 23:09:27ID:???
lt知らなかったけど、可読性が下がる方向性しか見えてこないw、
0420nobodyさん2006/07/12(水) 00:23:20ID:qvG7JsXw
perl初心者です。
今CGIを制作しているのですが、正規表現でおもいっくそ躓きましたorz

例えば「$nameが5文字以上、100文字以下でなければエラーを実行する。」
みたいな感じに「$name」に文字制限を掛けたいのですが・・・。
よろしくお願いします。
0421nobodyさん2006/07/12(水) 00:31:07ID:cb+ZHaYE
length($name)
0422nobodyさん2006/07/12(水) 00:35:00ID:qvG7JsXw
>>421
すいません。ありがとうございます・・・。
しかし、悩んでいるのはその先なんです・・・。それをどのように正規表現のパターンにはめればよいか・・・。
0423nobodyさん2006/07/12(水) 00:40:55ID:???
正規表現じゃなくて、length() を使って条件分を書けば良いだけ
0424nobodyさん2006/07/12(水) 00:42:25ID:???
>>420
正規表現で何がしたいのか書いてなくね?
0425nobodyさん2006/07/12(水) 00:54:54ID:qvG7JsXw
>>424
「5文字以上、100文字以下」であることを調べたいと思ってるんですが・・・ orz
0426nobodyさん2006/07/12(水) 00:57:04ID:???
unless (5 <= length($name) and length($name) <= 100) {
&error;
}
0427nobodyさん2006/07/12(水) 01:01:22ID:???
翻訳します。

質問:
5文字以上100文字以下の文字列にマッチする正規表現が書きたい
回答:
出来無くないけど正規表現の使い方間違えてるよ
0428nobodyさん2006/07/12(水) 01:03:57ID:???
unless ($name =~ /^.{5,100}$/) {
&error;
}
0429nobodyさん2006/07/12(水) 01:06:52ID:w3I1i8Fs
print 2+4*3/2-1; # 7
print (2+4)*3/2-1; # 6(8が正しいはず)
print int((2+4))*3/2-1; # 8
となるのは何故でしょうか?
04304202006/07/12(水) 01:13:25ID:qvG7JsXw
あぁ・・・もう・・・
こんな低レベルな質問に・・・本当にありがとうございました orz
0431nobodyさん2006/07/12(水) 01:13:29ID:cb+ZHaYE
print (2+4)         *3/2-1;
0432nobodyさん2006/07/12(水) 01:17:09ID:???
納得しましたorz。ありがとうございました。
0433nobodyさん2006/07/12(水) 01:28:20ID:???
$hoge = "a,b,c,d,e,f,g,h,................";
と「,」で区切られた文字列があるとして
その中の冒頭部分のいくつかの要素が欲しいとき
どうするのが一番メモリ食わずに済みますか?
例えば、上の文字列からbとcとdが欲しい場合、
(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);
とするのがベストなんでしょうか?
0434nobodyさん2006/07/12(水) 01:38:13ID:???
まぁ、しょうがないんじゃないの?
あとはsplitした結果の配列スライスを取るしかないね。
正規表現は処理として重いし。
データが絶対に1文字なら、substrで切ってからsplitするとか。

データが5000とかあって、3番目から100個取りたいとかいう事でなければ、
あまりメモリを気にしてもしょうがないよ。
perl使ってる時点で、かなりのメモリを喰ってる訳だから。
04354332006/07/12(水) 01:46:55ID:???
>>434
ありがとうございます。
多少のことなんか気にせずバリバリ書く方が気楽なんですけどね。
省メモリに凝りだすと、ついついつまらないことまでも気になって眠れませんw

ちなみにものすごくどうでも良いことだとは思うんですが
(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);

(undef,$hage1,$hage2,$hage3,) = split(/,/,$hoge);
って、あらゆる点から見て全く同じ処理という解釈で良いんですかね?
0436nobodyさん2006/07/12(水) 01:52:13ID:???
小手先だがsplitに第3引数を与えて余計な分解はしないようにするといいよ

(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge,, 5);
0437nobodyさん2006/07/12(水) 02:05:31ID:???
>>435
質問の答えじゃないですが
perldoc -f split
で第3引数のLIMITを見てみて。単純にsplitするよりは効率いいかも。
04384332006/07/12(水) 02:18:09ID:???
>>436-437
なるほど、どこまで読み込むかの範囲指定できる引数を割り当てられるんですね。
って、以前にsplitの項を本で読んだときに絶対目にしてるはずなんだけどなぁ。
実際に使わないと身に付かない体質なのか・・・。
これは付けておくに越したことはないですね。可読性の点からも悪くないですし。
即、該当箇所全てに割り振らねば!
ありがとうございました!

undefで値を捨てるのと、そもそも値を未定義(?)にしておくのと何か違いがあるのか
分かる方いらっしゃいましたら、お暇なときにでも教えて下さい。
0439nobodyさん2006/07/12(水) 02:44:06ID:???
>>435
>ちなみにものすごくどうでも良いことだとは思うんですが
>(undef,$hage1,$hage2,$hage3,undef) = split(/,/,$hoge);
>と
>(undef,$hage1,$hage2,$hage3,) = split(/,/,$hoge);
>って、あらゆる点から見て全く同じ処理という解釈で良いんですかね?

上はそのまま。
下は、
(undef,$hage1,$hage2,$hage3) = split(/,/,$hoge);
に最適化される。
0440nobodyさん2006/07/12(水) 02:56:50ID:???
左辺にundef置いても警告されないんだ。いい事聞いちゃったw
0441nobodyさん2006/07/12(水) 04:55:16ID:???
どうでもいいがundef 書くくらいだったら
my ( $hage1,$hage2,$hage3) = ( split/,/,$hoge)[1,2,3] ;
てスライス使わない?


0442nobodyさん2006/07/12(水) 09:45:38ID:???
>>438
> これは付けておくに越したことはないですね。可読性の点からも悪くないですし。
> 即、該当箇所全てに割り振らねば!

何も考えずに即値をばらまくと後できっと忘れます。やるならコメント推奨。


> undefで値を捨てるのと、そもそも値を未定義(?)にしておくのと何か違いがあるのか
> 分かる方いらっしゃいましたら、お暇なときにでも教えて下さい。

undef って書かなくていいので、楽ちんな上にプログラムサイズを小さくすることができます。
いや正直「そもそも値を未定義(?)にしておく」が、どういう操作を指しているのか分からないので分かりません。
0443nobodyさん2006/07/12(水) 10:47:13ID:???
>>420
日本語が含まれるのかどうかについて誰も触れていないんだが?
0444nobodyさん2006/07/12(水) 11:35:39ID:???
>>441の方法が普通だよな。
(undef,$hage1,$hage2,$hage3) = split(/,/,$hoge);
なんて酷いの始めてみた。
0445nobodyさん2006/07/12(水) 11:38:48ID:???
特に酷いとは思わない俺ガイル
0446nobodyさん2006/07/12(水) 11:50:40ID:???
>>444
undef を左辺に置く手法は、何番目の要素をそれぞれ拾い、捨てているのか視覚的に分かりやすいというメリットもある。
リストの要素数が小さく、かつ一定である場合には特に。
0447nobodyさん2006/07/12(水) 11:55:26ID:???
ダミーを用意しなくてもいい
スライスしなくてもいい
を考えて、warningが出ないなら有用だと思うが
04484412006/07/12(水) 12:13:35ID:???
軽い違和感を感じただけだから、>>446-447 の意見で納得した。
まあ機会があれば使うかもしれん。
>>393
>print @{[split /;/,$temp]}->[1];
の方は「 split のケースでは」一生使うことはない。

0449nobodyさん2006/07/12(水) 14:25:53ID:???
プチ天狗になりそうだった自分を戒めてくれる流れだわ。
0450nobodyさん2006/07/12(水) 16:11:36ID:x2NzMLn/
foreach $line (@log) {
 foreach $keyword (@keywords) {
  if ( index($line, $keyword) >= 0 ) {
    push (@result, $line);
    last;
  }
  }
}

こーんな感じで検索してるんだけど、
@keywordsの中身がHitしても次の行に行ってくれない、
というか@keywordsの複数の中身がhitすると同じ行が何回もpushされちゃう。
なんでなんでしょうか?
0451nobodyさん2006/07/12(水) 17:18:49ID:???
>>450 のループ自体は正常に結果を吐くので他の要因だと思われ。
つーか index をそう使うの初めて見た
0452nobodyさん2006/07/12(水) 20:58:47ID:???
grep
0453nobodyさん2006/07/12(水) 21:00:13ID:???
>>446
視覚的にとかいう意味だと、スライスの方が数字なんだし読みやすい希ガス。

>>451
探す文字がパターンマッチを必要としないならindexの方が激速。
0454nobodyさん2006/07/12(水) 21:01:33ID:???
復旧!
テストカキコついでに>>392 への遅レス
ダークサイドだが
my @date = grep {$_} split /(\d2})/, '060711' ;
ちう手もあるよん。
0455nobodyさん2006/07/12(水) 21:04:03ID:???
>>454
ひどいな、そのコード…。
普通にunpackが一番早かろうに
0456nobodyさん2006/07/12(水) 21:10:09ID:???
{ がぬけてもた。 /(\d{2})/ ね
>>454
そw 普段こんなの絶対使わないw
が、たまに
my $i = 0;
my %hash = map { $_ or $i ++ } split /(.{20})/, $hoge ;
とかしたくなって誘惑される。
だからダークサイド。
0457nobodyさん2006/07/12(水) 21:24:50ID:???
>>453
>探す文字がパターンマッチを必要としないならindexの方が激速。
なるほど…今度使ってみよう。
>>456
それって20で割り切れなかったら…
まあ、承知のうえで書いてんでしょうけど。ダークサイド宣言してるし。
0458nobodyさん2006/07/12(水) 21:26:14ID:Fw7S49xF
質問です。

perlで書かれたあるcgiからhtmlを読んでその中身を表示したいのですが、さらに一歩踏み込んで、そのhtmlの中でさらにperlで書かれたcgiを呼んで、そのhtmlを動的に変更して表示したいのですが、そんなこと可能ですか?
0459すいません…2006/07/12(水) 21:50:43ID:???
ものすごく初歩的な事をお伺いして申し訳ないのですが、activeperlを
ダウンロードしたのですが、コマンドプロンプトでバージョンチェックを
しても、「バッチファイルとして認識していません」と表示されるのですが
どうすれば良いのでしょうか?
0460nobodyさん2006/07/12(水) 21:51:10ID:???
>>457
一応対応はできる、がこんなことするくらいだったら
普通に hash 作成すべき。

split /(.{20})/, $hoge ;
push @_, '', pop @_ if @_ % 20 != 0 ;
my $i = 0;
my %hash = map { $_ or $i ++ } @_ ;

04614602006/07/12(水) 21:59:24ID:???
s/20/2/
orz...吊ってくる
04624602006/07/12(水) 22:03:56ID:???
@_ % 2 != 0 ;
スレ汚しすまん
0463nobodyさん2006/07/12(水) 22:36:08ID:???
質問させてください
Perlでシェルスクリプト(useradd)を使用するにはどうしたらいいでしょうか?
0464nobodyさん2006/07/12(水) 23:02:43ID:???
>>458
なんでそんなことせにゃならんのかかわからんがSSIでも使えば?
0465nobodyさん2006/07/12(水) 23:03:43ID:l/BVmrr1
今WinXPとActivperlでプログラム作ってるんですが
これってPerlユーザーの主流じゃないようなんですが
何故ですか
0466nobodyさん2006/07/12(水) 23:08:41ID:???
>>463
system "your script" ;
もしくは your script をバッククォートにてかこむ。
your script 部分にはコマンド単独実行時の
打ち込むものすべてを入れる。
0467nobodyさん2006/07/12(水) 23:18:33ID:???
>>466さんを参考に以下を実行してみました。
#!/usr/bin/perl

$user = "aaa";
system "useradd $user";

エラーは出ないのですが、ユーザーが追加されてません。
なぜでしょうか?
0468nobodyさん2006/07/12(水) 23:30:16ID:???
useradd ってコマンドがあるのね orz...

具具ってみたけど
useradd って管理者権限が必要でしょ。
sudo useradd か perl 自体の実行を su でするか
しないとだめなんじゃない?

力になれそうにありません。すまん。
0469nobodyさん2006/07/12(水) 23:39:41ID:???
>>468さんありがとう
ちょっと質問変えてみます
Perlでシェルスクリプト実行するにはどうしたらいいでしょうか?
04704462006/07/12(水) 23:41:57ID:???
細かい話になるけれど。

>>453
> 視覚的にとかいう意味だと、スライスの方が数字なんだし読みやすい希ガス。

もちろんそりゃ読みやすいほうを使ったらよろしいんです。いつでもどちらかがイイってな話はしてないですから。

「視覚的に」と言うからには、数値のリストを添字として読み、それを元にスライスされる前のリストからどの値を取り出してどの値を捨てたのかを、脳内変換すること無しに、その姿を *目で見て* 把握できることを指しています。
逆から言えば、その意味では添字によるスライスの表現は、左辺 undef と比較した場合、視覚的ではないと言わざるを得ないでしょう、ということです。
0471nobodyさん2006/07/12(水) 23:43:05ID:3OAigznj
perlやっててmysqlでつまづきました
CGI経由でsql文を実行しようとすると動きません
コンソールからやっても動かないのでsql文がおかしいと思います。

mysql> update todo set content = aho where id = 9;
ERROR 1054 (42S22): Unknown column 'aho' in 'field list'

以上のエラーが出ています。
mysqlのバージョンは4.1.13です。
よろしくお願いいたします。
0472nobodyさん2006/07/12(水) 23:44:44ID:???
>>469
それじゃ同じ答えしか返ってこない。
system使えとか、``使えとか、qx() しろとか。
systemの戻り値を調べるか、$! を見て。
0473nobodyさん2006/07/12(水) 23:46:15ID:3OAigznj
''入れたら自己解決しました。
本当にありがとうございました。
0474nobodyさん2006/07/12(水) 23:53:16ID:???
>>469
>ちょっと質問変えてみます
>Perlでシェルスクリプト実行するにはどうしたらいいでしょうか?
まあ、同じ答えになるんだけどもちょっとだけ詳しく。
「/PATH/hoge.sh を引数 piyo つきで実行するなら」
system "sh /PATH/hoge.sh piyo" ;
「STDOUT を perl の変数に直接入れたいなら」
open EXE, "sh /PATH/hoge.sh piyo|" ;
@data = <EXE> ;
「STDERR とか細かなところまで制御したいなら」
perldoc IPC::Open3あたり
0475nobodyさん2006/07/13(木) 00:17:16ID:???
>>469
Inline::Bash を書いて CPAN に上げてください。
応援しています。
0476nobodyさん2006/07/13(木) 00:23:07ID:???
>>465
Perl は UNIX 上の仕事をやっつけるために生まれ、UNIX 系のシステムを中心に普及したから。
でも主流じゃないことを気に病むことはないよ。まずは悩む代わりに、その時間を使ってコードを書くんだ。
0477nobodyさん2006/07/13(木) 00:26:45ID:???
>469
`
0478nobodyさん2006/07/13(木) 00:32:23ID:???
>>453
>探す文字がパターンマッチを必要としないならindexの方が激速。

あんま誤解の生じること言わないほうがいいw
0479nobodyさん2006/07/13(木) 00:38:17ID:???
>>478
一般に正しいと思うけど。
(最適化のかかる)オートマトン作らなくて良いパターンでなければ、
indexの方が遥かに安価で速いだろう。
04804692006/07/13(木) 00:39:17ID:???
うーん。できない・・・
0481nobodyさん2006/07/13(木) 00:45:41ID:???
>>469 は管理者権限の意味を理解しているのか小一時間(ry
0482nobodyさん2006/07/13(木) 00:48:22ID:???
ここWebProg板だから、CGIでuseraddしようとしてたりして…。
0483nobodyさん2006/07/13(木) 00:48:54ID:???
>>479
正しくないw
ベンチとってみればわかるけど

A1 $_ =~ /hoge/
A2 index($_, 'hoge')

my $word = 'hoge';
B1 $_ =~ /$word/
B2 index($_, $word)

A1 A2 はほぼ同じ速さで、
B1 は B2 より速い。

index($_, $word[1]) or index($_, $word[1]) ・・・
より
/$word[0]/ or $word[1] ・・・
のが速い。

$_ が 'aaaaaaa......' で $word が 'baaaaaaaaaaaa' とかいう特殊な場合は考えないでね。
04844692006/07/13(木) 00:48:56ID:???
root権限でcgiを実行ってことですか?
0485nobodyさん2006/07/13(木) 00:50:07ID:???
>>483 訂正
× /$word[0]/ or $word[1] ・・・
○ /$word[0]/ or /$word[1]/ ・・・
0486nobodyさん2006/07/13(木) 00:50:10ID:???
>>479
日本語の問題だと思うけど。
「探す文字がパターンマッチを必要としないなら(最適化がかかるので)indexの方が激速なんてことはない。」
04874582006/07/13(木) 00:52:59ID:aY2uz4D9
>>464
レスありがとうございます。
もう少し具体的に質問します。

まずparent.cgiがあります。ここやってることはhtmlテンプレートを使ったchild.htmlファイルを読み込んで表示させるだけです。つまり
$template = HTML::TEMPLATE->new(
  filename => 'child.html',
);
print $template->output;
のような感じです。


このchild.htmlでは
<!-- TMPL_INCLUDE NAME="hoge.html" -->
のようにhtmlファイルを読み込んでいます。

しかし今回このhoge.htmlの代わりにhoge.cgiを使いたいのです。つまり静的なhtmlファイルではなくcgiを使ってここに表示される内容を動的に変化させたいわけです。これをするのにいい方法ありますでしょうか?
0488nobodyさん2006/07/13(木) 01:04:37ID:???
>>487
静的なhtmlをincludeするんじゃなくて、そこで普通にテンプレートを使えば
実質お望みの事ができると思うんだけど…。
0489nobodyさん2006/07/13(木) 01:05:37ID:???
>>487
いろいろ方法はあるだろうけど、全く別の CGI を呼ぶ 「いい方法」 というなら SSI が 「いい方法」 だと思うぞ。
0490nobodyさん2006/07/13(木) 01:06:25ID:???
実はそこに入れたいのは カウンター とかいう話じゃねえのかなw
0491nobodyさん2006/07/13(木) 01:17:32ID:???
質問
パーミッション777のディレクトリだとmkdirできるのですが
755だとできません。777だとセキュリティ的に問題ですよね?
755のディレクトリ直下に新規ディレクトリを作成するにはどうしたらいいでしょうか?
0492nobodyさん2006/07/13(木) 01:29:08ID:???
>>484
よく分かってないなら、そういうプログラムは組まない方がいい。
0493nobodyさん2006/07/13(木) 01:29:35ID:???
>>491
じゃー、chmod で 777 にしてから mkdir して 755 に戻せば?
0494nobodyさん2006/07/13(木) 01:43:02ID:???
>>493
777のディレクトリだとchmodできましたが
755のディレクトリだとchmodできませんでした・・・
04954872006/07/13(木) 02:29:43ID:aY2uz4D9
>>487
知識不足で申し訳ないです。普通にテンプレートを使うとはどういうことでしょう?テンプレートでcgiを実行するようなものがあるんですか?

>> 489
SSIで試してみました。parent.cgiから読み取るのをchild.shtmlにしてその中で<!--#exec cmd="perl hoge.cgi" -->として実行してみました。

結果普通にchild.shtmlを見ると実行が確認できたのですが、parent.cgiの中でshtmlを読み込んでしまうとSSIが実行されないようでダメでした。

>>490
カウンターではありませんw
0496nobodyさん2006/07/13(木) 02:50:05ID:???
>>495
テンプレート使ってるってことは、そもそもCGIで動いてるんでしょ。
その場で動的なページ作ればいいだけでは。

テンプレートで静的なhtmlを読み込んで、
さらにそこからCGI叩いて動的なページを、、、なんて考える前に。
04974952006/07/13(木) 03:13:47ID:aY2uz4D9
>>496
レスありがとうございます。

しかしそのテンプレートのhtmlの"ある部分"にCGIの結果を入れたいんですよ。そこはスタイルシート等で位置が厳密に決まっているのでその部分だけ元のparent.cgiでhoge.cgiを呼び出してってのは難しいんじゃないかと思ってます。
0498nobodyさん2006/07/13(木) 03:25:44ID:???
じゃあもう iframe でいいじゃん。それかAjax
0499nobodyさん2006/07/13(木) 06:06:02ID:???
>>483
言いたい事はわかるが、
それはパターンマッチを必要とする条件じゃないのか?

ただの文字列を探すならindexしかないだろ。
0500nobodyさん2006/07/13(木) 06:14:58ID:???
Cとかでは確かにindexは激速だが、Perlはもしかしたらindexが正規表現ライブラリの
皮をかぶってるかもしれないから、ソース見るかベンチ取るかしてみないと(ry
0501nobodyさんNGNG
昔indexの方が速かった覚えがあるので
ふつーに簡単なベンチ取ったら
indexの方が2倍 速かったんですけど
当然っちゃー当然の結果やね
0502nobodyさん2006/07/13(木) 06:32:39ID:???
こういう結果もあるぞ。

http://x68000.q-e-d.net/~68user/webcgi/search-1.html
05034572006/07/13(木) 07:33:25ID:???
気分良く寝てたので話題に乗りおくれた。
>>502
横レスだけどリンク先を良くよんだら?
search-2.cgi がせめて and 検索だったらいいんだけどリンク先は
アンフェアな比較だよ。(まあ、そういう目的で作ったんんじゃない
だろうけど)
以下は寝起きで確認したベンチマークのソース。
#!/usr/bin/env perl -w
#use strict ;
use Benchmark ;
my $str1 = ( 'a' x 30 ) . 'hoge' . ( 'a' x 10 ) ;
my $str2 = ( 'a' x 30 ) . ' hoge ' . ( 'a' x 10 ) ;
sub cont1(){ $str1 =~ /hoge/ }
sub cont2(){ $str2 =~ /hoge/ }
sub test_index1(){ index $str1, 'hoge' }
sub test_index2(){ index $str2, 'hoge' }
timethese 500000, { o0 => 'cont1' , o1 => 'cont2' , o2 => 'test_index1' , o3 => 'test_index2' } ;
================
Benchmark: timing 500000 iterations of o0, o1, o2, o3...
o0: 1 wallclock secs ( 1.66 usr + 0.01 sys = 1.67 CPU) @ 299401.20/s (n=500000)
o1: 2 wallclock secs ( 1.66 usr + 0.02 sys = 1.68 CPU) @ 297619.05/s (n=500000)
o2: 1 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 347222.22/s (n=500000)
o3: 1 wallclock secs ( 1.43 usr + 0.01 sys = 1.44 CPU) @ 347222.22/s (n=500000)
0504nobodyさん2006/07/13(木) 07:46:36ID:???
search-3.pl って eval でモロ高速化してんじゃん…
search-2 が and 検索であろうとなんであろうと、単純な index と正規表現
の速度比較のソースにはならんな。
0505nobodyさん2006/07/13(木) 13:17:19ID:???
>>500
>Perlはもしかしたらindexが正規表現ライブラリの
>皮をかぶってるかもしれないから
それは普通に考えてありえない…。
0506nobodyさん2006/07/13(木) 15:37:15ID:???
>>503

>>483 でやってみて。
検索文字が文字列か変数かどうかで結果が変わるんだよ。
0507nobodyさん2006/07/13(木) 16:04:15ID:???
>>506
>>503 と同じようなのを書いてベンチ取った。
何度かやってみたが、変数に入れてもindexの方が速かった。

#!/usr/bin/perl
use Benchmark;

my $str1 = ('a' x 30) . 'hoge' . ('a' x 10);
my $str2 = ('a' x 30) . ' hoge ' . ('a' x 10);

sub test_reg1 { my $hoge = 'hoge'; $str1 =~ /$hoge/; }
sub test_reg2 { my $hoge = 'hoge'; $str2 =~ /$hoge/; }
sub test_index1 { my $hoge = 'hoge'; index($str1, $hoge); }
sub test_index2 { my $hoge = 'hoge'; index($str2, $hoge); }

timethese 500000, {
 reg1 => 'test_reg1',
 reg2 => 'test_reg2',
 idx1 => 'test_index1',
 idx2 => 'test_index2',
};

idx1: 1 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 602409.64/s (n=500000)
idx2: 0 wallclock secs ( 0.83 usr + 0.00 sys = 0.83 CPU) @ 602409.64/s (n=500000)
reg1: 1 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 500000.00/s (n=500000)
reg2: 0 wallclock secs ( 1.00 usr + 0.00 sys = 1.00 CPU) @ 500000.00/s (n=500000)
0508nobodyさん2006/07/13(木) 16:11:59ID:???
>>506
ちなみに >>483 みたいに orで繋ぐのもやってみたけど、
やっぱり indexの方が速かった。
0509nobodyさん2006/07/13(木) 16:38:50ID:???
>>508
あー、ほんとだ。

でもね、検索対象のサイズを大きくするにしたがって逆転していくみたい。

my $str1 = ('a' x 10000) . 'hoge' . ('a' x 1000);
my $str2 = ('a' x 10000) . 'hage' . ('a' x 1000);

とかでやってみておくれ。 これは 11k だけど、うちの環境では 1k あたりから差がではじめた。
0510nobodyさん2006/07/13(木) 17:11:02ID:???
>>509
そりゃ長くなれば BM法にアルゴリズム変えるからね。正規表現の方は。
0511nobodyさん2006/07/13(木) 17:29:16ID:???
結局長さとか対象文字列に依存して違う結果が出るので
気になる人はよく考えるなり実験するなりして選択しろと
いうことか。
0512nobodyさん2006/07/13(木) 17:33:49ID:???
ただ正規表現でいつまでもオプショナルな文字列が無い
(オートマトン作らなくて良い)なんて事は無いし。
0513nobodyさん2006/07/13(木) 19:41:52ID:???
index使わないコーディングスタイルはKENTのせい。
0514nobodyさん2006/07/13(木) 19:59:46ID:???
>>513
お前が働かないのは誰のせい?
0515nobodyさん2006/07/13(木) 20:09:12ID:IeuSyhG1
いまだKENT信者っていたんだなw
0516nobodyさん2006/07/13(木) 20:52:55ID:???
あれ? KENTってindexを使っているんじゃなかったっけ?
0517nobodyさん2006/07/13(木) 21:53:37ID:???
パターンを詰め込んだ変数でevalで局所化もせずぐりんぐりんじゃなかった?
0518nobodyさん2006/07/13(木) 21:58:11ID:???
KENT 曰く
「それでもPerlは動いている」
0519nobodyさん2006/07/13(木) 22:11:56ID:Ms2xB21u
print "location:hoge.gif\n\n";

アクセス解析用のcgiで出力を上記のようにしています。
自分自身先日winXPのIE7のベータ版にブラウザを変えて、気付いたのですが、
キャッシュされてしまってページ間の移動時に思うように動作しないことがあります。

これはベータ版のバグかもしれませんが。普通はcgiファイルをキャッシュして読み込みを省略することはないと思うので。
それでキャッシュ対策のヘッダを付け加えたいのですが、
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="Tue, 20 Aug 1996 14:25:27 GMT">
これのPERLヘッダ?版はどう記述すればいいでしょうか?

宜しくお願いします。
0520nobodyさん2006/07/13(木) 22:22:32ID:Ms2xB21u
print "Pragma: no-cache\n";
print "Cache-Control: no-cache\n";
print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n\n";

一応こんな感じかなと思いますが、あってるのでしょうか?
http://www.gac.jp/article/index.php?stats=question&category=10&id=11811&command=msg
ここではどうやらNNにはこれでは残ってしまうように書いてあるのですが。
0521nobodyさん2006/07/13(木) 22:23:30ID:???
>>519
ってか Content-type 出すときに Last-modified とか一緒にだしてもダメなん?
05225192006/07/13(木) 22:24:37ID:Ms2xB21u
>>520>>519ですすみません。
要は私の場合は戻るボタンが効かないように、ではなくて、
アクセス解析CGIがちゃんと動作することと、
チャットで使ってる、
<meta http-equiv="Refresh" content="15">
がちゃんと動作することなのですが。
05235192006/07/13(木) 22:25:35ID:Ms2xB21u
>>521
ありがとうございます。
その書き方がイマイチ自身がもてなかったので投稿して確認に参りました。
0524nobodyさん2006/07/13(木) 22:26:24ID:???
ダミーの値、たとえばtimeをアドレスにくっつけて別のURLにすれば解決。
0525nobodyさん2006/07/13(木) 23:13:19ID:???
'' and '' are identical (not copied) at test.cgi line 60

というエラーが出たんですが、これはどういうときに出るもんなんですか?
test.cgiの60行目で''と''が同じになってるよ(コピーされたとかじゃなくてな)
ってこと?意味が分かりません。
05265252006/07/13(木) 23:16:07ID:???
ちなみに60行目付近はこんな感じです。

59行目}elsif($action eq 'move'){
60行目&move;
61行目&move_complete;
62行目}elsif(......
0527nobodyさん2006/07/13(木) 23:29:36ID:???
>>525
シェルが吐いてるエラー。
どっかで cpしてるんだろうけど、コピー元とコピー先が同じだと出る。
05285252006/07/13(木) 23:46:26ID:???
>>527
該当箇所とは全然違うところが原因ってことですか。
コピーなんてしてたっけなぁ…。
レスありがとうございました!
0529nobodyさん2006/07/14(金) 00:05:57ID:???
Perlプログラムがおいてあるフォルダの中に、「temp」という名前のフォルダがあります。
この「temp」フォルダの中にある各フォルダの名前を$dirnameとしましょう。
各フォルダの中に、
{
$dirname
}
とだけ書かれた、「test.txt」という名前のファイルをそれぞれ新しく作りたいんです。

#!/usr/bin/perl
opendir DIR, "temp" or die "can't open temp\n";
@dir = map { -d "temp/$_" ? $_ : '' } readdir DIR;

foreach $dirname (@dir) {
chdir "./$dirname";
open OUT, ">test.txt" or die "can't create the file\n";
print OUT "{\n";
print OUT "$dirname\n";
print OUT "}\n";
close OUT;
chdir "..";
}

close DIR;
こんな感じにプログラムを書いてDOSプロンプトから実行したのですが何も起きません・・・
どうすればいいのか教えていただけないでしょうか?
05305252006/07/14(金) 00:20:17ID:???
60行目の
&move;を別の名前に変える動いた・・・なぜ??
逆に59行目の'move'を別の名前に変えただけでは同じエラーが。
0531nobodyさん2006/07/14(金) 00:26:19ID:???
>>529
とりあえず、mapで書いてる行をgrepで書き直す。
@dir = grep { -d "temp/$_" && !/^¥./ } readdir(DIR);
05325292006/07/14(金) 00:57:49ID:???
>>531
そのままコピペしてもう一度実行してみました。
が、駄目…。
0533nobodyさん2006/07/14(金) 01:07:41ID:???
横だけど
print @dir ; か
chdir "./$dirname" or die してみそ

@dir の中身は
./temp/hoge
./temp/piyo
じゃなく
hoge
piyo
になるYO @OSX
0534nobodyさん2006/07/14(金) 01:11:29ID:???
>>529
foreachの前の時点で@dirに期待した値が入ってるかどうかぐらいは
確認して問題の切り分けをしろよ。

あとchdirも失敗することがあるので or dieしとけ。
0535nobodyさん2006/07/14(金) 01:13:56ID:???
質問はしてくるけど、何も考えないのか。
誰かがなんか書いたらそれコピペして動くかどうかだけ?
なんだかなぁ。
0536nobodyさん2006/07/14(金) 01:14:40ID:???
わざわざ chdir せずに
open OUT, "> temp/$dirname/test.txt" or die "can't create the file\n";
ってすればいいじゃない
0537nobodyさん2006/07/14(金) 01:21:07ID:???
chdir でやるにしても foreach ループの前で chdir "temp/" が必要だしな。
05385292006/07/14(金) 01:27:17ID:???
>>536
できました!!!
ものすごく賢いやり方ですね。

>>534>>533
chdirがうまくいってなかったというか、どうやら相対ディレクトリ名の指定とかが根本的
にわかっていなかったようです。openでカレントディレクトリも変わるんだと思ってました。

>>535
(・∀・)

みなさんどうもありがとうございます。
おかげさまで相対ディレクトリ名の指定ということに関してだいぶ理解が進みました。
0539nobodyさん2006/07/14(金) 02:04:03ID:???
あれ、chdir の有効範囲って local だったっけ?
そもそも1回目の
chdir "./$dirname";
でもし成功して temp/hoge/ になっちゃった場合、2回目はそこから chdir だから temp/hoge/fuga/ とかなんじゃねの?
0540nobodyさん2006/07/14(金) 02:23:45ID:???
>538
フルパスも相対パスも知らずにファイル扱ってたのか((( ;゚Д゚)))
0541nobodyさん2006/07/14(金) 02:33:40ID:???
>>539
>>529 のコードではファイルへの書き込みを行なった後に chdir ".." してるから
temp/ → temp/hoge/ → temp/ と戻るはず。

でもやっぱり読みづらいから、カレントディレクトリはあんまり変えて欲しくないなぁ。
0542nobodyさん2006/07/14(金) 16:30:45ID:???
-dはsymbolic linkのリンク先がディレクトリの場合も真を返すので、
前提条件でそういうのはないならOKだが一般的にはchdir ".."では
戻れないかもしれない。

perlのchdirにはファイルハンドルやディレクトリハンドルを渡せるので、
戻りたいディレクトリを開いておいてこっちを使うほうが安全。

0543nobodyさん2006/07/14(金) 18:02:15ID:IyAZlhFk
メールの標準入力からの取得を考えています。
qmailなのですが、perlにパイプさせるにはどうしたらよいでしょうか?

sendmailなら/etc/aliases でできますよね?
0544nobodyさんNGNG
http://man.qmail.jp/jman5/dot-qmail.html
0545nobodyさん2006/07/14(金) 19:43:53ID:???
ttp://www.uploda.org/uporg445281.txt

上記の掲示板に投稿する際のコード入力のスクリプトを作ったんですが
時たまコード入力より下が表示されなくなってしまいます。
どうすれば改善していいか分かりません。
どなたか改善よろしくお願いします。
0546nobodyさん2006/07/14(金) 19:50:38ID:???
>>545
<form>タグが無い。
<table>タグも無い。
下から5行目、==&gt;と書くべき所で、'==>' と書いている。
0547nobodyさん2006/07/14(金) 19:55:39ID:???
>>545
というか、sub code 自体をどこからも呼んでない…。
sub error は存在しない。
何がしたいの?そこからして不明。
0548nobodyさん2006/07/14(金) 19:59:34ID:???
掲示板の一部です。
削除パスワードの下に&code;で呼び出して使ってます。
sub errorはあります。

で何をしたいかと言うとどうやってもコード部分が原因だと分かっていてもたまにコード部分からしたが消える
のが直せないので直してほしいわけです。
0549nobodyさん2006/07/14(金) 20:04:26ID:???
直して欲しいなら全部晒せよ
0550nobodyさん2006/07/14(金) 20:05:56ID:???
>>548
そんな一部しかないんじゃ分からん…。

とりあえず、>>546 の通り&code の中でHTML表示してる部分、
tableタグの開始も終了も無いんだが…。そこが一番あやしい。
ちゃんとtableタグ入れてみたら?
それさえ分からなければ、PerlじゃなくてHTMLの質問だよ。
0551nobodyさん2006/07/14(金) 20:08:03ID:???
すんません・・・。
http://livetool.ty.land.to/aska/aska.cgi
ココに問題の掲示板とソースをのっけてあります。

数回更新ボタンを押していると表示されなくなりますのでそれを改善したいのです。
よろしくお願いします。
0552nobodyさん2006/07/14(金) 22:04:47ID:LnOAoBN3
mysqlとperlで会員サイト作ってみたいのですが
よい参考書を教えてください
0553nobodyさん2006/07/14(金) 22:11:09ID:???
>>552
WEb制作板池
0554nobodyさん2006/07/14(金) 22:26:32ID:cNzjTfEo
>>552
その程度は参考書などいらない。
というか基本的にプログラム組むのに参考書なんていらない。

http://www.rfs.jp/sb/index.html
ここに書いてある内容を全て理解・・しなくても簡単にそのくらいは作れる。
まずは自分のパソコンに仮想環境を作ることが先決だ。
そうすればどれだけ程度の低い話なのかわかる。

優れたプログラムを組めるかどうかは人によって優劣がでるが、
最低限動くものなら健常者であれば誰でも可能。
0555nobodyさん2006/07/14(金) 23:28:12ID:???
確かに作るだけならその通りなんだが…
WebProgは脆弱性があると、攻撃される危険が付きまとうことも忘れないでくれ。

と言うことで最低限ここは読んでおくべき。
ttp://www.ipa.go.jp/security/awareness/vendor/programming/
出来ればこの辺もね
ttp://www.jumperz.net/texts/csrf.htm
0556nobodyさん2006/07/15(土) 13:04:39ID:FLr1xmaF
ありがとうございます>>553-554
0557nobodyさん2006/07/15(土) 19:12:52ID:???
あの>>551の件は・・・・。
0558nobodyさん2006/07/15(土) 19:19:39ID:???
>>557


>#乱数の作成
>$rand1 = int(rand(10));



$rand1 = int(rand(10)) + 1;

と末尾に+1しろ。
0559nobodyさん2006/07/15(土) 19:25:01ID:???
今の、このスレの空気は以下の成分からなってます。
1). 自力でつくってんだったら協力したるのに
2). 向うの掲示板に問い合わせろよ



3). KENT かよ!
0560nobodyさん2006/07/15(土) 19:41:55ID:???
>>559
だいたい合ってるwwwww

&code; とか気持ち悪いな。暗黙に &code(@_); と渡されることを知ってての諸行かな。
せめて &code(); とかにしてほしいなあ。
0561nobodyさん2006/07/15(土) 19:48:58ID:???
>>558
ありがとうございます。
文法的にも間違っていたようです。

>>559
すべてではないですが大半は作りましたが・・・・・。
0562nobodyさん2006/07/15(土) 19:53:50ID:???
たいはん 【大半】
全体の半分以上。過半。大部分。副詞的にも用いる。

へぇ・・・。
0563nobodyさん2006/07/15(土) 19:55:13ID:???
>>560

>せめて &code(); とかにしてほしいなあ。

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
と釣られてみるテスト
0564nobodyさん2006/07/15(土) 20:04:58ID:???
>>561
ほんとかどうか知らんが、おれは KENT であろうとなかろうと問い合わせ先が記入されてるソースに関してのレスは
つけんぞ。

おまえさんがさきに「この部分が自作です」といえば
話は別になるときもあるが。
0565nobodyさん2006/07/15(土) 20:06:20ID:???
改行忘れorz...
0566nobodyさん2006/07/15(土) 20:38:18ID:???
KENTもう配布やめてくれないかな。
ダメな子が増えて困る。
0567nobodyさん2006/07/15(土) 20:45:33ID:???
KENT便利だな

少なくともチャント動くし
0568nobodyさん2006/07/15(土) 21:34:29ID:???
× チャント動く
○ 動きはする
0569nobodyさん2006/07/15(土) 21:59:01ID:???
KENT使ったこと無い
0570nobodyさん2006/07/15(土) 22:15:52ID:???
KENTしか使っていない。
0571nobodyさん2006/07/15(土) 23:50:29ID:???
KENTの何がいいかって、セキュリティとか全然考えてないとこだよな。
攻撃できまくり☆(ゝω・)v
0572nobodyさん2006/07/16(日) 00:07:06ID:???
terra大先生の遺作がまだアチコチに残っている。
外部から任意コマンド実行可能なまま。
0573nobodyさん2006/07/16(日) 06:07:21ID:???
えーw どんな設計したらそんなことになるんだろw
0574nobodyさん2006/07/16(日) 13:59:39ID:pJTY6Rn5
正規表現でマッチした方の値を取る方法が分かりません。
例えば
$hoge = '2743AB5837C9849';
というような文字列があるとして
$hoge =~ s/\D//g;
とした場合に\Dに該当する方(ABC)の値を取りたいんですが
どうすれば良いんでしょうか?
0575nobodyさん2006/07/16(日) 14:07:23ID:???
>574
$&
05765742006/07/16(日) 14:21:08ID:pJTY6Rn5
>>575
ありがとうございます。
マッチ変数というのがあるんですね。

ttp://www.rfs.jp/sb/perl/02/09.html
>後方参照の変数には上記のほかに、マッチ変数 $& $` $' $+ があります。これらの変数を使うと
>プログラム内のすべての正規表現の処理が遅くなるので、注意して使ってください。

という記述があったんですが、できることなら使わない方が良い代物なんでしょうか。
それとも多用がいけないのであって、1、2箇所であれば問題ないんでしょうか。
0577 ◆TWARamEjuA NGNG
違う変数に入れちゃっても良いような。
($hage = $hoge) =~ s/\D//g;
0578nobodyさん2006/07/16(日) 14:48:17ID:???
>>576
> という記述があったんですが、できることなら使わない方が良い代物なんでしょうか。
> それとも多用がいけないのであって、1、2箇所であれば問題ないんでしょうか。
1回でも使っている箇所があると、全ての正規表現が遅くなる。
マッチ変数が使われているかどうか調べるためのモジュールはDevel::SawAmpersand
0579nobodyさん2006/07/16(日) 14:56:43ID:pJTY6Rn5
>>577-588
ありがとうございます。
ちょっと落雷がヤバイので一旦PCの電源落とします。
落ち着いたらそのときまたレスします。すみません。
0580nobodyさん2006/07/16(日) 15:07:17ID:???
速度気になるんだったら、
my @hit = () ;
push @hit, $1 while $hoge =~ s/(¥D)// ;
みたく $1 を使えば?
つーか $& 使ったことないなあ。オレ。
0581nobodyさん2006/07/16(日) 15:54:56ID:???
$1使ったほうが遅いはず
0582nobodyさん2006/07/16(日) 16:08:19ID:???
誰かベンチとってkt
0583bench 魔2006/07/16(日) 16:56:41ID:???
お前がやれよ!まあ、暇だからやったけどさ。
===そーす===
my $str1 = 'a' x 6 . 'hoge' ;
$str1 = $str1 x 100 ;
sub test1(){ my ( $tmp, @hoge ) = $str1 ; push @hoge, $& while $tmp =~ s/hoge// ; }
sub test2(){ my ( $tmp, @hoge ) = $str1 ; push @hoge, $1 while $tmp =~ s/(hoge)// ; }

#timethese 10000, { test2 => 'test2' } ;
timethese 10000, { test1 => 'test1', test2 => 'test2' } ;
===実行結果===
1. ソース内に $& 蟻
Benchmark: timing 10000 iterations of test, test2...
test: 13 wallclock secs (13.22 usr + 0.10 sys = 13.32 CPU) @ 750.75/s (n=10000)
test2: 14 wallclock secs (13.34 usr + 0.10 sys = 13.44 CPU) @ 744.05/s (n=10000)

2. ソース内に $& なし(test1 をコメントアウト
Benchmark: timing 10000 iterations of test2...
test2: 14 wallclock secs (13.32 usr + 0.10 sys = 13.42 CPU) @ 745.16/s (n=10000)
0584bench 魔2006/07/16(日) 16:57:32ID:???
$& だけじゃ差が出ないのか?と思い、
==========
で、test1 を以下の様に変えて
sub test1(){
 my ( $tmp, @hoge, @fuga, @piyo ) = $str1 ;
  ( push (@hoge, $& ),
   push (@fuga, $`),
   push(@piyo, $' )) while $tmp =~ s/hoge// ; }

実行してみたが…
Benchmark: timing 10000 iterations of test, test2...
test: 26 wallclock secs (24.80 usr + 0.22 sys = 25.02 CPU) @ 399.68/s (n=10000)
test2: 14 wallclock secs (13.28 usr + 0.08 sys = 13.36 CPU) @ 748.50/s (n=10000)
test2 の結果は余りかわらず。

prelre にまで書いてある記載だから $& とか使ったら遅くなるケースが必ずある筈なんだけどなあ。
実際のソースで自分で確かめるしかねーな。
0585nobodyさん2006/07/16(日) 17:10:42ID:???
>>583-584
文句言いながらやる君が好きだ。

でも、
> これらの変数を使うとプログラム内のすべての正規表現の処理が遅くなるので、注意して使ってください
だから、同じ時に計測すると $1 の方も遅くなっちゃうんじゃないのかな?
比較じゃなくて構わないから、参考に単独での速度を計ってみてくれるといいかも。

できれば
> @hoges = $hoge =~ /\D/g;
系と
> push @hoges, $1 while $hoge =~ /(\D)/g ;
系とでも比較してあるとなお。
0586bench 魔2006/07/16(日) 17:51:19ID:???
>だから、同じ時に計測すると $1 の方も遅くなっちゃうんじゃないのかな?
>比較じゃなくて構わないから、参考に単独での速度を計ってみてくれるといいかも。
583 の 2.の条件が $& を排除した形のものデス。
$& の入っている行をすべてコメントアウトしました。

お約束「あなたの為にやるんじゃないんだからね!!」
>>583 のソースに
sub cont (){ my ( $tmp, @hoge ) = $str1 ; @hoge = $tmp =~ /hoge/g ;}
を加えて実行 ( 実行名 cont )。実行回数は 5 万回に変更
Benchmark: timing 50000 iterations of cont, test1, test2...
cont: 49 wallclock secs (48.24 usr + 0.34 sys = 48.58 CPU) @ 1029.23/s (n=50000)
test1: 67 wallclock secs (65.77 usr + 0.39 sys = 66.16 CPU) @ 755.74/s (n=50000)
test2: 69 wallclock secs (66.33 usr + 0.53 sys = 66.86 CPU) @ 747.83/s (n=50000)

そこから $& が入った部分を全削除して実行
Benchmark: timing 50000 iterations of cont, test2...
cont: 44 wallclock secs (42.59 usr + 0.33 sys = 42.92 CPU) @ 1164.96/s (n=50000)
test2: 69 wallclock secs (66.67 usr + 0.54 sys = 67.21 CPU) @ 743.94/s (n=50000)

…なるほど、test2 ( $1 を利用 )にはもともとコストが掛ってて $& の影響が表われなかった
だけか。
一箇所の正規表現だけだと、$1 より $& を使った方が速いがソース全体だと影響を及ぼす
という妥当な結果かな。

0587nobodyさん2006/07/16(日) 18:23:45ID:???
>>586
オツカレ!

つまり $& を使うとそもそも結果を伴う $1 の処理には影響ないけど、
普通の正規表現も結果をとることになるから総合的に遅くなる、ってわけだな。

結局、>>574の場合、一番早いのは

my @matchs = $hoge =~ /\D/g;
$hoge =~ s/\D//g; # ※より早い形→ $hoge =~ tr/0-9//cd;

って2段階で処理して $& も $1 も使わない形なんだろね。
05885742006/07/16(日) 19:11:43ID:pJTY6Rn5
レス遅くなってすみません。

>>577
一度別の変数に逃がしておいて、そっちの方で再度逆のパターンで取得する、
という理解で良いんでしょうか。参考にしてみます。
括弧でくくって逃がしておく方法は知らなかったので勉強になりました。

>>578
マッチ変数は1箇所でも使うと他の全ての正規表現にも影響が出るんですね。
今のところ使ってる箇所はないんで、できたら使わない方向で考えてみます。

>>580>>581
速度も気になりますが、「注意して使ってください」の文言に
ちょっとビビってしまいました。でも、他にも正規表現使ってる箇所があるので
できたらマッチ変数使わなくても良いのならそっちの方が良いと思っています。

>>583-584>>586
画に描いたようなツンデレと詳しいベンチマークありがとうございました。
局所的にはマッチ変数よりも$1使った方が処理は速いけれど
他にも正規表現使ってる箇所があれば、結果は逆になるということですね。
コード内で他にもいくつか正規表現使ってるところがあるので
マッチ変数を使わなくてはならない状況になれば$1を代用することにします。
非常に勉強になりました。

>>587
正規表現の置換と言えば即sでやってたので
trに特有の便利な修飾子があるのを見落としていました。
ずばりの解答も含めてありがとうございました。

レスくださった皆さん、ありがとうございました。
最近あちこちで落雷が発生しているみたいなのでパソコンの方もご自愛下さい。
0589nobodyさん2006/07/16(日) 19:42:51ID:???
誰かアンチKENTの方々、コレが最高という掲示板配布サイトなどを教えて下さいな。
by KENT信者
0590nobodyさん2006/07/16(日) 19:44:18ID:???
はいはい釣り釣り
0591nobodyさん2006/07/16(日) 22:04:02ID:???
入力された文字を展開して表示させる方法ってあります?
たとえば ^\d$ と入力すると

0
1
2
3
4
5
6
7
8
9

と展開するみたいな
0592nobodyさん2006/07/16(日) 22:16:57ID:???
ない
0593nobodyさん2006/07/16(日) 22:32:38ID:???
質問の意図が読めない
正規表現の展開?
05945912006/07/16(日) 22:41:09ID:???
>>593
展開して表示する方法があるのかどうかです

^\d$なら>>591の通り0〜9まで展開
^[Aa]$ならAとaの2つ展開
という意味です



0595nobodyさん2006/07/16(日) 22:52:27ID:???
[^a] とかの場合はどんな展開を想定してんだ?
できないってことでいいよ。
0596nobodyさん2006/07/16(日) 22:56:17ID:???
知らないのかw


0597nobodyさん2006/07/16(日) 22:56:40ID:???
残念ながら知らないw
>>592のいう通りじゃない?
簡単な正規表現だったら、頭の中で想像つくし、
複雑なものだったら、展開後の文字が何万行にも
わたってしまうから...

単純な例だと「/./」。
これの展開は 1byte で表されるものすべてだから、
多byte文字とか考えたらガクガクブルブルw
05985932006/07/16(日) 22:59:52ID:???
>>597>>591に対してのレス
0599nobodyさん2006/07/16(日) 23:01:02ID:???
my $p = qr/^\d$/;
my @c = grep { $_ = chr($_); /$p/ } (0..0xFF);
0600nobodyさん2006/07/16(日) 23:34:52ID:???
パソコンに入っているcsvファイルAを読み込んでデータを取り出して処理、
そしてサーバ上にあらかじめ用意してあるファイルBにその結果を書き出す、
ということをやりたいんですが、そういうことは可能でしょうか?
0601nobodyさん2006/07/16(日) 23:36:49ID:???
>>600
要約するとこういうことです。

CSVファイルをアップロードして、処理した結果を保存する。

結論。可能
06026002006/07/16(日) 23:42:33ID:???
>>601
なるほど。とすると簡単な流れとしては
csvファイルAをサーバにアップロード
→オープンして処理
→ファイルBに書き込む
→ファイルA削除
という解釈で大丈夫でしょうか?
0603nobodyさん2006/07/16(日) 23:48:10ID:???
no
06045912006/07/17(月) 00:05:10ID:???
>>599
ありがとうございます
06055912006/07/17(月) 00:09:38ID:???
>>602
もっといい方法があるかもしれないけど
csvファイルAからGrep→ファイルBに書き込む
でいけるような
0606nobodyさん2006/07/17(月) 00:19:41ID:???
>>604
え、それでいいの?
シングルバイト、1文字限定なら、最初に言ってよ。
0607nobodyさん2006/07/17(月) 00:25:28ID:???
>>602
search.cpan.org にいって
NET::FTP とか NET::SSH::PERL とか
そっちがわ系のモジュールを検討してみたら?
0608nobodyさん2006/07/17(月) 00:31:41ID:???
>>606
ほんとだよなw
06096002006/07/17(月) 00:46:22ID:???
602の流れでとりあえず書いてみようと思ったんですが
ファイルAをアップロード→オープン
のところで、おそらくアップロードが完了する前に
オープンをかけてしまいエラーが出てしまいます。
アップロードとファイルBへの書き込み処理は
別々にしないと無理ですかね・・・。

>>603
喜び勇んで早速書き始めてたらいきなり否定されてたとは・・・

>>605
grepを使うにしても、まずはサーバ上にファイルAを上げないとダメですよね?

>>606
そういうモジュールがあるんですか。
調べてみます。
0610nobodyさん2006/07/17(月) 00:51:38ID:???
>>609
そんなこたあないはず。
心配だったら sleep(1) でもしてみたらいいじゃない。
06115912006/07/17(月) 00:59:20ID:???
>>606>>608
ああああ、>>599はシングルバイト限定なんですね・・・
2バイト以上だとやっぱり無理?
0612nobodyさん2006/07/17(月) 01:06:13ID:???
気づいてなかったのかw
0613nobodyさん2006/07/17(月) 01:06:32ID:???
>>611
パターンなんて無限大にあるしなあ。
/.../ これだけ展開するので 255*255*255 だろw
もっと条件言うか何がしたいか言うかしないと 「無理」 って感じ。
06146002006/07/17(月) 01:08:17ID:???
>>610
単に処理のコードが間違ってるだけでした・・・
一応602の流れでやりたいことはできました。
0615nobodyさんNGNG
                  般若波羅蜜多心経

           観自在菩薩行深般若波羅蜜多時照見五
           蘊皆空度一切苦厄舎利子色不異空空不
           異色色即是空空即是色受想行識亦復如
           是舎利子是諸法空相不生不滅不垢不浄
           不増不減是故空中無色無受想行識無眼
           耳鼻舌身意無色聲香味觸法無眼界乃至
           無意識界無無明亦無無明尽乃至無老死
           亦無老死尽無苦集滅道無智亦無得以無
           所得故菩提薩垂依般若波羅蜜多故心無
           罫礙無罫礙故無有恐怖遠離一切顛倒夢
           想究竟涅槃三世諸仏依般若波羅蜜多故
           得阿耨多羅三藐三菩提故知般若波羅蜜
           多是大神咒是大明咒是無上咒是無等等
           咒能除一切苦真実不虚故説般若波羅蜜
           多咒即説咒曰
           羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶

                 般若心経

仏説摩訶般若波羅蜜多心経観自在菩薩行深般若波羅蜜多時照見五蘊皆空度一
切苦厄舎利子色不異空空不異色色即是空空即是色受想行識亦復如是舎利子是
諸法空相不生不滅不垢不浄不増不減是故空中無色無受想行識無眼耳鼻舌身意
無色声香味触法無眼界乃至無意識界無無明亦無無明尽乃至無老死亦無老死尽
無苦集滅道無智亦無得以無所得故菩提薩捶依般若波羅蜜多故心無罫礙無罫礙
故無有恐怖遠離一切顛倒夢想究竟涅槃三世諸仏依般若波羅蜜多故得阿耨多羅
三貌三菩提故知般若波羅蜜多是大神呪是大明呪是無上呪是無等等呪能除一切
苦真実不虚故説般若波羅蜜多呪即説呪曰羯諦羯諦波羅羯諦波羅僧羯諦菩提薩
婆訶般若心経
06166072006/07/17(月) 01:10:00ID:???
>>609
適当にぐぐっただけなので、中身は知らんよ。
ただ、ftp, ssh 系のモジュールは、cpan に結構ある
から、その中に役立つものはあるかも。
0617nobodyさん2006/07/17(月) 01:11:22ID:???
>>591
昔ム板のPerlスレで似たようなお題が出たのを思い出した。

Perlについての質問箱 21箱目
ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/478-
ミラー
ttp://makimo.to/2ch/pc8_tech/1134/1134327348.html#478

で、こんなのが紹介されている。
ttp://search.cpan.org/~bowmanbs/Regexp-Genex-0.06/lib/Regexp/Genex.pm
読んで試してみたらどうも\d等の文字クラスが含まれていると、
ランダムにしか出てこないみたいだけど参考まで。
06186002006/07/17(月) 01:21:32ID:???
>>616
FTPと似たようなことができるみたいなので
よく分からない状態で用いるのは、
セキュリティ上危険な気がしました。
ご忠告ありがとうございました。
0619nobodyさん2006/07/17(月) 05:25:24ID:AcPhLonl
膨大なスクリプト内のいろんなところにexitが置いてあるコードはスパゲッティと考えていいですか?
0620nobodyさん2006/07/17(月) 06:08:57ID:???
(´・ω・`)モキュ?
0621nobodyさん2006/07/17(月) 07:11:29ID:???
>>619
mod_perlでも動かすのかな?
それより、local宣言だらけを心配した方がいいよ。
逆に、my宣言が全然ないとか。
0622nobodyさん2006/07/17(月) 10:19:25ID:???
>>619
exitの飛び先は明確だし、フローがでたらめな訳でもないから、違う。
0623nobodyさん2006/07/17(月) 11:23:26ID:???
>>618
> FTPと似たようなことができるみたいなので
> よく分からない状態で用いるのは、
> セキュリティ上危険な気がしました。

「FTPと似たようなこと」をやろうとしてるんじゃなかったのか。
にほんごってむずかしーね。
0624nobodyさん2006/07/17(月) 12:15:35ID:???
それを実行するには「ftpと似たような事」をしなければ出来ないと
いう事に思い至らなかっただけでしょ。
0625nobodyさん2006/07/17(月) 14:29:03ID:???
>>600
何悩んでるか知らないけど、アプロダ参考にすればいいんじゃないの?
0626nobodyさん2006/07/17(月) 16:03:52ID:???
FTPつかわずに、どうやってアップロードしてるんだろう?
http?
0627nobodyさん2006/07/17(月) 16:31:38ID:???
64**9を計算すると
1.8014398509482e+016
ってなるけど実数表示させるにはどうすりゃいいのん?
0628nobodyさん2006/07/17(月) 16:33:45ID:???
>>627
5.8以上ならuse bigint;
それ以前を考慮するならMath::BigIntを直接使う
0629nobodyさん2006/07/17(月) 16:47:46ID:???
>>628
おおそんなのがあったのか
ありがd
0630nobodyさん2006/07/17(月) 16:51:55ID:???
>>628
スマソ、”Math::BigIntを直接使う”
直接使う?
0631nobodyさん2006/07/17(月) 17:13:50ID:???
>>630
perldoc bigint を見れば分かるけど、
> "bigint" is just a thin wrapper around various modules of the Math::BigInt family.
0632nobodyさん2006/07/17(月) 22:48:16ID:???
>>631
英語読めない
0633nobodyさん2006/07/17(月) 22:53:09ID:???
"bigint"は Math::BigInt 関連のモジュールの単なる小さなラッパーです。
0634nobodyさん2006/07/17(月) 22:57:20ID:???
>632
消防はもう寝な
0635nobodyさん2006/07/17(月) 23:00:55ID:???
>>627
> 1.8014398509482e+016
実数表示してるじゃん。という突っ込みは誰もしないの?
0636nobodyさん2006/07/17(月) 23:01:54ID:???
>>632
お前の次のセリフは 「ラッパーって何?」 だ
0637nobodyさん2006/07/17(月) 23:05:15ID:???
>>636
ラッパーってあのラッパーですか?
0638nobodyさん2006/07/17(月) 23:21:32ID:???
DAYONE
0639nobodyさん2006/07/17(月) 23:36:11ID:???
>>628
5.8.8でuse bigint;したけど64**9は>>627みたいになったぞ?
0640nobodyさん2006/07/17(月) 23:43:04ID:???
>perl -e "printf '%.0f', 64**9"
18014398509481984

こうですか? わかりません><
0641nobodyさん2006/07/17(月) 23:45:16ID:???
printfでもできるのか
0642nobodyさん2006/07/18(火) 00:11:32ID:???
>>639
user@localhost:~$ perl -Mbigint -e 'print 64**9, "\n"'
18014398509481984
user@localhost:~$ perl -v | grep v5
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
0643nobodyさん2006/07/18(火) 00:24:40ID:DXYFSpfL
教えてください
このような表記は許されるのでしょうか?

1)$TEST[100]に代入されている文字列を表示させたい
2)$TEST[***]<-ここに$A[1]を入れたい

$A[1]=100;
$TEST[100]='TEST';
print $TEST[ $A[1] ];

やはり・・・
$A[1]=100;
$TEST[100]='TEST';
$B=$A[1];
print $TEST[$B];

なのかなあ
0644nobodyさん2006/07/18(火) 00:40:05ID:???
>>643
>print $TEST[ $A[1] ];
全然これで構わない。何もおかしくない。
06456432006/07/18(火) 00:46:23ID:DXYFSpfL
644さん、ありがとうございます。

ソース記述が途中で間違っていたのかも知れなかったです。
この表記がまちがっていると思い込んで2時間位悩んでいましたm(_ _)m
0646nobodyさん2006/07/18(火) 00:52:26ID:???
それより大文字の変数名やめないかw
0647nobodyさん2006/07/18(火) 01:00:06ID:???
BASICを思い出す
0648nobodyさん2006/07/18(火) 02:34:41ID:???
>639
5.8.4 だけど、use bigint で 18014398509481984 って結果でたよ

>643
大文字は定数で使われるのがほとんどなので、変数は小文字でどぞ。
0649nobodyさん2006/07/18(火) 03:41:25ID:???
すいませんアドバイスおねがいします

1.(2/3)*(2/3) の解を 4/9 にするにはどうすればいいですか?
2.次に1.の解を 1/2.25 (分子を1)にするにはどうすればよいですか?
0650nobodyさん2006/07/18(火) 03:50:18ID:RAKThs0C
CGIでクッキーかきました。保存されてるのを確認したのですが、
$ENV{'HTTP_COOKIE'}で何も取得できません!
作成直後ではなくて、ブラウザでリクエストを再送しても取得できません。
どんな原因が考えられましょうか!
0651nobodyさん2006/07/18(火) 04:54:13ID:???
>>649
>>628と同様に、bigrat or Math::BigRatでどうよ。
2はライブラリ任せにしないで、算数的に出力時にdenominatorをnumeratorで割れば?
0652nobodyさん2006/07/18(火) 05:24:58ID:???
>>649
use bigrat;
$a = (2/3)*(7/57);
print $a,"\n";
printf( "1/%f",1/$a);

%fのところはうまくいじらないと思い通りの出力にならないかも?
つーか7/8を1/xと表示したいときxは何になってほしいのか・・・?
0653nobodyさん2006/07/18(火) 05:35:52ID:???
>>650
$ENV{'HTTP_COOKIE'}で何も取得できなくて、
いったい何で”保存されてるのを確認した”のか、教えてください。
パッと思いつく原因としてはクッキーを出してるスクリプト
と受け取ってるスクリプトがあるディレクトリが別になってるとか?
どうやってクッキーを発行して、どうやって受け取ろうとしてるのか、
もっと詳細に報告してください。
06546502006/07/18(火) 09:21:50ID:???
どうもです!確認はクッキーフォルダにクッキーファイルができたことを確認しました。
スクリプトはいっしょで、読み書きするスクリプトをリロードして確認したり、
読みと書きでパラメータを分けて行き来したりしています。
Set-Cookie: session=test;expires=;\n
と書いてます。index.cgi?a=1で書いてindex.cgi?a=2で読んでいます。

宜しくお願いします!
0655nobodyさん2006/07/18(火) 09:28:15ID:???
アドバイスよろしくお願いします。

現在作ってるスクリプトで設定内容などは
$config = {
'test' => "テスト"
}
sub get{
my $pkg = shift;
my $hash = $config;
bless $config, $pkg;
}
my($cfg) = config->get();
print $cfg->{test};
この用にして設定内容を取得してます。
そして今回、$config の中に配列へのリファレンスを含めるようになり

@urls = (ずらずら〜っと);

と URL が書かれた配列へのリファレンスを

$config = {
'urls' => \@urls,
}

として $config へ設定しました。
この際に $cfg で値を取得する書き方としては

@{$cfg->{'urls'}}

で正解なのでしょうか?
もっときれいな書き方や 「こっちのほうが解釈としては正解じゃね?」 みたいな
書き方があれば教えていただければ幸いです。
0656nobodyさん2006/07/18(火) 10:10:41ID:???
>>655
おk
0657nobodyさん2006/07/18(火) 10:19:23ID:???
なんで設定をオブジェクトにしてるのか不明だけど、書き方はおk
0658nobodyさん2006/07/18(火) 10:26:39ID:???
設定したつもりの値が得られるという意味では正しいかもしれないが、
perlのoopの使い方がどうみてもむちゃくちゃなので勉強しなおしてください。
変な癖をつけると後で苦労するよ。
0659nobodyさん2006/07/18(火) 10:32:26ID:???
>>655
OOPをやりたいなら
package Config;
sub get{
my $pkg = shift;
my $hash = shift;
bless $hash, $pkg;
}
.....(いろんなメソッド)
package main;
my $cfg = Config->get({'urls'=>\@urls})

そのままだと、sub getが意味ない

>>658
perl oopのいい入門て見たことない希ガス・・・
0660nobodyさん2006/07/18(火) 10:35:44ID:???
レスありがとです
この書きかたでいこうかと思います


>657
以前このスレだかどこかで KENT の様に設定用変数を数多く
用意するのは綺麗じゃないみたいなことがあったときに、
私が
config.pl
%config=('test'=>2);
sub getconfig{return %config;}

my %config=&getconfig();


ってやってるって書いたら効率悪いって言われたもんで、
ちょっと書き直してたらこうなった次第です。
0661nobodyさん2006/07/18(火) 10:35:45ID:???
その get() が、実は new() な所がちょっと…
0662nobodyさん2006/07/18(火) 10:43:45ID:???
ローカルにハッシュをコピってから参照するほうが、その都度
関数コールするよりもオーバーヘッドは少ないかなって思ったので。

数回から数十回のコールでオーバーヘッドを気にするのは無駄
とは分かってはいたんですがやっぱりスマートな書きかたではなかったですか(-_-;
0663nobodyさん2006/07/18(火) 10:46:41ID:???
やっぱ慣例に沿った(newしてからget)方が、自分以外が読む人のためになりますか?
0664nobodyさん2006/07/18(火) 10:52:28ID:???
>>650
print "content-type: text/html\n";
print "Set-Cookie: session=test\n";
print "\n";
print $ENV{HTTP_COOKIE};
とりあえずうちの環境だと、これを2回読み込むと画面にsession=test
と出るので、それでだめだったら環境がおかしい
0665nobodyさん2006/07/18(火) 12:38:15ID:???
できました!ありがとうございます。
Set-cookie:〜\nContent-type:〜\n\nってなってたのをクッキーとContent-typeの順番を入れ替えただけで
行けたっぽいです。書き込み時がおかしかったようです。
ネットで順番はどっちでもいいようなことを見たし、実際クッキーらしきものが書かれていたのでこれでいいのかと
思ってました。ざっと試しただけですが、これから詳しいことを検証したいと思います。
あと、バグ入りクッキーは本当にクライアント環境によって挙動が違いました。(会社では場合によって読めた)
0666nobodyさん2006/07/18(火) 13:25:28ID:???
Content-type:〜\n\nSet-cookie:〜\n
となっていたに1票
0667nobodyさん2006/07/18(火) 14:04:40ID:???
>>663
ていうか、ただのハッシュとして使うだけなら
なんでオブジェクトにするのか全く不明。
それなら単純にハッシュを宣言して、読み込むだけの方が良い。
0668nobodyさん2006/07/18(火) 14:22:23ID:???
>>665
順番はどうでもいいけど検証するなら空行が何を表すのかってことを検証して下さい。
0669nobodyさん2006/07/18(火) 14:43:02ID:???
空行位置は665に書いたとおりなんで、間違ってないと思うんですよ。
それでも、やはり順序不問ってことは、どっかでケアレスミスしたかもしれません。今夜再検証してみます。
0670nobodyさん2006/07/18(火) 15:15:34ID:???
>667
外部ファイルにhashで設定を書いてrequireすると、
同じ内容の変数が2つ存在することになって無駄があるので
オブジェクトにした次第です。
0671nobodyさん2006/07/18(火) 15:24:45ID:???
>>670
その考え方が間違ってる。そんなことでオブジェクトにしちゃいけない。
だったらまだ、>>660 にある最初の書き方の方が、考えがマトモ。

同じ内容の変数が2つになるのが嫌なら、
外部ファイルの変数を別のハッシュに代入せずに、そのまま使えば良いだけの事。
0672nobodyさん2006/07/18(火) 15:28:41ID:???
ifで(unlessを使わずに)「特定の文字列にマッチしなければ」という条件式を
書くにはどうしたら良いんでしょうか?
単純に
if($data !=~ /MOJI/)
という書き方では反映されないみたいなんですが。
0673nobodyさん2006/07/18(火) 15:31:12ID:???
!~
0674nobodyさん2006/07/18(火) 15:31:47ID:S5V5gxsh
比較の質問なんですが
「○○かつ△△」を文字列で扱う方法はやはりないのでしょうか?

$type1 = 'BAKA';
$type2 = 'KASU';
if ( $type1 eq 'BAKA' and $type2 eq 'KASU')

みたいにするには数値をそれぞれ代入してからやるべきなのでしょうか?
0675nobodyさん2006/07/18(火) 15:34:06ID:???
>>670
リファレンスを使えば二重にならない。
0676nobodyさん2006/07/18(火) 15:38:45ID:???
質問の意味が分からない
06776722006/07/18(火) 15:39:57ID:???
>>673
if($data =!~ /MOJI/)
と書いてみましたがエラーが出て動かないです。
どこが間違っているんでしょうか?

>>674
単純に
if ( ( $type1 eq 'BAKA' ) && ( $type2 eq 'KASU' ) )
で良いじゃないでしょうか。
0678nobodyさん2006/07/18(火) 15:42:18ID:???
if ($data !~ /MOJI/)
06796722006/07/18(火) 15:46:52ID:???
>>678
できました。
=とか!とかはあくまでチルダに対して付いてたんですね。
ありがとうございました。
0680nobodyさん2006/07/18(火) 15:47:11ID:S5V5gxsh
>>676
数値比較では && や and を使えますが
文字列でも同じように && や and を使っていいのかどうかということです
0681nobodyさん2006/07/18(火) 15:47:29ID:???
Perlの本て、読まないのかな。
最近の質問見てるとネットだけで独学の人が多いような気がする。
0682nobodyさん2006/07/18(火) 15:48:55ID:???
>>680
and や && は比較の内容と関係ない。
だから当然使って良い。
0683nobodyさん2006/07/18(火) 15:49:31ID:S5V5gxsh
>>677
どうもです

>>682
ありがとうございます
0684nobodyさん2006/07/18(火) 16:01:37ID:???
perldocの存在を知らない気がする
0685nobodyさん2006/07/18(火) 17:42:03ID:???
>675
その都度デリファレンスするのって、見た目が余り綺麗じゃないからその案は
以前考えてるときに却下しました。
0686nobodyさん2006/07/18(火) 17:51:43ID:???
>>685
誰がデリファレンスしろと…。

>>675 が言ってるのは、
外部ファイルで %config を定義して、return ¥%config; でリファレンスを返せば
同じハッシュが2つにならないということでしょう。
使う時は $cfg->{'hoge'} みたいなので良いんだし。デリファレンス要らない。
0687nobodyさん2006/07/18(火) 18:24:24ID:???
OOP考えるならさあ、、
「とりあえず外部PL(PM)ファイルに設定をずらずらして require」 じゃなくて、
普通の(TXT)ファイルとかにCSVとかTSVみたいな感じで設定を書いて、
my $cfg1 = Config->new('config1.txt');
my $cfg2 = Config->new('config2.txt');
みたいな感じで設定取ってくるもんじゃないの?
>>655みたいに値を得たいときは my @url = $cfg1->get('url'); とかしてさ。
そうじゃないならOOPの意味もないな、って思うんだけどw
0688nobodyさん2006/07/18(火) 18:29:25ID:???
AppConfigかConfig::*の中から適当なの見繕って使うのが普通じゃないかと。
0689nobodyさん2006/07/18(火) 18:54:51ID:9xyhckKL
訪問者に強制的に話しかけるウェブサイト作ったのですが、
ページの更新をムダに頻繁にするのはいやなので30秒設定にしています。
要はチャットなのですが。

試験的に稼動してるのですが、相手にメッセージが届く前に相手が帰ってしまうようです。
そこで思ったのですが、こちらが書き込みをしたら即座に相手のブラウザに更新命令を
出すといったようなことはPerlCGIでは実現できませんでしょうか?

そんなことできたら怖すぎるかな?とも思いましたがやはりそんな危ない技術は正攻法では不可能ですかね?
ハッキング状態になっちゃいます?

アドバイスお願いします。
0690nobodyさん2006/07/18(火) 19:08:59ID:???
>>689
そういうクライアントサイドなのはJavaScript(Ajax)とかでやるんじゃねーかなー。
0691nobodyさん2006/07/18(火) 19:18:16ID:???
>>689
>こちらが書き込みをしたら即座に相手のブラウザに更新命令を
>出すといったようなことはPerlCGIでは実現できませんでしょうか?
できるわけないだろ。
そんな凶悪なセキュリティホールが空いてたらすぐに緊急のパッチが出るわ。

要は、最初のアクセスのときだけ3秒ぐらいでリロードして
その自動メッセージとやらを表示させて、
2回目以降は通常の30秒リロードにすれば良いんじゃないの?
0692nobodyさん2006/07/18(火) 19:45:12ID:???
コネクション切らずにつなぎっぱなしで垂れ流せばよい。
共有サーバでやるとヌッ殺される。
0693nobodyさん2006/07/18(火) 19:45:35ID:???
>686
あぁなるほど。
ファイルの最後で1;ってやるところで返すのはやらないほうがいいですか?
(出来るかどうか知らないけど)

>687
iniファイルのような設定ファイルは記述ミスに対するコーディングが生じるので考えてませんでした


勉強も兼ねて初めてパッケージ(もどき)を考えてみたけど、使いどころとか、使い方とか難しいですね
0694nobodyさん2006/07/18(火) 19:49:14ID:???
>>687
つーか値を得たいときは$self->{'config'}->{'value'}
もしくは$selfをconfig hashそのものにして、$self->{'value'}。
そもそも関数で値を”とってくる”という発想自体が間違ってる。(OOPなら
0695nobodyさん2006/07/18(火) 19:52:09ID:qN74jZ6A
my $count = $db->prepare("select count(*) from hoge where hogehoge = 1");
print $count;
-------------------------------
↑のような構文を打ったところ
(SQLで返される数字が出力されるようにしたつもり)
print $countが↓のように出力されてしまいます。
-------------------------------
DBI::st=HASH(1234abcd)
-------------------------------
正しく数字が返されるようにするにはどのようにしたらよいでしょうか?
0696nobodyさん2006/07/18(火) 19:55:35ID:???
まず中学に入学して prepare の意味を調べられるようになれ。
0697nobodyさん2006/07/18(火) 19:59:59ID:???
>>694
use CGI; で $Q->param('hoge') とかやるのは間違ってるってことニカ?
0698nobodyさん2006/07/18(火) 20:04:32ID:???
気付いても、生暖かく見守るのが大人の対応だ
0699nobodyさん2006/07/18(火) 20:04:40ID:???
>>697
それは”とってくる”じゃ無いと言いたいのだと思ふ。
関数じゃなくてメソッドだし。
0700nobodyさん2006/07/18(火) 20:06:25ID:???
関数とメソッドの違いも答えられないくせに偉そうだにゅ
0701nobodyさん2006/07/18(火) 20:10:22ID:???
googleで調べるの禁止な
07026952006/07/18(火) 20:11:15ID:qN74jZ6A
すいません抜けがありました。もう一度投稿ですみません。。


my $count = $db->prepare("select count(*) from hoge where hogehoge = 1");
$count->execute;
print $count;
-------------------------------
↑のような構文を打ったところ
(SQLで返される数字が出力されるようにしたつもり)
print $countが↓のように出力されてしまいます。
-------------------------------
DBI::st=HASH(1234abcd)
-------------------------------
正しく数字が返されるようにするにはどのようにしたらよいでしょうか?
0703nobodyさん2006/07/18(火) 20:13:37ID:???
DBIモジュールの説明読んで。
0704nobodyさん2006/07/18(火) 20:15:42ID:???
fetchしろ。fetchナントカってのはいっぱいあるからどれを使うかはお好みで。

07056952006/07/18(火) 20:32:22ID:qN74jZ6A
>>703-704
ありがとう
0706nobodyさん2006/07/19(水) 00:26:20ID:aJ2dkknB

$a = 31536001
に対して年$year 月$manth 日$day 時$hour 分$minute 秒$second
を求めるには地道に

$year = $a - 3153600;

とした方がいいのでしょうか?
それとももっと簡単な方法がありますか?
よろしくお願いします
0707nobodyさん2006/07/19(水) 00:32:18ID:???
誰か翻訳してくれw
07087062006/07/19(水) 00:35:08ID:aJ2dkknB
>>707
あああ、すいません
ミスってました

31536001は31536001秒ということです
秒、(繰り上がるならそれぞれ)分、時間、日、月、年を求める方法があるのかどうかです

0709nobodyさん2006/07/19(水) 00:38:52ID:???
うるう年じゃない年の一年の秒数が31536000、だな

>>708
日数までは良いとしてだ。
一月の長さは同じじゃないわけだが、そこのところどうやって計算する気よ
0710nobodyさん2006/07/19(水) 00:41:06ID:???
ああ、わかったw
$a = 31536000; # ← 3600*24*365
で、$a = 86401 なら 暦とか関係なく 1日と1秒 って経過時間だしたいってことね。

じゃあ単に
my @dates = gmtime($a);
とかやればいいんじゃねのw
07117062006/07/19(水) 01:03:53ID:aJ2dkknB
>>709
年は365、日は30にするつもりです

>>710
そうです
ちょっと
my @dates = gmtime($a);
やってみます
07127062006/07/19(水) 01:08:22ID:aJ2dkknB
>>710
51101071500

になります
07137062006/07/19(水) 01:25:12ID:aJ2dkknB
ああああ、すいません、ボケてました
ちゃんと>>711でできました

ただ気になるのがある時点での時間を求めるので
月の表示がうまくいきません

$a = 61;
の場合は1分と1秒なのでそのまま0月カウントになりおkなんですが
11月の次が12月を飛んでしまいます
かといって$mon+1;をすると$a=61;のときに1月1分1秒になっていまいます
これは仕様でしょうか?
0714nobodyさん2006/07/19(水) 01:51:28ID:???
ある時間を起点にして「11ヶ月31日59分59秒後」の1秒後は「1年0ヶ月0日0分0日後」

まず小学校まともに卒業してカレンダーと時計の見方を身につけろよ。
0715nobodyさん2006/07/19(水) 02:04:47ID:???
>>713
$mon は "11月" じゃなくて "11ヶ月目" なんだろ? +1する必要なんてない。
まあ $day を -1 してる (らしい) のはよかったと思うよw
07167062006/07/19(水) 02:12:29ID:aJ2dkknB
>>714
なんかおかしいな〜と思ってずっとカレンダー見てました
ようやく謎が解けましたw
ありがとうございます

ただ>>711のようにすると100年を超えると解がヌルになるようです

$a = 31536000000;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($a);
$year = $year-70;
$mday = $mday-1;
print $year."年".$mon."月".$mday."日".$hour."時".$min."分".$sec."秒";

ヌルにしないためにはどうすればいいっすか?
0717nobodyさん2006/07/19(水) 02:19:09ID:WORWfBlM
CGI::Liteを使ってFormからファイルをアップロードするCGIを作っています。
この際、ファイル名にタイムスタンプがついて1153238735__photo.jpgというようになりますが、
この「__photo」の部分を取って「1153238735.jpg」にする方法は無いでしょうか?
Content-dispositionのヘッダを使えばいいらしいですが具体的な方法が解りません。
よろしくお願いします。
0718nobodyさん2006/07/19(水) 02:20:38ID:???
>>716
▽2038年問題
http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95%8F%E9%A1%8C

まあ、そんな気になるなら一定の年数分の時間を最初に引いておけば?
0719nobodyさん2006/07/19(水) 02:25:04ID:???
>>717
rename すればw
07207062006/07/19(水) 02:33:21ID:aJ2dkknB
>>718
わかりました
0721nobodyさん2006/07/19(水) 13:05:06ID:???
コーディングではないのですが、
SSIをmod-perlで動かすにはどうしたらいいんでしょう?
CGIからmod-perl移行時にindexページはindex.html(SSI)からindex.cgiになるように設定したんですが、
GoogleのページランクとかもあるのでSSIを使いたいんですが、、
mod-perlに移行したらSSIが全く効いていないんです(-o-;
呼び出すperlがindex.plだとしたら、それ単体では問題なく実行されるんですが。。
0722nobodyさん2006/07/19(水) 13:13:26ID:???
ぐぐれかす
http://www.google.co.jp/search?hl=ja&q=perl+SSI+mod_perl&lr=lang_ja
0723nobodyさん2006/07/19(水) 13:57:04ID:???
>>722
さんくすこ
0724nobodyさん2006/07/19(水) 19:58:46ID:???
>>716
gmtimeとかって普通に現在時刻+αぐらいを扱うためのものだから、
100ねんとか、それ以上のことやろうとしてるんだったら、
自分でなんか作ったほうがいいと思う・・・
0725nobodyさん2006/07/19(水) 20:00:25ID:???
つ DateTime::Calc
0726nobodyさん2006/07/19(水) 20:03:34ID:+wpVYCo5
perlCGIでIEとIE以外のブラウザで条件分岐をして別のHTMLを渡したいです。
$ENV{"HTTP_USER_AGENT"}
この中の文字列を正規表現とか掛ければいいのでしょうか?

$ENV{"HTTP_USER_AGENT"} =~ /internet explorer/i;

で大丈夫でしょうか?自分はIE6ですので他のバージョン確認できませんので宜しくお願いします
07277262006/07/19(水) 20:05:37ID:+wpVYCo5
まちがえました。

$ENV{"HTTP_USER_AGENT"} =~ /IE/;

これでいいのでしょうか?ちなみにOSは虫です。
0728nobodyさん2006/07/19(水) 20:17:07ID:???
>>726
自分のPCなら火狐とかモジラとかオペラとかインストールして
実験すれば?
あとは、自分のページの中で一番アクセスのあるページでユーザエージェントを記録して、
どういうブラウザのアクセスがあるか観察して判断
07295712006/07/19(水) 20:40:38ID:+wpVYCo5
>>728
この雰囲気からすると、そんな簡単なIEとそれ以外の判別方法は存在しないということでしょうか。
確かに今後IEという文字が入るIE以外のブラウザが出る可能性もありまよもんね。

なかなか制作側には不便な環境なんですね。
レスありがとうございました。
もう少しだけ粘ってみます・
0730nobodyさん2006/07/19(水) 20:47:29ID:???
"MSIE"が含まれてるならIEと判断しちゃっていいんじゃないかな
今のところ、User-Agentに"MSIE"が含まれる一般的なブラウザはIEだけ。
07315712006/07/19(水) 20:48:27ID:+wpVYCo5
http://www.futomi.com/lecture/env_var/http_user_agent.html

これで行こうと思います。
728さんもよければ参考にしてください。
それでは失礼します。
07325712006/07/19(水) 20:50:23ID:+wpVYCo5
>>730
どうやらOperaが危ないようです。

$ENV{"HTTP_USER_AGENT"} =~ /MSIE/ and $ENV{"HTTP_USER_AGENT"} !~ /Opera/;

これで90%程度はいけるのではないかと思いますが。
0733nobodyさん2006/07/19(水) 21:00:22ID:PWLYocjq
-wって使ってみました。膨大な数の

Use of uninitialized value in substitution (s///)

というエラーが出ました。例えば下記の場合、@_が問題っぽいんですが、
どのように直したらいいでしょうか。

sub reformat_date {
my %args = (date => '', @_);
my $tmp = $args{'date'};
$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/;
return $tmp;
}
0734nobodyさん2006/07/19(水) 21:04:25ID:???
宣言しただけで値が格納されていない変数に対して値を読み込もうとしたからです。
07357282006/07/19(水) 21:13:16ID:???
>>731
なるほど、参考になりました(ぉ
0736nobodyさん2006/07/19(水) 21:21:25ID:???
&reformat_date('20060719') ;
してるものと仮定して。
my %args = (date => $_[0] );

つかこれだけだったら、%args てまったくの無駄なんだけど…
で、入力は何?
0737nobodyさん2006/07/19(水) 21:22:42ID:???
入力フォームからpostで次のページにデータを渡して移行した後、
ブラウザの「戻る」を押すと、入力フォームにデータが残ってる状態です。

二重のpostを防ぐために、postした後、戻るを押すと、
「ページの期限切れ〜」みたいな表示にする方法は無いんでしょうか?

0738nobodyさん2006/07/19(水) 21:23:48ID:???
だけどサーバー側でブラウザ判断する必要があることってそんなあるのかな?
0739nobodyさん2006/07/19(水) 21:26:12ID:???
>>737
その工程は二重投稿と言わないようなw
07407332006/07/19(水) 21:34:01ID:???
どうもです!入力は736のような感じです。名前付引数に統一した関係で、
こういうシンプルなのも%argsになってます。736さんのように変更してもだめでした。

ていうか、全く同じ関数をテスト用のシンプルなコードに書いたら
エラーがでませんでした。-wは呼び出し元との兼ね合いでもエラー出すんでしょうか。
0741nobodyさん2006/07/19(水) 21:36:59ID:???
>>740
reformat_date( date => $hoge )
とかやってて、$hoge が未定義(undef) なんじゃないの?

$tmp =~ s/(\d\d\d\d)(\d\d)(\d\d)/$1-$2-$3 00:00:00/ if (defined $tmp);
とかにしてみればどうよ
07427332006/07/19(水) 21:37:48ID:???
すいません、736さんので改善されてました!失礼しました。
07437332006/07/19(水) 21:43:08ID:???
741さんのおっしゃる通りでした!
呼び出し側が場合によって未定義のときがあったのが原因でした。
てっきり、字面だけでデバッグされているのかと勘違いしてましたので
呼び出し側をチェックしてませんでした。
ありがとうございました!
0744nobodyさん2006/07/19(水) 21:45:46ID:???
>>738
なに言ってんだ?
「そんなある」「そんなない」
恐ろしくどうでもよくね?
0745nobodyさん2006/07/19(水) 22:22:19ID:???
>>737
pragma no-cacheあたりで検索

まあ、そういう仕様の板が便利かどうかは微妙な気もするけど、
むしろ、パスワードで削除機能とかの方がエレガントなような・・・?(作るのはめんどくさいけど
0746nobodyさん2006/07/19(水) 23:49:53ID:???
>>745
答えるなら最後まで答えてやれよ。
なんか見てて気持ち悪いわ。
0747nobodyさん2006/07/20(木) 00:14:49ID:???
print "content-type:text/html\n";
print "pragma:no-cache\n\n";
とかこういうこと?それともパスワード機能の実装の仕方自体語れってこと?
後者だったら拒否w
0748nobodyさん2006/07/20(木) 00:42:07ID:EXDq6RmQ
すみません、初心者の質問なんですが

sub main{
  local @tmp = ("aa","bb");
  print "$tmp[0]"."  "."$tmp[1]\n";
  &subroutine(\@tmp);
  print "$tmp[0]"."  "."$tmp[1]\n";
}

sub subroutine{
  local $tmp = @_[0];
  $tmp = ("cc","dd");####################################
  print "$tmp->[0]"."  "."$tmp->[1]\n";
}

というコードを書きました。
しかし#############の行でエラーになってしまいます。
要するにmainルーチンから@tmpのポインタを送ってサブルーチン側では@tmpに("cc","dd")を代入したいのです。

サブルーチンで
$tmp->[0] = "cc";
$tmp->[1] = "dd";
とやれば済むのですが、こうではなくて = ("cc","dd")という風に代入したいのです。(実際はsplitとかを使って代入するから)ポインタを使ってどういう風にしたらよいかわかりません。ご教授おねがいします。
0749nobodyさん2006/07/20(木) 00:48:05ID:???
sub subroutine{
 @{ $_[0] } = ("cc", "dd");
}
こういう事?

他の部分に関してはつっこんだら負けかなと思っている
07507482006/07/20(木) 00:50:00ID:EXDq6RmQ
>>749
即レスありがとうございます。
そのようにやったらできました、ありがとうございました!
0751nobodyさん2006/07/20(木) 02:46:41ID:???
>>749
超能力者か!?
0752nobodyさん2006/07/20(木) 03:30:07ID:???
>>751
お前の考えてる事も全部まるっとお見通しだ! 「セクロスシテー」「カネホシー」「ハタラキタクネー」だろ!
0753nobodyさん2006/07/20(木) 08:26:39ID:???
>>752
違うよ。
「あぁ。ねれねぇ。明日起きれるかな・・・・・」
だよん
0754nobodyさん2006/07/20(木) 09:22:01ID:???
朝っぱらから明日の心配イクナイ
0755nobodyさん2006/07/20(木) 09:42:37ID:???
while(@row){substr $_,0,-1} if $754 == 1
0756nobodyさん2006/07/20(木) 11:10:49ID:OwGfxror
test.cgiとaccess.cgiがありまして。
test.cgiが呼ばれたときにtest.cgiの中で、まず初めにaccess.cgiを起動実行させてから
test.cgiの本処理に映りたいのですがさすがに無理でしょうか?

access.cgiはgif画像を一つ返してくるだけです。
07577562006/07/20(木) 11:37:22ID:OwGfxror
# ユーザ・エージェント オブジェクトを作成
use LWP::UserAgent;
my $ua = new LWP::UserAgent;
$ua->agent('AgentName/0.1'.$ua->agent);
# リクエストを作成
my $req = new HTTP::Request(POST => 'http://hoge.com/access.cgi');
$req->content_type('application/x-www-form-urlencoded');
$req->content("id=get");
# ユーザ・エージェントにリクエストを渡し、返されたレスポンスを取得
my $res = $ua->request($req);
# print $res->is_success;

昔作ったCGIから拾ってイジッテいちおうこれで呼び出しはできたのですが、
access.cgiに自分のとは違うIPが記録されてしまうようです。

アクセス管理CGIの都合上できればIPが別のものになってほしくないんです。
また、できればネット経由でない方法で呼び出せればと思ったのですが。
cron使用の呼び出しと同じような感じができて、さらにIPが自分のものか127.0.01とかなら最高なんですが。

どうぞ玄人の方お助け宜しくお願いします。
0758nobodyさん2006/07/20(木) 11:47:34ID:???
hoge.comを勝手に使わないように。攻撃依頼で削除申請するか?
0759nobodyさん2006/07/20(木) 12:01:19ID:WCdGbBzj
linux上のperlで書いたCGIから、majordomoの設定ファイル(majordomo.cf)にアクセスさせようとしています。
ところが、openでエラーになります。

majordomoのファイルが

オーナー:mail
グループ:deamon
属性:777

なのが原因だと思うのですが、このファイルを上記条件から書き換えるようにするには、cgiのプログラム
からどのようにしたら良いでしょうか?
0760nobodyさん2006/07/20(木) 12:12:22ID:???
777で開けないなんて普通はないんだがな。openがエラーになってるとわかってるなら
$!の値も示せよ。
07617562006/07/20(木) 12:13:08ID:OwGfxror
誰もわかりませんでしょうかm(__)m
0762nobodyさん2006/07/20(木) 12:16:44ID:???
>>758
その理屈ならYAHOOは死刑になっちゃいそうな勢いだな。
あんな有名なサイトが無許可で他人のサイトのアドレスを晒しまくって。
とりあえず削除申請してこいよ。
07637562006/07/20(木) 12:24:17ID:OwGfxror
>>762
荒れるから止めて欲しいのですm(__)m
私あてのレスです。
本人である私がスルーしてるのですから、察してくださいませんか。

宜しくお願いします。
0764nobodyさん2006/07/20(木) 12:35:40ID:???
>>756
system('perl access.cgi');とか?
というか、そのaccess.cgiの返してくる画像は必要なんですか?
画像だけが、必要なら<img src="access.cgi">とか?
でも、そのくらい知ってそうっていう雰囲気ですよね・・・・・・・・
なんだろう・・・
07657562006/07/20(木) 12:46:10ID:OwGfxror
>>764
言葉足らずだったかもしれません。ごめんなさい。
access.cgiはアクセスログを取っていくcgiなんです。
test.cgiは今仮で作ってるアクセス解析cgiなんです。

test.cgiからaccess.cgiを呼びたいのは最新の情報を読みたいからなんです。
つまりaccess.cgi直後のaccess.logが一番精度が高いわけです。

秒単位で誰がどこにいるかを表示してますので意外と重要なのです。
ですからaccess.cgiからの戻り値はまるでいりません。
要はaccess.cgiに処理をさせればいいだけなんです。
それこそ最悪access.cgiの中身をtest.cgiに書いて解決です。あまりにひどい決着ですが。
返してくるgif画像自体はまるでいりません。

長文すみません。ご飯を食べてまいります。
0766nobodyさん2006/07/20(木) 13:09:01ID:???
架空のドメインを例示するときは予約されているexample.comとかexample.jpにするべきだと思うよ。
07677562006/07/20(木) 13:10:51ID:OwGfxror
>>766
exampleですね。ありがとうございます。
以後そういたします。
0768nobodyさん2006/07/20(木) 13:13:04ID:???
access.cgiの内容をモジュールにして両方から呼び出せるようにすりゃいい
その前になぜかむかつくんだがなんでだぜ?
0769nobodyさん2006/07/20(木) 13:20:02ID:???
しかもh○ge.comって実運用されてるんだからさぁ。
07707592006/07/20(木) 13:32:32ID:WCdGbBzj
$! は Permission Denied です。

権限の問題だと思うのですが・・・どうすれば処理できるでしょうか?
07717562006/07/20(木) 13:32:50ID:OwGfxror
>>768
呼び出したいがためだけにaccess.cgiに手を加えるのは避けたかったです。
他のケースのときでも全部そうなってしまうのは愚の骨頂みたいに思ってましたが
その認識が間違ってるのですかね。

ちょっとガッカリです。
0772nobodyさん2006/07/20(木) 13:37:48ID:???
requireじゃいけんの?
0773nobodyさん2006/07/20(木) 13:38:45ID:???
>>770
ファイル自体が777なのでそれは問題ないと思うから経由するディレクトリだろうな。
どういう風にパス指定しているのかは知らないが関係するディレクトリを全部確認してみ。

0774nobodyさん2006/07/20(木) 13:40:32ID:???
>>732
ちょい亀レスだがOpera10から完全にIEに偽装する機能が実装されてるよ
0775nobodyさん2006/07/20(木) 13:44:36ID:???
>>774
へぇ。Operaは何がしたいんだろう・・・・
そもそも偽装するなよって話だよな。製作者への嫌がらせとしか思えない。
製作者協会とかあればなぁ。ふざけた実装を排除していけるのに。

>>768
まあまあ。今日はなかなかすごしやすい気温なんだからおっとりしようぜ
0776nobodyさん2006/07/20(木) 13:46:18ID:???
>>775
逆にagent調べてIEじゃないってだけで門前払いなサイトもよくあるわけで、
どっちもどっちだね。
0777nobodyさん2006/07/20(木) 13:48:44ID:???
なんか俺がガッカリされたみたいだ・・・(´・ω・`)
07787562006/07/20(木) 13:55:49ID:OwGfxror
>>777
いえ、それは勘違いですよ・・・(´・ω・`)
0779nobodyさん2006/07/20(木) 13:58:35ID:???
XHTML+CSSで凝ったサイト作ろうと思ったことある奴なら
UAにIEを含んだらヤフにでも飛ばしたろとか思ったことあるはずだ
0780nobodyさん2006/07/20(木) 14:05:54ID:???
>>776
違うよ。
>>779
ん?なんか変だぞ?
そもそも「XHTML+CSSで凝ったサイト作ろうと」ってのがどうなんだろうか。
XHTMLやCSSは目的を果たすための一つの手段に過ぎないというのに、
その手段を目的としてるということは、何かを伝えたいんじゃなくて、使いたいだけという可能性もあるな。
それこそIEの挙動なんて無視すればいいじゃない。使いたいだけなんだから。

なんちゃって。人間がそれほど単純なら苦労はないよね。
やっぱり制作協会ってのがあればいいと思うんだよな。
0781nobodyさん2006/07/20(木) 14:08:55ID:???
なんか俺が勃起したみたいだ・・・(´・ω・`)
0782nobodyさん2006/07/20(木) 14:10:18ID:???
>>765
access.logの内容はIPとかUAとか時刻とかがずらずら並んだ状態ですか?
もしそうだったら、別にいつ読み込んでも、新鮮とか新鮮じゃないとか
関係ない気がしますが・・・
それとも、なんか特殊な、フォーマットのデータがaccess.logには含まれてるんでしょうか?
07837592006/07/20(木) 14:11:14ID:WCdGbBzj
アクセスしようとしているのが、

/usr/local/majordomo/lists/ なので上位全ての777にするのは気がひけます。
listsだけは 777 にしみましたが、同じエラーでした。

linuxのfs設定で何かあるのでしょうかねぇ?
07847562006/07/20(木) 14:14:40ID:OwGfxror
>>782
ありがとうございます。
ずらずら並んだ状態です。
アクセス時刻ももちろん並んでおります。アクセス時刻が一定を過ぎると削除し
リアルタイムで誰がどこにいるかをある程度特定するアクセスプログラムになっております。

ですので新鮮さは重要なのです。
でももう最悪の方法で片付けてしまいました。せっかくご親切に気に掛けていただいたのにすみませんです。
access.cgiの一部をそのままコピペしましたtest.cgiにorz
0785nobodyさん2006/07/20(木) 14:18:25ID:???
>>784
いや、まあ、それで正解だと思う・・・<貼り付け
そんな長くなさそうだし、
0786nobodyさん2006/07/20(木) 14:19:19ID:???
コピペするぐらいならその時点でカプセル化しとけ
また同じこと繰り返すことになるぞ
0787nobodyさん2006/07/20(木) 17:29:45ID:gqKAMnqO
どなたかお手すきの方いらっしゃいましたらお助けください

1)combbslog.cgiというファイルを一行読み込んで
$rl,$yl,$gl,$wl,$blにそれぞれの値を代入して
すべてが1より大きければ実行する。
プログラムを書いてみたつもりです。

ちなみにcombbslog.cgiの中身は


<>1<>3<>1<>1<>1<>

↑こんな感じです


2)open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);
local($rl,$yl,$gl,$wl,$bl) = split(/<>/);

if(($rl > 1) && ($gl >1) && ($yl > 1) && ($wl > 1)){実行したい内容;}

3)とくにエラーなどは出ないのですが条件を満たしていても実行されません。

ファイルを読み込む当たりが良くわかっていないのでそのあたりがおかしいのではないかと思っています。
どこかおかしいところがありましたら教えてください。
0788nobodyさん2006/07/20(木) 17:38:15ID:???
データファイルに*.cgiという拡張子をつけるのはおかしい。

とりあえず
print $rl,$yl,$gl,$wl,$bl;
してみろ
0789nobodyさん2006/07/20(木) 17:44:06ID:???
>>787
if文の所。
>
の演算子の意味はわかってるよね?1には反応しないよそれじゃあ。2からだな
だからファイルの中身が全部2以上なら実行されるだろうね。
0790nobodyさん2006/07/20(木) 17:48:57ID:???
>>787
$rlの値がいつも空になると思うよ。

split(/<>/) だと
$rl<>$yl<>$gl<>$wl<>$bl<> こうでしょ。

>>788
> データファイルに*.cgiという拡張子をつけるのはおかしい。
( ´_ゝ`)・・・

>>789
すべてが1より大きければ実行する。ってことだからいいんじゃないの
07917892006/07/20(木) 17:53:54ID:???
>>790
よっ!さすがだな、おまい
07927872006/07/20(木) 18:00:12ID:???
こんなにも早くレスがついてるとは思いませんでした。

とりあえず全部2以上にしてみて
あと$rl<>$yl<>$gl<>$wl<>$bl<>にしてみますね

07937872006/07/20(木) 18:13:32ID:gqKAMnqO
レス下さったかたがたありがとうございます。
上記のことをやってみましたが出来ませんでした・・・
ためしに
print $rl,$yl,$gl,$wl,$bl;
しても何も表示されなかったのでどこか他のところがおかしいのかな?

以下にプログラム全文載せますので、もしよろしかったらまたお願いします。


-selectcol.cgi-

#!/usr/bin/perl --

open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
local(@file) = <IN>;
close(IN);

local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);

print $rl,$yl,$gl,$wl,$bl;

__END__

-combbslog.cgi-

1<>2006/07/20(Thu) 00:06<>blackh.gif<><><>北朝鮮がミサイルを発射することで国際社会からより疎外されている<><>127.0.0.1<><>1153321603<>2<>2<>2<>2<>2<>

0794nobodyさん2006/07/20(木) 18:17:11ID:???
>>788
  .r‐――'i   / > _         ,ノ~';;.    .....,,、 l´゙|゛           |´゙l゙        ,,,,,,,...... --、,
  . ̄ ゙̄} |  / ./ .;;./ '、         / ,./      ,! ./____| |__________、  ,,............-! !ー'''"゙.l     .ヽ --‐= /
  .r‐―" |'l゙_,,, ̄'i --、'ッ    / /      ./ ...........、 ,,................,!   ゙‐'ー''''''''''、 '.l゙´_,,,, 、      /./
  l |゙゙゙゙"'".._.... ! .|........ニ   / /       / /   ||       .l'''''''''''''''''''_.゛,,.... --′   ./ .イ-―ー 、
  ! .―--ィ .! .r‐''i .r‐‐i !  ..l ヽ.       ゙'/l'''''''''''''′゙'''''''''''''''i   `゙゙゙゙゙゙´゙_,゙,゙,,,,゙;;..\,    ./ ,..-''''^゙゙゙゙゙''''、 ヽ
  .゙‐'"^゙| ! .| .゙‐'''" !―" |    \ .\.       `゙゙゙゙゙゙゙゙゙| .!゙゙゙゙゙゙゙゙゙´    ,r'",, ---- ..,,/   < /        .| |
     .| ! .゙‐'゙゙゙゙゙! .!゙゙.l゙'│     .\. ゙'-,            ,! !        ! l゙              ゛       ._./ ./
  .,,,,,,,ノ !.r‐―ー" ゙''二、ヽ      .\ .゙>  .!^^^^^^^^^゛ `^^^^^^^^.!  .\`'''''''''''''''''''''>       'l'''''''''^゙゙_,,..-'゛
  .ゝ--‐゛ ゙‐''"゙ ̄´゛  `'´        `   . ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄゛    `゙゙''''''''''''''''"         ̄ ̄゛
0795nobodyさん2006/07/20(木) 18:19:15ID:???
この場合
local(@file) = <IN>;
ぢゃなくて
@_ = <IN>;
なら動くんで内科医?
0796nobodyさん2006/07/20(木) 18:19:15ID:???
良い悪いは別にしてデータファイルに*.cgiという拡張子をつけるのはおかしいだろw
あえてソコだったんだがただのかわいそうな人になってしまったw
0797nobodyさん2006/07/20(木) 18:20:27ID:???
>>796
おかしくないよ
他人に見せないためにも*.cgiにしたほうがいいと思うよ。
07987872006/07/20(木) 18:25:43ID:gqKAMnqO
またしても即答ありがとうございます。
>>795さんのいうとおりにしたら
error500

CGIエラー-Content-Typeヘッダが正しくありません。

とでてしまいました。これはどういうことでしょうか?
0799nobodyさん2006/07/20(木) 18:25:51ID:???
>データファイルに*.cgiという拡張子を付けることがおかしいだろw
おかしいと思う理由が知りたいんだが
0800nobodyさん2006/07/20(木) 18:27:34ID:???
combbslog.cgiのパーミッションは適切か確認汁
0801nobodyさん2006/07/20(木) 18:29:28ID:???
CommonGatewayInterfaceなファイルではないからおかしいという理論
っつーかもう触れないでくれw
どおりで俺の冗談には誰も笑わないわけだ
0802nobodyさん2006/07/20(木) 18:32:24ID:???
>>801
冗談にして逃げるわけねw
0803nobodyさん2006/07/20(木) 18:32:45ID:???
> local(@file) = <IN>;
> close(IN);

> local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);

$_ に何入ってんだよwww

foreach (@file) {
local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);
・・・
}

こうしたいんじゃねえのかい?
0804nobodyさん2006/07/20(木) 18:33:56ID:???
ああん更新し忘れた(ノ∀`)ペチ
0805nobodyさん2006/07/20(木) 18:34:18ID:???
>>798
print "Content-type: text/html\n\n";
を出力の前に入れないと駄目でしょ。

それと>>793が全文だとすると、sub error はいずこへ
0806nobodyさん2006/07/20(木) 18:35:10ID:???
>>802
逃げさせてくださいw
0807nobodyさん2006/07/20(木) 18:35:31ID:???
>>798
ブラウザでやってんの?

なら
つ【print "Content-type: text/html;\n\n"】
0808nobodyさんNGNG
突っ込み所が多すぎて
08097872006/07/20(木) 18:41:17ID:gqKAMnqO
はい、ブラウザでやってます。AN HTTPD というソフトでローカルチェックしてるところですから
パーミッションの設定はまだ関係ないですよね。
08107872006/07/20(木) 18:44:23ID:gqKAMnqO
突っ込みどころ多くて申し訳ないです。

>>803さんや>>805さんのとおりにしてみたらエラーは出なくなりました。
ただ何も出力されてきません。
0811nobodyさん2006/07/20(木) 18:48:34ID:???
デバック方法は自分で考えなよw

とりあえず
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
print <IN>;
close(IN);

とかからやってみたら。
あと無意味に local 使ってるのが kentくさくてイヤ。
08127872006/07/20(木) 18:51:54ID:???
>>811さん
  はい、デバックは自分で頑張ってみますね。
Kentさんのところをすごく参考にしていたのでそうなってしまいました。
08137872006/07/20(木) 18:55:45ID:gqKAMnqO
はやくもまた質問で申し訳ないのですが
ファイルを読み込むとき
最初の一行だけを読み込むとか出来ますか?
08147892006/07/20(木) 18:57:06ID:???
今日はみんな親切だな。
まあ雨がひどいからな。

0815nobodyさん2006/07/20(木) 18:58:03ID:???
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
$data = <IN>;
close(IN);
0816nobodyさん2006/07/20(木) 19:00:43ID:???
親切だなw

もう俺なら 「どこの講座でもいいから一回全部読んで来い」 っていう。 >>576 のでもいいから。
08177872006/07/20(木) 19:02:37ID:???
ほんとうに親切にありがとうございます。
雨の日でよかったです。
08187872006/07/20(木) 19:18:46ID:???
望んでいた事が出来ました!!
本当にありがとうございました。
花火大会を中止に追い込んだにっくき雨でしたが、
いまでは感謝しています
0819nobodyさん2006/07/20(木) 19:47:26ID:???
とかいって、回答者の実に半数は晴れでも出かける予定はなかったり・・・
0820nobodyさん2006/07/20(木) 19:56:23ID:???
ここまで話がはずんだのは>>788のおかげだとオモ
0821nobodyさん2006/07/20(木) 20:18:14ID:???
照れるじゃまいか
0822nobodyさん2006/07/20(木) 23:14:01ID:???
しかしあれだよな。
IE7って最高だな。
0823nobodyさん2006/07/20(木) 23:25:57ID:???
Acid2もクリアできないブラウザは嫌いだ
0824nobodyさん2006/07/20(木) 23:27:54ID:???
Perl7もたぶん最高
0825nobodyさん2006/07/20(木) 23:55:28ID:???
実装も存在しない言語は嫌いだ
0826nobodyさん2006/07/21(金) 01:52:13ID:VvqLR3Fu
コードの中で、自分自身が書かれている行数(行位置)を知ることはできるでしょうか。
例えば、「この文字列はindex.cgiの563行目で出力されました」と動的に出力できますか?
0827nobodyさん2006/07/21(金) 01:53:59ID:???
print __LINE__, "\n";
0828nobodyさん2006/07/21(金) 01:56:42ID:???

1: 自分は明日休みで暇だから・・・
2: なんかおまいらにコーディングの問題でも出して・・・
3: みようかな・・・

問題
・DATログをGrepして表示する
・検索語は任意の文字
・表示方法は100個づつ

最速コーディング達成者には妹の入浴画像を賞品(ry
0829nobodyさん2006/07/21(金) 02:00:29ID:???
>>827
おお!感動しました。そんな簡単にできたんですね。
エラー処理関数内でdieしたらデバッグの役に立たない行数がログに残るので
その対策をと考えておりました。ありがとうございます!
0830nobodyさん2006/07/21(金) 02:16:23ID:???
>>829
そういうことなら最後に改行を付けなさい。それで消えるから。
08318302006/07/21(金) 02:20:35ID:???
あ、ごめん。なんか凄い勘違いしたきがする。
呼び出し元の行をログに書きたいならcaller関数をあたると良い。後Carpモジュールも
0832nobodyさん2006/07/21(金) 02:24:01ID:???
あ、すみません、分かりづらくて。
丁度、callerを発見して感動して、その報告をしに来たところでした。
ありがとうございます!
0833nobodyさん2006/07/21(金) 03:50:54ID:???
ちょっと感動しすぎだろ
0834nobodyさん2006/07/21(金) 10:04:09ID:???
今日も雨だな・・・・
注文こねえかな
0835nobodyさん2006/07/21(金) 10:25:40ID:???
1.list.txtというファイルを読んで、一行ずつチェックボックスにするcgiを作ろうと思いました。
チェックされた項目は別ファイルに時刻付きで書き出すつもりでした。
2. ttp://marco.s4.xrea.com/cgi-bin/check/check.cgi
 を元にいろいろ変えて見てます。
3.入力フォームからpostでデータを渡して、表示上はどのチェックボックスもオンではないのに、
ブラウザをリロードすると、前にチェックされたデータが再度チェックされてます。
これは、どうしてでしょうか?
初心者で、不具合をうまく言えなくてごめんなさい。またこちらでの書き込みが不適切でしたら、該当スレをご教示いただければ有りがたく存じます。

下記は、ソースの一部分です。
print "<form action=$script method=post>\n";
print "<tr><td bgcolor=$page_color><font color=$bg_color>Check</font></td>\n";
print "<td bgcolor=$page_color><font color=$bg_color>項目</font></td></tr>\n";
open(LST,"$listfile");
@LIST=<LST>;
close(LST);
$cnt=0;
foreach (@LIST){
chomp($_); #chomp 行末の改行を削除
$cnt++;
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
}
print "</table>\n";
print "<input type=hidden name=checkcnt value=$cnt>\n";
print "<input type=submit value=送信>\n";
print "</form>\n";
 
0836nobodyさん2006/07/21(金) 10:31:20ID:???
http://pc8.2ch.net/test/read.cgi/php/1143834740/
http://pc8.2ch.net/test/read.cgi/php/1141174205/
0837nobodyさん2006/07/21(金) 10:43:47ID:???
>>828
すまんが問題の意図が掴めん。

そして妹の入浴姿より姉の下着姿のほうがやる気が出る。
0838nobodyさん2006/07/21(金) 12:09:34ID:NKhAgGvd
本当にくだらないことで申し訳ないのですが、
入力されたURLが正しいURLかを判断するソースはどのようになるのでしょうか?
メールアドレスを判断するスクリプトは何とか分かるのですが、
URLとなると・・・どのようにしたらよいか・・・・
0839nobodyさん2006/07/21(金) 12:17:55ID:???
>>838
ttp://www.din.or.jp/~ohzaki/perl.htm#httpURL
まあここまでやらなくてもいいと思うが
0840nobodyさん2006/07/21(金) 12:19:14ID:???
>>838
>>9
テンプレの過去ログ部分うぜえな
0841nobodyさん2006/07/21(金) 12:25:52ID:???
「『URI』?ぷっ、それって『URL』のこと?『url』と『uri』見間違えてそのまんま覚えてやんのw」
とよくバカにされるんですが、どうしたら良いでしょうか?
0842nobodyさん2006/07/21(金) 12:30:03ID:???
>>841
スレ違い、そしてその人は無知
ttp://www.kanzaki.com/docs/html/htminfo-uri.html#uri
ttp://www.alib.jp/html/uri.html
0843nobodyさん2006/07/21(金) 12:31:22ID:???
まじめに説明するのは疲れるので相手を見て使い分け。
0844nobodyさん2006/07/21(金) 12:59:56ID:???
そして葛藤しろ
0845nobodyさん2006/07/21(金) 15:15:48ID:???
下のコードが無限ループになるのはなぜでしょう?

--ここから--
my $param = '123a456';
my $n = '';
for (;;) {
$param =~ s/[0-9]+//;
$n = defined($&) ? $& : '';
print 'debug $n='.$n.' $parm='.$param."\r\n";
last if ($n eq '') ;
}
print 'end';
--ここまで--

とりあえず for(;;0) のように第三パラメータになんでもいいから
突っ込めば $& が再評価されてループを抜けるのはわかったが、Bad
Know-How くさいので正しいコードを誰か教えて。
0846nobodyさん2006/07/21(金) 15:33:56ID:bw5ViySC
「スペース(全角・半角問わず)があれば、そのスペースも含めてそれ以降の文字列を全て除去」
というのを正規表現で書くとどうなりますか?
0847nobodyさん2006/07/21(金) 15:36:13ID:???
ちょっとは考えろ
こうやったけどこうなってできませんでした、とか
0848nobodyさん2006/07/21(金) 15:39:23ID:???
>>845
$&はThe string matched by the last successful pattern match なので
マッチしなくて置換が行われなかったときに値が変わるのを期待する方が
危険な気がする。s///は置換に成功したかどうかを返すのでそれで分岐
するのが筋じゃないかと。

forの第三パラメタがあったときに値が変わるほうがむしろ不思議だな。

どっちにしろ成功したパターンマッチのすぐ後以外のところでマッチ関係の
変数($<数字>とか$&とか)を使うのは怖いので自分ならしない。
08498462006/07/21(金) 15:49:32ID:bw5ViySC
考えてみたものの分かりませんでした。
$moji =~ s/ / /g;
my ($temp undef) = split(/ /,$moji);
08508452006/07/21(金) 16:05:32ID:???
>>848
サンクス
$& はマッチしなかった場合 undef になるというのをどっかで読んだんだが。
defined($&) の条件分岐はしないほうがいいてこと?でも for(;;0)のときには
ちゃんと評価されるのが謎なんだよな。
0851nobodyさん2006/07/21(金) 16:08:33ID:???
>>845
perl -MO=Deparse foo.plで for(;;) とfor(;;1)を比べてみたが、

for(;;)の方は単純に

while(1) { ... }

になるのに対して、for(;;1)の方は

while (1) { do { ... }; '???'; }

となってループ内の実行文がdo ブロックの中に入るかたちに
なっていた。このためfor(;;)の方では最後に成功したマッチが
456の置換になるのに対して、for(;;1)の方ではこのループに入る
前(一度もないのでundef)になるのだろうと思われる。

ちなみに、プログラムの先頭に 'hoge' =~ /.*/; を追加して
for(;;1)を試すと3回目からhogeになる。
08528452006/07/21(金) 16:35:45ID:???
ちょっと動作はちがうけど、これでいいのか。ありがと。
my $param = '123a456';
my $n = '';
while (1) {
last unless ($param =~ s/[0-9]+//);
$n = $&;
print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0853nobodyさん2006/07/21(金) 17:08:27ID:???
普通whileに入れちゃうんじゃないかな
my $param = '123a456';
my $n = '';
while ($param =~ s/[0-9]+//) {
 $n = $&;
 print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0854nobodyさん2006/07/21(金) 18:08:00ID:???
>>849
絶対こいつは考えてない
0855nobodyさん2006/07/21(金) 18:24:05ID:???
s/>>846|>>849//g;
0856nobodyさん2006/07/21(金) 18:49:30ID:???
>>846
s/\s.*//; かな? split を使うなら、第三引数に1がいいかも

>>853
my $param = '123a456';
while ($param =~ s/([0-9]+)//) {
 print 'debug $n='.$1.' $parm='.$param."\r\n";
}

$& を使うと全体が遅くなるから、キャプチャした方が良くない?
0857nobodyさん2006/07/21(金) 19:06:38ID:???
まあ速さについては前レス嫁ってことだなー。
0858nobodyさん2006/07/21(金) 20:22:51ID:???
cgiなのに速さ?
余程凄いもん作るわけ?

俺はちょくちょく書き換えるから最適なコードなんて求めない。
早く仕上げることの方が面白いしね。
漫画みたいにズダダダダダーって物事を進めていくのが面白いんだよ。

っていうか画像サイズとかをかんぺきにするだけでじゅうぶんだそ。
0859nobodyさん2006/07/21(金) 20:47:36ID:???
日本語でおk
0860nobodyさんNGNG
速い方が気分が良い
0861nobodyさん2006/07/21(金) 21:41:57ID:???
>>858
( ´,_ゝ`)プッ
0862nobodyさん2006/07/21(金) 23:54:16ID:???
>>858
>>858
>>858

0863nobodyさん2006/07/22(土) 01:07:15ID:???
ズダダダダダー
0864nobodyさん2006/07/22(土) 01:25:10ID:???
速くしたいなら画像サイズとかをかんぺきに!
0865nobodyさん2006/07/22(土) 01:29:11ID:???
↓そろそろ>>858が「大量に釣れた(藁」とか書き込む
0866nobodyさん2006/07/22(土) 05:06:31ID:???
ちょっとコーディングの質問なんですが

foreach $test (@test){
print "$test";
}



foreach $test (@test){
$test .= $test;
}
print "$test";


とではどちらが鯖負担の軽減、高速化になりますか?
0867nobodyさん2006/07/22(土) 05:30:37ID:???
>>866
上。だってやってること違うじゃん。
foreachよりforの方が速いから、上の方のもっと速くするには
for(@test){
print;
}
0868nobodyさん2006/07/22(土) 05:33:09ID:???
grepについて質問です。
agroupeの要素がbgroupeに含まれていれば、ok!と出力し、
入っていなければ、その要素を出力するスクリプトがうまくいきません。
@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for(@agroupe){
if(grep(/^$_$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
これでやると全部入っていることになっちゃうんですが、どこが間違ってるでしょうか。
0869nobodyさん2006/07/22(土) 05:40:00ID:???
>>868
@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for my $word (@agroupe){
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
0870nobodyさん2006/07/22(土) 05:43:37ID:???
でも grep でいちいち探していたら時間がかかるので、一旦ハッシュに入れる事をオススメします。

@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);

my %bgroupe = map { $_ => 1 } @bgroupe;
for (@agroupe){
  if(exists $bgroupe{$_}){
    print "ok!\n";
  } else{
    print $_, "\n";
  }
}
0871nobodyさん2006/07/22(土) 05:47:20ID:???
>>869
ありがとうございます。
そうか、grepの場合、$_にはそのループのデフォの$_じゃなくて
比較対象の要素が入ってるんですね。前も引っかかったのに忘れてて
小一時間損したぁぁ。
ちなみに
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $word, "\n"; # print $_, "\n";だと何も出てこない!
}
0872nobodyさん2006/07/22(土) 05:49:11ID:???
>>870
ハッシュを使えば速いんですね。確認しました。ありがとうございました。
0873nobodyさん2006/07/22(土) 09:05:18ID:???
>>835
本当にそのコードなんだったらチェックは付かない。
しかし実際は、そのコードからは出力されるはずのない
<tr><td><input type=checkbox name=chk1 value=1 checked></td><td>洗顔</td></tr>
という行が出力されている。(checkedの部分が問題
つまり
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
の2行の間に「すでにチェックされたかどうか」を判定するコードが実際には入ってると考えられる。
その部分のコードを削除すればたぶんOK
0874nobodyさん2006/07/22(土) 17:39:40ID:???
そろそろ
my $foo = "hoge";
print "$foo";
みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
>>866 みたいなやつ。

ダブルクォートで囲うと新しい文字列を作る事になるから
上のような場合は、ただの無駄にしかならない
($fooと全く同じ文字列を作って表示している)。

一体、どこで習ってくるんだろう。
KENTもそこまで酷くないよね?
0875nobodyさん2006/07/22(土) 17:41:47ID:???
このスレって日によって温度差かなりあるよね。
0876nobodyさん2006/07/22(土) 18:08:55ID:???
最適化されて消えるでしょ。
$fooと同じ文字列をわざわざ作るなんて馬鹿なコンパイラはない。
0877nobodyさんNGNG
ベンチ取ったら5倍も違ったー
0878nobodyさん2006/07/22(土) 18:50:39ID:???
>>876

$ perl 876.pl 2>/dev/null
Benchmark: timing 1000000 iterations of bare, quote...
bare: 2 wallclock secs ( 0.78 usr + 0.53 sys = 1.31 CPU) @ 762776.51/s (n=1000000)
quote: 1 wallclock secs ( 0.96 usr + 0.56 sys = 1.52 CPU) @ 657030.22/s (n=1000000)

$ cat 876.pl
use Benchmark;

my $foo = 'bar';
timethese(1_000_000,
{'quote'=>sub {print STDERR "$foo";},
'bare'=>sub {print STDERR $foo;},
});
0879nobodyさん2006/07/22(土) 18:55:33ID:???
DWIMの言語なわけで、プログラマーのわがまま通りにかけるのも
魅力のひとつだと思う・・・
0880nobodyさん2006/07/22(土) 19:40:53ID:???
$ perl 876.pl
Benchmark: timing 1000000 iterations of bare, quote...
bare: -1 wallclock secs ( 0.11 usr + 0.00 sys = 0.11 CPU) @ 9090909.09/s (n=1000000)
(warning: too few iterations for a reliable count)
quote: -1 wallclock secs ( 0.20 usr + 0.00 sys = 0.20 CPU) @ 5000000.00/s (n=1000000)
(warning: too few iterations for a reliable count)
$ cat 876.pl
use Benchmark;

my $foo = 'bar';
timethese(1_000_000,
{
'quote'=>sub {$boo="$foo";},
'bare'=>sub {$boo=$foo;},
});
printしないとこんなかんじ
0881nobodyさん2006/07/22(土) 21:43:50ID:???
>>876
"" で括るのは、新しい文字列の生成という意味だから、最適化はされないよ。
-MO=Deparse 付けてみても、"$foo" そのまま。
0882nobodyさん2006/07/23(日) 01:44:22ID:NrRWf3Mx
どうでもいいけど、次スレから
「Perl・CGIコーディング初心者質問スレ」
に変えるべきだと思う。
0883nobodyさん2006/07/23(日) 01:46:04ID:BeERA3x6
>>872
念のため言っておくけどハッシュにすると遅いよ。
可読性があがるからコーディングが早いってだけ

でもハッシュ使っとけ
0884nobodyさん2006/07/23(日) 02:08:35ID:???
>>882
"CGI コーディング" ってなんだ?
0885nobodyさん2006/07/23(日) 02:19:16ID:???
>>872
速さを求めたいならはじめに両方の要素をソートしておくことをお勧めする。
もちろんそれに応じたコーディングも必要だが要素数が多ければ目に見える効果があるはず。
0886nobodyさん2006/07/23(日) 03:06:54ID:???
拾ってきたコードに
if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\n";
print "Content-type:text/html\n";
}
という記述があったんですが意味がよく分かりません。
分かる人、翻訳お願いできませんか?
0887nobodyさん2006/07/23(日) 03:31:22ID:???
>>886
検索したらすぐに解ったが…
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#My_CGI_scripts_don_t_seem_to_run
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#How_does_my_script_know_if_it_s_

「ISAPIで実行されていたらステータス行とContent-Typeヘッダ吐き出せ」
08888862006/07/23(日) 03:35:53ID:???
>>887
すみません。まさか検索で引っかかるとは思いが至らず・・・。
要は削除してしまっても問題ない箇所なんですね。
こんな時間にありがとうございました。
0889nobodyさん2006/07/23(日) 03:44:25ID:671DuE1H
>>874
うざいよ、藻前。
>my $foo = "hoge";
>print "$foo";
>みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
上のは必要。下のは"$foo\n"が普通なので必要。ちなみに$foo,"\n"より速い。
0890nobodyさん2006/07/23(日) 11:48:54ID:???
>>889
>上のは必要
お前、何当たり前の事言ってんだ…。

>下のは"$foo¥n"が普通なので必要
コード違うじゃん。誰が改行付ける時の話してる?
0891nobodyさん2006/07/23(日) 11:56:10ID:???
ここは初心者質問スレ
0892nobodyさん2006/07/23(日) 12:16:20ID:rog/ar/G
誰か教えてください。
perl-5.8.8で、URLエンコーディングのデコードをやりたいと思っています。
以下の様にやってみました。

 use encoding "euc-jp";
 $str = "%C6%FC%CB%DC";
 $str =~ tr/+/ /;
 $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
 print $str;

が、何も出力されません。

use encoding "euc-jp" を除くと正しく出力("日本")されるのですが、
この部分は入出力の関係上できればのこしておきたいと思っています。

どうしたら解決できるか、どなたかお分かりの方教えてください。
0893速さ順2006/07/23(日) 13:08:12ID:???
$foo."\n"
"$foo\n"
$foo,"\n"

こんな感じか?それなら文字列連結でいいんじゃね
0894nobodyさん2006/07/23(日) 13:30:13ID:???
>>892
これじゃだめなの?
use encoding "euc-jp";
{
  no encoding;
  $str = "%C6%FC%CB%DC";
  $str =~ tr/+/ /;
  $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
}
print $str;
0895nobodyさん2006/07/23(日) 14:44:30ID:???
>>890
なんかこないだから一人ずれてるのいるよね・・・。

>>892 がなんで use encoding 下でダメなのか説明おねがいえらいひと。
0896ヽ(´ー`)ノ ◆.ogCuANUcE 2006/07/23(日) 17:23:10ID:???
>>892
解決法は >>894、もしくは use encoding を使わない。

理由は perldoc encoding の DO NOT MIX MULTIPLE ENCODINGS のあたりを参照。

use encoding "euc-jp";

my $str = '%C6%FC%CB%DC';

print "before: $str (" . length($str) . ")\n";

$str .= "\xFE";

print "after : $str (" . length($str) . ")\n";

use encoding については、作った本人が「使うな」と言ってる上に、
副作用が多すぎる。
新規で書くコードに関しては、Encode.pm で適宜変換するようにして、
文字リテラルには ascii しか書かないか、use utf8 をして utf-8 に
統一してしまうかの、どちらかを選択するべき。
古いコードで use encoding しているものは、no encoding で逃げるか、
駄目なら書き直すべし。

知ってる人間が use encoding 使ってたら、確実に殴る。
0897nobodyさん2006/07/23(日) 17:35:06ID:???
print << "HOGEHOGE";
unko
HOGEHOGE

これの << ってなんだっけ
名称をどわすれした
0898nobodyさん2006/07/23(日) 17:51:27ID:???
ヒアドキュメント Here Document
0899nobodyさん2006/07/23(日) 18:45:27ID:???
>>896
ああ、そうか。 なるほどねー。
use encoding "euc-jp"; 下では
$str = "\xc6";
$str .= "\xfc";
$str .= "\xcb";
$str .= "\xdc";
こう書いても $str は "日本" ってはならないわけだな。 ic ic
0900nobodyさん2006/07/24(月) 01:13:30ID:ga9J27XZ
^が改行の直後にマッチしません!!
0901nobodyさん2006/07/24(月) 02:23:23ID:???
mオプションつけたらできた
0902nobodyさん2006/07/24(月) 10:35:48ID:78lGpjq9
# $timeには動いた時の時刻が入っています
open FH,"+>>test.log";
seek FH,0,0;
print FH "$time","\n";
close FH;

test.logの先頭に一行新しく入れたいのですが、これだと末尾に一行追加されます・・・・
多分+>>のせいだと思いますが、先頭に入れようとしたら、

my @list=<FH>;
truncate FH,0;
print FH $time,"\n";
print FH @list;

とするしかないのでしょうか?
なんかいちいち一旦全部配列に入れてファイルを消してってのが嫌です。
09039022006/07/24(月) 10:39:56ID:78lGpjq9
あ、後者のコードに
seek FH,0,0;
がないと@tempに何も入りませんね。

しかしなんでそこでのseekは効くのに、前者の方ではうまくいかないんだろう
09049022006/07/24(月) 11:25:03ID:78lGpjq9
うお。今日誰もいないのね。
0905nobodyさん2006/07/24(月) 11:51:01ID:???
受信メールをPerlで受けて処理したいのですが、パースするモジュールとかありますか?
0906nobodyさん2006/07/24(月) 11:56:03ID:???
115311
こういうフォーマットの文字列を
11時53分11秒
に変換したいです。
なるべく短い記述ですませいたいのですが。

できれば2バイトずつで自動スプリットできればそのままsprintfに渡せるのですが。
substrを3個も書いてsprintfに渡すのはなえますよね。
0907nobodyさん2006/07/24(月) 12:03:49ID:???
>>906
>>396,397
0908nobodyさん2006/07/24(月) 12:22:19ID:???
>>902

基本的に追記はファイル末尾に行う。
読み出し方を工夫したほうがいい。
0909nobodyさん2006/07/24(月) 12:23:35ID:???
906

>>907
そういえば正規表現でいけましたね。ありゃ()がミソでしたね確か。

396は本当になるほど!って感じです。
unpackはまるで使いこなせていないままでしたが便利なものですねこれ。

09109052006/07/24(月) 12:35:23ID:TyNTrbq3
http://digit.que.ne.jp/work/wiki.cgi?Perl%e3%83%a1%e3%83%a2%2fPerl%e3%81%a7%e3%83%a1%e3%83%bc%e3%83%ab%e3%82%92%e5%8f%97%e3%81%91%e3%82%8b#pparse%2dbody
↑は見つけましたが1年ほど前なので、他にありますでしょうか?
0911nobodyさん2006/07/24(月) 13:02:47ID:???
>>902
基本的に内容消さないで最初の行に追加する方法は無いと思う。
解決法としては、逆に、使うときに、my @list = reverse <FH>;
とか、foreach(reverse <FH>)
とかするとか、・・・
0912nobodyさん2006/07/24(月) 13:16:16ID:???
search.cpan.org がアドレス解決できないもうだめだ
09139022006/07/24(月) 13:20:39ID:78lGpjq9
やっぱり・・・
あきらめス。
ありがとうございす。
0914nobodyさん2006/07/24(月) 15:16:26ID:???
>>911

馬鹿、またそうやって全部メモリに読み込んで。
しかも foreach でもう一度展開して。
勘弁してくれ。

>>913

http://perldoc.jp/docs/modules/File-ReadBackwards-1.02/ReadBackwards.pod

>このモジュールはファイルを行単位で逆方向に読み込みます。
>使い方は簡単で、メモリの使い方は効率的で高速です。
>オブジェクトとtieされたハンドル・インターフェイスの両方を
>サポートしています。

使わない理由は無い。
0915nobodyさん2006/07/24(月) 16:33:06ID:???
う〜ん、とりあえず巨大ファイル扱うようなコード書かないので、
正直メモリ展開とか実感できない・・・1ミリ秒か100ミリ秒かとか体感違いないので・・・
昔のコンピュータを使ったこと無いってのもあるかも・・・
0916nobodyさん2006/07/24(月) 16:40:34ID:???
まあ、その辺の違いが致命的な仕事したくなったらperlはプロトタイプで、
cとかで実装するかなぁ・・・と思う、・・・(今のとこそういうプロジェクトの予定無し・・・

個人的にforeach(reverse <fh>){.....}なんかは見やすいのでがんがん使う。
まあ、遅いって言ってもせいぜい多項式オーダーの遅さだと思うので、あまり気にしない
指数オーダーだったら大変だが・・・w
0917nobodyさん2006/07/24(月) 16:58:47ID:???
だいたいは読むより書く方が頻度少ないんだから、黙ってファイルの最初につけて書けばいいやんね。
my @list=<FH>; はよろしくないけどw
0918nobodyさん2006/07/24(月) 18:27:39ID:LY53xScL
package HOGE::List;

↑のように、パッケージファイル(List.pm)を更新しても、Webページで反映されません。
.cgiを持つ拡張子のファイルは反映されます。
これはどのようなことが原因ですか?
どのようにすればList.pmで書き換えた内容の更新が反映されるようになりますか?
0919nobodyさん2006/07/24(月) 18:44:08ID:???
>パッケージファイル(List.pm)を更新しても、Webページで反映されません。
んな訳ない
0920nobodyさん2006/07/24(月) 18:46:52ID:???
mod_perl?
0921nobodyさん2006/07/24(月) 18:58:52ID:???
どうせアップロードし忘れてるんでしょうね
0922nobodyさん2006/07/24(月) 19:16:35ID:???
mod_perlだとキャッシュが残っちゃうときあるよな
0923nobodyさん2006/07/24(月) 19:24:17ID:???
書き込みの質問が読み込みの質問にされてる件
0924nobodyさん2006/07/24(月) 19:40:51ID:???
同名のファイルを別のとこにあげてて、そっち取られてるとかはたまに俺もやるw
0925nobodyさん2006/07/24(月) 19:46:47ID:???
>>902
テンポラリファイル作って一行出力してから元ファイルから残りを追記後
リネームでもできるけど一緒にロックせにゃならんし残った後のこともあるな。
>>906
substr($str,0,2),substr($str,2,2),substr($str,4,2)
でもできるだろう。数字と判定してからのほうがよいと思うけど。
0926nobodyさん2006/07/24(月) 19:52:51ID:???
>>925
本人が萎えると言ってる方法を提示してどうする…。
0927nobodyさん2006/07/24(月) 20:13:17ID:???
>>906
$date = "115311";
$date =~ s/(\d\d)(\d\d)(\d\d)/$1時$2分$3秒/;
0928nobodyさん2006/07/24(月) 20:49:14ID:???
悪い見逃してた。まあ自分なら正規表現使うな
0929nobodyさん2006/07/24(月) 20:53:25ID:???
わざわざまともなスクリプトかけないこと暴露しなくていいのに
0930nobodyさん2006/07/24(月) 21:09:27ID:???
初心者の初心者による初心者のためのスレなんだから、仕様ですね。
0931ヽ(´ー`)ノ ◆.ogCuANUcE 2006/07/24(月) 21:16:05ID:???
個人的には POSIX::strptime が好みだな。

残念ながら、標準では入ってないが。
0932nobodyさん2006/07/24(月) 21:54:20ID:???
>>905
つ MIME::Parser
0933nobodyさん2006/07/24(月) 22:22:30ID:IKH596di
はじめまして、kent webさんのttp://www.kent-web.com/bbs/
YY-BOARDを使っていますが最近英語の荒らし書き込みが増えちゃって困っています
そこで相談したところ「半角のみの投稿を禁止すればよい」という話を
聞いたのですが実際にスクリプトを変更する技術がなく出来ませんが
どなたか実際に使っている方などいたりしませんか?
アドバイスよろしくお願いいたします。
0934nobodyさん2006/07/24(月) 22:46:14ID:???
>>933
KENT WEB総合スレへドゾ。改造方法もあるでよ。

http://pc8.2ch.net/test/read.cgi/php/1078991985/450-
09359332006/07/24(月) 23:13:25ID:???
>>934
ありがとうございました。そのような記事があるのを見落としてました・・
0936nobodyさん2006/07/24(月) 23:59:23ID:cgyCzAHv
以前、下記の質問をした際に「過去ログに書いてある」との事でしたが
見つけた内容は行いたい処理とは違う物しか発見できませんでした。
どなたか、下記の内容について処理方法を概要だけでも結構ですので
ご教授お願い出来ないでしょうか?宜しくお願い致します。

----
HTML内のフォームからファイルと時間を選択させて、
その時間になったら自動で指定ファイルをFTPで別サーバー
へ移動するという処理は可能でしょうか?
Perlでcrontabに書き出すことができればと思いましたが
レンタルサーバーでそれは許可されておりません。
cronを使用せずにperlにより指定時間になっているかどうかを
チェックして時間になっていたらFTPでファイルを移動
するような処理は可能なのでしょうか?
0937nobodyさん2006/07/25(火) 00:19:33ID:???
>cronを使用せずにperlにより指定時間になっているかどうかをチェック

この場合プログラムが能動的に動くことは不可能。
ただスクリプトがアクセスされたときに指定時間になっているかをチェックすることは十分可能。

ほかはperlの機能としては全て可能だが、サーバーにより制限がかかっている場合もある。
0938nobodyさん2006/07/25(火) 00:30:15ID:???
自分のPC常時つけといて、時間チェックしてファイル移動するcgiに、JavaScript使って1秒ごとにアクセスすればいいんじゃね?
0939nobodyさん2006/07/25(火) 00:43:59ID:???
forkさえ使えればゴニョゴニョ(ry
0940nobodyさん2006/07/25(火) 00:46:36ID:???
いっそメール経由で自鯖に送信して自鯖からFTPうp
0941nobodyさん2006/07/25(火) 00:48:44ID:???
perl -MCPAN -e shell でインストールする場合、
最新版がインストールされますが、
昔のバージョンを指定し、かつ、そのバージョン
と依存関係のあるものをインストールすることって
できますか?
0942nobodyさん2006/07/25(火) 01:08:00ID:???
>この場合プログラムが能動的に動くことは不可能。
そうですか。有難うございます。
やはりcrontabに書かせるしかないのですね・・・
ホスティングでcrontabを変更できる所は日本であるのでしょうか?

>fork
forkで時間指定になるまで子供を常駐させるという事なのでしょうか?
もう少し詳しく教えていただけないでしょうか?
0943nobodyさん2006/07/25(火) 03:11:29ID:???
デイリーのスクリプトを指定できるのは知ってる
0944nobodyさん2006/07/25(火) 09:30:20ID:???
>>937
>この場合プログラムが能動的に動くことは不可能。
無限ループ内にsleepなり時間チェックの関数書いとけば可能。
ただ、>>937の言うように「サーバーにより制限がかかっている場合」に注意。
0945nobodyさん2006/07/25(火) 10:15:47ID:???
もっと別のやり方考えたほうがいいよ
なにがしたいのかわからんけど。
0946nobodyさん2006/07/25(火) 11:45:48ID:???
サーバーの設定で run time に制限かかってなくても、酷いスクリプトは管理者によって kill されるか、
パーミッションをいじられて実行不可にさせられるのが共有サーバー。
自鯖にするか占有を借りれば好きかってできるかと。
09479022006/07/25(火) 11:52:35ID:kxudY76D
>>914
せっかくなのですが。
ファイルの一番上の行に書き込む時より、全部を読み込んで処理して表示する時の
方が他にも処理があり、頻度も五分ですのでアsdgjな;ぐあwbんrgぅじぇbんぎl

ファイルに書き込むときに最上部に書いた方が今回の場合はグラッリェなのです。

すいません。ありがとうおざいます。もう肌がヒリヒリしてたえられrません。
病院にいきってててててててえてtwえまsづあsd。あdgsgfdsあ
09489022006/07/25(火) 11:56:06ID:kxudY76D
>>917
>my @list=<FH>; はよろしくないけどw

どうしてですか?一見完璧に見えますが。実のところ落とし穴があるのでしょうか?
やっぱり違いますねこのスレは。なんかプロに教わってる感じで最高です。

お返事お待ちしております。とりあえず病院に行ってきます。
なんか肌がボロボロやぶれて血だらけになってしまいました。
なんですかね。これ・・・・orz
0949nobodyさん2006/07/25(火) 12:06:57ID:???
>>944
>無限ループ内にsleepなり時間チェックの関数書いとけば可能。

何か勘違いしてないか?
お前のサーバーでは無限ループの中にsleepなり時間チェックの関数書いたプログラムが勝手に立ち上がるの?
結局そのプログラム自体は誰かからアクセスされることによってしか起動し得ないわけでしょ?
そもそも時間がたてば普通にkillされるし。
0950nobodyさん2006/07/25(火) 12:11:52ID:???
とりあえず病院池www
0951nobodyさん2006/07/25(火) 12:13:12ID:???
> そもそも時間がたてば普通にkillされるし。
0952nobodyさん2006/07/25(火) 12:17:22ID:???
最初の起動はコマンドラインから叩けばいい
あとは時間チェックとスリープ組み込んだ無限fork
絶対怒られるけど。
0953nobodyさん2006/07/25(火) 12:32:25ID:???
>>952
失敗するとゾンビが腐るほどたまったりするからなw
0954nobodyさん2006/07/25(火) 13:25:59ID:???
http://sourceforge.net/project/showfiles.php?group_id=74976
qmHandle って最新Ver1.2.0でDecember 10, 2003なんだけど、
今だったらもっといいスクリプトとかあるかな?教えてエロイひと
0955nobodyさん2006/07/25(火) 13:55:36ID:???
>>948
ィ`w

@list って配列他に使わないのであれば、<FH> するより一気に read した方がいいよ、ってことかな。
0956nobodyさん2006/07/25(火) 13:59:10ID:???
うちの環境では<FH>の方がreadより若干速い。
0957nobodyさん2006/07/25(火) 14:00:52ID:???
>>956
1行1行読む <FH> でのこと? うそやろ・・・(´・ω・`)
0958nobodyさん2006/07/25(火) 14:53:00ID:???
ファイルを何らかのマーカー(一般には改行文字)で区切って読み込む場合

open FH, 'example.data';
my @list = <FH>
foreach( @list ){
処理
}

より

open FH, 'example.data';
while( <FH> ){
処理
}

のほうが一般に高速、メモリの使用量も少ない。
前者はファイルに保存してある情報を全てメモリ上にぶちまけた上でその情報を使って処理するのに対して、
後者はそのときの処理に必要な部分のみをファイルからメモリに読み取って処理を行う。

ディスクアクセスのキャッシングは OS がシステム全体の状況に応じて行ってくれるので
間欠アクセスによるシークロスは気にする必要は無い。
0959nobodyさん2006/07/25(火) 14:57:44ID:???
>>892
use encoding qw(euc-jp);
use Encode qw(from_to encode decode);

my $str = "%C6%FC%CB%DC";
$str =~ tr/+/ /;
$str = encode("utf8", $str); # utfフラグを落とす
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
from_to($str, "euc-jp", "utf8"); # 変換
$str = decode("utf8", $str); # utfフラグを付ける
print $str;

でだめなん?
0960nobodyさん2006/07/25(火) 16:17:48ID:p7nXlRS6
アップローダーを作成したのですが、15M程度のファイルなら
問題なくアップできるのですが、100M近いものになると
「ページを表示できません。検索中のページは現在、利用できません。
Web サイトに技術的な問題が発生しているか、ブラウザの設定を調整
する必要があります。」
のエラーが発生してしまいます。
CGIでのファイル制限は設けていないのですがこのような症状になって
しまいます。どなたかご存知の方ご教授お願い致します。
0961nobodyさん2006/07/25(火) 16:28:28ID:???
timeoutとか
0962nobodyさん2006/07/25(火) 16:42:24ID:???
>timeoutとか
timeoutはアップの途中でも起こることなのでしょうか?
もしそうだとしたらtimeoutを防ぐ(ごまかす?)手段などはありますか?
0963nobodyさん2006/07/25(火) 16:50:00ID:???
レン鯖デバッガーかよ。しかもIEの簡易エラー表示なんてもってのほか。
0964nobodyさん2006/07/25(火) 17:04:06ID:???
>しかもIEの簡易エラー表示なんてもってのほか
申し訳ありません。下記がログに残されているメッセージです。
CGI.pm: Server closed socket during multipart read (client aborted?).
0965nobodyさん2006/07/25(火) 17:20:00ID:???
>>964
CGI.pmが腐ってるんじゃないの
自分でparseしたら
0966nobodyさん2006/07/25(火) 19:41:41ID:???
>>965
おいおい
0967nobodyさん2006/07/25(火) 19:54:02ID:???
>CGI.pmが腐ってるんじゃないの

みたいに適当な初心者が

>自分でparseしたら

ですか。
お前にCGIモジュール以上のものが書けるのかと問いたい問い詰めたい、小一時間ほど。
どうせおまえ KEMT からコピペするだけと違うんかと。
っていうか server も close も socket も during ...も中学レベルの単語じゃねぇか。
0968nobodyさん2006/07/25(火) 20:00:23ID:???
富○県から引っ越すんだ!!
0969nobodyさん2006/07/25(火) 21:50:03ID:???
>>964
てことはクライアント側でなんか起こってるんじゃないの?
どうしてもだめならファイル自体分割するとか・・・
0970nobodyさん2006/07/26(水) 10:23:21ID:???
apacheなら入力出来るサイズをhttpd.confで増やす。
phpならphp.iniで入力サイズを増やす。
あと、perlならアップするファイルサイズの約二倍の物理メモリを。

そしてもう来るな
0971nobodyさん2006/07/26(水) 11:01:41ID:???
>>970
>そしてもう来るな
?
0972nobodyさん2006/07/26(水) 11:37:01ID:???
> あと、perlならアップするファイルサイズの約二倍の物理メモリを。

それはすごい perl ですね。
0973nobodyさん2006/07/26(水) 11:37:58ID:???
SJISから特定の文字列($target)を[16進]で置き換えたく以下の処理をしてるんですが、

sub change{
my ($in) = @_;
my $sjis_str = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
my $target = '[\xF7][\x41-\x9B\xA1-\xFA]|[\xF9][\x41-\x9B\xA1-\xED]|[\xFB][\x41-\x8d\xA1-\xD9]';
$in =~ s/\G((?:$sjis_str)*)($target)/$1.'['.unpack('H4',$2).']'/ego;
return $in;
}

sjisとtargetがかぶってしまっています。$sjis_strから$targetを除くとどう表現できますかね?
文字コードテーブルはよーわからんヽ(+∇+)ノ
0974nobodyさん2006/07/26(水) 12:04:59ID:JkK9HWj1
2006724,hogehogehogeoegoegeg
2006723,akjhkadghjhgiower

Text::CSV_XSを使ってCSV形式で保存してます。
アクセスログなので結構膨大です。
日付別に分別したいのですが何かいい案はありますか?
ハッシュのキーに数字のみが使えたらよかったですが。無理ですし。
で、まあdateとかつけようと思ったのですが。
push @$hash{date$temp[0]},$csv->string();
みたいな。

なんかうまくいきませんね。グローバルシンボルじゃボケエラーがでますが。
もちろんmy宣言はしてるのです。問題なく。
でりふぁれんす部分がおかしいかキーの中のやり方がおかしいかですね。


09759742006/07/26(水) 12:13:15ID:JkK9HWj1
勘違いorz

push @{$hash{$temp[0]}},$csv->string();
で動いた。
っていうかperlってキーに数字のみも使えるのね。便利すぎ
0976nobodyさん2006/07/26(水) 12:13:57ID:???
まあ数字も文字なわけで・・・
0977nobodyさん2006/07/26(水) 12:32:06ID:???
awkの伝統?
09789742006/07/26(水) 13:52:08ID:JkK9HWj1
すいませんでした。

あれから色々と進めてカベにぶち当たってなんとか解決して。
でもイマイチなのでよりよい記述をアドバイス願います。

ループ処理をするときに
foreach(keys %hash){}
とやると$_に入りますが、これを$dateに入れたいのです。
今は
while(my($date,)=each %hash){}
としてますが、なんか不満が残る記述方法です。
もっとスマートなやりかたはないでしょうか。

それと連続ですみませんがもう一つ。
上記のやつでさらにkeyをsortしてから取り出したいのですが、each sort %hashだとエラーになってしまいました。
カッコもつけてみたのですがだめでした。これもできればスマートに・

宜しくお願いします。
0979nobodyさん2006/07/26(水) 14:23:02ID:???
my %hash = (
key1 => 'data1',
key2 => 'data2',
key3 => 'data3',
key5 => 'data5',
key4 => 'data4',
);
my $key;

print "Unsorted Result\n";
foreach $key ( keys %hash ){
print " $key\t$hash{$key}\n";
}

print "\n\nSorted Result\n";
foreach $key ( sort keys %hash ){
print " $key\t$hash{$key}\n";
}
09809742006/07/26(水) 14:28:07ID:JkK9HWj1
なるほど!
さっき試しに
while(my($date,)=keys %hash){}
してみたら無限ループでクラッシュするかと思いましたよ。

ありがとうございました。
09819742006/07/26(水) 14:32:56ID:JkK9HWj1
ところで無限ループにはいつもこまってるのですが、
せめて処理開始から1分が経過したら自動でexit()が発動するようなことはできないんでしょうか?
そうすればループが無限してもパソコンは安心ですよね。
0982nobodyさん2006/07/26(水) 14:55:54ID:???
無理ざます。そんなのあったらとっくに広まってるざます。
だからみんな危ないかなってときはループが一定回数を超えたら処理をエラーメッセージと共に
処理を中断させるんざます。
0983nobodyさん2006/07/26(水) 15:07:27ID:???
プログラム開始時にアラームでもセットすれば?
0984nobodyさんNGNG
出来るよ
0985nobodyさん2006/07/26(水) 15:39:28ID:???
SpiderMonkeyのJS_SetBranchCallbackみたいなのってないの?
0986nobodyさん2006/07/26(水) 15:52:09ID:???
>>981
普通にできるよ。

>>982
(ry
09879742006/07/26(水) 16:04:23ID:JkK9HWj1
http://perl.misty.ne.jp/function01/alarm.html

ここ読んでalarmが何かを理解しようと思いましたが、どうやら他にも理解しないといけないことがあるようで。
実行中のプロセスにSIGALARMシグナルをおくられてもね・・・

どっかで受け取る処理をするのか?
そのシグナルがきたら発動するようにできるのか?

そこらへんをこのサイトも書いてくれてたら・・・・
でもこのサイト質問すると答えてくれる。最高な管理人だからこんなこと言うの恐縮だ
0988nobodyさんNGNG
( ゚д゚)ポカーン
09899742006/07/26(水) 16:16:59ID:JkK9HWj1
m(__)m
0990nobodyさん2006/07/26(水) 17:29:19ID:???
>>987
そこに受け取る処理も何も全部書いてあるんだが。
それ読んで分からなければ、perldoc -f alarm 読んでも分からんだろうな…。
基本的に同じ事が書いてあるから。
0991nobodyさん2006/07/26(水) 20:29:14ID:???
>>973
(?:$sjis_str)* のとこを (?:$sjis_str)*? にしてみてわ?
ってか >>973 の場合 \G いらないと思うんだけど。
0992nobodyさん2006/07/27(木) 09:50:11ID:1uzwaimq
trust::error_print() if $form{test} =~ /\D|\d{2}/;

中身に数字以外を含むか、数字だけでも1桁でなければ
エラー分を出力してexitするルーチンを呼びたいのですが、
上記で穴は完全にふさげてますでしょうか?
0993nobodyさん2006/07/27(木) 10:14:26ID:???
無限ループの例
for ( $i=0; $i<0; $i++ ) {
print $i;
}
このプログラムでは、初期値を0に設定してループごとに1足していっているのですが
終了の条件が 「0未満になった場合」 となっています。
0から1づつ足していってるので、「0未満」 となるはずもなく、0からの数字が延々と表示され続けます。


↑これって本当ですか?forの条件式部分って確かifと同じでしたよね。
だから0未満であれば実行するんであって、0未満でない上記の場合は一度も実行しないはずですが。

私が間違ってますか?
0994nobodyさん2006/07/27(木) 10:52:50ID:???
> ↑これって本当ですか?forの条件式部分って確かifと同じでしたよね。
大嘘。そんなこと言ってる奴は葬ってしまう事が社会正義なので晒してください。
09959932006/07/27(木) 11:10:17ID:???
>>994
色々勉強させてもらったサイトなのでご勘弁をm(__)m
回答ありがとうございました。失礼します。
0996nobodyさん2006/07/27(木) 11:26:26ID:???
my %test = qw/a 1 b 4 c 2/;
これを値の数値が小さい順に並べ替えたいのですがsどうやればいいでしょうか。
0997nobodyさん2006/07/27(木) 11:31:29ID:???
my %test = qw/a 1 b 4 c 2/;
my @row = sort{$test{$a} <=> $test{$b} }keys %test;
print @test{@row};

なんか知らないけど試してたら偶然カスリました。
ここから後は自分でいけそうです。996でした。
0998nobodyさん2006/07/27(木) 11:43:39ID:???
>>995 もう遅い。
http://perl.misty.ne.jp/04.html#e
0999nobodyさん2006/07/27(木) 11:52:44ID:???
@a = qw/1 2 3 4 5 6 7 8 9/;
print $a[int rand @a];

これでそれなりに全てが平等に抽選できてますかね?
1000nobodyさん2006/07/27(木) 12:13:11ID:???
>>999
バ〜カ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。