Perlコーディング初心者質問スレ Part 49
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
2006/05/31(水) 04:32:28ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0002nobodyさん
2006/05/31(水) 04:33:02ID:???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/05/31(水) 04:35:21ID:???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/05/31(水) 04:36:16ID:???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/05/31(水) 04:37:00ID:???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/05/31(水) 04:37:37ID:???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/05/31(水) 04:38:17ID:???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/ (前スレ)
part44-621氏による過去ログ倉庫
ttp://user.ftth100.com/mirrorhenkan/perl/
0008nobodyさん
NGNG[プログラミング自体の経験が無い奴はまずココを読め]
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.7/
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さん
NGNG[モジュール]
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
0011前スレ992
2006/05/31(水) 07:10:12ID:???ありがとうございます。euc-jpにエンコードすればいいことがわかりました。
jcode.plを使い&jcode::convert(\$str, "euc");のようにしてエンコードしたところ正しく表示されました。
本当にありがとうございます。情報が小出しで申し訳ありませんでした。
0012nobodyさん
2006/05/31(水) 08:08:01ID:???0013nobodyさん
2006/05/31(水) 10:34:09ID:upa0fhXd0014nobodyさん
2006/05/31(水) 12:55:08ID:???> とりあえずおっぱいうp
http://search.cpan.org/perldoc?Acme::Oppai
0015nobodyさん
2006/05/31(水) 13:59:38ID:???0016nobodyさん
2006/05/31(水) 14:06:05ID:???0017nobodyさん
2006/05/31(水) 17:57:14ID:???という1つの文字列を元に
@b=(a,b,c,d,);
のような配列に代入する方法はないでしょうか?
0018nobodyさん
2006/05/31(水) 18:06:09ID:???0019nobodyさん
2006/05/31(水) 18:07:54ID:???0020nobodyさん
2006/05/31(水) 18:47:06ID:???まず目的ありきの時に、どの関数・どのモジュールを使えばいいかわからないよね
オライリー有用だけど高いよ('A`) 貢ぎましたけど・・・
0021nobodyさん
2006/05/31(水) 18:53:43ID:???0023nobodyさん
2006/05/31(水) 19:08:04ID:qTr6Ebfxさせようとすると、500エラーが出てしまいます。
具体的には下記のようにしております。
print "HTTP/1.1 206 Partial Content\n";
print "Last-Modified: Wed, 24 May 2006 18:41:30 GMT\n";
print "Pragma: no-cache\n";
print "Accept-Ranges: bytes\n";
my $range = $ENV{'HTTP_RANGE'};
if($range =~ m/^bytes=(\d+)\-(\d+)$/){
my $offset = $1;
my $end = $2;
my $len = $end - $offset + 1;
print "Content-Range: bytes $offset-$end/$len\n";
$filesize = $len;
}
print "Content-Length: " . $filesize . "\n";
print "Content-Type: $content_type\n\n";
print while(<IMG>);
close(IMG);
エラー内容は「Bad header=HTTP/1.1 206 Partial Content」ですので
これを外せばエラーは出ないのですが、206を返す手段があれば
ご教示いただきたく思っております。
宜しくお願いいたします。
0024nobodyさん
2006/05/31(水) 19:29:32ID:???Status ヘッダ
http://www.nilab.info/docs/cgi/draft-coar-cgi-v11-03-clean-jp.html#7.2.1.3
以後 CGI の話は以下のスレへ。
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/
0026nobodyさん
2006/05/31(水) 20:06:46ID:???場合、これを取り除いて別の著名などを挿入したいのですが
取り除くにはどうしたらいいか教えてください
0029nobodyさん
2006/05/31(水) 20:29:54ID:???本文の最後に空白がない場合にも著名を挿入したい場合は、
$text =~ s/\s*$/$chomei/s;
な。それから、著名でなくて署名じゃないのか?
0030nobodyさん
2006/05/31(水) 20:31:16ID:???クックブックの方が便利なの?
これ↓を買おうと思っているんだけど。。
Perl/CGI逆引き大全 600の極意
http://www.amazon.co.jp/gp/product/4798010774/
0031nobodyさん
2006/05/31(水) 20:31:30ID:???0035nobodyさん
2006/05/31(水) 21:58:58ID:???おらいりーは有用だけど余計な文が多くてあまり馴染めんかった
0037nobodyさん
2006/05/31(水) 23:33:41ID:???0038nobodyさん
2006/05/31(水) 23:36:50ID:???ラクダ本は、必要な所だけスキャンして処分(ボロボロだったので)。
現在うちにあるPerlの本はAdvanced Perl のみ…。
0039nobodyさん
2006/05/31(水) 23:39:11ID:???0040nobodyさん
2006/06/01(木) 00:00:48ID:???0041nobodyさん
2006/06/01(木) 00:14:11ID:???0043nobodyさん
2006/06/01(木) 12:09:27ID:???>>18を無視するな…>>32はネタだ。
@splited = split /,/, $csv
まあ要するに>>19。split(とeval)を提示された時点で検索していれば、
splitが求めるものだとすぐ分かるはずなのにそれを怠っているとしか思えない。
0045nobodyさん
2006/06/01(木) 18:57:05ID:???>17=42
my @array = split(/,/, $string);
split → 文字列(第2引数)を区切り子(第1引数)で分断し、その配列を返します。
my → 変数の局所化
/,/ → 正規表現でカンマ区切りを指定
$string → ここではカンマで区切られた文字列が入ってると仮定
@array → split関数によって返された配列が入る
以上
スクリプトを組む上で必ず使うような関数は、書式を完全に覚えろとは言いません。
せめてやりたいことから関数名を連想(要は逆引き)できるようにしませう。
0048nobodyさん
NGNGhttp://perl.misty.ne.jp/function02/split.html
0049nobodyさん
2006/06/01(木) 19:41:05ID:???<!--start-->
cgiからの書込み
<!--end-->
って出来るのを最近知ったんですがどういう風に書くんですか?
ネットで探してもこのスクリプトが載ってないのだが・・・。
0050nobodyさん
2006/06/01(木) 19:45:57ID:???0051nobodyさん
2006/06/01(木) 19:48:35ID:???テンプレートとなるHTMLを1行ずつ読み込む
<!--start-->が現れたら処理開始
<!--end-->が現れたら処理終了
そんなことよりも(すごい巨大なデータでなければ)
<!--INSERT-->とかを置換した方がスマートかな
0052nobodyさん
NGNG0053nobodyさん
2006/06/01(木) 19:56:54ID:???0054nobodyさん
2006/06/01(木) 19:57:40ID:???む?
「 .htmlで 」 って拡張子でかいてるから、HTMLファイルにアクセスしてやりたいってことじゃないの?
エスパー失敗?
0055nobodyさん
2006/06/01(木) 20:09:17ID:???を求めてると判断した次第
>54
SSIだったら<!--#exec 〜-->って表記をするはずだし、startとendとペアで記述するもんじゃないから
SSIは違うんじゃね?と思った
よく見たらいきなりスバっと書きすぎてたかな
気分を害してたらゴメ
0057nobodyさん
2006/06/01(木) 20:55:56ID:???0058nobodyさん
2006/06/01(木) 20:57:12ID:???多くの住人もエスパーさんも「そんな感じの」ではわからんのです。
>>55の冒頭が「やりたいこと」だったら、>>51とか。
「だから>>51のやりかたを…」とか言われると果てしなく続くのです。
0060nobodyさん
2006/06/01(木) 21:04:54ID:???>57でもOKだけど
一応考え方の参考って事で・・・(略記だけど)
my %template;
$template{##TITLE##}="あ〜";
$template{##BODY##}="う〜";
open(FH, "テンプレートHTML"); read(FH, $templatehtml, (-s FH)); close(FH);
foreach(keys(%template)){
$templatehtml=~s/$_/$template{$_}/g;
}
print $templatehtml;
HTML には挿入したい場所に##TITLE##とかを書いておけばOKです
0061nobodyさん
NGNG0062nobodyさん
2006/06/01(木) 21:09:47ID:???これ以上書くならテンプレート形式を使ってるスクリプトを眺めろとしか言えないし
0063nobodyさん
2006/06/01(木) 21:10:01ID:???0065nobodyさん
NGNG0066nobodyさん
2006/06/01(木) 21:42:09ID:???0067nobodyさん
2006/06/01(木) 21:50:08ID:???散々単語が出てきてるのに・・・おまえもう来るなカス
0068nobodyさん
2006/06/02(金) 00:14:24ID:???0069nobodyさん
NGNGとか
0071nobodyさん
2006/06/02(金) 00:45:57ID:???0072nobodyさん
2006/06/02(金) 01:30:15ID:???print lc().uc() for (a..z);
0073nobodyさん
2006/06/02(金) 01:31:18ID:???いやいや敢えてこんな感じで。
my $m = 25;
$_ -= $m--, print chr $_ - 32, chr and --$m for reverse 97..122;
0074nobodyさん
2006/06/02(金) 01:43:41ID:???0075nobodyさん
2006/06/02(金) 02:16:24ID:???ありがとうございました
それから、マイドキュメントにあるホームページアップ用のhtmlファイルのjpgを全てpngにしたいんですが
どのようにすればよいですか?
いちおうこんな感じにやってみたんですがウンともスンともいいませんでした
open IN,"./1.html";
while ( $word = <IN> ){ $words .= $word;}
close IN;
open ADD,">./1.html";
$words =~ s/jpg/png/g;
print ADD "$words";
close ADD;
どこがミスってますか?
0076nobodyさん
NGNG0078nobodyさん
2006/06/02(金) 03:12:56ID:???>>77
全部の open と close の後に or die $! って書いてみよう。
open IN, "./1.html" or die $!;
...中略...
close IN or die $!;
というふうにね。
困った時に時々原因を教えてくれるおまじないだよ。
これからは必ず付けるようにしてね♪
0080nobodyさん
2006/06/02(金) 03:49:36ID:???まず、置換・書き込み部分はコメントアウトして、読み込んだ後に
$words を print して正常に読み込めているか確かめる。
正常に読み込めているのを確認したら、置換部分を有効にして、置換した後に
$words を print して本当に置換されているか確かめる。
正常に置換されていたら、書き込み部分を有効にして、書き込みファイル名を変えてみる。
・書き込み先のパスをフルパスで指定してみて、正常に書き込めるか確かめる
・存在しないファイル名を指定して、新規作成してみる
・既存のファイル名を指定して、上書きしてみる
これだけやれば原因がわかるはず。
008179
2006/06/02(金) 04:02:27ID:???とりあえずこんな感じでテストしてみました
デスクトップのaフォルダの中に1.htmlとtest.pl
# test.plの中身
$name = "./1.html";
open OUT,">>$name";
print OUT "test\n";
close OUT;
これでコマンドプロンプトから実行してもだめでした
0082nobodyさん
2006/06/02(金) 04:43:31ID:???でなけりゃ一回ファイル名変えてやってみ。
たまに自分のアホなスクリプト実行したせいでファイルがロックされてる場合がある。
ソース自体は普通みたいだから、絶対なんかヘンなことしてるしw
0083nobodyさん
2006/06/02(金) 04:59:21ID:???open errorだったりして…
0084nobodyさん
2006/06/02(金) 05:32:21ID:???0085nobodyさん
2006/06/02(金) 09:47:40ID:???$a2 ="い";
$a3 ="う";
〜
$a50="ん";
このスカラー変数を、連結して表示したい場合、
print $a1.$a2.$a3.〜$a50;
perlでは、このような表記の仕方しかないでしょうか?
0086nobodyさん
2006/06/02(金) 09:55:34ID:???while(1..50){
$tmpsname = $sname . $_;
$val = \${$tmpsname};
$renketu .= $val;
}
すげぇテキトーw
つかね、配列使ってください
0087nobodyさん
2006/06/02(金) 10:15:26ID:???0088nobodyさん
2006/06/02(金) 10:54:24ID:???あ い う え お
か き く け こ
....
わ を ん
);
local $, = "";
print @hiragana;
qwはタブも改行もスペース扱いしてくれるぞ
0089nobodyさん
2006/06/02(金) 10:55:50ID:???print @Hiragana;
ちなみに$a50="ん";にはならんぞ。50音て50個じゃないから
0090nobodyさん
2006/06/02(金) 10:59:55ID:???リファレンスを連結している
my $sname='a';
print join '', map { ${"$sname.$_"} } (1..50);
動かしてないがこれでよくね?
0091nobodyさん
2006/06/02(金) 11:22:34ID:???とりあえずグローバル変数やたら定義すると面倒で適わんね。
0092nobodyさん
2006/06/02(金) 11:25:06ID:???… 実は map の使い方というか使う意義がわかんねw
あとでリファレンス立ち読みしてみるかにゃ
0093nobodyさん
2006/06/02(金) 11:35:03ID:???0094nobodyさん
2006/06/02(金) 13:54:21ID:???0095nobodyさん
2006/06/02(金) 14:26:56ID:???さ し す せ そ た ち つ て と な に ぬ ね の
は ひ ふ へ ほ ま み む め も や ゆ よ
ら り る れ ろ わ を ん);
print map{${$_->[0]} = $_->[1]}map{['a'.$_ ,$hiragana[$_-1]]}(1..46);
なんか質問の主旨とは違うよーな気もするが
0096nobodyさん
2006/06/02(金) 15:05:28ID:???0097nobodyさん
2006/06/02(金) 15:25:35ID:???ん〜、エラーっすねぇ
Can't use string ("a.1") as a SCALAR ref while "strict refs" in use at /test.cgi line 16.
${"a$_"} にしたら
Can't use string ("a1") as a SCALAR〜
で同じエラー
俺にゃ難しい宿題だw
0098nobodyさん
2006/06/02(金) 16:09:13ID:lBhNFSRP${"@{[substr($s,0,1]}$_"}=substr($s,$_*2-1,2)for(1..length($s)/2); #ここまでセットアップ
print join '', map ${"a$_"}, (1..10); # 好きな数だけloopすれば?
0100nobodyさん
NGNG0102nobodyさん
2006/06/02(金) 17:22:15ID:???no strict 'refs';
my $sname='a';
print join '', map { ${"$sname$_"} } (1..50);
0103nobodyさん
2006/06/02(金) 18:06:46ID:???文句多いな。
local $r = sub{((@_[0] > 1) ? $r->(@_[0]-1) : ''). eval('$a'.@_[0])};
print $r->(50);
0104nobodyさん
2006/06/02(金) 20:13:53ID:???sub p { my $n = shift; my $p; ($p = sub { print chr($n += shift); $p })->() }
p(0x48)->(0x1D)->(0x07)->(0x00)->(0x03)->(-0x43)->(-0x0C)->
(0x57)->(-0x08)->(0x03)->(-0x06)->(-0x08)->(-0x43)->(-0x17);
0105nobodyさん
2006/06/02(金) 20:16:51ID:???print $test; # ここで実体化(ハード)
代入する段階でハードリファレンスってどうやるの?
0106nobodyさん
2006/06/02(金) 20:22:18ID:???0107nobodyさん
2006/06/02(金) 20:22:33ID:???0108nobodyさん
2006/06/02(金) 20:23:28ID:???0109nobodyさん
2006/06/02(金) 20:24:21ID:???0110nobodyさん
2006/06/02(金) 20:25:29ID:???0111nobodyさん
2006/06/02(金) 20:35:06ID:???use Tie::Man::And::Man;
my $happy = tie $res106, Tie::Man::And::Man, $res107;
0112nobodyさん
2006/06/02(金) 20:37:13ID:???$happy->insert(); # ここで実体化(ハード)
挿入する段階でハードリファレンスってどうやるの?
0113nobodyさん
2006/06/02(金) 20:43:35ID:???$test = \1; # リテラルスカラー値に対するハードリファレンス
print $$test; # デリファレンス
多分シンボリック=リテラルだと思ってるのかな と想像。
シンボリック=実体はただの文字列。文字列をデリファレンスするとシンボルテーブルから
その名前を持つモノをひっぱってきてくれる。
0114nobodyさん
NGNG0115nobodyさん
2006/06/02(金) 21:01:00ID:???0116nobodyさん
2006/06/02(金) 21:46:32ID:???0117nobodyさん
2006/06/02(金) 22:15:15ID:???俺もよくわかんなくて、ガンガッってググったよ。
ここ↓とかどう? perl-解説ってとこ。
山口家の逆襲
http://kabocha.org/jelfe/
0118nobodyさん
2006/06/02(金) 22:23:29ID:???0119nobodyさん
2006/06/02(金) 22:38:40ID:???0120nobodyさん
2006/06/02(金) 22:45:09ID:???●リテラル
コードに直接埋め込まれている値
・123 3.14 のような数値
・"abc" 'hoge' のような文字列
・(1, 2, 3) (hoge=>123, huge=>456) のようなリスト など
●ハードリファレンス(ただ単にリファレンスと言った場合はこれ)
値に対する参照。これ自体もスカラー値。C言語やってた人はポインタと考えれば良い。
ハードリファレンスを生成するには、以下の方法がある。
・値や変数の前に「\」を付ける → その値に対してのリファレンス
・[1, 2, 3] → 無名の配列が自動的に作られて、その無名配列に対するリファレンス
・{hoge=>123, huge=>456} → 無名のハッシュに対するリファレンス
・sub { CODE } → 無名の関数に対するリファレンス(クロージャ)
●シンボリックリファレンス
ただの文字列。文字列をデリファレンスすると、パッケージが持つシンボルテーブル
(パッケージ変数の名前と実体を結び付ける表)を通じて、その文字列の名前を持つ
実体を得る事ができる。誤爆しやすいので use strict; すると使えない。
0121nobodyさん
2006/06/03(土) 00:18:22ID:???0122nobodyさん
2006/06/03(土) 02:04:02ID:???0124nobodyさん
2006/06/03(土) 18:24:46ID:???$" = '/';
@list = (10, 20, 30, 40, 50);
$scalar = "@list";
これで
$scalar = join( "/" , @list);
と同じ結果になるようだけど、「$" = '/';」を使った場合には、
特殊変数$"のデフォルトの値を変えてしまうから
その後もずっとjoinせずとも/で区切られた値になるという感じなのかな。
他にはサブルーチンの@_とかは元の値が変わっちゃうみたいだけど、
特殊変数の扱いはブロックの中だけ?それともブロックの中とか関係なし?
どちらの場合もある?
その辺は一時的なものなのか、恒久的(ちょっと変な表現だけどw)なのか教えて下され。
0125nobodyさん
2006/06/03(土) 18:54:27ID:???ただし、mod_perl とか $" とかだとうまくできない場合があるね。
「特殊変数」 が 「$"」 とかを指すなら、
それの有効範囲はグローバル変数と一緒。
local $" とかもできるよ。
0126nobodyさん
2006/06/03(土) 18:56:58ID:???perl -e '@a=qw/a b c/; {$"=q!/!; print "@a\n";} print "@a\n";'
0127nobodyさん
2006/06/03(土) 20:34:18ID:???0128nobodyさん
NGNG0129124
2006/06/03(土) 22:08:37ID:???なんとなくイメージがつかめたよ。
0130nobodyさん
2006/06/03(土) 23:16:29ID:???my にはグローバル変数およびパッケージ変数を宣言する能力がないので
ここにlocalとmyの大きな差がある。
呼び出し先のサブルーチンでの参照可能性でlocalとmyの差を説明するやつはウンコ
0131nobodyさん
2006/06/04(日) 00:07:15ID:???our→パッケージ変数の宣言
local→パッケージ変数のダイナミックスコープ化
という理解でおk?
0132nobodyさん
2006/06/04(日) 00:46:14ID:???0133nobodyさん
2006/06/04(日) 01:08:44ID:???0134nobodyさん
2006/06/04(日) 01:18:27ID:???0135nobodyさん
2006/06/04(日) 09:23:10ID:???0136nobodyさん
2006/06/04(日) 10:40:42ID:???ようとしたんです。
32文字ぐらい *16列 * 4098行 = 2M 程度。
メモリは2ギガ積んでいます。
しかし、実行するとメモリの使用率がガンガン上がって
いって止まってしまうんです。
use CGI::Pretty をコメントアウトすると問題ありません。
テーブルのサイズが小さいときは問題ありません。
なぜでしょう?
CGI::Pretty は使わないほうが速いというのはわかるんです
が、使わないと、HTMLソースがすごく見にくいので、できれ
ば使いたいんです。
CGI::Pretty って\tと\nを入れているだけにしか見えないの
ですが、そんなにメモリを使用するものなのでしょうか?
Windows,Linuxどちらでも、以下のスクリプトでも再現しました。
use strict;
use CGI qw(:standard);
use CGI::Pretty;
my @trs;
my @tds=qw(0 1 2 3 4 5 6 7 8 9 a b c d e f);
push @trs,td({bgcolor=>'#FFFFFF'}, \@tds) for (0..4097);
print header,start_html;
print table(Tr \@trs);
どこが問題なのでしょう?
ブラクラのつもりは無いのですが、
http://pc8.2ch.net/test/read.cgi/tech/1149259409/69
のようにswapし始めて、サーバが応答しなくなることがあるみたい
ですので、試すときは注意してください。
0137nobodyさん
2006/06/04(日) 11:49:27ID:???HTML::Table
ttp://homepage3.nifty.com/hippo2000/perltips/html/table.htm
があるけど、こちらを使ってみてはいかがでしょうか?
0138nobodyさん
2006/06/04(日) 12:18:09ID:???で試した。
別 PC のブラウザで開いて、サーバーのメモリを監視してたら、ピークで 400MB 突破して、
250-350MB で変動してました。
で、500 Error で止まったw
Windows2000 + Perl 5.8.4 で試した。
自力で表示した方がいいんじゃないの?
0139nobodyさん
2006/06/04(日) 12:24:48ID:???だと 143MB ピークで正常終了
0140nobodyさん
2006/06/04(日) 12:46:25ID:???やっぱりモジュール使って書くメリットってのがわからない。
モジュール使ったほうがいいって言ってるヤツの意見を聞いてみたいね。
0141nobodyさん
2006/06/04(日) 12:59:04ID:???この程度のテキスト処理にそんなにメモリを使うはずがない。
と思って試したら本当にものすごい負荷がかかる。何なんだコレ?
0142nobodyさん
2006/06/04(日) 13:13:35ID:???0143nobodyさん
2006/06/04(日) 14:07:00ID:???@CGI::Pretty::AS_IS = grep !/^td$/, @CGI::Pretty::AS_IS;
これを use CGI::Pretty; の後に差し挟むことで耐用限界を引き上げることができるはず。
アドホックでバッドプラクティス全開なので、あくまで応急処置。
こういうの思いついちゃう自分が嫌い。
0144nobodyさん
2006/06/04(日) 15:43:10ID:???その場合、元の値が「2004/7/7」という中央寄せの文字列(日付型ではない)のとき、取り出した値が
Win32::OLE::Variant=SCALAR(0x1c14028)
となってしまうのですが、何が原因なのでしょうか。
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
my $master_excel_file = "xlsファイル";
$Win32::OLE::Warn = 3;
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit') || die;
my $Book = $Excel->Workbooks->Open($master_excel_file) or die;
foreach my $row(@{$Book->Worksheets(1)->Range(A1:Z1000)->{'Value'}}) {
my @values = @$row;
}
0145nobodyさん
2006/06/04(日) 17:00:56ID:???256程度でエラーとか、全然かわいくねーよw
0146nobodyさん
2006/06/04(日) 17:05:04ID:???書き直してみた。いちおうmake testは通る。
sub _prettyPrint {
my($input) = @_;
return if !$CGI::Pretty::LINEBREAK || !$CGI::Pretty::INDENT;
$$input =~
s/\Q$CGI::Pretty::LINEBREAK\E/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/gi;
my $as_is = join '|', map { quotemeta $_ } @CGI::Pretty::AS_IS;
$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egi;
}
sub _deIndent {
my($s) = @_;
$s =~ s/\Q$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT\E/$CGI::Pretty::LINEBREAK/gi;
return $s;
}
0147nobodyさん
2006/06/04(日) 17:21:35ID:???せっかくだからオリジナルを保存して書き換えてしまうか
0148nobodyさん
2006/06/04(日) 17:24:55ID:???え、それで同じ結果になるの? すごくね?
後学のために _prettyPrint の問題点を教えてください。
0150nobodyさん
2006/06/04(日) 18:20:33ID:???とか思いつつお買い物・・・
0151nobodyさん
2006/06/04(日) 18:23:50ID:???専門用語として伝統的にPretty Printって言ったら整形出力の意味な。
つまり、かわいいHTMLソースを作る職人が大喰ら(ry
>>146
それ処理的に等価じゃないな…
例えばpreの中身がインデントされちゃうから実用的にも影響が出る。
div( pre( "hoge\nfuga" ) )
しかしそれにしても元のやつには改善の余地があるような…漏れもリファクタリングやってみよう
0152nobodyさん
2006/06/04(日) 18:49:36ID:???すまん、バグっていた。s修飾しないと「.」が改行にマッチしないから
@AS_ISで指定されるタグに囲まれる部分が複数行にまたがるときに
おかしくなるね。
$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egi;
↓
$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egis;
これでその例も同じ結果になるはず。
0153nobodyさん
2006/06/04(日) 19:02:53ID:???@AS_ISで指定したタグに囲まれた部分はインデントを追加しないで
他の部分に追加ということをやりたいようなのだが、オリジナルは
以下のような処理になっている。
if (@AS_ISタグに囲まれた部分がある) {
文字列を 「囲まれた部分の前」、「囲まれた部分」「囲まれた部分の後」
の3つに分割
「囲まれた部分の前」「囲まれた部分の後」をそれぞれ再帰的に
自分を呼んでインデント
「囲まれた部分の前」をインデントしたもの,「囲まれた部分」,
「囲まれた部分の後」をインデントしたものを連結して返す
} else {
改行の後ろにインデントを追加する
}
デフォルトで@AS_ISにtdが含まれているので、<td>〜</td>の数だけ
再帰する。再帰するごとにだんだん短くなるが文字列がコピーされるので
O(n^2)のメモリを消費し、コピー処理でCPUも同じオーダで食うようだ。
書き直した奴は、
とりあえず全部の改行にインデントをつける
@AS_ISで指定されたタグに囲まれた部分の改行の後のインデントを削って戻す
という処理にしてみた。
0154nobodyさん
2006/06/04(日) 19:43:37ID:tvwlqg+dActivePerlの導入をしようと思い、msi版をダウンロードしても、
”有効なwin32アプリケーションではありません ”
になります。
当方、Win98なんですがどうすれば導入できますか?
0155nobodyさん
2006/06/04(日) 20:20:57ID:???ActivePerlをダウンロードしたページの
Installation Notes
の部分をよく読めば導入できます
0156nobodyさん
NGNG0157nobodyさん
2006/06/04(日) 21:24:40ID:???わかりやすい解説ありがとう!
なるほどなるほどって感じ。
発想変えるだけでコードがガラっとかわる手本だね。
0158nobodyさん
2006/06/04(日) 22:05:46ID:???0159154
2006/06/04(日) 22:29:14ID:???Windows Installer 2.0+ is required for Windows.
download for 9x/Me
ってことですね。ありがとうございました。
0160nobodyさん
2006/06/05(月) 04:51:59ID:???ベンチとったら、(10000回)
my $string2 = lc $string;
が 5.7 秒で
my $string2 = $string;
$string2 =~ tr/A-Z/a-z/;
が 2.6 秒だったんだけど、これどういうこと?
同じことしてるんじゃないんだっけ?
0161nobodyさん
2006/06/05(月) 06:47:28ID:???うちではどっちもどっちだったよ
$ perl -v
This is perl, v5.8.7 built for cygwin-thread-multi-64int
$ cat hoge.pl
use Benchmark;
my $string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
timethese(10000*100,
{
'lc' => sub {my $string2 = lc $string;},
'tr' => sub {my $string2 = $string;$string2 =~ tr/A-Z/a-z/;},
});
$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 2 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 1721170.40/s (n=1000000)
tr: 2 wallclock secs ( 0.54 usr + 0.01 sys = 0.55 CPU) @ 1814882.03/s (n=1000000)
$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 2 wallclock secs ( 0.52 usr + 0.00 sys = 0.52 CPU) @ 1923076.92/s (n=1000000)
tr: 2 wallclock secs ( 0.58 usr + 0.00 sys = 0.58 CPU) @ 1721170.40/s (n=1000000)
0162nobodyさん
2006/06/05(月) 07:48:02ID:???あれ、ほんとだね。わざわざありがとう。
置換するソースによって違うんかなあ?
うちは google に perl って入れてでてきた 56kb くらいのソースでやったんだけど。
それともアルファベット以外がたくさん入ってると lc は遅くなるとか? うーん・・・
perl の ver だったらやだなw
ちなみに
uc $string : 6.58 [s]
tr/a-z/A-Z/ : 5.50 [s]
0163nobodyさん
2006/06/05(月) 11:03:38ID:GKAwUgKi10個目以降全てに対して処理をしたい場合、
foreachで、1〜9回目のループをifで飛ばすようなやり方以外で、
何かスマートな方法はありますか?
0164nobodyさん
2006/06/05(月) 11:07:12ID:???0165nobodyさん
2006/06/05(月) 11:23:55ID:???配列スライスに対してforeachでいいんでね?
foreach my $i (@x[9..$#x]) { ... }
0166nobodyさん
2006/06/05(月) 12:24:24ID:???> うちは google に perl って入れてでてきた 56kb くらいのソースでやったんだけど。
それでやってみた。何回やってもlcの方が速かった。
$ cat hoge.pl
use Benchmark;
use LWP::Simple;
my $string = get('http://www.google.com/search?q=perl');
timethese(10000*100,
{
'lc' => sub {my $string2 = lc $string;},
'tr' => sub {my $string2 = $string;$string2 =~ tr/A-Z/a-z/;},
});
$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 1 wallclock secs ( 0.28 usr + 0.00 sys = 0.28 CPU) @ 3571428.57/s (n=1000000)
(warning: too few iterations for a reliable count)
tr: 0 wallclock secs ( 0.34 usr + 0.00 sys = 0.34 CPU) @ 2932551.32/s (n=1000000)
(warning: too few iterations for a reliable count)
$ perl hoge.pl
Benchmark: timing 1000000 iterations of lc, tr...
lc: 0 wallclock secs ( 0.23 usr + 0.00 sys = 0.23 CPU) @ 4347826.09/s (n=1000000)
(warning: too few iterations for a reliable count)
tr: 1 wallclock secs ( 0.32 usr + 0.00 sys = 0.32 CPU) @ 3115264.80/s (n=1000000)
(warning: too few iterations for a reliable count)
0167nobodyさん
2006/06/05(月) 12:35:00ID:???訂正。今やったら逆転した。(warningに気づいてなかったので回数を更に10倍にした)
やっぱりどっちもどっちじゃね?2倍も差が開くとは思えないけど。。ベンチ取ったスクリプトさらしてみて。
$ perl hoge.pl
Benchmark: timing 10000000 iterations of lc, tr...
lc: 4 wallclock secs ( 3.58 usr + 0.00 sys = 3.58 CPU) @ 2797202.80/s (n=10000000)
tr: 3 wallclock secs ( 3.42 usr + 0.02 sys = 3.44 CPU) @ 2911208.15/s (n=10000000)
$ perl hoge.pl
Benchmark: timing 10000000 iterations of lc, tr...
lc: 3 wallclock secs ( 3.41 usr + 0.01 sys = 3.42 CPU) @ 2928257.69/s (n=10000000)
tr: 3 wallclock secs ( 3.45 usr + 0.00 sys = 3.45 CPU) @ 2894356.01/s (n=10000000)
0168nobodyさん
NGNG0169nobodyさん
2006/06/05(月) 18:57:41ID:???ってか、うち1万回で5秒とかなのに、1000万回で3秒とか、どんなPCの性能差だよw
AthronXP1700 の 512MB あるんだけどなあw perl は 5.6
・・・っと思ったら、
use strict;
use Benchmark;
use LWP::Simple;
my $string = get('http://www.google.com/search?q=perl');
print $string;
これ何もでなくね?w status_line とったら 403 返ってきたよw google 内部で弾いてんのかな・・・
こっちはブラウザから見てソース保存して開いてやってた。 〜?q=perl&num=50&hl=ja
こんな感じ。
use strict;
use Benchmark;
my $string;
open (LOAD, 'lc.html'); read (LOAD, $string, -s LOAD); close (LOAD);
timethese(10000, {
'lc' => sub {my $string2 = lc $string;},
'tr' => sub {my $string2 = $string;$string2 =~ tr/A-Z/a-z/;},
});
0170nobodyさん
2006/06/05(月) 19:14:18ID:0Db/Ehfsとある文字が出てきたところで区切って
その区切ったそれぞれの文字を配列に入れるということをしたいのですけど、l
やり方が浮かばなくて・・・
どのようにコーディングすればいいのでしょうか?
0171nobodyさん
NGNG0173nobodyさん
2006/06/05(月) 19:39:21ID:0Db/Ehfsあっ 出来ました。 ありがとうございます
0174nobodyさん
2006/06/05(月) 19:52:22ID:JTs163rfデフォの /home/~username/.cpan にしとく?自分用に変える?
dotディレクトリに入れるのがなんか気持ち悪いんだが、、、
0176nobodyさん
2006/06/06(火) 01:40:03ID:???それぞれ一行ずつを取り出して表示させるにはどうすればよいでしょうか?
0177nobodyさん
2006/06/06(火) 01:53:24ID:???ていうか、本くらい読め。基本過ぎる
0178nobodyさん
2006/06/06(火) 02:06:41ID:???本だと私のやりたいことが載ってなかったので質問してしまいました
すいません、、、
@listに代入させた各行の1番目の<p></p>はそのまま、2番目の<p></p>を削除したいのですが、、、
0180nobodyさん
2006/06/06(火) 02:18:35ID:???なくなっちゃったんですか?探してもないんだけど。
0182nobodyさん
2006/06/06(火) 02:25:49ID:???「Perl&CGI入門」という本です
1番目の<p></p>はそのまま、2番目の<p></p>を削除がちょっと、、、
0183nobodyさん
2006/06/06(火) 03:09:49ID:???正規表現くわしくのってないのかな? 持ってないから分からん・・。
$line =~ s{^(.*?<p>.*?</p>.*?)<p>.*?</p>}{$1};
↓ (<p class="〜"> とかもあるなら)
$line =~ s{^(.*?<p(?:\s[^>]*)?>.*?</p>.*?)<p(?:\s[^>]*)?>.*?</p>}{$1};
これでいいかな? 試してないけど。
後で 3番目以降も削除したいんですけど、とか聞かないでね。応用しる。
あまりに正規表現に弱かったら、
if ($line =~ /<p>/) {
$line =~ s{<p>}{\x01};
$line =~ s{</p>}{\x02};
$line =~ s{<p>.*?</p>}{}g;
$line =~ s{\x01}{<p>};
$line =~ s{\x02}{</p>};
}
とでもやればいいんじゃねw おすすめはしないけど。
でもなんで 1番目だけいらないんだろうなw どう使うのか予想つかないわ。
0184nobodyさん
2006/06/06(火) 03:13:16ID:???たぶん、ム板にあるからいいじゃんということになったんだと思う
正規表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131028296/
0185nobodyさん
2006/06/06(火) 03:16:48ID:???> これ何もでなくね?w status_line とったら 403 返ってきたよw google 内部で弾いてんのかな・・・
うはwwwごめんwww
同じスクリプトでやってみた。trの方が速いっぽい。まあそれでも2倍も差はつかないけども。。
$ perl -v | head -2
This is perl, v5.8.7 built for cygwin-thread-multi-64int
$ wc lc.html
133 2052 60082 lc.html
$ for i in 1 2 3 4 5 ; do perl hoge.pl ; done
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.93 usr + 0.00 sys = 2.93 CPU) @ 3408.32/s (n=10000)
tr: 3 wallclock secs ( 2.47 usr + 0.00 sys = 2.47 CPU) @ 4043.67/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.97 usr + 0.00 sys = 2.97 CPU) @ 3362.47/s (n=10000)
tr: 3 wallclock secs ( 2.47 usr + 0.00 sys = 2.47 CPU) @ 4042.04/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.90 usr + 0.00 sys = 2.90 CPU) @ 3443.53/s (n=10000)
tr: 3 wallclock secs ( 2.56 usr + 0.00 sys = 2.56 CPU) @ 3901.68/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.92 usr + 0.00 sys = 2.92 CPU) @ 3419.97/s (n=10000)
tr: 3 wallclock secs ( 2.49 usr + 0.00 sys = 2.49 CPU) @ 4011.23/s (n=10000)
Benchmark: timing 10000 iterations of lc, tr...
lc: 3 wallclock secs ( 2.90 usr + 0.00 sys = 2.90 CPU) @ 3443.53/s (n=10000)
tr: 3 wallclock secs ( 2.47 usr + 0.01 sys = 2.48 CPU) @ 4027.39/s (n=10000)
0186nobodyさん
2006/06/06(火) 06:19:56ID:???0187nobodyさん
2006/06/06(火) 10:15:26ID:???自分はこうやってるんだけど他にいい方法ない?ならわかるけどさ。
0188nobodyさん
2006/06/06(火) 11:17:16ID:???0190nobodyさん
2006/06/06(火) 14:59:19ID:Re1RmuFGもっと簡潔に書けるような気がするんですが自分ではこれが限界でした。
あと、ファイルロックのやり方が合っているのか自信がありません。
一応動いていることは動いているんですが、問題はないでしょうか。
改良すべき点、根本的にこういう書き方に直した方が良い、とかあればアドバイスお願いします。
大まかな内容は以下のようなものです。
予定として保存する内容は「予定日(月と日)」と
「予定内容(長くても200バイト程度)」の2つでフォームから渡します。
予定を保存するファイルは月単位で作成します。
例えば2006年5月の予定の場合なら「200605.txt」というファイル名です。
保存するファイルがないときはその都度作成し、
6月1日
6月2日
6月3日
.
.
.
という風に日付だけを先に入れておきます。
保存するファイルがあるときは、
フォームから渡された「予定日」とマッチした日付の次の行に「予定内容」を書き込みます。
内容は以上です。次レスにコードを晒します。
0191190(前半)
2006/06/06(火) 15:03:27ID:???$a = sprintf("%04d%02d",$YEAR,$MON)
$file = "$a.txt";
# 月から日数を出す
if($MON == 1|3|5|7|8|10|12){
$m = 31;
}elsif($MON == 4|6|9|11){
$m = 30;
}else{
if($YEAR % 4 ==0){
$m = 29;
}else{
$m = 28;
}
}
for($i=1;$i<=$m;$i++){
$date .= "$MON月$i日\r\n\r\n";
}
0192190(後半)
2006/06/06(火) 15:04:16ID:???if(!open(IN,"$file")){
open(OUT,">$file")
flock(OUT,2);
print OUT $date;
close(OUT);
}
open(IN,"$file");
flock(IN,2);
@A = <IN>;
close(IN);
# 「予定日」とファイル内の「日付」をマッチングさせて該当日付に「予定内容」を書き込む
$loop = @A;
$i = 0;
while($loop > 0){
if($A[$i] eq $plan_day){# $plan_day = "フォームからの情報(予定日)";
$A[$i] .= "$plan_value\r\n";# $plan_value = "フォームからの情報(予定内容)";
}
$loop --;
$i ++;
}
if(!open(OUT, "+< $file")){&error;};
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT @A;
close(OUT);
0193nobodyさん
2006/06/06(火) 15:04:28ID:???自作CGIを評価するスレ
http://pc8.2ch.net/test/read.cgi/php/1049514428/
0195nobodyさん
2006/06/06(火) 17:58:30ID:???これ斬新だな。当然Warning出るけど一応動くんだw
0198nobodyさん
2006/06/06(火) 18:34:39ID:???入れ直したいんですが良い方法が浮かびません。
うまく表現できないので例を挙げると、
「@listの中身は20コあって、5コごとに折り返して再び@listに入れ直す」
という意味は、下のようなイメージです。
$list[0] = $list[0] . $list[5];
$list[1] = $list[1] . $list[6];
$list[2] = $list[2] . $list[7];
$list[3] = $list[3] . $list[8];
$list[4] = $list[4] . $list[9];
$list[5] = $list[10] . $list[15];
$list[6] = $list[11] . $list[16];
$list[7] = $list[12] . $list[17];
$list[8] = $list[13] . $list[18];
$list[9] = $list[14] . $list[19];
0199nobodyさん
2006/06/06(火) 18:37:06ID:???0201nobodyさん
2006/06/06(火) 18:46:12ID:???そらビット演算するだろなw
やりたかったのは
if($MON =~ /^1|3|5|7|8|10|12$/)
こうだろうね
0202nobodyさん
2006/06/06(火) 18:47:16ID:???if($MON =~ /^(?:1|3|5|7|8|10|12)$/)
0203nobodyさん
2006/06/06(火) 18:56:40ID:???0204nobodyさん
2006/06/06(火) 19:04:10ID:???も、もう少しヒントお願いします。
>>200
例えば、EXCELのフォーマットの関係でCSV出力のときだけ
こういう処理をしたりするのって変ですか?
0205nobodyさん
2006/06/06(火) 19:18:40ID:???標準入力の読み込み位置を変更したいのですが
seek STDIN, 0, 0;
ではダメなようでして
なにか術があれば教えてください
0206nobodyさん
2006/06/06(火) 19:21:39ID:???1つのループでいけるかとおもったけど、前半と後半でちゃうのか・・・
処理方法を見直したほうが良いかと思うw
0207nobodyさん
2006/06/06(火) 19:23:03ID:???1行でもできるんでない?
ヒントをいえば、
右側は常に list[n] + list[n+5]
になってて、
その n ってのは、左側を list[i] とすれば、
i が 5回ごとに 10 足されていって、それに、 i 回目を 5 で割ったあまりを足したもの。
0208nobodyさん
2006/06/06(火) 19:24:49ID:???(1) 一旦ファイルに書き出したのを利用する
(2)そんなにでかくないのなら read で読み込んだものを利用する
の2通りがあります。
大きいファイル、環境にも夜でしょうが 5MB あたりを境に (1) か (2) かを使い分ければ良いかと思います。
0210nobodyさん
2006/06/06(火) 19:41:34ID:???あ〜、無理に $i 1つでやろうとしてたから駄目だったかw
>204
use strict;
my @list = map{ "str$_" }(0..19);
my $n = 0;
my @newlist = ();
for(my $i = 0; $i < 10; $i++){
if($n && !($n % 5)){ $n += 5; }
$newlist[$i] = $list[$n] . $list[$n + 5];
$n++;
}
print join("\n", @newlist);
0211nobodyさん
2006/06/06(火) 19:44:07ID:???エレガントじゃないけど、こんなのどうかな・・・
use strict;
sub wrap_list($@) {
my ($width, @list) = @_;
return @list if $width <= 0 or @list == 0;
my @result = (), my $wrap = 0, my $i = 0;
for (@list) {
$result[$i++] .= $_;
if ($i % $width == 0) {
$wrap = !$wrap;
$i -= $width if $wrap;
}
}
return @result;
}
my @wlist = wrap_list 5, ('a'..'z');
print "@wlist\n";
0212nobodyさん
2006/06/06(火) 20:00:57ID:???my @list;
for (my $i = 0; $i < 10; $i++) {
my $j = $i % 5 + 10 * int($i / 5);
$list[$i] = $list[$j] + $list[$j + 5];
}
0213nobodyさん
2006/06/06(火) 20:02:43ID:???>>198
my @list;
for (my $i = 0; $i < 10; $i++) {
my $j = $i % 5 + 10 * int($i / 5);
$list[$i] = $list[$j] . $list[$j + 5];
}
0214nobodyさん
2006/06/06(火) 20:05:47ID:???うはw 答え書いちゃうとわざわざヒント出した意味がww
まあありか。
自分が書いたのは >>213 まんまっす。
配列数がわからない場合、$i < 10 の部分は、事前に
my $limit = (scalar @list) / 2; で $i < $limit; とでも。 # @list は偶数であること。
0215198
2006/06/06(火) 20:08:34ID:???こういうことでしょうか・・・でも結果がうまく出ないです。
どこが間違ってるんでしょうか?
for($i=0;$i<10;$i++){
if($i>=5){
$n = ($i%5) + 10 + $i;
}else{
$n = $i;
}
$list[$i] = $list[$n] . $list[$n+5];
}
0217198
2006/06/06(火) 20:10:27ID:???あわわ、レスあったのに気付かなくてすみませんでした!
ありがとうございます!ゆっくり拝見させていただきます。
0219nobodyさん
2006/06/06(火) 20:12:27ID:???あ、ズバリその通りです。
ただ、自分の場合いきなり任意の数でできるレベルじゃなかったので・・・。
どんな数にでもすぐ応用できるものがあれば一番良いと思っています。
0221nobodyさん
2006/06/06(火) 20:15:15ID:???$list[10] から先が残ったまんまだぞ。
まあ >>198 見ると残らせるのか残らせないのか分からないけどねw
>>198 は残らせないなら @newlist に入れるべし。
0222nobodyさん
2006/06/06(火) 20:19:35ID:???「>>198の動作を、2行の折り返しから3行の折り返しにしたくなった」
「3行bヌころかn行(任意の行数)に折り返したくなった」
ちゃんと拡張できますか?
0223nobodyさん
2006/06/06(火) 20:21:42ID:???0225207
2006/06/06(火) 20:29:44ID:???んじゃ、ちょっと面白そうなのでやってみた。
>>213 に似た自分のソースでの回答w
use strict;
my $ori = 10; # ○個ごとに折り返す (自然数)
my $ren = 4; # 繋げる個数
my @list = map{ " $_ " }(0..119); # @list の数は $ren と $ori の倍数であること
# loop
my @newlist = ();
my $limit = (scalar @list) / $ren;
for (my $i = 0; $i < $limit; $i++) {
my $n = int($i / $ori) * $ori * $ren + $i % $ori;
$newlist[$i] = '';
for (my $j = 0; $j < $ren; $j++) {
$newlist[$i] .= $list[ $n + ($ori * $j) ];
}
}
for (my $i = 0; $i < scalar @newlist; $i++) {
print "$i : $newlist[$i]\n";
}
exit;
連結に2重 for 使うのはしょうがないよね・・・。
0226198
2006/06/06(火) 20:29:59ID:???そうですね。その点を見落としていました。
>>222
3列の場合は・・・こう?
for (my $i = 0; $i < 30; $i++) {
my $j = $i % 5 + 15 * int($i / 5);
$list[$i] = $list[$j] . $list[$j + 5] . $list[$j + 10];
}
任意の行については・・・もうちょっと待って下さい・・・。
0227211
2006/06/06(火) 20:30:39ID:???引数で$n(行数)を受け取ったとして
$wrap = !$wrap;
$i -= $width if $wrap;
を
if ($wrap++ < $n-1) { $i -= $width }
else { $wrap = 0; }
に直したらできます。
0228222
2006/06/06(火) 20:37:25ID:???_、_
( ,_ノ` ) n
 ̄ \ ( E) グッジョブ!!
フ /ヽ ヽ_//
0230198
2006/06/06(火) 20:59:42ID:???解答を見てもよく分からない部分もあるようなレベルなので
参考にしつつ勉強してきます。
お付き合いしていただいた方々、本当にありがとうございました。
0231nobodyさん
2006/06/06(火) 21:29:12ID:???中身を表示→数字に1を足す という動作をさせたいのですが、
中身をセットする時点で数字が消去されてしまうようです。
open (ID,">id.txt");
$id = <ID>; #ここの時点で中身が消去?
print "$id";
$id++;
print ID "$id";
close(ID);
例えばファイルの中身の初期値が100ならば、
最初は100、リロードの度に101、102・・・と表示されると思うのですが
上手くいきません。
ご指摘のほどよろしくお願いいたします。
0232nobodyさん
2006/06/06(火) 21:35:14ID:???>open (ID,">id.txt");
書き込みでopenしているので、中身はこの時点で消去です。
一度読み込んでから、書き込むように変えましょう。
0234nobodyさん
2006/06/06(火) 21:41:43ID:???seek
減る事もある場合、桁数に注意
0235nobodyさん
2006/06/06(火) 23:19:31ID:???$word が任意の入力できる文字列で、文字コードが EUC か UTF8 だとして、
$word = quotemeta $word;
$word =~ /$word/;
に、セキュリティホールってある? 普通に通るかすら。
0236nobodyさん
2006/06/06(火) 23:22:01ID:???$word = quotemeta $word;
$text =~ /$word/;
こうですた。
0237nobodyさん
NGNG0238nobodyさん
2006/06/06(火) 23:43:29ID:???俺は\x00-\x19までを削除してるのと、正規表現で意味のもつものをエスケープする以外はなんもやってない
0239nobodyさん
2006/06/07(水) 00:01:52ID:Z9iT2VzKopen(FILE, "<2get.txt") || print "file open error!";
while(<FILE>){
print;
}
とやって、2get.txtの内容を出力する、というのを応用して、
2get.txtの内容を途中まで読み込むCGIを作りたいのですが。
例えばこの2get.xtxの中の1行に、
<!-- ここまで -->
とか書いておきます。
で、CGIで読み込む時に、上から1行ずつ読んでいって
<!-- ここまで -->の行が出てきたら、読み込み終了。
実際に自分で作ってみて、while〜の1行を
while(<FILE> ne '<!-- ここまで -->') ||(以下略)
って書き換えたら、CGIが動かなくなりますた。
どっかで勘違いしてるんだろうと思うんだけど、
勘違いのポイントかヒントだけでも教えてください。
0240nobodyさん
2006/06/07(水) 00:16:13ID:???print; の前に抜ける条件を書いて lastしてみればいいんじゃないかと。
0241nobodyさん
2006/06/07(水) 00:41:37ID:DSNCvTMFつーか500エラーが出ました。
while(<FILE>) {
if($_ eq '<!-- ここまで -->') { last; }
print;
}
これで合ってますか?
0242nobodyさん
2006/06/07(水) 00:47:38ID:DSNCvTMFでも<!-- ここまで -->を読んでくれません。
''で囲むんじゃダメなんですかね?
それとも改行コードも考慮しないといけないとか?
0247nobodyさん
2006/06/07(水) 01:03:44ID:???一気に全部読んで文字列に入れてから、その文字があるなら正規表現でずばっと削除したほうが早いよね。
0249nobodyさん
2006/06/07(水) 01:11:19ID:???0250248
2006/06/07(水) 01:18:21ID:???「早いよね」ってことだったので、速いか遅いかは読込むデータの傾向や動作環境によるっつー話。
メモリやら I/O の話はどこから出てきた?
0251nobodyさん
2006/06/07(水) 01:20:34ID:???>>239 の場合
local $/ = '<!--ここまで-->';
open (FILE, '2get.txt');
$_ = <FILE>;
close (FILE);
print $_;
ってやると解決しないか?
速度的にも一番早い。
0252nobodyさん
2006/06/07(水) 01:23:04ID:???>>244
ありがとうございました。なんとか動くものになりました。
>>247
正規表現もまだ理解しきっていないので…
今後のメンテナンスの時に考えることにします。
0253251
2006/06/07(水) 01:24:25ID:???0255nobodyさん
2006/06/07(水) 01:38:27ID:???まじでwww
うちではうまくいくけどなあ。
ちょっとこれだけ走らせてみt
[2get.txt]
1111111111111111111111111111111111111111111
222222222222222
3333333<!--ここまで-->333333333333
[hoge.pl]
use strict;
{
local $/ = '<!--ここまで-->';
open (FILE, '2get.txt');
local $_ = <FILE>;
close (FILE);
chomp $_;
print $_;
}
exit;
\r\n\r\n ずつデータとるときとかに使えるしwktkだと思ったんだがなあ。
0256nobodyさん
2006/06/07(水) 01:43:22ID:???0257nobodyさん
2006/06/07(水) 01:52:11ID:???どうなんだろ?
とりあえず試しに 200kb くらいのテキスト用意して、
- - - - - - - - - - - - - - - - - - - - - - - - - - -
$/ = '『根掘り 葉掘り 聞き回る』の・・・『根掘り 葉掘り』・・・・・ってよォ〜〜〜
『根を掘る』ってのはわかる・・・・・スゲーよくわかる 根っこは土の中に埋っとるからな・・・
だが「葉掘り」って部分はどういう事だあああ〜〜〜〜〜っ!?
葉っぱが掘れるかっつーのよーーーーーーッ!
ナメやがってこの言葉ァ 超イラつくぜぇ〜〜〜ッ!!
葉っぱ掘ったら裏側へやぶれちまうじゃあねーか!
掘れるもんなら掘ってみやがれってんだ!チクショーーッ
どういう事だ!どういう事だよッ!クソッ!葉堀ってどういう事だッ!
ナメやがってクソッ!クソッ!';
- - - - - - - - - - - - - - - - - - - - - - - - - - -
・・・って入れてやってみたけど、こっちでは無事その前部分だけに切り取られたよw
0259nobodyさん
2006/06/07(水) 01:59:10ID:???え、どんなエラーでてる?
ブラウザでやってるなら
#!/usr/bin/perl
print "Content-type: text/html\n\n";
も入れてね?
0260nobodyさん
2006/06/07(水) 02:03:21ID:???その文章の方が気になりますがw
すんません、Content-typeを入れるの忘れてますた。
んで、今度こそ大丈夫だと思ったら空白ページ。
鯖環境かなんかですかね?
0261nobodyさん
2006/06/07(水) 02:07:38ID:???0262nobodyさん
2006/06/07(水) 02:11:01ID:???まあおめでとう!w 何が悪かったのやらw
てか自分のPCに perl 入れて、コマンドプロンプトとかから perl 実行すること覚えようぜ。エラーメッセージでて便利よ。
0263nobodyさん
2006/06/07(水) 02:14:36ID:???無限 fork するようなもの書いたときにおかしくなるから嫌。
0264nobodyさん
2006/06/07(水) 02:14:53ID:???うい。perlは入れた(はず)ですが、実行の仕方(設定の仕方?)が分からんとです。
これから覚えます。
ちなみに、もともと作ってた方のページも直しましたが、
読み込み元ファイルの内容が表示されんとです。
まだまだ道は長いとです。
ありがとうございました。
0265nobodyさん
2006/06/07(水) 02:19:08ID:???えぇw
>>264
そのフォルダからcmd開いて、 「perl hoge.cgi」 とか打つだけだす。
あと、$/ 変えて読み終わったあとは、変な挙動起こさないように、
$/ = "\n"; って設定しなおしていくといいかも。
0266nobodyさん
2006/06/07(水) 02:23:00ID:???> そのフォルダからcmd開いて
いきなり意味分かんないんで、このスレのログ保存しておきました。
もうちょっと頭が良くなってから読み返します。
こんな夜中までありがとうございます。
0268nobodyさん
2006/06/07(水) 02:37:25ID:???確かに、意味不明ですね。
0269nobodyさん
2006/06/07(水) 03:07:49ID:???0270nobodyさん
2006/06/07(水) 03:08:00ID:???↓こういうのをやるとか、
http://arena.nikkeibp.co.jp/tec/winxp/20050309/111687/
どっかのフォルダの ツール → フォルダオプション → ファイルの種類 → CGI ファイル → 詳細設定 で、
新規 → アクション 「cmd」 → アクションを実行するアプリケーション 「cmd.exe "cd %l"」
ってやると、「そのフォルダからcmd開いて」 な感覚になるんだけど・・・普通そう言わないのかな・・・(´・ω・`)
0271nobodyさん
2006/06/07(水) 04:27:27ID:???cd "c:\perlスクリプトがあるディレクトリ"
perl スクリプト名.pl
が親切では?
0272nobodyさん
2006/06/07(水) 05:24:07ID:???うん、そうなんだけど、
ファイルのディレクトリが D:ドライブだとまた違うし、
何度も使うなら、cd 〜フォルダ名 とか打つの省略できる方が楽だと思って。
0273nobodyさん
2006/06/07(水) 05:51:48ID:???今日から perl 勉強します yo! ってひとが、そんな設定やると思う?
コマンドプロンプト開いた時点で、その人のホームディレクトリにいるから
誘導するのはそれほど難しくないよね。
0274nobodyさん
2006/06/07(水) 08:11:05ID:???エクスプローラのフォルダから DOS 窓を開けるようになる。
そうすれば一々 CD しなくてもいいし、perl への PATH が通ってれば perl ってだけで
起動できる。
ちなみに cmd とか commasnd とかから起動すると速攻で窓閉じるから駄目よw
0275nobodyさん
2006/06/07(水) 10:29:37ID:???@{$a}{@$b}
これってどういう意味なんでしょう?
そんなに難しいことじゃないと思うんですが、
perlは慣れていないので苦労しています。
宜しくお願いします。
0276nobodyさん
2006/06/07(水) 10:44:11ID:???例えば、
$a = 'hash';
$b = ['a', 'b']; # 配列のリファレンス
とすると、
@{$a}{@$b} → @hash{'a', 'b'} → ($hash{'a'}, $hash{'b'})
のこと。
0278nobodyさん
2006/06/07(水) 13:05:38ID:???左は日付です
--20060101--aaaa----
--20060423--bbbb----
--20060514--cccc----
なんてのが書いてあるファイルを読み込み @dataとします
まず@dataを表示させてみると2行目からの頭に半角のスペースが入ります
これはなんでしょうか?
さらに
foreach(@data){
if( /(--(\d*)--\w*----)/){
$list {"$2"}=$_;
}}
foreach $key (sort keys %list){
push @htm ,$list{$key};}
とし、これをもう一度展開して表示させてみると、同じ日付がある場合に
誤動作して読み込まれません
改善するにはどうしたらいいでしょうか?
0279nobodyさん
2006/06/07(水) 13:14:37ID:???行と改行コードに関する質問です
読み込み
もう一度展開
なんてのが書かれている質問を読み込みます
これはなんでしょうか?
> 頭に半角のスペースが入ります
> これはなんでしょうか?
自分で書いているとおり半角のスペースなのではないでしょうか。
さらに
誤動作して読み込まれません
と書いてあるので考えてみると、コードは動いているのに質問する場合なので
解釈がうまくできません
改善するにはどうしたらいいでしょうか?
0280278
2006/06/07(水) 13:20:29ID:???0281nobodyさん
2006/06/07(水) 13:28:36ID:???> 半角スペース
定番FAQ
print "@data";とやってるだろ。
配列を文字列内に入れようとすると$"(デフォルトで半角スペース)で連結されるからこうなる。
むやみにダブルクォーテーションで囲むのは止めましょう。
ちなみにprint @data;の場合は$,で連結される。これはデフォルトで空文字列。
> 同じ日付
%listの中に配列を作って複数の値を記録できるようにすれば良い。
foreach (@data) {
push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
}
foreach my $key (sort keys %list){
push @htm, @{$list{$key}};
}
0282nobodyさん
2006/06/07(水) 13:29:56ID:???@dataはファイルから丸ごと読み込み
@data = <FH>;
で、@dataを表示する時に
print "@data";
とかやってるんじゃないの?
だったら頭にスペース入るだろうね。
2つめは当たり前でしょう。
同じ日付があれば、データが上書きされるので。
ハッシュの先を配列にするとかしないと。
0283nobodyさん
2006/06/07(水) 14:35:06ID:CY60cgj5そういったモジュールってありますでしょうか?
CPANでwikiで検索したら数があまりに多すぎて。。。。。
0284278
2006/06/07(水) 14:55:55ID:???有り難うございます
push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
この部分がエラーを発生します
もうちょっと勉強してみます
0285278
2006/06/07(水) 14:57:52ID:???0286nobodyさん
2006/06/07(水) 16:04:17ID:???0287nobodyさん
2006/06/07(水) 16:08:10ID:???最初に空のデータとして宣言しとかないと何か不具合起こすことってあるの?
0288nobodyさん
2006/06/07(水) 16:22:34ID:???Cみたいに初期化しないと変な値が書き込まれてるって事は無い。
ただし、配列かどうか分からない所にいきなりpushしたりするとエラーになる。
my %hash;
my %data = ('a' => 1, 'b' => 2, 'c' => 3);
while (my($key, $val) = each %data) {
push($hash{$key}, $val); # Error(配列に初期化してないから)
}
0289nobodyさん
2006/06/07(水) 16:25:30ID:4ldG4rWrperl5.8.8
ウェブ上で使ってるプログラムをローカルに持ってきたらエラーがでました。
ウェブのperlは5.8.1です。
そこで質問です。
use strictしてるプログラムをperl -cに掛けてエラーが出ないのにapacheのログに
[Wed Jun 07 16:06:23 2006] [error] [client 127.0.0.1] Premature end of script headers: c:/program files/apache group/apache/htdocs/public_2/system/system.cgi
[Wed Jun 07 16:06:23 2006] [error] [client 127.0.0.1] Can't use an undefined value as a HASH reference at c:\\PROGRA~1\\APACHE~1\\apache\\htdocs\\public_2\\system\\system.cgi line 427.\n
と出て、strictを外すと
[Wed Jun 07 15:47:53 2006] [error] [client 127.0.0.1] Premature end of script headers: c:/program files/apache group/apache/htdocs/public_2/system/system.cgi
[Wed Jun 07 15:47:53 2006] [error] [client 127.0.0.1] substr outside of string at c:\\PROGRA~1\\APACHE~1\\apache\\htdocs\\public_2\\system\\system.cgi line 445.\n
とエラー内容が変わるのはなんですかね。
ウェブ上ではなんのエラーもなく動作してる時点でコードに問題はないと思うのですが。
0292nobodyさん
2006/06/07(水) 16:30:26ID:???use strict; してるかどうかによって警告が出る位置が違ってる。
それから、エラー読もうよ…。
substr が文字列境界超えてるって。
多分、見えないだけで、webサーバ側のログには延々とそれが書き込まれてる。
0293289
2006/06/07(水) 16:40:43ID:4ldG4rWrすみません。先ほどのapacheのエラーログです。
>>292
文字列境界越えてるって使い方がおかしいってことですかね。<strong>${\substr($db_all_field_html{ordertime},0,4)}年${\substr($db_all_field_html{ordertime},4,2)}月${\substr($db_all_field_html{ordertime},6,2)}日
こういうことはしてます。でもウェブの方ではエラーログには何も残らず、ちゃんと表示される。
自宅では表示もできないし、ログにも
残る。
それにしても構文レベルのエラーならperl -cでひっかかると思ったのですが、
構文はあっているけど、実際に処理をしたら無理だった。とかあるんですかね?
それでウェブの方では実際にやっても大丈夫だったけど、自宅の法では実際に無理だったみたいな誤差ですかね。
strictを外すとエラーの行が変わるのは気づいてたのですが、どうも構文チェックがokでてる以上
何をすればいいかわからなくて。
0294nobodyさん
2006/06/07(水) 16:41:02ID:???僕の個人的かつ大胆な推測によると、
仮に $hash{$key} の値を配列リファレンスで初期化していたとしてもエラーが出ると思うのだ。
それ、デリファレンスしてねえからな。
0295294
2006/06/07(水) 16:48:28ID:???未初期化なナニをデリファレンスすると、perl はその時点から「そのように」扱ってくれる。
だから >>288 のようなケースでは個別の初期化は不要。いや、してもいいけどさ。
0297nobodyさん
2006/06/07(水) 17:10:08ID:???何か値が入るとあなたが仮定している変数が、どこかで undef ってると思われます。
それぞれのタイミングで各変数の値が期待通りになっているかチェックしましょう。。
-c スイッチの syntax OK は 「perl によって曖昧さなくパースできますよ。一応ね」 という意味なので、セマンティクス上のバグは見つけてくれません。
代わりに -wc を使うようにすると警告も併せて示してくれます。
0298nobodyさん
2006/06/07(水) 17:15:43ID:???0299289
2006/06/07(水) 17:20:02ID:4ldG4rWrありがとうございます。
-wcやってみます。
とりあえずsubstrのあの記述を抜いて、strictを外すと表示ができるようになりました。
今はstrictでない部分を探してます。
ところでもしかして、5.8.1と5.8.8では何か違うんですかね。そう思えてならないです。
5.8.1が手に入ればわかりやすいですが。
0300nobodyさん
2006/06/07(水) 17:48:23ID:???$text =~ s/\r\n\w//g;
とかだと、直後の1文字も消えてしまうし・・・ヒント下さい。
0301nobodyさん
2006/06/07(水) 17:52:35ID:???perl58[2-8]delta に変更点が書いてある。
http://search.cpan.org/~nwclark/perl-5.8.8/
>>300
s/\n(?!$)//g;
ついでに http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0302300
2006/06/07(水) 18:01:42ID:???ありがとうございます!
$が末尾、!$が末尾じゃない、ってことで?が条件文として働いてるってことですかね。
改行コードって実は結構複雑だったんですね。参考にします。
みなさんデータの読み込みのときに毎回コードの変換して・・・
って、書き込みの段階で変換してれば読み込みのときには必要ないのか・・・。
0304nobodyさん
2006/06/07(水) 18:26:26ID:???http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html#looking_ahead_and_looking_behind
0305nobodyさん
2006/06/07(水) 18:30:05ID:???[例]
@number = (1,2,3,4,5,6,7,8,9,10);
を
@number = (1,2,3,5,6,7,8,9,10);4番目の要素を削除
としたり、
@number = (1,2,A,3,4,5,6,7,8,9,10);3番目に要素を追加
としたり。
0306nobodyさん
2006/06/07(水) 18:35:35ID:???ぐぐれって・・・
0308nobodyさん
2006/06/07(水) 21:34:12ID:???ここの最後の疑問を読んで、確かにそうだなぁと思ったので、こちらで質問させてください。
grepやmapの第一引数にEXPRを指定すると、何度も評価されますよね?
でも、普通に考えたらgrepやmapが実行される前に評価されてしまうのではないでしょうか。
この遅延評価はgrepやmapだけ特別なんでしょうか。
BLOCKを渡すと遅延評価される、というのは納得できますが…。
同じような事がforやwhileなどにも言えますけど、あちらは構文ですよね。
0309nobodyさん
2006/06/07(水) 22:43:06ID:???/e$/ は $_ =~ /e$/の略で、普通は
my @e_fruits = grep $_ =~ /e$/, @fruits;
ではなく
my @e_fruits = grep /e$/, @fruits;
って書くと思う。これ関係ない?
ちなみにgrepもmapもforのような書き方もできるぞ。
0310nobodyさん
2006/06/07(水) 22:55:49ID:???grep は最初の引数(あるいは間接オブジェクトスロット)にコードリファレンスを取る。
それは後続の引数をリスト展開して得られた最初の要素から順に $_ にセットして繰返し呼び出される。
ユーザサブルーチンのプロトタイプで言うと (&@) ね。完全に同一じゃないけれど。
>>309
grep や map を連結できるのは、それぞれが返した値を前の関数に引数として渡しているから。だから両者は全く別物。
for(each), while, if などの修飾子は引数として渡されているわけではなく、スコープを生じるブロックを持たないだけでそれぞれが元来の制御構造であることに変わりがないので。
0311308
2006/06/07(水) 23:03:22ID:???わかりづらくてすいません。
例えば
$_ = 10;
my @r = map $_ * 2, (1..5);
print "@r";
と書いた時に、@r の中身は (10, 10, 10, 10, 10) じゃなくて (2, 4, 6, 8, 10) とできるのは
なぜなんでしょう?
0312308
2006/06/07(水) 23:06:03ID:???>>310
ありがとうございます。スッキリしました。プロトタイプの仕業でしたか。
てことは、EXPRの場合もBLOCKの場合も、結局コードリファレンスとして渡されるわけですね。
0313nobodyさん
2006/06/07(水) 23:42:47ID:???使う分にはそこまでわからなくても問題ないけど。
0315nobodyさん
2006/06/08(木) 00:16:48ID:???やっぱり組み込み関数なのでズルしてると思ったほうがいいね。
0316308
2006/06/08(木) 00:33:23ID:???そうみたいですね…。試しに map を (&@) で実装してみました。
やはり式やブロックだけでは渡せず、無名関数を作ってコードリファレンスを渡さなきゃダメみたいです。
先ほどのブログにコメント付けてきちゃいましたorz 訂正してこなきゃ・・・
sub mymap(&@) {
my $code_ref = shift;
my @new_list = ();
for(@_) { push @new_list, $code_ref->(); }
return @new_list;
}
$_ = 5;
# @r = mymap $_ * 2, (1..5); # NG
# @r = mymap { $_ * 2 }, (1..5); # NG
@r = mymap sub { $_ * 2 }, (1..5); # OK
print "@r";
0317nobodyさん
2006/06/08(木) 00:40:21ID:???> やはり式やブロックだけでは渡せず、無名関数を作ってコードリファレンスを渡さなきゃダメみたいです。
おいおい。呼び出し方が間違ってるだけだよ。
× @r = mymap { $_ * 2 }, (1..5); # NG
○ @r = mymap { $_ * 2 } (1..5); # OK
0318308
2006/06/08(木) 00:44:04ID:???という事は、式の場合だけは裏でトリックが使われてる、て事でいいのでしょうか…
0319nobodyさん
2006/06/08(木) 01:04:38ID:???別に難しく考えなくても、変数のスコープが違うだけじゃん。
$_ = 10;
print map $_ * 2, (1..5);
print $_ * 2 for(1..5);
print $_;
0320308
2006/06/08(木) 01:20:55ID:???「スコープが違う」というのはわかるのですが、
「なぜgrepやmapの引数に書いた時だけスコープが違うのか」がわかりませんでした。
特別な構文もなしに書いた「$_ * 2」が、mapを呼び出す時点でなぜ「20」と評価されずに
「$_ * 2」という式そのものとして渡せるのかが不思議でした。
紛らわしい書き方ですいません。質問するのは難しいですね……。
長くなってしまいました。皆様お答え頂きありがとうございました。
0321nobodyさん
2006/06/08(木) 01:29:33ID:???0322239
2006/06/08(木) 01:58:38ID:???あの後も、動作確認ができたプログラムを自分の作ったページに組み込んでみるとやっぱり動かない。
試行錯誤の末、サブルーチン名に予約語を使っていたことが分かりました。
で、ようやくさっき、思い通りのページが作れました。
ということで、とことん勉強不足を痛感したわけですが、
ここでのアドバイスがあってなんとかなったもので、一言だけお礼を言いに。
特に>>251氏。ありがとうございました。
他の皆さんも参考になりました。ありがとうです。
またトラブったら泣きつきにくるかもしれませんが、その時はその時でまたよろしくです。
0323nobodyさん
NGNG思っているのですが、eval使うぐらいしか方法はないでしょうか?
0324nobodyさん
2006/06/08(木) 07:39:13ID:???書き込んだり削除したりした後に、掲示板表示画面に戻ってきた際に
キャッシュされた以前の状態の画面が表示されてしまいます。
ブラウザに更新を知らせるにはどのようにするのがよいのでしょうか?
0325nobodyさん
2006/06/08(木) 08:28:37ID:???my $func = $obj->can($val) and $obj->$func();
いきなり$obj->$val()で動かなかったっけ?
0326nobodyさん
2006/06/08(木) 15:06:05ID:iBH9Xn1Capache1.3.35 activeperl5.8.8 mysql4.0.26
DBIを使うのにppmでモジュールをインストールしました。
DBIとDBD-mysqlです。
そうしたらどうも
$sth->fetchrow_hashrefがstrict環境下ではエラーになってしまいます。
ハッシュリファレンスの値がありませんとのこと。
以前デスクトップで作ってた環境をノートパソコンに写したのですが、
モジュールのインストールが十分か不安ですが、思い出せません。
確かdata-dumperとdbiとmsql-mysql-moduluesという3つが欲しかったのですが、
ppmで見つからなかったので他のサイトで薦められてたDBD-mysqlとDBIにした覚えが
あります。というあやふやな記憶で今回もその二つを入れたのですが、
どうも動作がしませんので間違っていたかもしれません。
この二つの入れる順番などありましたでしょうか?
それとも前者の3つのモジュールを決められた順番でいれないとfetchrowが使えませんでしょうか。
アドバイス宜しくお願いします。
0327326
2006/06/08(木) 15:08:17ID:iBH9Xn1C失礼しました。
0328nobodyさん
2006/06/08(木) 15:20:30ID:???0329nobodyさん
2006/06/08(木) 15:21:25ID:???というのも、以前Encodeモジュールでエラーがあり調べてたらWinとLinux環境とでバージョンの違いが酷かったので・・・
0330326
2006/06/08(木) 15:33:20ID:iBH9Xn1Chttp://www.rfs.jp/server/mysql/01/07.html
ここを見てperlを勉強していて、(結構前の話ですが)それでDBIもここで勉強しました。
Data-Dumper-Simpleというモジュールは過去に入れた覚えがないのですよね。
過去作っていた環境なら問題なく動いたコードなんです。
fetchrow_heshref以外は問題なく動作してるのでDBIのモジュールのインストール自体は
できてると思うんです。
さっき試しに一旦ppm unsitallしてから先にDBD-Mysqlを入れたら自動でDBIを
先にインストールされました。
モジュールのバージョンがかわってfetchrow_hashrefがダメになったのですかね。
なんでしょうか。とりあえずData-Dumper-Simpleも入れてみますね。
あ、それとstirctを外すと何故かfetchrow_hashrefは動作します。
なんですかねこの症状。
>>329
そうでしたか。
でも過去動作していたコードと考えると逆にバージョンがアップしたせいなのかもしれませんが。
0331nobodyさん
2006/06/08(木) 15:41:28ID:???たとえば
<input type="text" name="test[0]">
<input type="text" name="test[2]">
<input type="text" name="test[3]">
というフォームデータを以下のように受け取ろうと考えて
いますが上手く行きません。
use CGI;
$query = new CGI;
@test = $query->param('test');
どなたかご教授お願い致します。
0332326
2006/06/08(木) 15:43:30ID:iBH9Xn1C特にかわりありません。
やはりstrict環境下では$sth->fetchrow_hashrefが不正扱いされるようです。
0333326
2006/06/08(木) 15:45:36ID:iBH9Xn1Cそれはできません。あくまでHTMLとPERLは違う言語でHTMLには配列という概念がありません。
0334nobodyさん
2006/06/08(木) 15:46:14ID:???inputタグ内の添え字は要らない。(PHPはできたかも)
あとは@test = $query->param('test'); で読めるんじゃなかったかな?
0335nobodyさん
2006/06/08(木) 16:24:15ID:???そうですか・・・
input type=textを、type=checkboxのようにに同一要素名で
送信する事は出来ないのでしょうか?
・・・とおもったら
>inputタグ内の添え字は要らない。
こちらで解決しました!!
添え字無しできちんと配列データとして送られていました。
ありがとうございます。
0336nobodyさん
2006/06/08(木) 16:29:01ID:???同じnameで配列の様に受け取りたいならcgi-libのReadParseを使ってみてください
たしか\0を区切り文字として渡してくるので
@array = split(/\0/, $in{'param'});
で配列にできたかと
0338326
2006/06/08(木) 17:00:06ID:iBH9Xn1Cmy $dbh = DBI->connect(@$dbipass{qw/source user pass/});
my $sth = $dbh->prepare(qq|select * from order_table order by ordertime desc limit $_,1;|);
$sth->execute();
my %db_all_field = %{$sth->fetchrow_hashref};
$sth->finish;
print $_,"<br>";
}
上記を試して確認中にやっとのことで原因わかりました。
データーベースにレコードが10以下の時の対処が記述してなかったが故のkとでした。
面目ありません。
0339nobodyさん
2006/06/08(木) 18:11:03ID:iBH9Xn1Cたまにチャットとかで
只今の閲覧者5人 参加者1人
っていう表示を見かけます。
あれはどうやって実現するのでしょうか。
例えばHTMLのmetaでrefleshを使って30秒毎に相手のIPを確認して
閲覧人数を割り出すのでしょうか?
相手がCGIにアクセスしてきたらIPを取って、取得時間をデータベースに入れておく。
で、1分毎にそのデータベース内のレコードを確認して取得から1分以上になっていたら
削除する。
でもイマイチな仕様ですね。これじゃ。ああ。もっといい方法があると思うのですが。
0340nobodyさん
2006/06/08(木) 18:11:51ID:MZDW6IYK残った数値に1を足したいんですがうまくいきません
$line="hoge100";
$line =~ s/hoge//;
$line=$line+1;
print $line; 何も表示されない
どこが悪いんでしょうか、お願いします。
0342nobodyさん
NGNG0343nobodyさん
2006/06/08(木) 18:43:37ID:???とりあえず
$line='101';
print $line;
で表示されるかどうか確かめることをお勧めする。
0344nobodyさん
2006/06/08(木) 19:00:59ID:???セミコロンの後ろにある全角空白を削除すれば動く
0345nobodyさん
2006/06/08(木) 19:43:03ID:iBH9Xn1Cここ閲覧者数がでますが、これをperlCGIで実現する方法はわかる方いますでしょうか?
0346nobodyさん
2006/06/08(木) 19:52:07ID:???ただこれだけですよ
0347nobodyさん
NGNG0348345
2006/06/08(木) 20:02:06ID:iBH9Xn1Cそれで1分たったらどうするんですか?
cronとかで1分毎に削除CGIを動かすとかですか?
例えば今自分のサイトのどこに何人いるかを確認できるようにするには、
CSV形式で
1.IPアドレス
2.パスインフォ?でしたっけ
3.リクエスト時刻(秒単位)
でやって毎回誰かがアクセスしてきたらそのCSVのIPで正規表現、重複しないように更新をやって、
削除はcronで別CGIを動かして3のリクエスト時刻が既定タイムを超えてたら
削除。
1分毎にcron起動ってなんかあれですね。
訪問者が来た時に削除プログラムも動かす方がスマートですかね。
と考えてみて一応できそうですが、やり方が下手なような気もします。
指摘などありましたらお願いします
0349nobodyさん
NGNG0350345
2006/06/08(木) 20:10:23ID:iBH9Xn1Cありがとうございます。
とりあえず徹夜で作ってみます。
強制的に訪問者に話かけることができるサイトを。
0352nobodyさん
2006/06/08(木) 20:28:53ID:???0353nobodyさん
2006/06/08(木) 21:03:01ID:???print FILE, @stream;
close(FILE);
みたいにして簡単に配列の中身をtest.datに書き込みたいんですが、
エラーになってしまいます。
やっぱり配列をループ回して一行ずつ書き込んでいくしかないんでしょうか。
アドバイスよろしくおねがいします。
0354nobodyさん
NGNGコンマイラネって書いてあるだろ
0355nobodyさん
2006/06/08(木) 21:08:05ID:???回答を求めてないと思われてもしょうがないな...
0356nobodyさん
2006/06/08(木) 21:13:05ID:???ありがとうございます。
0357nobodyさん
2006/06/08(木) 21:17:23ID:???0358nobodyさん
2006/06/08(木) 23:57:04ID:???書き込み禁止の読み込み限定にしたいんですが
0360358
2006/06/09(金) 00:10:31ID:CHuIt143日本語とは?
0361nobodyさん
NGNG古来日本民族が用いてきた言語で、日本国の公用語。
北海道から沖縄までの島々にわたり、一億余の人々に使用されている。
音韻面では、一つの子音と一つの母音との結合音節を基調とし、
母音で終わる開音節を特徴とする。「ガ・ッ・コ・オ(学校)」という発音にも見られるような
等時的なリズム上の単位、すなわち拍(モーラ)をもち、高低アクセントを伴う。
文法面では膠着語(こうちやくご)に属し、助詞・助動詞が文の成立について
大きな役割を果たしており、また、述語が文の最後にくるという文法構造をもつ。
複雑な敬語法が発達していることもその特徴の一つに数えられる。
中国語から借用した漢字と、漢字を母胎として成立した仮名との併用で表記されるのが普通である。
語彙(ごい)には日本固有の語である和語のほかに、漢字音に基づく漢語も多い。
近年は、西欧語からはいってきた外来語も多く用いられる。国土の面積の割には、
方言による違いも著しく、男女や職業などの別による用語差も大きい。
系統はアルタイ諸語の一つに属するものか、などとも言われるが、いまだに定説とはなっていない。
0363nobodyさん
2006/06/09(金) 10:11:56ID:???0364nobodyさん
2006/06/09(金) 15:58:08ID:???if(!open(FH, "< $file1")){&file_err;};
flock(FH, 2);
@DATA = <FH>;
close(FH);
# @DATAの処理。
if(!open(FH, "+< $file2")){&file_err;};
flock(FH, 2);
seek(FH, 0, 0);
print FH @DATA;
truncate(FH, tell(FH));
close(FH);
で良いんですよね?
とすると、$file1から読み込んだデータを処理した後再び$file1に上書きする場合、
上の$file2の部分を単純に$file1にすれば良いんでしょうか?
それとも処理の前にクローズするのはマズイんでしょうか?
0365nobodyさん
2006/06/09(金) 17:45:02ID:???file2をそのままfile1にすると、ロックが効かない典型。
http://web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html
0366nobodyさん
2006/06/10(土) 01:04:27ID:???↑こういう書き方を誰が広めてるの?
open FH, "+< $file2" or file_err();
のほうが自然言語に近くて読みやすいしタイプもすくない。
0367nobodyさん
2006/06/10(土) 01:06:14ID:???0368358
2006/06/10(土) 01:10:25ID:fHtGRC+E書き込み禁止の読み込み限定にしたいんですが
0370nobodyさん
2006/06/10(土) 01:30:58ID:???open(FH, "file") or do { a(); b(); };
とかなってキモス。
0371358
2006/06/10(土) 01:49:00ID:fHtGRC+EたんなるHTMLのみだと
JaneStyleで読みこめません
かちゅでも読みこめません
0372nobodyさん
2006/06/10(土) 01:54:26ID:???or ( a() , b() ); でもいかね?
>>371
その2ちゃんブラウザのデータのフォーマット見ればどうすればいいのかわかるじゃん。
何がわかんないかさっぱりわかんないから相手にされないんだよ。 現時点じゃ perl の話題とも思えないしな。
0373nobodyさん
2006/06/10(土) 02:34:33ID:???動く動かないの問題じゃなくて、
open($io, "./3/2/1/0/0/321001056131731037.dat") or ( $obj->method_a() , $obj->method_b() , $obj->method_c() , $obj->method_d() , $obj->method_e() );
位になるとどこで折り曲げるか悩むだろ。
0374nobodyさん
2006/06/10(土) 02:45:21ID:???なるほ。 まあそれはいくらなんでもそりゃ if 文使うだろーね。
あるいは前もって無名サブルーチン作っておいて、そこでまとめて処理するとかかな。
0375nobodyさん
2006/06/10(土) 03:03:50ID:???open $io, "./3/2/1/0/0/321001056131731037.dat"
or $obj->method_a()
and $obj->method_b()
and $obj->method_c()
and $obj->method_d()
and $obj->method_e();
しかしこんぐらいなら別のサブルーチン作るかも
0376nobodyさん
2006/06/10(土) 03:06:37ID:???or map { $obj->can("method_$_")->($obj) } (a..e);
とか。この場合ね。
0377nobodyさん
2006/06/10(土) 03:13:25ID:???0378nobodyさん
2006/06/10(土) 03:20:09ID:???0379nobodyさん
2006/06/10(土) 03:32:05ID:???0380358
2006/06/10(土) 03:35:54ID:YyFvvuc/書き込み禁止の読み込み限定にしたいんですが
0382358
2006/06/10(土) 04:01:25ID:YyFvvuc/たんなるHTMLのみだと
JaneViewで読みこめません
ギコナビでも読みこめません
0383nobodyさん
2006/06/10(土) 04:11:44ID:???0384nobodyさん
2006/06/10(土) 04:13:02ID:???use strict;
my $fuge = 'fuge';
my $run1 = \&Hoge::fuge::run;# 通る
$run1->();
my $run2 = \&{"Hoge::${fuge}::run"};# 通る
$run2->();
my $str = \${"Hoge::${fuge}::str"};# エラー
print $$str;
exit;
package Hoge::fuge;
use strict;
$Hoge::fuge::str = '++++++++++++++++++++++',"\n";
sub run { print '-----------------------------', "\n"; }
上で、$str が通らないのはわかるけど、$run2 が通るのは何でなのかな?
0385nobodyさん
2006/06/10(土) 04:52:18ID:???use strict;
(\&{"test"})->();
exit;
sub test{ print "hello, world!"}
って、こんなのも通るのね…。
0386nobodyさん
2006/06/10(土) 05:05:09ID:???0387nobodyさん
2006/06/10(土) 06:17:24ID:???ttp://search.cpan.org/~nwclark/perl-5.8.8/lib/AutoLoader.pm
| There is one exception to this rule:
| | $bar = \&{'foo'};
| | &$bar;
| is allowed so that goto &$AUTOLOAD would not break under stricture.
0388nobodyさん
2006/06/10(土) 06:30:15ID:???http://search.cpan.org/~nwclark/perl-5.8.8/lib/strict.pm#DESCRIPTION
0389nobodyさん
2006/06/10(土) 07:23:45ID:???( ・∀・)シ∩<へぇーへぇーへぇー
先生方さすがです。
0390nobodyさん
2006/06/10(土) 15:22:30ID:+aR8vdDYshtmlにしないとSSIディレクティブはできないんでしょうか??
0391nobodyさん
NGNG0392nobodyさん
2006/06/10(土) 15:24:45ID:???perlと何の関係もないな。
スレ違い。
0393nobodyさん
2006/06/10(土) 15:25:38ID:???<input name="NAME" type="hidden" value="hoge">
というタグを送信元のページに入れておき、
それをcgiの中で、別の変数に移す時、
$hage = $FORM{ 'hoge' };
と記述したのですがうまくいきません。
記述が間違っていますか?
0394390
2006/06/10(土) 15:28:43ID:+aR8vdDYカウントダウンのCGI作ってたもんで
0396nobodyさん
2006/06/10(土) 15:43:39ID:???某サイトからダウソしたcgiファイルに、FORMで受け取った内容を
>>393の記述で使っている部分があったんで、これでおkと思ってますた。
で、今そのcgiファイルの中に>>393の記述でおkにする部分(らしきもの)を見つけたんで、
それを処理の一番上に持ってきたら思い通りに動作しました。
ありがとうございます。
0397nobodyさん
2006/06/10(土) 16:59:32ID:???まあ最初は自分もそうだったけどw
0398nobodyさん
2006/06/10(土) 17:21:59ID:???いろんなところから切り貼りして汚い…('A`)
誰にも見せられない…
0399nobodyさん
2006/06/10(土) 21:50:32ID:???0400nobodyさん
2006/06/10(土) 22:06:47ID:???0401nobodyさん
2006/06/10(土) 23:02:04ID:???0402nobodyさん
2006/06/10(土) 23:30:24ID:???0403nobodyさん
2006/06/10(土) 23:52:59ID:???0404nobodyさん
2006/06/11(日) 01:30:03ID:???そんな、へんてこで読みにくいスクリプトなんて。
use strictを使えばいいのに。ふぅ。
だから、絶対見てないって!
0405nobodyさん
2006/06/11(日) 01:44:54ID:???#!/usr/local/bin/perl
どかーん!
(⌒⌒⌒)
||
/ ̄ ̄ ̄ ̄ ̄\
| ・ U |
| |ι |つ
U||  ̄ ̄ ||
 ̄  ̄
もうおこったぞう
0406nobodyさん
2006/06/11(日) 01:52:53ID:???0407nobodyさん
2006/06/11(日) 01:55:40ID:???0410nobodyさん
NGNG別に使わなくていいと思う
0411nobodyさん
2006/06/11(日) 02:12:30ID:???( ,_ノ` ) n 私に質問するんですか?
 ̄ \ ( E) だったら答えてあげますよ!
フKENT /ヽ ヽ_// 初心者にも簡単!
文字化けは回避できるわ鯖落ちは回避できるわ
とりあえず使っとけな雰囲気があるわで大騒ぎ!
0412nobodyさん
2006/06/11(日) 02:15:31ID:???>409さんが書いている通り
ただ、他のページからデータを持ってこようとしたり、自分の管理外の色んなページから
GET・POSTを受ける場合は文字コード変換が必要
0413nobodyさん
2006/06/11(日) 02:38:31ID:???0414nobodyさん
2006/06/11(日) 02:49:36ID:???0415407
2006/06/11(日) 03:18:44ID:???それはHTML内で
<Meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
としてあるのにEUCでデータを送ってくるブラウザもあるということですか?
EUCで送られてきたデータを
# $testにフォームから送られたデータが入ってるとする
print <<"HTML";
<html>
<head>
<Meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
$test
</body>
</html>
HTML
このように表示すると文字化けし、
それを回避するためにjcode.plで文字コードを変換する、ということでOKですか
>>412
それはURLエンコードのことではないんですか?
当方、簡単な掲示板を作っていて、jcode.plを使わなくても何の問題も無かったんで気になったんですが。
0416nobodyさん
2006/06/11(日) 03:41:11ID:???0417nobodyさん
2006/06/11(日) 03:47:49ID:???j(J)code でデータうけとったときに何でもかんでも変換してると半角カナで文字化けするので、
どうせ変換するなら method get だけにしとくとかのがいいと思った。
他のとこから post でデータ送ってくるのって一部を除いてイタズラ以外にないしな。
まあ get にするにしても utf-8 に対応してない jcode.pl じゃあんま役に立たないとは思うけど。
どうなんでしょうKENT様
0418nobodyさん
2006/06/11(日) 04:33:43ID:???0419nobodyさん
2006/06/11(日) 04:50:51ID:???私は、コードを決めておいて、文字コードが合わなかったら変換しないで、
エラーを出すように作ってる。
0420nobodyさん
2006/06/11(日) 05:01:19ID:???0422nobodyさん
2006/06/11(日) 05:25:55ID:???正しいんだと思うんだがね。
対応してないブラウザってあるの?
0423nobodyさん
2006/06/11(日) 08:33:22ID:???プロンプトで色々やってからcgiってのが王道?なんでしょうか?
あとKENTのところのソースを参考にしてるんですが、ここでは評判悪いようですが参考にしない方がいいですか?
0424407
2006/06/11(日) 09:15:29ID:???0425nobodyさん
2006/06/11(日) 09:35:16ID:???KENT氏のはモジュールなどを使わない枯れた古い方式なので、
車輪の再発明に苦労することになるでしょう。
これからPerlを始めるのなら、モジュールをバシバシ使った
お手軽プログラミングをおすすめします。
0426nobodyさん
2006/06/11(日) 09:38:19ID:???cgi はいいんじゃない?
最初は形に残ったほうが面白いしね。
KENTはまあ、一回参考にしてもいいかもね。
反面教師って言葉もあるし。
use strict; して↓これみとk
http://www.perldoc.jp/docs/perl/5.8.0/perlstyle.pod
0427nobodyさん
2006/06/11(日) 12:24:35ID:???「情報を再送信しないと、ページを更新できません。「再試行」をクリックして〜」と表示され、
「再試行」を押すと、2重投稿っぽい感じに投票が行われてしまいます・・・・・。
更新ボタンを押しても、CGIにデータを送らないようにはできないでしょうか?
0428nobodyさん
2006/06/11(日) 12:27:26ID:???情報送って登録したらprint "Location: ..."すりゃ一応回避できるけど
もしくは同一IPから同一情報の登録はブロックするとか
0430nobodyさん
2006/06/11(日) 14:25:32ID:???> perl始めると共にいきなりcgi作ってるんですが、何かまずいでしょうか?
ダメとは言いませんけれど、少し不安です。
他はともかく、安全性についての配慮は忘れないでください。できる限り -Tw スイッチを使うようにしてください。ユーザという種族はいつでも、プログラムの動作にとって最も都合の悪い操作を選択的に行うものです。
> プロンプトで色々やってからcgiってのが王道?なんでしょうか?
CGI はサーバサイドプログラムの出力をサーバ応答として返す仕組なので、コマンドプロンプト (のことですよね?) 上でプログラムがどのように動作し、どんな出力を吐くのかを知っていたほうが有利であることは確かです。
> あとKENTのところのソースを参考にしてるんですが、ここでは評判悪いようですが参考にしない方がいいですか?
氏の CGI スクリプトは動作環境の範囲を広く取るために後方互換性を重視したスタイルのようです。
あなた (あるいはあなたのユーザ) がこれから何年もの間、比較的古い (and|or) 制限の多い環境を使い続けるなら、その点で参考になる部分は多いかもしれません。
0432nobodyさん
2006/06/11(日) 14:40:36ID:???広い動作環境ゆっても、perl4 とかのがめずらしいよな。
local だけだと全部グローバルになるせいか、少し長い script 組むとたまーにありえない挙動するから困る。
0433nobodyさん
2006/06/11(日) 15:14:21ID:???> local だけだと全部グローバルになるせいか、少し長い script 組むとたまーにありえない挙動するから困る。
それはあなたがそのように書いたからです。
また、こういった認識は上達の妨げになるので気をつけてくださいね。
プログラムは (処理系のバグも含めて) 「書いたなり」にしか動かないことを忘れちゃいけません。
0434nobodyさん
2006/06/11(日) 15:41:32ID:aFjDPMnZ「log.dat」の中に↓のようなデータが入っているとして
5,4,4,3,1,2006/06/11(日) 14:59:27,yyyyyyyyyyyyyyyyyy
1,3,4,5,3,2006/06/11(日) 14:58:45,ggggggggggggggggggg
2,4,4,4,3,2006/06/11(日) 14:58:37,ggggggggggggggggggggggggg
この「log.dat」内の「5,4,4,3,1」や「1,3,4,5,3」といった頭5つの数字だけを、
全て足していきたいのですが、そうゆうことってできますでしょうか?
ちなみに上の例だと「5+4+4+3+1+1+3+4+5+3+2+4+4+4+3」で「50」という数字を求めたい・・・・・・
一応自分で調べようと努力はしたのですが、検索しきれなくて・・・・・
よろしくお願いします orz
0435nobodyさん
2006/06/11(日) 15:54:20ID:???処理の流れがわからんのだろうかね…これは
答えを書くのは五行足らずだがそれじゃ本人のためにならないのでヒント
まず、その処理で必要なことは何かを考える
・ファイルを開いて
・一行一行読み取って
・カンマで切り分ける
・その最初の五つを取り出して
・足し合わせる
で、これをコードに落とす
ファイルを開くのは"open"(読み取るサンプルも大抵一緒に解説されてる)
切り分けは"split"、初めの五つを取りだすには"配列のスライス"辺りで検索汁
0436nobodyさん
2006/06/11(日) 15:59:53ID:???0437nobodyさん
2006/06/11(日) 16:07:20ID:???0438434
2006/06/11(日) 16:16:01ID:aFjDPMnZ@logs=<FP>;
close(PF);
foreach $line(@logs) {
chop($line);
($atai1,$atai2,$atai3,$atai4,$atai5,$dat,$value,) = split(/\,/,$line);
if (!$line){last;}
"<TABLE border=\"1\" align=\"center\"><TR><TD>\n".
"$atai1/$atai2/$atai3/$atai4/$atai5/$dat<br><br>\n".
"$value\n".
"</TD></TR></TABLE><br>\n\n";
}
一応、ここまでは何とか分かっているのですが、この「$atai1〜$atai5」の値を全て足すには。。。。
foreachの間に「$tasu = $atai1+$atai2+$atai3+$atai4+$atai5;」と書いてみましたが、全然駄目でした・・・
正直、自分の頭では・・・・・
0439nobodyさん
NGNG0440nobodyさん
2006/06/11(日) 16:46:10ID:???教えていただいて申し訳ないのですが、このようにログが一番古いものしか、ちゃんと表示されません。。。。
http://ranobe.sakuratan.com/up/src/up113712.jpg
0441nobodyさん
2006/06/11(日) 17:23:33ID:???つまりあれか、その全てに同じ値、全体の合計を表示したいわけか。
それなら二段階に分ける必要がある。
事前に合計を調べた上で、その後に表示。
>>436
reduceの処理でmapを使うのはスマートに思えないな…
$sum += $_ foreach @list[0..4];
reduce処理にはmapを使ってもそう大差無い様に思うのだけれども
0442nobodyさん
2006/06/11(日) 17:28:59ID:???>一応自分で調べようと努力はしたのですが、検索しきれなくて・・・・・
ていうか、なんで考えないで検索しようとするんだろうね。
自分と全く同じ状況にあるコードの書き方なんて
検索してもなかなか出てくるもんじゃないのに。
0443nobodyさん
2006/06/11(日) 18:00:25ID:l/QD+3uq0444434
2006/06/11(日) 18:51:48ID:aFjDPMnZログファイルを2つに分けるってことでしょうか?・・・・ orz
ありがとうございます。やってみます。
>>442
「ファイル perl」、「open perl」等、とりあえずファイル関係で調べていました・・・ orz
0445nobodyさん
2006/06/11(日) 18:59:18ID:???> ログファイルを2つに分けるってことでしょうか?
そうじゃなくて、1つのログファイルから内容を読み込んだ後
1. 合計を求める foreach
2. 結果を表示する foreach
の2つのforeachを書く必要がある、という事だと思うよ。
0446nobodyさん
2006/06/11(日) 19:01:16ID:???>442は
>なんで考えないで検索しようとするんだろうね。
と書いているんだが・・・お前は日本語が読めないのか?
まず日本語がちゃんと理解できるように勉強し直せ。
0447nobodyさん
2006/06/11(日) 19:34:32ID:???0448nobodyさん
2006/06/11(日) 20:44:56ID:???my($total) = 0;
open(INFH, "test.txt");
while(<INFH>){
chomp;
my($tmpsum, $tmpstr);
my(@data) = split(/,/, $_);
my(@nums) = splice(@data, 0, 5);
map { $tmpsum += $_ } @nums;
$total += $tmpsum;
$tmpstr = join("/", @nums);
print <<"EOM";
------------------------------
$data[0]
$tmpstr = $tmpsum Points.
$data[1]
EOM
}
close(INFH);
print "------------------------------\n";
print "TOTAL : " . $total . "\n";
print "------------------------------\n";
0449nobodyさん
2006/06/11(日) 21:42:55ID:???sub test {
$a = 5
}
sub test2 {
print "値は$aだお\n";
}
みたいなノリで、”test”サブルーチン内の変数を”test2”のサブルーチン内で使うことってできる?
上のだとうまく行かなくて…
0450nobodyさん
2006/06/11(日) 21:57:42ID:???パッケージ変数(グローバル変数)を使う時はなるべく our で宣言しておいた方がわかりやすい。
後々「use strict;」を覚えた時にこの事は役に立つはず。
our $a = 0;
sub test { $a = 5; }
sub test2 { print "値は$aだお\n"; }
test();
test2();
実行結果:値は5だお
ところで、 $a と $b はソートに使う特殊な変数なので、なるべく使わない方がいいよ。$c 以降は問題ない。
0452nobodyさん
2006/06/11(日) 23:50:12ID:???0453nobodyさん
2006/06/12(月) 00:00:13ID:???ただしドメインの例示だけはexample.com
0454nobodyさん
2006/06/12(月) 01:00:03ID:???0455nobodyさん
2006/06/12(月) 01:01:25ID:???foo bar だと baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud とかあるんだけど
0456nobodyさん
2006/06/12(月) 01:02:57ID:???初めて知った
0457nobodyさん
2006/06/12(月) 01:12:21ID:???それともただ"ほげほげふがふが"?(ダレてるときの擬音??)
そういえば変数名でよくみかける$lnがピンとこない。
$imgとか$cntだったらパッとみて内容を想像できるんだけど
lnは何を略してるんですか!!
入ってる内容から察するにlineですかね?(´・ω・`)
0458nobodyさん
2006/06/12(月) 01:29:00ID:???もう一つだけならpiyoかmogeか、かな。しかしあわせて検索すると恐ろしく件数が減る罠
>>456
RFC3092読んどけw
0459nobodyさん
2006/06/12(月) 01:33:49ID:???っていうやりとりに繋がっちゃうか恐れてたけど無駄に終わってよかったですw
0461nobodyさん
2006/06/12(月) 03:44:18ID:???そうか、piyo か。
メタ構文変数 http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0 とか言うんだなw
hoge fuga piyo で、hogehoge fugafuga piyopiyo とか重なってくのが通例みたいね。
hogera とか mogeta とか使ってみたす。
0464nobodyさん
2006/06/12(月) 17:44:14ID:m4uvfRE1配列@sclArrayには
@sclArray = (●●大学,△△大学,●●大学,□□大学,●●大学,XX高校・・・);
というような形で200種、1,000件くらいの学校名が入っています。
これを
%schHash = (
●●大学=>'15',
△△大学=>'8',
□□大学=>'7',
XX高校=>'14',
・・・
);
という形にしたいのですが、根本的にやりかたがわかりません。
調べ方が悪いのかgoogle様にお伺い立てても出てきません・・・
よろしくお願い致します。
0465nobodyさん
NGNG0467nobodyさん
2006/06/12(月) 18:11:03ID:???自分で考えろってこった。
どうも考える事を放棄して、ぐぐってる人が多いよね。
0468278
2006/06/12(月) 19:04:02ID:???前回、配列にするということでご指導頂き、ソートはできました
それでなんですが、実はもう一個keyがあって揃えたいのです
最初は日付でソートし、同じくキャラクターのものを並びにし、
20060612 a
20060520 a
20060610 b
20060423 c という感じにしたいのです
二回繰り返すと最初のソートがリセットされてしまいます
何か方法はあるのでしょうか?
foreach(@data){
push @{$list{$1}},$_ if/^<>inf<>--.*<>(\d*)<>----/ ;}
foreach $key (sort keys %list){
push @htm, @{$list{$key}};
}
foreach(@htm){
push @{$list2{$1}},$_ if/^<>inf<>--(.*).*<>----/ ;}
foreach $key (sort keys %list2){
push @htm2, @{$list2{$key}};
}
0469nobodyさん
2006/06/13(火) 00:52:20ID:???大学ごとに固有の識別番号が決まっているのでしょうか?
それとも入試合格ラインの偏差値のようなデータ?
大学名と番号の対応が、名称から番号を導けるような規則性を持っていないのなら、
元となるデータなしに自動的に番号の入ったハッシュを作るのは不可能なんじゃないですか。
その対応はExcelの表かコンマ区切りテキストか何かの形で手元にあるのですか?
0470457
2006/06/13(火) 01:17:24ID:???なるほど。コード読むとき少し楽になりそうです。アリトゥース!!
>>464の数字は配列内での同じ学校名の登場回数と推測。
けどおれのスキルでパッと思いつくのはパターンマッチごにょごにょ・・・
ハッシュのキーごとにインクリメントごにょごにょ・・・が精一杯orz
↑まったく当たっていないかも
0471nobodyさん
2006/06/13(火) 05:43:37ID:???同時に比較すればいいんでね?
my @arr = qw(
foo-1 bar-2 baz-3 qux-4
quux-1 corge-2 grault-3 garply-4
waldo-1 fred-2 plugh-3 xyzzy-4 thud-5
);
my @new_arr =
map { $_->[0] .'-'. $_->[1] }
sort { ($a->[1] == $b->[1]) ? $a->[0] cmp $b->[0] : $a->[1] <=> $b->[1] }
map { my ($k, $i) = split (/-/); [$k, $i] } @arr;
$, = "\n";
print @new_arr;
exit;
誰かもっといい方法あったらおせーて orz
0472nobodyさん
2006/06/13(火) 06:10:34ID:???とりあえずこれ。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_sort_an_array_by__anything_
ググればもっといいドキュメントが出てくる。
0474468
2006/06/13(火) 12:07:21ID:???これは難しい・・・
0475468
2006/06/13(火) 12:34:52ID:???1行のラインが
<>a<>b<>c<>d<>e
という風に、要素が<>で区切られ、それが格納された@dataがあるとします
この中の2つの要素でソートしたいのです、要素には同じ値もあります
2つのkeyをどういう風に考えハッシュを作ったらいいのでしょう?
大変初歩的で申し訳ありませんが、リンク先をプリントしていくら
読んでも簡単に理解できません。
0476nobodyさん
2006/06/13(火) 12:55:07ID:???無理を承知でお願いします。
どうかうちのバカ息子に因数分解を教えてやってくれませんか?
何度教科書を読んでも理解できないって言うんです。
そのくせ、友達が「こうじゃない?」って親切にヒント出してくれてるのに
無視したりするような非常識な子で…でも、根は優しい良いコなんです。
ちなみに、息子は足し算と引き算はできるらしいんですが
掛け算と割り算はよく分かってないようです。
だから、まず掛け算から教えて欲しいそうです。
おそらく相当な時間が掛かると思いますが、
どうかタダで息子が納得できるまでお付き合い下さいますようお願い申し上げます。
0477nobodyさん
2006/06/13(火) 13:15:40ID:???> リンク先をプリントしていくら
> 読んでも簡単に理解できません。
理解できるまで何百回でも読んでください。
0478nobodyさん
2006/06/13(火) 13:21:15ID:???結果としては >>471 で既にできてるじゃんな。それすら理解してないのかね?
0479468
2006/06/13(火) 14:10:46ID:???0480464
2006/06/13(火) 18:12:16ID:???その大学名の出現回数をハッシュにしたい」でした。
質問が悪くてごめんね。
>>466であっさりできました。
ありがとう。
0481nobodyさん
2006/06/13(火) 22:03:14ID:???少しはググった?
「perl sort 複数 項目」でぐぐれば、コピペプログラミングできる程度の情報が出てくる。
0482nobodyさん
2006/06/14(水) 00:39:55ID:???他人が見ても何をやってるか分かるプログラムを書きたいのですが、汚い書き方が身についてしまい困ってます。
簡単なBBS程度のものだと助かります。
0484nobodyさん
2006/06/14(水) 01:20:32ID:???use strict; しつつCPANモジュールを駆使したCGI。
Tropy のソースはタイ変数が使われてて面白い。
http://www.hyuki.com/tropy/
YukiWikiMini は200行ぐらいでWiki書いてる。こちらもなかなか。
http://www.hyuki.com/yukiwiki/mini/index.html
コメントが少ないから、ちょっと難しいかも。
0486nobodyさん
2006/06/15(木) 12:01:24ID:???#!/usr/bin/perl
require './lib.pl';
&test;
[ lib.pl ]
sub test{
print "Content-type: text/html\n\n";
print "test";
}
↑500エラーになる。
[ main.cgi ]
#!/usr/bin/perl
sub test{
print "Content-type: text/html\n\n";
print "test";
}
&test;
↑エラーにならない
requireで読み込むと必ずエラーになってしまうのですが、どうしてでしょうか?
0487nobodyさん
2006/06/15(木) 12:08:41ID:???1;か。
0488sage
2006/06/15(木) 21:58:51ID:gFTNSvnGPerlで
print $cgi -> header(-charset=>"EUC-JP");
と記述したのですが、作ってブラウザーでみると
文字化けしてます。。。
ブラウザーの「表示」→「エンコード」を見ると
西ヨーロッパ言語が設定されてます。。。
これをEUC−JPに直すと文字化けしないのですが、
どうやれば、最初から文字化けしないようにできるのでしょうか?
0489nobodyさん
2006/06/15(木) 22:14:33ID:???多分、HTMLの出力もCGIモジュールを使ってると思うんだけど、出てきたHTML見て見れ。
start_htmlのほうで何も指定しないとlang=en-USのcharset=iso-8859-1になる。
ということで
start_html(-encoding => "EUC-JP", lang => "ja")
0490nobodyさん
2006/06/15(木) 22:18:23ID:???0491489
2006/06/15(木) 22:27:19ID:???ところでふと気づいたけれど、CGIモジュールって
Content-Typeのmetaタグよりtitleのほうが先に来ちゃうのね。
エンコーディングの指定を一番最初に書くことが推奨されてたと思ったけれど・・・
0492nobodyさん
2006/06/15(木) 22:27:38ID:???別にそれでいいじゃん
それぐらい手前で出力しろとか思うわけよ
0493nobodyさん
2006/06/15(木) 23:08:38ID:???なんか文字化けしたままなんですが。。。
レスついたことに(^人^)感謝♪
いわれた辺りをいじってみます。
ありがとうございました。
-------
print $cgi -> header(-cahrset=>"EUC-JP");
print $cgi -> start_html(-title=>$title,
-BGCOLOR => $bg,
-TEXT => $fg,
-encoding => "EUC-JP",
-lang => "ja",
);
-----------
といいつつ
ソース載せてみた。。。orz
0495nobodyさん
2006/06/16(金) 00:24:31ID:???$check = 'デイレクトリ名/ファイル名';
if (-e $check){
&sonzai
}
上記のようにしてやってみましたがどうもifをスルーしてelseのルーチンばかり実行してしまいます。
0496nobodyさん
2006/06/16(金) 01:15:09ID:???0498nobodyさん
2006/06/16(金) 05:13:12ID:???0499nobodyさん
2006/06/16(金) 08:01:47ID:???0500nobodyさん
2006/06/16(金) 08:42:03ID:???0501nobodyさん
NGNG0502nobodyさん
2006/06/16(金) 08:53:11ID:???マルチバイトのファイル名をつける超絶バカは居ないでしょ…
0503nobodyさん
2006/06/16(金) 09:06:03ID:???マルチバイトのファイル名を扱う業務も普通にあるぞ。
もちろんフリーソフトを使って英数字にリネームしてから作業しても構わないわけだが、
全部Perl一本で済ませたいタイプの俺としては非常に面倒いのだ。
0504nobodyさん
2006/06/16(金) 09:07:12ID:???皆さんって最初の大まかな処理分岐ってどうやってますか?
今、テストで1関数で1ファイルで作って
eval{
require '$in{exec};'.'.pl';
&$in{exec};
}
の様に呼ぼうかと思ってるのですが(エラー処理とかばっさり切って略記しました)、
この考え方よらもスマートなやり方があったら教えて頂ければ幸いです
0505nobodyさん
2006/06/16(金) 09:23:19ID:???0506nobodyさん
2006/06/16(金) 09:31:11ID:???まぁperlsynでも読めみたいな。
0508nobodyさん
2006/06/16(金) 10:18:29ID:???0509nobodyさん
2006/06/16(金) 10:20:03ID:???長くなってもわかりやすければそれに越したことはないし、
作成したスクリプトを他人が触る可能性があれば
その方が管理委託しやすいしね
0510nobodyさん
2006/06/16(金) 10:25:22ID:???まあKENTがアレなのは認めるし笑えるんだが、
if 文や local 自体は全然悪くないぞ >>504!
うちには関数 (サブルーチンのことだと解釈したが) ひとつひとつを1ファイルにするとかのが面倒でありえないw
0511nobodyさん
2006/06/16(金) 10:34:11ID:???0512nobodyさん
2006/06/16(金) 12:51:25ID:???サブルーチンを使い回しまくっていると、結局条件分岐
を入れ込む回数が増えて大変だから
HTMLの構文エラー等はなくして欲しいけど
0513nobodyさん
2006/06/16(金) 13:21:21ID:???0514nobodyさん
2006/06/16(金) 13:25:39ID:???0515nobodyさん
2006/06/16(金) 13:57:10ID:???thx 見たことなかったので見てきた。
すごいなこれw
KENTは perl4 とか過去のでも動くように、とかでしょうがないのかなとも思っていたけど、
ここは1年前作った 5.6 以上推奨のでもまったく同じ書き方でしたw
まあわかりやすいっちゃわかりやすい・・・のかな。
0516nobodyさん
2006/06/16(金) 14:18:31ID:???妙にレスポンスだけは良かったりするから困るw
0517nobodyさん
2006/06/16(金) 14:48:05ID:???簡単なものならフルスクラッチしたほうが早い場合もあるし。
0518nobodyさん
2006/06/16(金) 15:16:01ID:???$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;
というふうにやると $timp が空になってしまいます。
どうしたらよいでしょうか。
0519nobodyさん
NGNG0520nobodyさん
2006/06/16(金) 15:22:19ID:???0522nobodyさん
2006/06/16(金) 16:29:57ID:???今は 出力する前に
if( $flag==1 ){ open(NKFOUT, "| nkf"); }
とやっておいて、出力時に
if( $flag==1 ){ print NKFOUT "ちんこ"; }
else { print "ちんこ"; }
とやろうと思うのですが、ちょっと
0523nobodyさん
2006/06/16(金) 16:34:42ID:???$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;
というふうにやると $timpo が空になってしまいます。
どうしたらよいでしょうか。
0524nobodyさん
NGNG0525nobodyさん
2006/06/16(金) 16:37:56ID:???正直嬉しかったぞw
0526ヽ(´ー`)ノ ◆.ogCuANUcE
2006/06/16(金) 16:46:15ID:???if ($flag == 1) {
open(my $orig_stdout, '>&STDOUT');
open(STDOUT, '|nkf');
}
# パイプを通して出力
print "ちんこ";
# そのまま出力
print $orig_stdout "ちんこ";
perlfaq5 にある How do I dup() a filehandle in Perl? か、
perlfunc -f open を読むと良い。
0527nobodyさん
2006/06/16(金) 16:59:43ID:???ありがとう。それを参考に
if( $flag==1 ){ open(STDOUT, "| nkf"); }
とやったらだいたいうまくイキました。
0528nobodyさん
2006/06/16(金) 17:31:55ID:???で送ったFと
<input type="text" name="F" value="">
に & を入れて送ったF
って違いますよね?
0529nobodyさん
2006/06/16(金) 17:33:13ID:???&→&
0530nobodyさん
2006/06/16(金) 17:36:21ID:???HTMLなら表示されてる通り送られると思う普通。
0531nobodyさん
2006/06/16(金) 17:45:41ID:???試せばすぐ分かることに対してまじめに答える気にはならん
0532nobodyさん
2006/06/16(金) 17:46:42ID:???use strict;
print "Content-type: text/html\n\n";
my $buffer;
read(\*STDIN, $buffer, $ENV{'CONTENT_LENGTH'},0);
print <<END;
$buffer
<form method="post">
<input type="text" name="111" value="&"><br>
<input type="text" name="222" value=""><br>
<input type="submit">
</form>
END
exit;
下のフォームに&と入れて送信するとあら不思議。
同じような挙動をする文字を知りたいんですがどこかにドキュメントありませんか?
0533nobodyさん
2006/06/16(金) 17:49:12ID:???○<input type="text" name="111" value="&&"><br>
0534nobodyさん
2006/06/16(金) 17:49:56ID:???◎<input type="text" name="111" value="&"><br>
0535nobodyさん
NGNG0536nobodyさん
2006/06/16(金) 18:16:46ID:???$hogeにはブラウザから送られてきたのをデコードしただけの物が入っていて、
print <<END;
<form method="post">
<input type="text" name="hoge" value="$hoge"><br>
<input type="submit">
</form>
こんなことをやって、&が入っていたら&に変わっちゃう…とかいう理由での質問なんじゃないか。
HTMLに流し込む前に実体文字参照に変換汁。
$hoge =~ s/&/&/g;
$hoge =~ s/</</g;
$hoge =~ s/>/>/g;
$hoge =~ s/"/"/g;
# というかこれを知らないなら、頼むから公開するCGIなんか作らないでくれよ…
# XSS脆弱、下手するとScript Insertion脆弱だから…
0537nobodyさん
2006/06/16(金) 18:40:41ID:???ありがとうございます!!
マークアップ記号、Laten-1、ラテン拡張とアクセント記号までは
&があっても直接変換されるようですね。
>>536
そうです、受け取り側での処理に影響するのか?という部分です。
ただし変換自体が問題ではなく、2回以上変換する場合が気になったんです。
というのもHTML::FillInFormの中で変換されてるっぽくて
先に変換かませるとひどいことに・・・
いろいろ試しているうちに上記の実態参照も考慮するべきか悩んだ次第であります。
0538536
2006/06/16(金) 19:30:41ID:???スマソ、ちょっとレベルを低く見すぎた。しかしそういうことは初めに(ry
混乱してるだけだと思うが、そう悩むことではないと思うぞ。
まずCGI側がFormに流し込む、生のテキスト「&」を持っているとする。
HTML::FillInFormは生のテキストをHTMLに変換する。「value="&amp;"」
で、ブラウザはHTMLを解釈して元のテキストに戻してからフォームを表示する。[&]
Submitされると"生のテキストを"URLエンコードなり何なりしてCGIに送り返す。「hoge=%26amp%3B」
で、CGIはURLエンコードのデコード処理をして、生のテキスト「&」を受け取ることになるわけだ。
なぜに二回以上変換するようなことになるのかな…
0539nobodyさん
2006/06/16(金) 19:51:08ID:???非常に混乱しております・・・
2回以上の変換なんですが、実はTTのPluginでFillInFormを使ってるんです。
他で変換しないと生のデータとFillInFormで変換されたデータが混在してしまって。
TTのタグでひとつひとつFILTERつければ回避できそうではありますが
できれば一元管理したいなあと・・・。
クエリを受け取った段階で変換してみたらFillInFormで不具合。
TTに渡す時点で変換すれば良さそうですが、データ構造が結構深いんです・・・
0540nobodyさん
2006/06/16(金) 23:41:05ID:???perlはオブジェクト指向の書き方すると遅くなるのは当然。
「ハードの性能がどんどん上がってるからかまわない」なんて言い訳してるが、
簡単なスクリプトの時にperlでオブジェクト指向の書き方するのはやめたほうがいい。
みんなKENTをけなすが、実はKENTはそれほど悪くないのかもしれない。
こういうと、きっと「コードの再利用が...」「保守のしやすさが....」って言い始めるヤツが必ず出てくる。
でもあの程度の規模だと、動作速度以外にも、理解しやすさとか、動作に必要な条件を考えると
必ずしも悪いと言い切ることは難しいんじゃなかろうか?
0541nobodyさん
2006/06/17(土) 00:24:46ID:???どうやったらあんなコードになるのか理解できない。
0542nobodyさん
2006/06/17(土) 00:25:29ID:???ttp://www.lri.fr/~filliatr/evolution
ごめんなさい。言ってみたかっただけです。
0544nobodyさん
2006/06/17(土) 00:29:58ID:???0545nobodyさん
2006/06/17(土) 00:30:49ID:???> perlはオブジェクト指向の書き方すると遅くなるのは当然。
というソースが欲しい。
0546not 540
2006/06/17(土) 01:52:07ID:???んー、でも、それほど問題になる部分じゃないと思う。
0547nobodyさん
2006/06/17(土) 01:55:18ID:???残念ながら、実行速度に関してだけは >>540 が正しい。
ダミアン・コンウェイの「オブジェクト指向Perlマスターコース」の「はじめに」のvii ページ
「オブジェクト経由でメソッドを呼び出す処理は、通常のPerlサブルーチンを呼び出す場合より著しく低速である」
(「著しく低速」の部分は太字で強調)
手軽に確認するなら
perldoc perltoot
if you wanted fast, you wouldn't be using objects at all
ベンチマークだったら
http://psst.jp/syn/archives/000190.html
オブジェクト指向は遅いというのは共通認識だと思っていたのだが。
だがオブジェクト指向は実行速度を上回るメリットがある。
0548nobodyさん
2006/06/17(土) 02:06:34ID:???親クラスのサブルーチン
親クラスのAUTOLOAD
UNIVERSAL のクラスのサブルーチン
と探すんだから多少は遅くなるのは仕方がない
0549nobodyさん
2006/06/17(土) 02:07:45ID:???オブジェクト指向型プログラミングがバカみたいに遅いのは
インタプリタ言語特有の問題だな
コンパイルすれば、かなりその差はちぢまる
0552nobodyさん
2006/06/17(土) 02:52:44ID:???お前はしないのかもしれないが、他の人間はするんだよ。
第一、スクラッチから書く人間の労力だって圧倒的に違う。
0554nobodyさん
2006/06/17(土) 04:45:08ID:???そそw
いきなりメソッド呼んで、このメソッドはどのファイルにあるのかな?
これかな?誤爆。。なんて事をするくらいなら、1枚板のKENTの方が
改造なんかも手早くやりやすい。
しかもダメと叩かれる部分を修正してやると、さらに体感速度が上がるのも
教材に適してるような…w
0555nobodyさん
2006/06/17(土) 05:44:41ID:4rge2G1Jどこになにがあるのかを説明するより、モジュールリストを共有するほうが効率がいい。
今はひとりでやってるからいいかもしれないがちょっとは先を見ることを勧める。
体感なんてそんな変わらんから、規模の大きい開発の手間のほうが重要。
0556nobodyさん
2006/06/17(土) 05:45:31ID:4rge2G1J0557nobodyさん
2006/06/17(土) 06:31:48ID:???まあ、なんていうか、
それ以外に、
オブジェクト指向では、use とか require したときの速度が遅いのが結構ネックでな。
mod_perl はその時間が減るからいいんだけど。
関数呼び出しが 1.5倍遅い、とか言っても、
それ自体は 1秒間に 45万回 か 64万回 かって違いで、ほとんど気のせい程度の時間でしょ。
問題は何回も実行する、例えば値を取得する param() 呼び出しとかなんだろうね。
それでも param() 程度なら 1000回実行して 0.01 秒か 0.002 秒の違いなんだけど。
つまり、OOPが悪いっていうけど、require とかの時間を考えなければ、そーそー体感で変わるもんじゃないと思う。
実際は他のトコで無駄省いたりして速くするようにすれば、そっちのが変わりそうだよね。
0558nobodyさん
2006/06/17(土) 06:33:38ID:???Jane で書き込むとたまにこうなるんだよなあ・・・。 スペース無駄にしてスマソ。
0559nobodyさん
2006/06/17(土) 07:01:46ID:???作者が再利用しやすいってだけの分割されたスクリプトファイルが
20〜30個って事が結構あるぞ?
しかもKENT製を静的なページを表示するのと同じレベルで実行できる環境で
実行してみると多少の引っ掛かりを感じる。
しかもファイルが分割されてるのにpackageはmainのままだったりするから、
mod_perlで修正することなく動いてもファイルシステム上の位置が変わると
別キャッシュになってメモリを馬鹿食いに。
0560nobodyさん
2006/06/17(土) 07:12:57ID:???> ファイルが分割されてるのにpackageはmain
全然まともなスクリプトじゃねえよw さすが自称www
0561nobodyさん
2006/06/17(土) 07:54:09ID:???こう言う人たまに見かけるよね。
ファイルを分割したりモジュール使うことがオブジェクト指向だと思ってる人。
他にも sub 使えば関数指向だと思ってる人とかさ。
0562nobodyさん
2006/06/17(土) 09:33:44ID:???正規表現について質問です。
たとえば、 'abc' 以外の全ての文字にマッチする場合はどのように書けばいいでしょうか。
acb にはマッチします。
abcaa にもマッチします。
aaabc にはマッチしません。
m演算子の真偽の逆転ではなくて、正規表現内で解決する必要があります。
0563nobodyさん
2006/06/17(土) 09:47:34ID:???/.(?!abc)/ こういうのね
0564562
2006/06/17(土) 10:01:24ID:???前方一致とかじゃ無理な気がする…って思ってたけど、できるんですね。すんません。
なんか正規表現超苦手です。。。頭いたくなるぜ。
/^(.(?!abc))+$/
まだ試してないけどたぶん大丈夫な予感です。ありがとうございますた。
0565nobodyさん
2006/06/17(土) 10:05:24ID:???まあ /^(.(?!abc))+$/ だと 文字列の最初が abc だとマッチしちゃうけどね。なんとかがんばって。
0566nobodyさん
NGNG0567nobodyさん
2006/06/17(土) 12:38:20ID:???キックするのはムリなのは確かだね。必要なファイル読むだけで
しばらくかかるし(笑) レン鯖でCGIしか使えない人は残念でした。
0568nobodyさん
2006/06/17(土) 15:58:17ID:YHZ73blsあんまり複雑なのだと遊びじゃなくなるので。
15分くらいで作れる、簡単だけど面白いのってなんかないかな。
アイデアくだなさいあな。
0570nobodyさん
2006/06/17(土) 16:03:45ID:YHZ73blsなんですかそれ?
ちょっと検索してみますよ。
0572nobodyさん
2006/06/17(土) 16:06:57ID:YHZ73bls以前にショッピングカートを作ったんです。
もう覚えてないのでそのレベルでさえ遊びにならない。
すごい低級になるんですが、低級なりの楽しみ方がないかなと。
少しづつ拡張できるようなのでもいいかなと。
う〜ん。スレ違いっぽ。とりあえずこれにて書込みはおしまいにします。
何かアドバイスが見には来ますのでありがたく。
それでは。
0573nobodyさん
2006/06/17(土) 18:17:27ID:???書き方おかしいけど。
0574nobodyさん
2006/06/17(土) 20:51:25ID:???結城のオリジナルのクローンを書くほうがほうがシンプルだし勉強目的にはちょうどいい。
0575nobodyさん
2006/06/17(土) 21:20:25ID:???そうなの? CPAN コマンドで簡単に入ったんだけど。
0576nobodyさん
2006/06/17(土) 22:42:28ID:???外部モジュールを使わないで UTF8フラグをつけたり、ついてるかどうか検査したりするのってどうしたらいいんですかね?
どっかに誤爆したのは内緒w
0578nobodyさん
2006/06/17(土) 22:58:03ID:???言い忘れ。utf8::以下についてはテンプレの[Perl5.8Unicodeメモ]参照
utf8プラグマと混同しないように。
0579nobodyさん
2006/06/17(土) 23:03:30ID:???え、まぢで? v5.5 とか 5.6 でもできる?
ピンクのサイトの方は見てたんだけど、v5.8 だったkら・・・
0580nobodyさん
2006/06/17(土) 23:17:27ID:???そもそもutf8フラグはありません。
0582nobodyさん
2006/06/18(日) 02:12:27ID:LFB3TFsx$EXPIRES = 3;# アクセスログ保存期間
# 日時の取得
$tm = time;
($sec, $min, $hour, $mday, $mon, $year) = localtime($tm);
$year += 1900;
++$mon;
# アクセス情報の整形
$ln = "$hour\t$min\t$ENV{'REMOTE_HOST'}\t"
. "$ENV{'HTTP_REFERER'}\t$ENV{'HTTP_USER_AGENT'}\n";
# ログファイルの書き込み
$logfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
open(FILE, ">>$logfile")
or die("エラー:ログファイルが開けません");
eval{ flock(FILE, 2) };
seek(FILE, 0, 2);
print FILE $ln;
close(FILE);
# 古いログファイルの削除
$tm -= $EXPIRES * 60 * 60 * 24;
($sec, $min, $hour, $mday, $mon, $year) = localtime($tm);
$year += 1900;
++$mon;
$delfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
if(-e $delfile) {
unlink $delfile;
}
0583582 583
2006/06/18(日) 02:13:02ID:LFB3TFsx$delfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
となぜ形成してるんでしょうか??
消すためにはいちいち作らないとだめなんでしょうか??
これを消したとしても$logfile にログは残るんじゃないでしょうか??
0584nobodyさん
2006/06/18(日) 02:38:28ID:???$logfile と $delfile はファイル名が違う。
$logfile は新規のログのファイル名
$delfile は何日か前のログのファイル名
コメント読もうよ。
> # 古いログファイルの削除
とあって、
> $tm -= $EXPIRES * 60 * 60 * 24;
で数日前の日付を出してる。
0585583
2006/06/18(日) 03:08:41ID:Kocek/q+古いファイルを作ってなぜまた消すんでしょうか?
0586nobodyさん
2006/06/18(日) 03:11:44ID:???どこで古いファイルを作っていることにしたいんだろう。
0587nobodyさん
2006/06/18(日) 03:16:15ID:Kocek/q+0589nobodyさん
2006/06/18(日) 03:23:31ID:???0590nobodyさん
2006/06/18(日) 03:24:41ID:???不要なログファイルがドンドン溜まっていきそうな気が・・・
0592nobodyさん
2006/06/18(日) 03:57:55ID:???"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
で3日前のファイル名を$delfileに入れている。
unlink $delfile;
で3日前のログファイルを実際に消している。
>>$logfile にログは残るんじゃないでしょうか??
それはその日のログなので残してOK
0593nobodyさん
2006/06/18(日) 07:30:51ID:???あ、hashが先か
なぜhashを連想と訳すのでしょうか
どうして? 細切れ=連想なの? 教えて!
0594nobodyさん
2006/06/18(日) 09:14:10ID:???あと正確には 連想配列=hash変数 ではない。
0595nobodyさん
2006/06/18(日) 11:00:31ID:???0596nobodyさん
2006/06/18(日) 11:21:18ID:???perl の連想配列は内部でハッシュ法が使われているからだろうけど、
配列みたく入れた順番に取り出せないし、みんな区別して ハッシュ って呼ぶ気がする。
0597nobodyさん
2006/06/18(日) 12:02:53ID:Kocek/q+>>582ー592まで質問してたんですが
古いログはlogsというファイルに残ったままにならないんでしょうか?
0598nobodyさん
2006/06/18(日) 12:13:01ID:???>584-592を百回読み直せ。それでも理解できないようならとっとと市ね。
0599nobodyさん
2006/06/18(日) 12:16:51ID:Kocek/q+0600nobodyさん
2006/06/18(日) 17:41:34ID:???ファイルから文章を読み出して正規表現でマッチングしようとしてるんですが
「ー」文字が入る単語をマッチング条件とするとエラーがでてしまいます。
-wcコマンドで実行するとSyntaxOKとでてます。
perlのバージョンは5.8.8です。
$word = 'マリオブラザーズ';
while (<INPUT>) {
if (/^\.([^\n]+),$word\./){
〜〜〜〜〜
}
}
読み込みファイルの内容
.data1,data2.
.任天堂,マリオブラザーズ.
.ああああ,えええええ.
〜
〜
前後についてる..は正規表現を使いこなせない証でしょうか…マッチングするために付加しています。
これで任天堂を$1で取り出したいんですけど$wordに「ー」含んだ単語設定すると
以下のようなエラーがでます。data2、ええええを入れた場合は、意図した通りにdata1とああああが$1に入ります。
C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin>perl search.cgi
Unmatched [ in regex; marked by <-- HERE in m/^\.([^\n]+),マリオブラザー <-- HER
E ズ./ at search.cgi line 43, <INPUT> line 1.
原因がまったく分からず困っています。どなたかご教授下さい。
0601nobodyさん
2006/06/18(日) 17:42:09ID:???0602nobodyさん
NGNG0603nobodyさん
2006/06/18(日) 17:52:27ID:???参考になりそうなサイトをいくつかググって探せたので、調べながら頑張ってみます。
ありがとうございました
0604nobodyさん
2006/06/18(日) 18:24:16ID:???ハッシュに格納してそこからCSVに出力したいのですが、
ハッシュからキーとデータをCSVに出力すると順番がランダムになってしまいます。
キーとデータを自分の意図した順番通りにCSVに出力するにはどうしたらいいのでしょうか?
sort関数を使用しても辞書順にしかならないので、意図した通りの順番で
CSVに出力することが出来ません。
どなたかアドバイスをください。よろしくお願いします。l
0605nobodyさん
2006/06/18(日) 18:27:52ID:???1. 並べたい順にキーを並べた配列を作る
2. 1. の配列をforeach か何かで回してハッシュを引く
3. CSVに出力
0607600
2006/06/18(日) 19:21:32ID:???フォームからcgi起動してフォームから送られた単語に基づいて検索するサイトを作ってたんですけど
アドバイス頂いた事を元に、cgiとHTMLフォームのソース、検索元csvファイルをEUC-JPに変換したらうまくいきました。
初歩的な質問だったようですけど、お答えいただきありがとうございました。
0608nobodyさん
2006/06/18(日) 20:05:50ID:???ユーザ入力をメタキャラクタも含めてそのままパターンに取るような CGI を晒しておくと、イイカンジにアッー! されて色々と被害をまき散らしたりするんで安全性について要再考。取り急ぎ。
0609nobodyさん
2006/06/18(日) 20:27:30ID:???気をつけます。調べてみたんですが、
つまりデータとしてとりたい文字列がperlプログラム上で特別な意味を持つ文字になってしまって
プログラムが意図しない動作をする可能性があるってことですよね
0610nobodyさん
2006/06/19(月) 12:44:33ID:???連想配列(associative array)をラリーウォールが勝手にhashと名づけた。
けど、それに賛成できない訳者がそのまま連想配列と訳した、とか?
0612nobodyさん
2006/06/19(月) 14:36:59ID:???、とか?
、とか?
妙な推測するほうもアレだが
釣られるほうもアレ。
0614nobodyさん
2006/06/19(月) 14:38:47ID:???0615nobodyさん
2006/06/19(月) 14:40:28ID:???0616nobodyさん
2006/06/19(月) 15:13:28ID:???open(FILE, "$file") or die "エラーだ";
みたいな感じでdie使うもんだと思ってて深く考えたことなかったんだけど
これって、何かモジュール入れてないとエラーメッセージは表示できない?
単にInternal Server Errorが返されるだけなんだけど。
0617nobodyさん
2006/06/19(月) 15:15:58ID:???理解の方向性は合ってます。ただ危険性のレベルは一般にもっと高いです。
特に Perl の場合、値をそのままパターン内で展開する、ということは「任意のコードが実行できる」と同義なので大変危険です。
0618nobodyさん
2006/06/19(月) 15:17:21ID:???そういう問題じゃないんだけど…。
エラーメッセージはサーバのログに吐かれてる。
ブラウザに出したいなら自前でエラー処理書いて、dieじゃなくてexitする。
ちなみにその$fileをダブルクォートで括る必要は全くない。
0619nobodyさん
2006/06/19(月) 15:32:57ID:???あぁ、なるほど。die以下のメッセージはサーバのログに出てるだけだったのか。
じゃあ、レンタルサーバで不特定多数が使うcgiの場合には
dieより自前で用意したエラー処理に飛ばす方が良いってことか。
>ちなみにその$fileをダブルクォートで括る必要は全くない。
でも、シングルクォートとかダブルクォートとかで括ってるの多い気ガス。
単に好みの問題?
0620nobodyさん
2006/06/19(月) 15:35:50ID:???oioi
0621nobodyさん
2006/06/19(月) 15:36:41ID:???漏れも先日までそう思ってたんだがな、実際にやって見れ。
安全措置が施されていて、use re 'eval';しないとデフォルトでは動かないんだこれが。
まあ、汚染された正規表現を実行するなんて真似は、やっぱり止めておいたほうが良いのは確かだと思うけれど。
>>619
とりあえず公式にも非推奨。
ttp://www.kt.rim.or.jp/%7Ekbk/perl-5.8/perlfaq4.html#what_s_wrong_with_always_quoting__vars
これをわきまえた上で、好みをとりたいと言うのであれば何も言うまい。
0622nobodyさん
NGNG0623616=619
2006/06/19(月) 15:49:01ID:???>>621
なななるほど。そう言われてみれば、そうだ。
とりあえずダブルクォートで括ってみた。
中身は何でも良かった。今は反省している。
>>622
標準装備にそんなのあったんだ。
で、実際のところdieで>>622のモジュール使うのと
自前でエラー処理用意して飛ばすのと、
どっちが一般的なんだすか?
いや、それこそ好みの問題かもしれないけど。
0624nobodyさん
2006/06/19(月) 15:52:21ID:???0625nobodyさん
2006/06/19(月) 15:54:57ID:???CGI.pm を使う書き方をしてるのであれば、>>622 で良いんじゃないかな。
die のメッセージをHTMLで吐いてくれるし。
ただし、エラーがあってdieしてもHTTP的に50x系のエラーにならないのと、
デバッグが終わったら >>622 は外さないといけない事に注意。
エラーメッセージを見せるのは、セキュリティー的によろしくない。
0626616
2006/06/19(月) 16:05:52ID:???アドバイス感謝です!
>エラーメッセージを見せるのは、セキュリティー的によろしくない。
言われてみればグレート当たり前のことだよね。でも、この視点完全に欠落してた…。
フォームの入力値のエラーなんかと同様に、エラーだったら何でもかんでも
ブラウザで教えてあげるのが、イケてると思ってた…。
ここは本当に恐ろしい知識の泉でつね。
オレ、今、かなり賢くなってる。
0627nobodyさん
2006/06/19(月) 16:06:51ID:???0628nobodyさん
2006/06/19(月) 16:12:56ID:???0629nobodyさん
2006/06/19(月) 16:21:34ID:???danのblogでも少し前に話題になってたと思うんだけど(探すの面倒くさいんで自分でやってね)、
Perl4まではPerlでも連想配列 (Associative Array)と呼んでいた。
連想配列という言葉は、この「Associative Array」という語に
対応したもの。この時点ではハッシュは関係ない。
PerlのAssociative Arrayは直接には awkのそれからきたものだと
思われるけど(awkでも Associative Array = 連想配列と称される)、
多分 IconとかSnobolの表が祖先じゃないかと思う。
で、Perl5.000になった時点で、Larry Wallが「Associative Arrayってさ
長いから書くのも読むのも面倒じゃん、Hashって呼ぶことにしようよ」
ということで呼称がハッシュに変わったのね。で、それはAssociative Array
を実現するのにハッシュ法を使っていたから。
Programming Perl (第一版 赤本ね)には実際次のような記述がある(訳本の37ページ)。
1.5 連想配列
この章の最後を締めくくる話題は連想配列(associative array)である。
(略)
連想配列は、添え字として任意の文字列を指定できるという点を除けば、
普通の配列と何ら変わらない。連想配列から得られたエントリは文字列で
あってもよいので、任意の文字列の対をたがいに関連づける(associate)ことが
可能である -- これが連想配列(associative array)と呼ばれる理由である。
呼称をハッシュに変えた理由も、Programming Perlの第二版(青本の分冊になっていない方)に書かれていたと思うんだけど、本が見つからなかったので
紹介できん。スマン。
0630616
2006/06/19(月) 16:53:42ID:???は通るけど、
open(FILE, +< $file);
はダメなんだね。入出力の記号を付けるときはダブルクォート必須?
なら、
open(FILE, $file);
は
open(FILE, "< $file");
と同じだから、やっぱ
open(FILE, "$file");
と書くのが正しいんじゃね?とか思ってしまうんです。
それとも記号の付け方がおかしいのか??
そこんとこもう少しヒントを!
0631nobodyさん
2006/06/19(月) 16:56:54ID:???Programming Perl(第二版:青らくだ本)の日本語版8ページから引用
1.2 自然言語と人工言語
ハッシュ:ハッシュ(hash)は、順序付けられていないスカラーの集合で、
各スカラーに関連付けれれた文字列によってアクセスされる。
そのためハッシュは「連想配列」(associative array)と呼ばれることもある。
しかし、これは怠惰なタイピストにとってタイプするのが面倒だし、
頻繁に使われるので、私たちはもっと短くて、ぴりっとした(snappy)呼び名を
付けることにしたのだ。
ということらしい。
0632nobodyさん
2006/06/19(月) 17:15:39ID:5NRkvew2昨日みたいに2ちゃんが落ちるとCGIが止まってしまいますよね?
落ちてる時の回避方法ありますでしょうか。。。
sub checkProxyList{
my $RADDR = $ENV{'REMOTE_ADDR'};
$RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
my $query_addr = "$4.$3.$2.$1.niku.2ch.net";
my $addr = join('.', unpack('C*', gethostbyname($query_addr)));
if ($addr eq '127.0.0.2'){print_error("PROXY ERROR")}
}
0633nobodyさん
2006/06/19(月) 17:17:11ID:???これじゃ、質問の答えにはなってないと思うが
> open(FILE, +< $file);
perlfunc嫁。modeは別の引数に出来る。
open(FILE, '+<', $file);
0634nobodyさん
2006/06/19(月) 17:19:08ID:???試してないがNet::DNS使えばタイムアウトの設定が出来るんじゃないか?
ttp://search.cpan.org/~olaf/Net-DNS-0.57/lib/Net/DNS.pm
0636nobodyさん
NGNGあんま信用しない方がいい
実際にやってみれば分かると思うけど
0637616
2006/06/19(月) 17:37:51ID:???別の引数にしたら…??
すません。よく分かりません。
open(FILE, "+< $file");
は正しくなくて
open(FILE, '+<', $file);
が正しい書き方ってこと??
0640nobodyさん
2006/06/19(月) 17:48:45ID:???>open(FILE, "+< $file");
いや、これでも正しいよ。
openの引数をいくつにするかってだけだから。
ただ、"$file" は無駄やってるよってこと。理由は >>621 のリンク参照。
0642616
2006/06/19(月) 18:06:04ID:???なぁんとなく解ってきたようなきてないような。
$hoge = '質問スレ';
print "初心者$hoge";
と書くのは正しいけど、
$hoge = '初心者質問スレ';
print "$hoge";
と書くのは厳密には正しくない、みたいなことかな。
上の例で言えば、どうしてもダブルクォートで揃えたいなら
open(FILE, "$file");
とは書かず
open(FILE, "< $file");
と書いた方が文法的(?)にはオケってことか。
ちょっとスッキリした。サンキューです!
0643nobodyさん
2006/06/19(月) 18:18:13ID:???いや、正しい正しくないの話じゃなくて。例えば、0から9まで処理するときに
for my $i (0..9) { }
と書いても、
{ my $i = 0;
while ($i <= 9) { }
continue { $i++ }
}
と書いても文法的には正しいし、同じように動くけれど、
前者のほうが無駄が無いし、間違い起こしにくいでしょ?みたいな話かと。
0644nobodyさん
2006/06/19(月) 18:24:02ID:???> print "初心者$hoge";
これも
print '初心者', $hoge;
こうか
print '初心者' . $hoge;
こう書かない?
0645616
2006/06/19(月) 18:43:23ID:???そっちの解釈か!
ロクに入門書も読まず他人様の書いたコードを切ったり貼ったりしながら
適当に「学んだつもり」になってた人種にとっては耳の痛いお話ですわ。
システム面でのエラーが起こりにくい無駄のない書き方に拘泥して
稚拙なヒューマンエラー続発とか…自分には有り得そうで怖いなぁ。
とは言っても、そんなんでは進歩はないので心掛けて書き直すかな!
>>644
例が悪かったかもかも。
print "<SPAN STYLE=\"color:$hoge\">2ちゃんねる</SPAN>";
みたいなのを想定で。
0646nobodyさん
2006/06/19(月) 18:46:17ID:???0649nobodyさん
2006/06/19(月) 19:10:40ID:???んー。他の人も言ってるけどちと違う。
別にどっちで書いても文法的には正しいし動作もする。
"$file" みたいにダブルクォートで括ると(無名の)「文字列の生成」が起こる。
内容は$fileと全く同じ。
だったら新しく生成しなくても良いんじゃないの?って話。
同じもの2個作ってどうするよ。無駄だよね。
しかも、 open(FH, "$file"); じゃ、生成した所ですぐに使い捨て。
だったら open(FH, $file); の方が無駄な変数作らなくて良い。
まぁそんだけだけど。
0650616
2006/06/19(月) 19:41:40ID:???>"$file" みたいにダブルクォートで括ると(無名の)「文字列の生成」が起こる。
!!
先生『週刊そーなんだ』にも掲載すべきだと思います。
懇切丁寧な説明により、ようやく合点がいきました。
しかし、ラクダ本読むのには時間もだけど体力要るな…。
0651nobodyさん
2006/06/19(月) 22:55:15ID:Fr5nT8/Wちょっと知り合いのサイトを作ってあげよかなと思いまして、
いろいろ遊びたいのでとりあえず全部のページをCGIにしようと今メモ帳を眺めてるのですが。
プログラム本体にHTMLを書いていくとなんか物凄く長くなってしまいますよね。
でも10ページくらいでも1000行くらいは簡単に超えますね。
なんかそのやり方がすきになれないのですが、かといって.txtにhtml本文を書いておいて
読み込み手法も納得いかない。
出力内容を作成するルーチンだけ.plで別にしても結局はイマイチ。
読みやすく拡張しやすくスッキリとした手法をかなり神経質なレベルで考えていますが、
アドバイスもらえたらとおもって投稿しました。
少しコーディングから離れるというか、前段階の話になるので気が向いた方だけで
かまいませんので宜しくお願いします。
0652nobodyさん
2006/06/19(月) 23:06:33ID:???とりあえず HTML::Template でも使っとけ
0653nobodyさん
2006/06/19(月) 23:08:51ID:???最近Catalystばかりなのでわかんね。
0654651
2006/06/19(月) 23:12:39ID:Fr5nT8/WHTML::Templateは知っていますが、そういうことではないんです。
うまく説明できませんのでスルーしてもらってもm(__)mごめんなさい。
例えば普通にhtmlファイルのまま全部のページを公開してるとしますよね。
10ページだろうが100ページだろうが、拡張していくときに面倒はありませんし、
把握もとても単純なんですよね。
それをCGIにするとイマイチなんです。
スマートじゃなくなるというか。ゴミゴミするというか。
もちろん同じフォーマットの文章だけ違うような場合はいいのですが。
それぞれのページで違いますので。
0655nobodyさん
NGNG0657617
2006/06/20(火) 00:38:01ID:???> 安全措置が施されていて、use re 'eval';しないとデフォルトでは動かないんだこれが。
ウホッ! ありがと。
0658nobodyさん
2006/06/20(火) 01:00:18ID:???他を選択する合理的な理由がない場合、ファイルオープンには常に 3引数の open を使うのが良い習慣だと思います。
正しくは、「どんな場合でも、その必要がなければ 2引数の open を使わない」なんだけれど。
0659nobodyさん
2006/06/20(火) 01:21:04ID:???・共通する部品と各ページに固有の部品をそれぞれ抽出
・各部品をファイルに保存 # この時、プログラムから利用しやすい形で保存しておく
・CGI が叩かれた時に必要な部品を読込み、それらを組み合わせて返す
全リソースが静的なら、こーゆーのは SSI の仕事で CGI でやるメリットはないと思う。
抽出の粒度と保存スタイルさえ適切ならディスクの節約にはなるかもね。
0660nobodyさん
2006/06/20(火) 01:29:57ID:???ヒアドキュメント使えば、表示したいHTML+5行ぐらいでcgiに出来ますよね?
”拡張性がある”というのをどういう状況を指して言ってるのか分からないですが、・・・
0661nobodyさん
2006/06/20(火) 03:32:08ID:???Perlの練習の意味を込めて、今現在CGIでホームページを作成しています。
(ただ単に、HTMLを出力するだけのCGIです)
そこで質問なのですが、
「http://yomi.pekori.to/s/yomi.cgi?mode=kt&kt=02」の用な感じにページを分けたいのですが、考え方が分かりません。
自力で「http://yomi.pekori.to/s/yomi.cgi?mode=kt」まで分けることはできるのですが、
その後にさらに「&kt=02」を足して
「http://yomi.pekori.to/s/yomi.cgi?mode=kt&kt=02」というページを作成する方法が分かりません・・・ orz
正直、自分でやってもうまくいかないし、何て検索していいのかも分からず途方に暮れています・・・
よろしくお願いします。
0662nobodyさん
2006/06/20(火) 03:59:35ID:???CGI.pmを使ってるならparam('mode')、param('kt')で欲しい値が取れる
ので、それを条件にかければOK
0663nobodyさん
2006/06/20(火) 04:48:28ID:???自分のスクリプトではこんな感じにしてます。
$template{'##TITLE##'} = "TEST";
$template{'##CONTENTS##'} = "本文";
&templateprint("template.html", %template);
sub templateprint{
my($inputfile, %data) = @_;
my($templatetext);
if(open(FHTEMPLATE, $inputfile)){
read(FHTEMPLATE, $templatetext, (-s FHTEMPLATE));
close(FHTEMPLATE);
while (my($pos, $val) = each %data){
$templatetext =~ s/$pos/$val/gi;
}
}
print $templatetext;
}
※ ここに貼り付けるにあたってエラー処理とかはばっさり削除してます
0664nobodyさん
2006/06/20(火) 07:13:05ID:???テンプレート使うとかブラウザからページ作成する、とかでない限り無駄でしかないんだけどw
0665nobodyさん
2006/06/20(火) 07:27:32ID:???あと HTML 編集時のミスも極力防げるし。
サーバーの負担以外はプラス面ばかりだとは思う。個人的にはだけどね
0666651
2006/06/20(火) 08:03:26ID:5983Ww81例えば10ページ分を一つのファイルにまとめると物凄いうざくなりますよね。
HTML自体が長くても所詮は.htmlで保存公開してるならスッキリ感があるんですが、
それをひとつのファイルにまとめると最悪な感じなんです。
html的に最悪ということです。
見渡しにくいコード・ソースというのが嫌いなのです。
逆に外部ファイルが10個も20個もあるのもイヤなんです。
というジレンマなんです。
0667nobodyさん
2006/06/20(火) 08:27:29ID:???デザインなんてCSSファイル変えるだけじゃん。
テーブルレイアウトやってるならあれだけどね。
>>666
CGI でやること自体見渡しにくいし、何kbのCGIファイル作る気だよ・・・
テンプレートは嫌だって言うし・・・
もう、あれだ、perl より php でやったらw
0668nobodyさん
2006/06/20(火) 09:59:21ID:???普通に1つのページに対して、1個のCGIにすれば?
というかperlはヒア演算子があるから、既にHTMLが出来てるなら、
#!/dir/perl
print <<HTML;
content-type:xxxx
HTML
で、とりあえずすぐにcgiになる。で、なんか動的要素追加したかったら
前の部分にちゃちゃっと書けば、ある程度拡張できるし・・・
というか何を目指してるのかがいまいち分からない・・・
0669nobodyさん
2006/06/20(火) 10:21:31ID:???10ページ分のHTMLを一つのCGIファイルにまとめてたい。
でも、大きくなって見通しも悪いのでどうにかしたい。
複数ファイルは死んでも嫌。
回答:
HTML::Templateは変数にテンプレート入れて動かせるよ。
0671nobodyさん
2006/06/20(火) 11:57:30ID:???0672nobodyさん
2006/06/20(火) 11:57:50ID:???0673nobodyさん
NGNG動的なページっぽく見せてるお^^
0674nobodyさん
2006/06/20(火) 12:20:28ID:5Ut+7oeuセグメンテーションエラーになってperl.coreというファイルを吐いて死んでしまいます。
perl.coreというファイルは何に使うのでしょうか?
0675nobodyさん
2006/06/20(火) 12:26:38ID:???[ケース1]
Perlを熟知しているが無意識に「Perl(CGI) > HTML」というイメージにとらわれている。
[ケース2]
Perlはそこそこできるが、HTML::Templateについて実はよく理解していない。
[ケース3]
Perl習いたてで、Perlを万能低級言語であるかのような錯覚に陥っている。
[ケース4]
HTML、CSS、JavaScriptについて実はよく理解していない。
[ケース5]
そもそも、対象としているHTMLソース自体が汚いから誰がやってもまとまらない。
0676nobodyさん
NGNGアセンブラの知識があれば読めます
0678nobodyさん
2006/06/20(火) 12:39:34ID:???0679674
2006/06/20(火) 12:49:03ID:5Ut+7oeuとでています。
perl -dでデバッグを行ってみたのですが、ある部分でずっとCPUを100%使い切ったまま止まっているように見えます。
このperl.coreはどのように役立てればよいのでしょう?
ググっても参考になる情報が載っていないので‥
0680nobodyさん
NGNGデバッガ使って読んで下さい
0681nobodyさん
2006/06/20(火) 14:11:30ID:T0oahEq/ファイル($log)の中身を1行ずつチェックしながら処理する場合、
open ( FH, $log );
と開いたとして、
@array = <FH>;
$limiti = @array;
while ( $limiti > 0 ) {
処理;
$limiti --;
}
とするのと
while(<FH>){
処理;
}
とするのは同じこと?
どっちでもできるなら後者の方が無駄な変数無い分よろしい?
0682nobodyさん
NGNG0683nobodyさん
2006/06/20(火) 14:18:25ID:???明らかに前者は分かりにくい。ありえない。メリットも少ないし。
それでもメモリに展開するなら foreach (@array) {} にでもしなよ。
0684681
2006/06/20(火) 14:32:11ID:???後者の方法最近知ったんだけど、それまでずっと前者の方法でやってた・・・orz.
>明らかに前者は分かりにくい。ありえない。メリットも少ないし。
だよね!だよね!ハッキリ答えてもらえてかなりスッキリ。
しかも代替案まで出してもらって恐縮です。
どうもでした!
0685nobodyさん
2006/06/20(火) 14:44:49ID:???0686651
2006/06/20(火) 18:41:22ID:5983Ww81CSSレイアウトは正確に書いても正確にレンダリングされるわけではありませんので、
バグ対応を考えるとテーブルレイアウトの方がよほどデザインの変更は私にとっては簡単です。
0687651
2006/06/20(火) 18:54:06ID:5983Ww81ケース6
ある一つのファイルを開けた時の見渡しやすさを確保するには一ページずつhoge.cgiにすれば
.htmlほどではないが準じたレベルで解決。
でもそれだとperlとしてボツ。
要は見渡しやすさと効率と利便性と拡張的と省エネと論理的という理想がそれぞれで
ぶつかりあって毎度動きはするけど納得いかないレベルのものになってしまうのです。
ここらでこのジレンマを解決したいのですが。
strictHTMLと作る側の利便性と効率的且つ拡張的なHTMLは反発しますよね。
そんな感じかもしれません。
m(__)m
0688nobodyさん
NGNG↓
高負荷でレスポンス激重or鯖缶から垢デリ
↓
水の泡
0689651
2006/06/20(火) 19:19:53ID:5983Ww81いや。まあかまわないのですがそれも。
作る自体遊びなので。
0690nobodyさん
2006/06/20(火) 19:37:08ID:???b;b1;10
c;c1;10
と記述したファイルがあるのですが、
例えばb;b1;10の10を11に書き換えたい場合はどうすればいいのでしょうか?
0691nobodyさん
2006/06/20(火) 19:40:22ID:???0692nobodyさん
2006/06/20(火) 19:45:22ID:???ファイルじゃなくてどうゆうふうに変数に入れてるのか家
まぁ、データ整理がうまく言ってないだけだと思うけど、たぶん想像だけど無難なトコでは
@file = (
['a', 'a1', 10],
['b', 'b1', 10],
['c', 'c1', 10],
);
って感じでいいのか?
だとしたら
$file[1][2]++;
となる
0693nobodyさん
2006/06/20(火) 20:02:06ID:???データファイルなりなんなりで保存しておいて、Apacheのmod_rewrite使って
自動的にCGIにパスを渡すようにするかなー
ってこれブログじゃねえか!
0694nobodyさん
NGNG0695nobodyさん
2006/06/20(火) 20:09:48ID:???Perlは初心者レベルの俺から見ても、
外部にhtmlの共通部分をテンプレートとして用意しておいて、
コンテンツをそこに流し込むだけでいい気がするんだけど。
>>686
それはCSSを知らないだけじゃない?
よっぽど変なレイアウトをしない限り、CSSハックとかちょっと組み合わせれば
主要ブラウザの表示の差異ぐらい普通に取り除けるぞ。
IE7でちょっと混乱しそうだが、IE7でCSSハックもできるようだから問題ないだろうし。
0696nobodyさん
2006/06/20(火) 20:12:07ID:???ファイルを読み込んで該当の一行を返し、それを;でsplitしています
ですので、変数としては@datに配列として入っています。
その@datの値を変更したのですが、ファイルに書き戻す方法がわかりません
0697nobodyさん
NGNG0698nobodyさん
2006/06/20(火) 20:23:24ID:???マッチした行をsedしたいのですが
0699698
2006/06/20(火) 20:25:48ID:???s///です。
0703651
2006/06/20(火) 21:04:52ID:5983Ww81いえ、htmlのソースは十分見やすいのです。
ただ、それを一つにまとめると長くなって見渡しやすさがなくなるのです。
>>693
昔携帯用サイトをそんな感じで作りました。
>>695
それはCSSに適したレイアウトをしてるからじゃないですか?
デザインレベルの段階で「これはCSSだと云々」と考えたりするのは
個人的には邪道なのです。
例えば写真がページごとに入る枚数が違って、写真と文字の位置の関係や
回り込みの仕方。文字のサイズを変えたときのかわり方、全体の長さによる背景の可変。
そして久しぶりにソース、コードを見た時のわかりやすさ。論理的でありながら効率的で。
長くお邪魔してしまいましたが、スレ汚しになってしまいますのでここらへんで消えます。
ありがとうございました。
0705651
2006/06/20(火) 21:17:35ID:5983Ww81例えば
my $print_value;
if ($form{page} eq "index"){ $print_value = &tag_index}
と本文でやってインデックス用のページを作るサブルーチンから完成したソースを
返してくるとしますよね。
これでページがindexとblogとgalleryと3種類だけでもソースを返してくるルーチンを
3つ同じファイル内に書くと見渡しにくくなりますよね。
最高の解決としては。これはメモ帳レベルの問題なのですが、
同じファイルに書いておきながら
#このルーチンはどういう処理をして何を返すのかを軽く説明
sub tag_index{} ### このルーチンの中身を見るにはココをクリック!
こんな感じになれば最高なんです。これで10個のルーチンがあっても30行ほどでよくなります。
つまり10個のルーチンが画面内に収まるのですから処理の全体の流れがとてもわかりやすいのです。
これが私のいう見渡しやすさです。
外部にライブラリにすればいい。モジュールにすればいい。
いや。違うんです。ファイルをいくつも作るのはゴミゴミして嫌いなんです。
そして毎度引数を色々渡すのも嫌いなんです。
って、こんなメモ帳を自分で作ればいいのか・・・・・・・
terapadを使ってるのですが、このインターフェースに慣れてるので
サブルーチンはデフォルトでは表示されないとかになればいいのに。行数はもちろんトビトビになる仕様で。
0706nobodyさん
NGNG0707nobodyさん
2006/06/20(火) 21:19:55ID:???0708nobodyさん
2006/06/20(火) 21:20:03ID:???ファイル複数にするのも邪道
HTML::Templateは使いたくない
これじゃどうしようもない…。
>>651 は何がしたかったんだろう。
0709nobodyさん
2006/06/20(火) 21:22:25ID:???っていう質問だったのか。。。
0710nobodyさん
NGNG0711nobodyさん
2006/06/20(火) 21:27:06ID:???その辺も普通にCSSで実現できるな。
tableデザインにはそれなりのメリットがあるのはわかるが、
貴方は多分CSSデザインを過小評価しすぎてるよ。
否定するならちゃんと勉強してからがお勧め。
0714651
2006/06/20(火) 21:34:10ID:5983Ww81そういうエディタもあったのですか。
しょぼい結末になってすみませんです。
>>711
そうでしたか。CSSスレで回答者をしていたころはよく回答者同士で
実装について嘆いたものですが。
1年ほどCSSから離れていたあいだにブラウザに革命でもおきて全て解消されたのでしょうか。
失礼いたしました。
0715nobodyさん
2006/06/20(火) 21:35:11ID:???0716651
2006/06/20(火) 21:40:19ID:5983Ww81優しくしてくれてありがとうございました。
0717nobodyさん
2006/06/20(火) 21:59:49ID:???0718nobodyさん
2006/06/20(火) 22:01:41ID:???0719nobodyさん
2006/06/20(火) 22:14:59ID:???ファイルを直接書き換えたいので、
open( FILE, ">>./dat/img_data.dat");
while(<FILE>){
s/$FORM{'tmp'}.*/$dat/;
print;
}
close( FILE);
このようにしているのですが、うまく動きません
原因がわかるかたいますでしょうか?
0722nobodyさん
2006/06/20(火) 22:22:13ID:???最後まで言ってることチンプンカンプンだったな。
どうでもいいけど、strict-HTMLとかCSSとかを心底使いこなせるほど覚えたのに、でもテーブルレイアウトのがいい、って言う人はじめて見た。
0724nobodyさん
2006/06/20(火) 22:27:29ID:???CSSハック駆使してその程度のデザインが出来ないっておかしい
amazonがまさにやりたいデザインを実践してるように見えるし
0726nobodyさん
2006/06/20(火) 22:32:50ID:???>>719
解決法そのいち:(メモリ喰うけど簡単だよ!)
配列に一回読み込んでから好きに書き換え、同じファイルに書き出す
解決法そのに:(メモリ喰わないけどちょっと面倒だよ!)
INとOUT、二つのファイルハンドルを作り、INで一行読んで好きに書き換え、OUTに書き出す
全部終わったら元ファイルを削除し、新ファイルを元ファイルと同じ名前にリネーム
0727nobodyさん
2006/06/20(火) 22:36:01ID:???>>719
> open( FILE, ">>./dat/img_data.dat");
追加書き込みで open してるのに
> while(<FILE>){
読もうとしてる。
しかも出力してるのはファイルじゃなくて
> print;
標準出力
そりゃうまく動かない。
というかこれが通るperlって凄いな。ある意味。
0729nobodyさん
2006/06/20(火) 22:37:42ID:???ここを直しても動かないけど、明らかにおかしいところ。
そのいち:
open( FILE, ">>./dat/img_data.dat"); は、追記オープンでしょ。
そのに:
print; は標準出力でしょ。少なくとも print FILE $_; にしないとFILEの意味がない!
と書いてたら>>727に先を越された。
>>728
意味が分からない。
0731nobodyさん
2006/06/20(火) 22:51:15ID:???0732nobodyさん
2006/06/20(火) 22:54:19ID:???0733nobodyさん
2006/06/20(火) 22:56:30ID:???とW3C信者の俺が言ってみる
0734nobodyさん
2006/06/20(火) 22:58:09ID:???この部分のことかね?
0736nobodyさん
2006/06/21(水) 01:11:43ID:???0737nobodyさん
2006/06/21(水) 12:25:23ID:Jpc8QU0aという情報が入っている。
・これを「住所」でソートして結果を出力(都道府県別という程度のソート)。
・その際、ブラウザにはフォームで選択した項目の情報だけを吐き出す。
ということをやりたいんですが、
1.openしてwhileで1行ずつ配列(@temp)に入れて処理。
1-1.フォームで選択されていないものを@tempからspliceして除去。
1-2.全ての都道府県にあらかじめ番号を付けておき、
$temp[4]に当たる値とマッチングさせて、unshiftで@tempの頭にその番号を付ける。
1-3.@newdataに@tempをpushで追加していく。
2.@newdataをソートして出力。
という方法しか思いつきませんでした。
でも、これだと不要な項目をループ処理の中で1回1回チェックしていて
ものすごく無駄なことをしている感じがします。
ファイルを開く前に必要な項目をチェックしておいて、
ファイルを開くときにはそれだけを取り出して処理する、
ということはできないでしょうか?
0739737
2006/06/21(水) 12:56:08ID:Jpc8QU0aありがとうございます。
それにしても「自分で決めた順番でソートする」という
ピンポイントな文章で結果が出るとは・・・。
しっかりブックマークして読んできます。
0740nobodyさん
2006/06/21(水) 13:10:47ID:QAUqj+Eucvs?といいますか、特定の文字で区切られた(12個)ファイルを読み込んで
二次元配列に入れて、処理をしたい。
2: それでこんな風にやってみたが・・・
for文(i++)で行を読み込んでから、それをさらにfor文(j++)で区切りずつに
わけ、その都度$list[$i][$j]に入れていくようにしました。
3: こんなエラーが出て上手く行かなかった。
12行目に来たところで突然ちゃんと配列に入らなくなってしまいました・・・。
読み込むファイルに原因があるのかと思い、1行から20行まで同じ内容のファイルを作ったのですが
同じように読み込めませんでした・・・。どのようなことが原因と考えられるでしょうか・・・?
0741nobodyさん
2006/06/21(水) 13:21:16ID:???Perlメモには多くの人がお世話になっているはず。
そのページの他の項目も非常に為になりますよ。
>>740
どんなエラーですか・・・
0743737
2006/06/21(水) 13:46:58ID:Jpc8QU0aこれはとても勉強になりそうです。
逆引きなのが助かります。
ところで、>>738にて指摘してもらった箇所を参考にしてみたんですが
>>737に即して書き直すと
$i = 0;
undef(%jusho);
foreach $name ('北海道', '東京', '愛知', '', '大阪', '福岡') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[5]} <=> $jusho{$b->[5]}}
map {[$_, split /<>/]} @data;
というふうになるかと思うんですが、「住所」の項には都道府県以下の内容も含まれているので、
この方法で対処しようとすると「住所」の項とは別に「都道府県」の項を設けるか、
住所を「都道府県」と「それ以下」とに分けなければダメですよね?
これはこれで大変便利で、参考になりましたが、
今の記述内容のファイルでは、やはり>>737の方法しかないんでしょうか?
0744nobodyさん
2006/06/21(水) 13:49:01ID:???マッチする前の部分も表示されました。
一応$& $'と書くことで、自分のやりたいことはできてるんですが、
なぜこうなるのか気になります。
何か特別な理由があるんでしょうか?
0745nobodyさん
2006/06/21(水) 13:49:48ID:???別に20行目とか多次元配列で何か起こるってことはないと思う。
どうみても処理のせいです。
同じように多次元配列(ハッシュ) にいれるモジュール作ったけど、そんなことは起きなかったし。
データが shiftjis で、その特定のマーカーと知らないうちにかぶってるとか。
0747nobodyさん
2006/06/21(水) 14:00:01ID:???応用しようぜw
@data = map {$_->[0]}
sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[5] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;
まあニュアンスね。試してないけど。
0748nobodyさん
2006/06/21(水) 14:00:50ID:???sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
↓
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
0749737
2006/06/21(水) 14:20:59ID:Jpc8QU0a>sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
これは「名前」でソートするってことですか?
>$tmp[5] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1]
この部分が分かりません・・・。
簡単にで良いので解説を・・・。
0750nobodyさん
2006/06/21(水) 14:35:16ID:???()の中身を取って$1に入れときたいのです。
0752nobodyさん
2006/06/21(水) 14:44:47ID:???0753737
2006/06/21(水) 14:54:48ID:Jpc8QU0a解説ありがとうございます。
とすると、
>>747の処理をして一旦「都道府県」だけを取り出して>>743の処理をする
という解釈で良いんでしょうか?
それとも>>743のコードの6行目以下を>>747のニュアンスのように書き換える
ということなんでしょうか?
京都府に関しては岸部四郎に免じてお許しを。
0754nobodyさん
2006/06/21(水) 15:02:29ID:???0755nobodyさん
2006/06/21(水) 15:11:00ID:???0756737
2006/06/21(水) 15:19:55ID:Jpc8QU0a0757nobodyさん
2006/06/21(水) 15:26:09ID:???0758nobodyさん
2006/06/21(水) 15:27:40ID:???0759nobodyさん
2006/06/21(水) 15:33:54ID:???0760nobodyさん
2006/06/21(水) 15:40:10ID:???0761nobodyさん
2006/06/21(水) 15:42:59ID:???0762nobodyさん
2006/06/21(水) 15:47:58ID:???HTTP上の問題は今になって考えればなかっただろうが。
UAでの解釈問題はあるかもな。
今の出力コードでおすすめは何?
c-HTMLではSJIS onlyなi-modeも拡張されたの?
0763nobodyさん
2006/06/21(水) 15:50:04ID:???0764744
2006/06/21(水) 15:51:28ID:sa5CDJCkすみません、こんな感じです。
$euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
#検索
while (chomp ($_ = <IN>)) {
if (/<DOCID>(.+)<\/DOCID>/) {
$docid = $1;
}
if (/<TITL>(.+)<\/TITL>/) {
$title = $1;
}
if (/<AUTHOR>(.+)<\/AUTHOR>/) {
$author = $1;
}
if ($form{'tosho1'} eq "all") {
if (/^$euc_regex($key1)/) {
$found++;
print "ID=$docid TITLE=$title AUTHOR=$author<BR>\n";
print "$& <BR>\n<BR>\n";
}
}
}
0765744
2006/06/21(水) 15:52:07ID:sa5CDJCk………石
のように表示されます。
質問は「なぜ$&を使ったのにマッチした部分以前も表示されてしまうか」です。
最低限がどれくらいかわからなかったんですが、
もっとソースの大部分を書いたほうがいいでしょうか?
0766nobodyさん
2006/06/21(水) 15:55:04ID:???メールも7bitだけだしなー。
携帯のブラウザのプログラマはほんと何考えて作ってんだと思うよ。
0767nobodyさん
2006/06/21(水) 15:55:41ID:???0768nobodyさん
2006/06/21(水) 15:56:15ID:???$euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
ちょw おまwww
0769nobodyさん
2006/06/21(水) 15:59:46ID:???> $euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
> if (/^$euc_regex($key1)/) {
え、当たり前では。
「石」で検索かけるってことは、$key1 = "石"なんだよね。多分。
このとき正規表現は
/^(?:$ascii|$two_bytes|$three_bytes)*?(石)/
なんだから、$&ではマッチした部分全部が取れる。
"石"だけ取りたいなら $& じゃなくて $1 でしょう。
0770737
2006/06/21(水) 16:30:27ID:Jpc8QU0a$i = 0;
undef(%jusho);
foreach $name ('北海道', '東京', '愛知', '', '大阪', '福岡') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[4] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;
ラスト3行については下から処理してるんですよね?
なぜ、正規表現で取り出した()の中身を$1に入れて
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}となるのか分かりません。
岸部四郎の件で気分を害されたならお詫びします。
0771nobodyさん
2006/06/21(水) 16:36:13ID:???解読してみる。
$jusho{ $a->[1] }
・↑の $a の部分は [ $_, $1 ] である、
・つまり $a は [ 元のデータ , 県名 ]
・なので、 $a->[1] は 県名
・$jusho{ $a->[1] } は
$jusho{ 県名 } ということ。
あってる?
0772737
2006/06/21(水) 17:07:18ID:Jpc8QU0a解説ありがとうございます。ラスト3行の意味がやっと理解できました。
そうすると、ハッシュとして割り当てる名前にも都道府県を付ける必要があるわけですね。
$i = 0;
undef(%jusho);
foreach $name ('北海道', '東京都', '愛知県' , '大阪府', '福岡県') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[4] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;
としてみましたが、やはりうまくいきません…。
ちなみに読み込む@dataに入っている情報は
岸部4郎<>57<>男<>077-XXXX-XXXX<>京都府京都市伏見区・・・<>
のような形態です。
0773nobodyさん
2006/06/21(水) 17:07:26ID:???公開資料上で全機種対応なのはSJIS。
だが実際は、ほとんどの機種は四大エンコードに対応している。
>>766
糞仕様を決めたのはドコモ。
0775nobodyさん
2006/06/21(水) 17:50:44ID:???鵜呑みじゃなくて、ちょっと考えて流用しようよ。
>>747 のコードが間違ってるんだってば。
本人ニュアンスだけで試してないって書いてあるし。
それと >>751 も忘れずに。
0776nobodyさん
2006/06/21(水) 18:05:31ID:???>>743 に ('北海道', '東京', '愛知', '', '大阪', '福岡') ってあったけど
今度 ('北海道', '東京都', '愛知県' , '大阪府', '福岡県') ってしてるのに、コード変えてないから・・
その場合 /^(.*?(?:県|都|府|道))/ こうねw
まあ京都府問題あるけどね。
0777nobodyさん
2006/06/21(水) 18:06:54ID:???0778nobodyさん
2006/06/21(水) 18:10:36ID:???('北海道', '東京都', '愛知県', '京都', '大阪府', '福岡県')
うわー頭の悪い解決法w
漏れの出生地だったりもします♪
そういや本7も京都府、、、
0780nobodyさん
2006/06/21(水) 19:54:18ID:???0781740
2006/06/21(水) 21:36:56ID:YEOwQDJjこんな感じです。
while (<SOCKET>){
m/ここから後ろが12行で一区切り/ and last;
}
for ($i = 0 ; $i < 100; $i++ )
{
for ($j = 0 ; $j < 13; $j++ )
{
$list[$i][$j] = <SOCKET>;
}
}
[12][5]ぐらいあたりから次に([12][7])ずれてしまいます・・・。
[12][4]までは、ちゃんと入っています。データはeuc-jp?でした。
0782nobodyさん
2006/06/21(水) 21:48:58ID:???$j は 13個で回ってるんだがそれはOKなの?
0783nobodyさん
2006/06/21(水) 21:56:27ID:???ですよねぇ。。。
SOCKETなんて名前を使っているところを見ると何かしら通信しているのかしら?
となると、改行問題とかもありそうな。
しかし、whileでSOCKETを読み捨てているのもなんだかなぁ。。。
0785nobodyさん
2006/06/21(水) 23:05:30ID:???ユーザディレクトリ内に任意のディレクトリ構造を作って利用できます。
ユーザディレクトリ内はCGI経由で閲覧しますので、画像などもCGI経由でバイナリで書き出そうと思い
実際やってみたのですが、画像へ直リンク張るのに比べ、格段に表示が遅いです。
よく、画像の無断直リンク防止のためにCGI経由ってのはあると思うのですが、上記のように、
サイトの全画像をCGI経由ってのは設計としてよろしくないのでしょうか。
0786nobodyさん
2006/06/21(水) 23:08:34ID:???1ページでプロセスいくつ使ってると…。
0787785
2006/06/21(水) 23:11:12ID:???HTTPで通信してデータ取得する場合、一行のサイズに限界があるから、
サーバ側が勝手に(というか仕様に基づいて)改行コードを入れる可能性がある。
サイズが長い行でずれてるのでは?
0791nobodyさん
2006/06/22(木) 00:09:28ID:???本当にあのコードで12行目まで動いてるのだとしたら、
何がやりたいのか分からんのでお手上げだが。
やりたいのは実はこういうことじゃないのか?
while (<SOCKET>){ chomp; push @list, [(split /特定の文字/, $_)[0..11]]; }
0792nobodyさん
2006/06/22(木) 00:58:05ID:???.htaccess が利用できるなら
<FilesMatch "\.(gif|jpe?g|png)$">
SetEnvIf Referer "^$" shutout
Deny from env=shutout
</FilesMatch>
でどうです?
0793nobodyさん
2006/06/22(木) 00:58:34ID:???>785 宛でした
0794nobodyさん
2006/06/22(木) 00:59:58ID:qN5f1h6gまず下のコードは、見ていただければ分かると思いますが、
「$come」や「$name」などが未記入であった場合、「&error」を実行させるという基本的なコードなのですが、
下では「$come」、「$name」、「$title」が”全て未記入”であっても、
「コメントが入力されていません」と、一箇所だけしかエラーが吐き出されません。
全て未記入であった場合
------------------------------------------------------
コメントが入力されていません
名前が入力されていません
タイトルが入力されていません
------------------------------------------------------
等、全てのエラーを”一度に全部”吐き出したいのですが、やり方が分からず困っています・・・・。
どうかよろしくお願いします。
------------------------------------------------------
if ($come eq "") { &error("コメントが入力されていません"); }
if ($name eq "") { &error("名前が入力されていません"); }
if ($title eq "") { &error("タイトルが入力されていません");}
------------------------------------------------------
sub error {
local($msg) = @_;
print "<br>\n";
print "<table border=\"1\" cellpadding=\"3\" width=\"500\" cellspacing=\"0\">\n";
print "<tr><td align=\"center\">\n";
print "$msg\n";
print "</td></tr>\n";
print "</table>\n";
exit;
}
0796nobodyさん
2006/06/22(木) 01:07:27ID:???my $errormsg = "";
if(!$come){ $errormsg .= "コメントが入力されていません<br>\n"; }
if(!$name){ $errormsg .= 名前が入力されていません<br>\n"; }
if(!$title){ $errormsg .= タイトルが入力されていません<br>\n";}
if($errormsg){ &error($errormsg); }
こんな感じでしょか
0797nobodyさん
2006/06/22(木) 01:09:10ID:???実行してるソースに書くときは忘れずに・・・
0799nobodyさん
2006/06/22(木) 01:30:47ID:???$come eq ""を!$comeに変えたのはあまり宜しくないと思うぞ
"0"が入ってきたらどうする
# 確かに無意味そうな投稿だから弾いても良いかも知れんが
0800785
2006/06/22(木) 01:42:48ID:???ありがとうございます!
今回、CGI経由にする目的の一つに、テンプレート内の相対パス指定がCGI経由で
崩れるのを回避するため、ファイル指定関数でfile.cgiを呼び出す、というのが
あったのですが、それは別の方法で解決するとして、一般的な直リンク防止の仕組みは
おっしゃる方法でみんなやってそうですね。試してみます。
>>789
ごめん、全く憶測で言ってるので鵜呑みにしないでください。
0801nobodyさん
2006/06/22(木) 10:08:11ID:???1000を1,000に変換する関数とかってありますか?
0802nobodyさん
2006/06/22(木) 10:14:14ID:???0803nobodyさん
2006/06/22(木) 10:47:24ID:???> 画像をCGI経由で呼び出すと格段に遅い
そう? 実際簡単に↓のようなソース作ってやってみたけど、
#!/usr/bin/perl
my @begin = times();
{
my $img = $ENV{QUERY_STRING} || './hoge.png';
$img =~ s/^\?//;
my $ext = ($img =~ s/\.([A-Za-z]+)$//) ? lc $1 : 'png';
open (IMG, $img .'.'. $ext) or die;
my ($size, $modified) = (stat(IMG))[7, 9];
read (IMG, $_, $size);
close (IMG);
binmode (STDOUT);
print "Last-Modified: ", scalar (gmtime $modified), "\n";
print "Content-length:", $size, "\n";
print "Content-type: image/", ($ext eq 'jpg' ? 'jpeg' : $ext), "\n\n";
print $_;
}
my @end = times();
open (FILE, '>times.txt');
print FILE 'user: ', ($end[0] - $begin[0]), ' , sys: ', ($end[1] - $begin[1]);
close (FILE);
exit;
結果 user: 0 , sys: 0.0078125 とかで、0.01秒かかるかかからないかくらいだったよ?
試したときの画像のサイズは 2.3Mb くらい。
もしかして1行ずつ読みこんでるとかじゃないよねw それとも何十個のファイルを一度に出すとか?
まあ、いちいち負荷かけるのはうちもどうかとは思うけど。
0804nobodyさん
2006/06/22(木) 10:49:30ID:???ある値を空にするとき
$scalar = "";とするのと$scalar = '';とするのとは厳密に言えばどっちが正しいの?
あと、要素が空かどうかを調べるとき
if($scalar eq "")とif($scalar eq '')とか。
0805nobodyさん
2006/06/22(木) 10:52:09ID:???0806nobodyさん
NGNG0808nobodyさん
NGNG代入の場合はダブルの方が高速だったんだけどなぁ
スマソ ソースはム板だったような
0809nobodyさん
NGNG好みの問題なのでわ
0810nobodyさん
2006/06/22(木) 11:15:30ID:???0812nobodyさん
NGNG比較対象or代入対象が長い文字列な程
ダブルクオートの方が速くなった
0813801
2006/06/22(木) 12:03:04ID:???何気にスルーされてる801です。
1000を1,000のように変換することってできませんでしょうか?
0814nobodyさん
2006/06/22(木) 12:04:36ID:???0815801
2006/06/22(木) 12:18:36ID:???$a = Perlメモ($a);
こんなかんじ?
Perlメモの意味がわかりません・・・
0816nobodyさん
NGNG0819737
2006/06/22(木) 12:58:32ID:fNuZm9nk>>775-778
ありがとうございます。
お蔭で住所によるソートについてうまく動作するようになりました。
本当に助かりました。
>>780
「住所」の項を「都道府県」と「それ以下」に分けることも考えたのですが
さらに「市町村」でソートすることも今後ないとは言えないので
柔軟に対応できるようなコードがあれば、そっちの方が良いかなと思った次第でした。
0820737
2006/06/22(木) 13:04:30ID:fNuZm9nk「フォームで選択された項目のみを出力する」という方法が
やはり>>737で書いたようなやり方しか考え付きません。
どうすればもっとスッキリとして処理になるでしょうか?
# 「$nenrei」「$seibetsu」「$denwa」はそれぞれ
# 「年齢」「性別」「電話番号」情報を出力するかどうかのフラグ。
open ( LOG, "< name.txt" ) || die ( "ERROR: $!" );
flock ( LOG,1 );
while ( <LOG> ) {
my @tmp = split (/<>/);
if ( !$denwa ) { splice ( @tmp , 3 , 1 ); }
if ( !$seibetsu ) { splice ( @tmp , 2 , 1 ); }
if ( !$nenrei ) { splice ( @tmp , 1 , 1 ); }
push ( @data , join (',' , @tmp ) );
}
close ( LOG );
# 以下、昨日教えていただいたコードで処理。
$i = 0;
undef(%jusho);
foreach $name ('北海', '東京', '愛知' , '大阪', '福岡') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[4] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;
# @dataを出力。
0821nobodyさん
2006/06/22(木) 13:39:30ID:???ダブルクォートだと変数展開しようとするから遅いんじゃないの??
>>815
ワロタww
「Perlメモ」でググってみ
0822nobodyさん
2006/06/22(木) 13:41:23ID:???ってか >>820 のやりかただとデータの配列ぶっこわれて map 内の $tmp[4] が違うくなるよーな。
splice するより、$tmp[3] = ''; とか空白にすればいいんでないかい?
0823nobodyさん
2006/06/22(木) 13:43:16ID:???その時は文字列を連結すりゃいいじゃん
データ構造を考えるのもプログラミングのうちですよ。
0824nobodyさん
2006/06/22(木) 13:52:02ID:???都道府県/市区町村/それ以下
の3つのカラムに分けておくね、俺なら。
既存のデータがあるの?
0825nobodyさん
2006/06/22(木) 13:54:34ID:???0826nobodyさん
2006/06/22(木) 14:01:39ID:1JauVdIN上記のように、カンマ区切りのCSVデータを文字列として配列に入れた状態で、
CSV内、2つめの値が1のものだけを@bの配列にいれるには、
foreachで全レコードを回し、条件式を使って@bにpushするしかないんでしょうか?
こういった状態にしたいんですが。
@b=("a,1","c,1");
0827nobodyさん
2006/06/22(木) 14:05:22ID:???0828nobodyさん
2006/06/22(木) 14:05:51ID:???0829737
2006/06/22(木) 14:17:17ID:fNuZm9nkあ!その通りですね・・・。
できるなら配列を短くした方が処理としては良いと思って削ってました。
>>823-824
なるほど。最初から細かい部品に分けておいて
必要に応じて連結して対応する形にする方が効率的ですね。
一応、既存のデータはありますがそれほど数は多くありませんし
テキストエディタでも使えばすぐに書き換えられそうなので
データファイルの構造を変えようと思います。
繰り返しになりますが「フォームで選択された項目のみを出力する」という方法については
whileで1回1回全て開いてから、選択されているかどうかをチェックする方法(>>820の前段)で良いんでしょうか?
もちろん動くことは動くんですが、選択の有無のチェックを各行ごとに行う処理を
1回のチェックでできないかと悩んでいます。
0830nobodyさん
2006/06/22(木) 14:21:42ID:???そろそろ自分でやりなよ
0831nobodyさん
2006/06/22(木) 14:24:10ID:???0832nobodyさん
2006/06/22(木) 14:26:23ID:???のはダメ?
0835nobodyさん
2006/06/22(木) 14:33:56ID:/RLzZFvLundef my $pass;
undef my @temp;
my $val = 7; #パスワード8文字
my @char = ('a'..'k','m','n','p'..'z','A'..'H','J'..'N','P'..'Z','2'..'9');
srand(time ^ $email);
foreach (0..$val) {
{
push(@temp,splice(@char,rand(@char),1)) while @char;
@char = @temp;
}
$pass = $char[($_)] . $pass;
}
return $pass;
}
として、パスワードを生成しているんですが、同一プロセスで二つ以上の異なったパスワードを生成したい場合
どうしたらいいんでしょうか?
$emailはグローバル変数でユニークです。$emailが違う毎に違うパスワードを生成したいんですが、
同じ値が返ってきます。
srandって呼び出しできるの一回だけなんですよね。
0836nobodyさん
2006/06/22(木) 14:37:24ID:???0837nobodyさん
2006/06/22(木) 14:43:03ID:???0838nobodyさん
2006/06/22(木) 14:43:23ID:/RLzZFvLおお。できました
ありがとです<(_ _)>
0839737
2006/06/22(木) 14:45:33ID:fNuZm9nkデバッグ・・・そんなつもりはなかったんですけど、
結果的にそういうことになってましたか・・・。
すみません。
「配列の中から必要なものだけ」という点についても
何かアドバイスが欲しかったので、しつこく聞いてしまいました。
すみませんでした。
>>831
その通りでした。
>>822にて指摘していただいた通り
spliceするのではなく要素を空にする方法にします。
>>832>>834
>View側で表示しないよう分岐
にしても、結局同じように@data内を1行ずつ展開して
表示させるかどうかのチェックをする方法しか思いつきませんでした。
アドバイスありがとうございました。
>>833
もしかしたら、自分のやりたいことと書いてるコードが全然見当違いのことをやっていて
「そんな無駄な処理しなくても、こうやった方が良い」というのがあるのかな、と思って質問しました。
特段、妙なコードを書いているわけではないと分かっただけでもありがたいです。
同じような質問、くだらないことを何度もしつこく書き込みをしてすみませんでした。
今まで懇切丁寧に色々と教えて下さった方々本当にありがとうございました。
0840nobodyさん
2006/06/22(木) 14:53:39ID:???my @checked = qw(1 0 1);# 「年齢」「性別」「電話番号」を出すか
#ループ内で消す
my $i = 0;
foreach my $flg (@checked){
undef $tmp[$i] if $flg;
}
こうするとか。
まぁViewでやるけど。
0841nobodyさん
2006/06/22(木) 15:24:19ID:???じゃあ最後に土産
my %in = (denwa => 1, seibetsu => 0, nenrei => 0, juusyo => 1, hoge => 'hogehoge'); # クエリのデータ?
$in{namae} = 1; # 名前は必ず必要
my @checks = qw(namae seibetu nenrei denwa juusyo); # 含まれるデータの名前
# データ取得
my @data = qw();
open ( LOG, "< name.txt" ) || die ( "ERROR: $!" );
flock ( LOG,1 );
while ( <LOG> ) {
my $d = {};
@{$d}{ @checks } = split (/<>/);
foreach my $key (@checks) {
delete $d->{$key} if (!$in{$key});
}
push (@data, $d);
}
close ( LOG );
# ソート
my $i = 0;
my %jusho = ();
foreach my $name ('北海', '東京', '愛知' , '大阪', '京', '福岡') {
$jusho{$name} = $i++;
}
@data = map {$_->[0]}
sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
map { $_->{juusyo} =~ /^(.*?)(?:県|都|府|道)/; [$_, $1] } @data;
foreach my $d (@data) { while (my ($k, $v) = each %$d) { print $k, ': ', $v, ', '; } print "\n"; }
0842nobodyさん
2006/06/22(木) 15:27:23ID:???0843nobodyさん
2006/06/22(木) 15:30:29ID:???0844nobodyさん
2006/06/22(木) 17:30:21ID:???$i = 1;
print $hoge{aaa$i}; だとエラーになるのですが、正しい記述方法は何でしょうか?
0845nobodyさん
2006/06/22(木) 17:36:13ID:???0846nobodyさん
2006/06/22(木) 17:38:57ID:???0847nobodyさん
2006/06/22(木) 17:50:11ID:fJKTYP9wどうすれば良いのでしょうか?現在は↓のように書いています。
print "ほげ".&hoge('abcd')."ほげ";
しかし、なんか綺麗じゃないので、↓のような感じで書く方法とか
あったら、良いなぁと思ってます。
print "ほげ&hoge('abcd')ほげ";
↓のような書き方も良いのですが…。
print sprintf("ほげ%sほげ",&hoge('abcd'));
まだPerlを始めたばかりなので、皆さんの知恵をかしてください。
0849nobodyさん
2006/06/22(木) 17:54:49ID:???"ほげ",
&hoge('abcd'),
"ほげ"
;
#改行しちゃえば?
0850nobodyさん
2006/06/22(木) 17:57:17ID:???printの中に埋め込まない方が良い
個人的には、
print "ほげ", &hoge('abcd'), "ほげ"; # 連結コスト無し
print "ほげ" . &hoge('abcd') . "ほげ"; # だと2回分、文字列連結コストがかかる
print "ほげ&hoge('abcd')ほげ"; # 動作せず
printf("ほげ%sほげ", &hoge('abcd')); # printf, sprintf のコストは重い
0851nobodyさん
2006/06/22(木) 18:02:27ID:???見栄えはあまりねぇ。
逐次出力したくないときは、どっちにしろ文字列連結コストがかかるし。
0853847
2006/06/22(木) 18:05:43ID:???対するコストなんて考えてませんでした。
皆さんの意見が" ,"で繋げる事で一致しているみたいなので、
これからは、" ,"で繋げる方法でいこうと思います。
0854nobodyさん
2006/06/22(木) 18:10:46ID:???0855nobodyさん
2006/06/22(木) 19:14:15ID:???0856nobodyさん
2006/06/23(金) 00:51:44ID:???The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.
Depending on the server configuration, you can also run thisscript under CGIWrap debugging.
Usually, either rename or linkthe script temporarily to a file which ends with.
cgidextension, or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.
─────────────────────────────────────
Perlで組んだCGIを実行するとこの様なエラーが出てしまい、困っています
CGIのログファイルに、既にデータが入っていれば、↑のエラーは出ないのですが、
ログファイルの中身が空っぽの場合↑のエラーが出ます。
なぜでしょうか?ログファイルを処理するコードに問題があるのでしょうか・・・・・・?
0857856
2006/06/23(金) 00:52:17ID:???─────────────────────────────────────
sub data {
open(LOG,"< $logname") || &error("ログファイルが開けませんでした");
@logs=<LOG>;
close(LOG);
foreach $line(@logs) {
chop($line);
($atai1,$atai2,$atai3,$atai4,$atai5,$time,$value,$name,$titles,) = split(/\,/,$line);
if (!$line){last;}
print "<TABLE border=\"1\" align=\"center\" width=\"500\">\n";
print "<TR><TD>名前</TD><TD>$name</TD></TR>\n";
print "<TR><TD>タイトル</TD><TD>$titles</TD></TR>\n";
print "<TR><TD>投票</TD><TD>$atai1/$atai2/$atai3/$atai4/$atai5/</TD></TR>\n";
print "<TR><TD>書き込んだ時間</TD><TD>$time</TD></TR>\n";
print "<TR><TD>本文</TD><TD>$value</TD></TR>\n";
print "</TABLE><br>\n\n";
}
}
0858nobodyさん
2006/06/23(金) 01:09:56ID:???見慣れないエラーだな…XREAの鯖か?
それを見る限り、ログファイルが空というだけじゃ特に問題を起こしそうなコードじゃない。
が、それが出るのってもしかしてログファイルが存在しない場合、じゃない?
そうだとしたらerrorサブルーチンのほうをチェック。
特にHTTPヘッダをちゃんと出しているかどうかを確認汁。
どうでも良いが変数名はもうちょっと考えたほうが良いぞ…
valueって日本語で値なんだが…本文は大抵bodyとかtextとかかと。あとなぜにtitleが複数形なのよ。
0859nobodyさん
2006/06/23(金) 01:42:46ID:???0860856
2006/06/23(金) 01:57:18ID:???それがどうも、>>858さんがおっしゃっられた通り「&error;」に問題があるっぽいです・・・・。
ためしに、>>857(&data;)のログファイルの変数を適当な文字列に変え、実行したところ、
「ログファイルが開けませんでした」が無限と出てきました。
しかし、↓はその「error」のサブルーチンですが、取り分け私の目には可笑しいようには見えないのですが・・・・
─────────────────────────────────────
sub error {
local($msg) = @_;
print "<br>\n";
print "<table border=\"0\" cellpadding=\"3\" width=\"500\" cellspacing=\"0\" align=\"center\">\n";
print "<tr><td width=\"100%\" bgcolor=\"#C0C0C0\" align=\"center\">\n";
print "$msg\n";
print "</td></tr>\n";
print "</table>\n";
&data;
&foot;
exit;
}
─────────────────────────────────────
sub foot {
print "</BODY>\n";
print "</HTML>\n";
exit;
}
─────────────────────────────────────
0861nobodyさん
2006/06/23(金) 02:32:49ID:???0862nobodyさん
2006/06/23(金) 07:34:25ID:???0863nobodyさん
2006/06/23(金) 14:40:13ID:???そこが分からん
自分では分からないものなのか?
0865nobodyさん
2006/06/23(金) 16:01:22ID:???0866nobodyさん
2006/06/23(金) 16:58:29ID:QUOZQBvkしょーもないところでハマってしまったので、教えてください。
pack("C",8) → 0x08
pack("C",9) → 0x09
pack("C",10) → 0x0D 0x0A
pack("C",11) → 0x0B
どうも10をバイナリ変換したときだけ0x0Dがついてしまうんですが、
これってなんでですか?
0867nobodyさん
2006/06/23(金) 17:07:46ID:???http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0868nobodyさん
2006/06/23(金) 17:08:13ID:???大雑把に書けば \r\n
0869nobodyさん
2006/06/23(金) 17:18:27ID:QUOZQBvk$bin='';
for(1..100){
$bin.=pack("C",$_)
}
open(OUT, "> test.bin");
print(OUT $bin);
close(OUT);
exit 0;
↑のコードに意味はないですが、こんな感じで「pack()の第2引数に何か数値が入る」という場合に、
10が入ってきても正しく動くようにするにはどうすればよいのでしょう?
0870nobodyさん
2006/06/23(金) 17:20:41ID:???0871nobodyさん
2006/06/23(金) 17:22:53ID:QUOZQBvk助かりました。ほんとにありがとう。
0872nobodyさん
2006/06/23(金) 22:21:11ID:HrkNw3LRprint "content-type:image/gif;\n\n";
というヘッダを吐き出して試しに画像を返すCGIを作ってみようと思いました。
最終的には画像をいじるCGIを作ろうと思ってるのですが。
バイナリをコピーしてテキストファイルに貼り付けても何故か
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
という形で張り付きません。何か方法がありますでしょうか?
0873nobodyさん
NGNG0874872
2006/06/23(金) 22:58:10ID:HrkNw3LRなるほど。
それではどうすればいいのでしょうか?
手書きで移すしかないのでしょうか。
0875nobodyさん
2006/06/23(金) 23:16:19ID:???ソースにバイナリを埋め込もうとするなよ、と。
0876nobodyさん
2006/06/24(土) 00:26:02ID:???「 $hoge /= $fuga; 」
で、$hugaの値は始め「0」なのですが、この場合どうすればよろしいでしょうか?
割る数が0だとエラーですよね・・・・
0877nobodyさん
2006/06/24(土) 00:32:56ID:???0878nobodyさん
2006/06/24(土) 00:34:07ID:???経験からすると、そういう時はだいたい計算方法自体が間違ってる。ループの開始値は実は1とか。
まあこれで正しい計算ができると言うのなら $hoge /= $fuga || 1 とか。
0879876
2006/06/24(土) 01:54:46ID:???ありがとうございます。
一応いろいろいじっていて、「$hogehoge = eval { $hoge / $fuga; };
と、形が崩れてしまったのですがこれで動きました・・・が、これでも問題ないでしょうか?
0883nobodyさん
2006/06/24(土) 02:17:12ID:???0で割ったら0にならないものを、無理やり0にしようとしてるんだから
素直に場合わけした方がいいよ。
if ($fuga == 0) {
$hogehoge = 0;
} else {
$hogehoge = $hoge / $fuga;
}
eval使うと遅いし。
$ perl
use Benchmark;
timethese(1_000_000,
{'ore'=>sub{if ($fuga == 0) {$hogehoge = 0;} else {$hogehoge = $hoge / $fuga;}},
'omae'=>sub{$hogehoge = eval { $hoge / $fuga };}});
Benchmark: timing 1000000 iterations of omae, ore...
omae: 6 wallclock secs ( 6.64 usr + 0.00 sys = 6.64 CPU) @ 150625.09/s (n=1000000)
ore: 0 wallclock secs ( 0.39 usr + 0.00 sys = 0.39 CPU) @ 2557544.76/s (n=1000000)
(warning: too few iterations for a reliable count)
0885nobodyさん
2006/06/24(土) 02:48:48ID:LjIFBTanその場合ためらいも無く「flock(LOG,2);」とかやっても問題無いですか?
0886nobodyさん
2006/06/24(土) 04:03:57ID:???flockが使えないような鯖で動かす予定がないなら良いんじゃない?
漏れは、もう長いことflockのためにeval使ったことなんて無いな…
# っつか、flock非対応の環境に出会ったことが無いんで、
# 対応してない環境では致命的なエラーになる事をすっかり忘れてた。
0887872
2006/06/24(土) 17:30:41ID:1EkY/rQfそれじゃあ画像をいじるCGIを作るのが難しいですよ。
どこの何番が何に当たるとか、逐一みたいですし。
あ、勘違いしてるかもしれません。
ASCIIコードで埋め込みたいんです。
バイナリで埋め込むという表現は間違いでした。すみません。
0888nobodyさん
NGNGとか、packとか
0889872
2006/06/24(土) 17:52:23ID:1EkY/rQf89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
こういう感じです。
件のものですが、locationと同じですよね。
まあ
print "location:/img/logo.gif;\n\n";
でやってもエラーが出てしまって困ってるのですが。。。。
なんかスランプです。あつくtえ
0892nobodyさん
2006/06/24(土) 19:40:28ID:???英語で記載したセルとハイパーリンクだけは抽出してくれるのですが、日本語部分が文字化けしてしまいます。
モジュール部分には、以下のように記載しています。
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
use Unicode::String;
Googleなどの検索では、これで上手く言っている人が大部分でした。お判りになる方がいたら、教えてください。
0893872
2006/06/24(土) 21:10:03ID:1EkY/rQfprint "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
my @img = <FH>;
pack "h", @img;
print @img;
close;
そうしたら正常でない画像が表示されました。多分変換部分が間違いなんですね。
hじゃなかったのかな。
>>890
すみません。暑さに参っておりました。35度って凄いですね。
冷房使えない体なので。
フォトショップみたいなCGIを作ろうと思ってます。
ご覧の通り未熟ですので今年一杯の趣味感覚で取り組んでいます。
>>891
ありがとうございましたm(__)m
やさしさを感じましたm(__)m
0894872
2006/06/24(土) 21:12:18ID:1EkY/rQf文字コード問題では?
モジュールに渡す時に決められた文字コードにしておかないといけないとかはないのですか?
その他もジーコ度全般を見直してみhてあ。
0897nobodyさん
2006/06/25(日) 00:04:20ID:???掲示板ログから出力すると、行数が多いので、
件名だけか、本文の何行まで抜き出すという風に出来たらと思うんですけど。
@match = map { $_->[0] }
sort { $b->[18] <=> $a->[18] }
map { [$_, split /\|\|\|/] }
@match;
my$i = 5;
foreach $line (@match) {
@mdata = split(/\|\|\|/,$line);
if ($i > 0) {
print "<CENTER>\n";
&table_html($HoD);
&subj_date_name_hp_html ("main", \@mdata, $HoD);
0898nobodyさん
2006/06/25(日) 00:14:20ID:???0899872
2006/06/25(日) 00:28:43ID:CLTK8aRMbinmodeで、rawにやってみます。ありがとうございます。
>>897
決めたバイトだけ読み取るとか・・・・というかどういう形式で保存されてるのかさえ
わかりやすく説明したらきっと詳しい人がズバリで教えてくれると思いますよ。
0900nobodyさん
2006/06/25(日) 01:37:46ID:???spliceで削除しちゃえばいいんじゃないのか?
0901897
2006/06/25(日) 03:45:53ID:???ありがとうございます。
バイトで読み取りをしてみたのですが、うまくいかず…。
もっと勉強します…。
spliceでいけました。
>>900
spliceでいけました。
ヒントありがとうございます。
本当に本当に助かりました!
ありがとうございました。
0902nobodyさん
2006/06/25(日) 06:35:30ID:???img/logo.gifが純正のgifファイルなら、
何も変換せずにprint <FH>で表示できる。
windows環境ならbinmodeが必要。
binaryが見たいなら、とりあえず
print unpack"H*",join"",<FH>で見れる
各要素を配列として得たいなら
my@a=unpack"C*",join"",<FH>など、・・・
0903nobodyさん
2006/06/25(日) 07:42:22ID:???0904nobodyさん
2006/06/25(日) 10:22:03ID:???フォトショップの何をしたいのかさっぱりわからんw 全体だったらかなり無謀だよね。
0905nobodyさん
2006/06/25(日) 12:03:42ID:???Photoshop を Web アプリとして再実装できたら面白いと思ふ。
例えば中小規模でのグラフィックワークステーション共有とか、コスト面でのメリットが出るならいけそうじゃないか?
0906nobodyさん
2006/06/25(日) 12:06:28ID:???0907872
2006/06/25(日) 12:47:39ID:CLTK8aRMopen FH,"../img/logo.gif";
binmode FH;
my @img = <FH>;
pack "raw", @img;
print @img;
close;
これだと画像部分が×になって表示されません。でも画像のサイズはあってます。
print "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
binmode FH;
print <FH>;
close;
だとやっぱりぐにゃぐにゃの画像になって表示されてしまいます。
winXP
apache1.3.3
active perl 6.8
です。
0908nobodyさん
2006/06/25(日) 13:10:04ID:???もお忘れなく
0909872
2006/06/25(日) 13:22:05ID:CLTK8aRMprint "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
binmode STDOUT;
print <FH>;
close;
ありがとうございました。これでできました。
binmode FH;はファイルをバイナリレベルでいじる時で、出力をバイナリにするには
binmode STDOUT;が必須だったのですね。
ありがとうございました。
>>904-905
専用サーバを借りてるので、時間掛けながらゆっくりやろうとかと思います。
どこらへんまで出来るのかは現時点の私ではわかりませんので、みなさんからすると
アホなことかもしれません。でも面白そうなので。
0910nobodyさん
2006/06/25(日) 13:44:45ID:???index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
こういうアクセスログファイルがあって、
open FD,"access.log";
while (<FD>){
print $_,"<br>\n";
}
とするとブラウザのところで何行にもなってしまいます。
つまりwhileが行末の改行以外でちょんぎってはじめてしまってるのです。
一応
open FD,"access.log";
my @line = <FD>;
close FD;
print $line[0];
も試してちゃんと行ごとの配列になってましたので、whileの影響だとは思うのですが。
0911nobodyさん
2006/06/25(日) 13:46:56ID:???index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
こういうアクセスログファイルがあって、
open FD,"access.log";
while (<FD>){
print $_,"<br>\n";
}
とするとブラウザのところで何行にもなってしまいます。
つまりwhileが行末の改行以外でちょんぎってはじめてしまってるのです。
一応
open FD,"access.log";
my @line = <FD>;
close FD;
print $line[0];
も試してちゃんと行ごとの配列になってましたので、whileの影響だとは思うのですが。
多分<FD>これでちゃんと行ごとに渡そうとしてるにもかかわらずその中の何かのコードに
whileが反応して行の途中で区切って処理を開始してしまうんだと思います。
whileに行ごとにやらせたいのですが、何かwhileのモードを変える方法でもあるのでしょうか?
0912nobodyさん
2006/06/25(日) 14:09:12ID:???なんとか使うことは出来ないのでしょうか?
0914nobodyさん
2006/06/25(日) 16:38:32ID:???何言ってんの?
while (<FD>){
print $_;
}
こうすれば行ごとになるんでしょ? それに加えて \n 入れたら2行になるの当たり前じゃん。
0915915
2006/06/25(日) 16:58:59ID:???if($old_rand == $rand)
{ $rand = $rand + 1; }
if($rand == 0)
{ $key = "000"; $old_rand = $rand;}
elsif($rand == 1)
{ $key = "001"; $old_rand = $rand; }
elsif($rand == 2)
{ $key = "002"; $old_rand = $rand; }
elsif($rand == 3)
{$key = "003"; $old_rand = $rand; }
elsif($rand == 4)
{ $key = "004"; $old_rand = $rand; }
else
{ $key = "006"; $old_rand = $rand; }
上記の部分を処理が来るごとに使っています。
前回と同じ値の場合は+1して2度連続で同じkeyにならないようにしているのですが
何故か同じkey(例:$key = 002等が)が重なることがあります。
前回と同じ数値の場合は+1しているので重なることはないと思うのですが
なぜ同じ数値が出るのでしょうか?
どこか間違っている場所があればアドバイスいただければと思います。
0916nobodyさん
NGNG+=とsprintf使った方がよさげ
0917nobodyさん
2006/06/25(日) 17:13:02ID:???$rand += 1 if ($old_rand == $rand);
if ($rand < 5) {
$key = sprintf("%03d", $rand);
} else {
$key = "006";
}
$old_rand = $rand;
006は重なるだろうけど、他の部分で$old_rand変更しちゃってるとか。
0918915
2006/06/25(日) 17:21:20ID:???もしかして
{}内で$old_randに入れても{}内だけで有効で
{}外では$old_randって何も入ってない状態になりますか?
もしそうなら私のバカなミスということになりますが・・・。
0919nobodyさん
2006/06/25(日) 17:23:14ID:???同じ処理が全部の条件に入っていたから括り出しただけ
0921nobodyさん
2006/06/25(日) 18:51:53ID:???こんなコード書いてみた。いろいろ弄って考えてみて。
foreach(1..1000){
r();
}
exit;
BEGIN{
my ($old_rand, $old_key) = (0, 0);
sub r
{
my $rand = int(rand(6));
$rand++ if($old_rand == $rand);
my $key = sprintf("%03d", ($rand < 5 ? $rand : 6));
print "OUT! key:$old_key,$key rand:$old_rand,$rand\n" if ($old_key eq $key);
$old_rand = $rand;
$old_key = $key;
return $key;
}
}
# 本当は、元のままのコードを使いたかったのだけれど、
# プログラム関連の板で改行制限が厳しいとはどういうこった!>ひろゆき
0922nobodyさん
2006/06/25(日) 19:09:56ID:???0925911
2006/06/25(日) 21:28:57ID:???my %access;
# どのページにアクセスしてきたか
$access{p} = ( p => "index" );
# アクセス人物のIPアドレス
$access{ip} = $ENV{'REMOTE_ADDR'};
# アクセス時刻の記録
$access{time} = sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->(@{[gmtime(time+32400)]}[5,4,3,2,1,0]);
# アクセス人物のブラウザ
$access{browser} = $ENV{'HTTP_USER_AGENT'};
# 書込み処理
open FH,"+>access.log";
flock FH,2;
my @line = <FH>;
my @new_line = join ",",@access{qw/p ip time browser/};
for ( my $i=0; $i<@line; $i++ ){
my @temp = split /,/,@line;
if ( $access{ip} ne $temp[1] and 1000000000 > $access{time} - $temp[2] ){
push (@new_line,join (",",@temp));
}
}
for ( my $i=0; $i<@new_line; $i++ ){ print $new_line[$i],"\n" }
while ( <@new_line> ){ print FH $_,"\n" }
close FH;
これを実行するとブラウザには一行で表示されますが、ファイルにはブラウザの種類部分が
何行にもわたって書き込まれてます。
ファイルに書込みするのもforでやれば問題は解消します。
なぜでしょうか?
0926nobodyさん
2006/06/25(日) 21:52:14ID:???配列を<>に入れてるのも初めて見たわ。
0927nobodyさん
2006/06/25(日) 22:03:36ID:???+>で開いて読み込めるわけないし。+<の間違いだとしてもtruncateしてないし。
split /,/,@lineって$i使ってないし。
で、
> ファイルにはブラウザの種類部分が何行にもわたって書き込まれてます。
というのは、
index,127.0.0.1,20060624210600,Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; SV1;
.NET CLR 1.1.4322)
こんな感じになるって意味?
そうなるとせっかくの乱数が偏って、ますます乱数から遠のくかと♪
0929911
2006/06/25(日) 22:28:53ID:???え?実際にそのソースで動作させた結果をお話してるのですが?
+>で読み込めますよ?
http://www.rfs.jp/sb/perl/02/08.html
それとtruncateがこの場面で必要ですか?
ヤケに煽りっぽい口調ですし・・・・単なる荒らしですか?
ちなみにアクセスログファイルには以下のように書き込まれます。
index,127.0.0.1,20060625212623,Mozilla/4.0
(compatible;
MSIE
6.0;
Windows
NT
5.1;
SV1;
.NET
CLR
1.1.4322)
ただwhileでブラウザに出力すると上記のようにはならないのでwhileだけの問題ではなさそうですが。
0930nobodyさん
2006/06/25(日) 22:30:25ID:???(1)欲しい乱数の範囲を連番で配列へ格納
(2)その配列をシャッフル
これでOKよ
0931911
2006/06/25(日) 22:31:28ID:???>split /,/,@lineって$i使ってないし。
あ、ありがとうございます。
・・・やっぱり普通に親切な人なのかな?
0932911
2006/06/25(日) 22:36:58ID:???>split /,/,@lineって$i使ってないし。
なんでこれで動いてるんでしょうか。
ちゃんと書き込まれる内容があってるというのは不思議です。
ローカルレベルなのでipが一つだけなのでたまたま動いてるんだと思いますが。
my @temp = split /,/,@line;
これの結果って@lineをスカラで評価するわけですから、本来@tempには
数字しか入らないとおもうのですが。
なぜまともに中身が入ってるのですかね・・・
0933nobodyさん
2006/06/25(日) 22:43:11ID:???ここが原因。
<> でくくると空白ごとに改行に置換される模様。
つかですね、配列に入ってるなら
print FH @new_line;
でえぇですやん
0934911
2006/06/25(日) 22:52:08ID:???空白ごとですか。
でもそれだとどうしてブラウザに出力したときは違う結果になるのでしょうか。
よければ>>925のソースにHTTPヘッダをプラスして実行してみてください。
whileでブラウザに出力してソースをみてもブラウザの種類のところに改行は
自動挿入されてないのです。
ファイルに書き込む時だけそうなってるんですよね。
確かに
$`="\n";
print FH "@new_line";
でよかったですね。
0935911
2006/06/25(日) 22:54:37ID:???print "content-type:text/html;charset=euc-jp\n\n";
my %access;
# どのページにアクセスしてきたか
$access{p} = ( p => "index" );
# アクセス人物のIPアドレス
$access{ip} = $ENV{'REMOTE_ADDR'};
# アクセス時刻の記録
$access{time} = sprintf "%04s%02s%02s%02s%02s%02s",sub{shift()+1900,shift()+1,@_}->(@{[gmtime(time+32400)]}[5,4,3,2,1,0]);
# アクセス人物のブラウザ
$access{browser} = $ENV{'HTTP_USER_AGENT'};
# 書込み処理
open FH,"+>access.log";
flock FH,2;
my @line = <FH>;
my @new_line = join ",",@access{qw/p ip time browser/};
for ( my $i=0; $i<@line; $i++ ){
my @temp = split /,/,@line;
if ( $access{ip} ne $temp[1] and 1000000000 > $access{time} - $temp[2] ){
push (@new_line,join (",",@temp));
}
}
while ( <@new_line> ){ print $_,"\n" }
while ( <@new_line> ){ print FH $_,"\n" }
close FH;
ブラウザでは普通に出力され、ファイルには変な改行が加えられて書き込まれます。
0936927
2006/06/25(日) 22:56:13ID:???そこのサイトかー勘違いしやすい書き方なんだよな…これ。
http://pc8.2ch.net/test/read.cgi/tech/1149259409/n272-273
Perlの関数リファレンス参照
ttp://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
| '+>' は最初にファイルを上書きします。
これだけじゃわかりにくいんで、もう一つ。+>のモードと言うのはfopenのw+に相当するんだが
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html
| w+ 読み取りおよび書き込みのために開く。ファイルが存在していない場合には新たに作成する。
| 存在している場合には長さゼロに切り詰められる。ストリームはファイルの先頭に位置される。
とあるように、読み込みは出来るけれど、開いたときに中身が空になる。
つまり、
my @line = <FH>;
は@lineに何も入ってきてないはず。
# 口調は雑だけど煽りのつもりは無いのでキニスンナ
# うっかり素を出すと敬語もどきになってしまうんですよ
0937911
2006/06/25(日) 23:17:15ID:???なるほど!
ローカルチェックだったので初め消されても支障がなかったようです。
自分のipは一つで>>935をなんどやってもどちらにせよ中身を読み込む必要がなかったので。
splitとopenで間違いがあるのを教えてくれてありがとうございました。
すみませんあらぬ疑いを向けてしまって。質問者の分際でごめんなさいm(__)m
それでですが、本来の目的である「期待の動作をするスクリプトの作成」
からはちょっと脱線してしまってまして、なぜ>>935のソースでブラウザ出力内容と
ファイル書込み内容に差がでるのかが気になってしょうがないのですが。
>>936さんはわかりますでしょうか。
ファイルの書込みとwhileと。複雑に絡んだ現象なのでしょうか。
ちなみにperlのバージョンは5.8.1のwinxPです。
0938927
2006/06/25(日) 23:33:09ID:???ブラウザではHTMLとして解釈されていると言うことを忘れているのではないか。
HTMLソースを見るか、
while ( <@new_line> ){ print $_,"<br>\n" }
while ( <@new_line> ){ print FH $_,"\n" }
とすれば同じように表示されると思う。
0939911
2006/06/25(日) 23:35:41ID:???いえ、HTMLソースと書き込まれたファイルを比べて差異が出てるのです。
不思議ですよね?
さきほどから何度も>>935のソースをそのまま貼り付けて実行していますが、
何度やってもファイルの書込みの方だけ
index,127.0.0.1,20060625212623,Mozilla/4.0
(compatible;
MSIE
6.0;
Windows
NT
5.1;
SV1;
.NET
CLR
1.1.4322)
こうなってしまうのです。
0940nobodyさん
2006/06/25(日) 23:41:23ID:???0941927
2006/06/25(日) 23:53:03ID:???ああスマソ、>>934にソース見てもと書いてあったか。
漏れのところじゃファイルに書き出された物と同様に、ブラウザの方のHTMLソースにも改行が入ってるよ。
多分、Perl上の問題じゃなくて間に入ってるウェブサーバかエディタか…ともかく環境の問題だと思う。
# それにしてもperl5.8.1って随分とまた古いものを…
>>940
else ifじゃ無いのはぶら下がりが禁止されてるから。
Cなんかのelse ifは
if (expression)
statement;
else
if (expression)
statement;
と言うのをくっつけて書いてるだけだからな。しかし、elseifにしなかった訳はわからん…
言語によってelifだったりelsifだったりelseifだったり覚えるの大変('A`)
0942911
2006/06/26(月) 00:08:33ID:???周辺環境によるのですか。
エディタはterapadで、apache1.3.31です。
どうやらスッキリ解決という感じにはなりそうもないですね。
ちなみに<>は空白にも反応してしまうという話ですが。
それではよくある
open FH,"hoge.txt";
my @array = <FH>;
close;
や
open FH,"hoge.txt";
while (<FH>){ print $_,"\n" }
close;
の精度はイマイチということでしょうか。
色々なサイトに前者の方法でファイルを読み込んで行ごとに配列に入れられる
という説明があったと思いますが。
実際は半角空白?か何かがあると行ごとにはいかないということですよね。
0943nobodyさん
2006/06/26(月) 00:10:42ID:???配列を <> に入れるとそうなるって話でしょう。
見た事無いよ <@array> なんて使い方は。
0945nobodyさん
NGNG0946911
2006/06/26(月) 00:23:18ID:???index,127.0.0.1,20060625235612,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,128.0.0.1,20060625235046,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
上記がaccess.logの中身です。
open FH,"access.log";
open DH,"+>test.log";
flock DH,2;
while (<FH>){ print DH $_;}
close DH;
close FH;
上記をやったらaccess.logの中身は
index,127.0.0.1,20060625235612,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
index,128.0.0.1,20060625235046,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
でした。
0948911
2006/06/26(月) 00:27:26ID:???続き
open FH,"access.log";
my @line = <FH>;
open DH,"+>test.log";
flock DH,2;
while (<@line>){ print DH $_;}
close DH;
close FH;
今度上記をやったらtest.logの中身は
index,127.0.0.1,20060625235612,Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322)index,128.0.0.1,20060625235046,Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322)
でした。
open FH,"access.log";
my @line = <FH>;
open DH,"+>test.log";
flock DH,2;
while (<@line>){ print DH $_,"\n";}
close DH;
close FH;
最後に上記をやったらtest.logの中身は
0949nobodyさん
2006/06/26(月) 00:28:23ID:???どういう勉強の仕方したらこう書くようになるんだろう…。
ネットだけでやってきたのかなぁ。
0950911
2006/06/26(月) 00:28:34ID:???(compatible;
MSIE
6.0;
Windows
NT
5.1;
SV1;
.NET
CLR
1.1.4322)
index,128.0.0.1,20060625235046,Mozilla/4.0
(compatible;
MSIE
6.0;
Windows
NT
5.1;
SV1;
.NET
CLR
1.1.4322)
でした。
0951nobodyさん
2006/06/26(月) 00:29:19ID:???普通そこはfor(foreach)じゃないの?
0952nobodyさん
2006/06/26(月) 00:31:01ID:???0953nobodyさん
2006/06/26(月) 00:31:50ID:???0954911
2006/06/26(月) 00:32:25ID:???で、まとめですが。
わかったこと
@array = <FH>とやると格納されるときに行末の改行コードがなくなってる。
<@array>の時点では既に改行はない。
<@array>の中には改行は既にないが、配列の要素を一つづつ出すわけではない。
つまり<@array>なんて使うなということだと思いますが、もしかしたら
$`の区切り文字設定と同じものを見つけると<@array>これが反応する?
少し眠くなってきました。勉強になりました。
0955911
2006/06/26(月) 00:34:20ID:???いえ、どうすればキチント動くかという話ではなくて、何であれであの動きをしたのかということが
気になったので。
ちなみに<@array>の方法はここで数年前にここで教わりました^^;
0956nobodyさん
2006/06/26(月) 00:34:42ID:???んなこたない
0957nobodyさん
2006/06/26(月) 00:37:15ID:???>@array = <FH>とやると格納されるときに行末の改行コードがなくなってる。
間違い。
>>948 での君のコードが間違ってる。
出力する時にまた同じく
> while (<@line>){ print DH $_;}
やってるから、この時点で空白文字(改行)がカットされてるだけ。
0958911
2006/06/26(月) 00:37:44ID:???>>948を見てください。>>954は実際に動作させて得た結果のまとめのつもりです。
>>948をやると改行が全てなくなってtest.logに書かれてるということは
どこかで消されてるはずなのです。
で、それを配列に入れたときだろうと推測しました。
0959nobodyさん
NGNG0960911
2006/06/26(月) 00:40:05ID:???なるほど。そこで消えてたのですか。
一応>>943を受けての一連の実験だったので、あのコードは間違いではないのですが。
しかしみなさん<@array>って本当にありえないんですね。
数年前に教えてもらってからずっと正しいやりかただと思って使ってました。
0961nobodyさん
2006/06/26(月) 00:43:26ID:???0962nobodyさん
2006/06/26(月) 00:44:29ID:???0963nobodyさん
2006/06/26(月) 00:44:52ID:???> 数年前に教えてもらって
((( ;゜д゜)))ガクガクブルブル
911が納得したところで次スレ建てトライしてくる。
0964nobodyさん
2006/06/26(月) 00:51:24ID:???保障されてないと思うんだけど。
少なくともperldocにもラクダ本にも明記されてないね。
0965nobodyさん
2006/06/26(月) 00:52:50ID:???どの板のスレかとその時のキーワード分かるならログから探してくるよ。
0966nobodyさん
2006/06/26(月) 00:58:50ID:???$self->{next}->lead($self);
# テンプレ多いっす(;´Д`A
__END__
次スレ
http://pc8.2ch.net/test/read.cgi/php/1151250398/
0967nobodyさん
NGNG0968nobodyさん
2006/06/26(月) 10:37:50ID:???package >>966;
use AutoLoader qw/AUTOLOAD/;
. . .
0970nobodyさん
2006/06/26(月) 15:17:06ID:kXeMxgQF↑をHTMLに埋め込んでHTMLからhoge.cgiの呼び出しをしたいのですが、
hoge.cgi側でどこのページから呼ばれたのかを
<img src="hoge.cgi?p=index">
のようにGET形式を使わずに知ることはできますか?HTML側には
<img src="hoge.cgi">
とだけ記述で。
今初めてchatを作ってるんですが、管理者モードと一般モードとわけて機能や表示内容を変えたいのです。
それでサイト管理cgiが既に用意してあるのですが、その管理CGIから呼ばれたら管理者モード
ってことでできたらいいなと思ってるのです。
管理CGIの方はセキュリティ一応ある程度になってますので、管理CGIを開けた人間なら
いちいちそれ以上のパスなどやらないで、チャットも管理モードで動作してほしいんです。
何か方法はありますか?%ENVを見てもどうやら使えそうなのがなさそうですが。
0971nobodyさん
NGNG0972nobodyさん
2006/06/26(月) 15:29:23ID:???JavaScriptのdocument.locationを使ってimgタグを生成してdocument.writeする方法はどう?
0973nobodyさん
2006/06/26(月) 15:31:25ID:???ウソつき放題だからそんなものをあてにするのは感心しないな。
0974970
2006/06/26(月) 15:33:20ID:kXeMxgQFてっきりリファラは前のページになってしまうのかと。
ちゃんとできるのですね。
すみませんです。
今テストしてみたら確かにできてました。
ちなみにリファラの偽装って簡単ですか?難しいけど出来る人はできるのですか?
管理CGIのページには.htaccessで認証をつけてあるのですが、リファラの信頼度が
その.htaccessの認証以上であれば別にかまいませんが、どうなのでしょうか。
0975nobodyさん
NGNG0976970
2006/06/26(月) 15:38:54ID:kXeMxgQF一応リファラに入ってました。
例外もあるかもしれませんが。
>>973
自己申告でしたか。
それじゃあダメぽですね。
悩んでみます。
0977nobodyさん
2006/06/26(月) 15:47:16ID:???と言いたいところだが気をつけないとCSRF脆弱になるからな…
0978970
2006/06/26(月) 15:55:42ID:kXeMxgQF<iframe src="chat.cgi">ブラウザが未対応です。</iframe>
以外を追加したくないんですよね。
基本全てをchat.cgiがやる。そして一般者には管理モードがあることを悟られないようにしたい。
ipでやればできるような気もしますが、気が進まないんですよね。
0979970
2006/06/26(月) 16:21:47ID:kXeMxgQFchat_login.cgiを作って。それでまあ一応管理CGIの方は
<iframe src="...">〜</iframe>だけの追加でいいことになりますし。
ありがとうございました
0980nobodyさん
2006/06/26(月) 16:25:09ID:???encode( 'MIME-Header', $hoge )で文字化けしまくりです。
できれば5.8標準モジュールで済ませたいのですが、
JCodeとかを使わなければ無理でしょうか?
スクリプト自体はeuc-jpで書いています。
0981nobodyさん
NGNG0982nobodyさん
2006/06/26(月) 19:22:04ID:???$hogeがちゃんとしたユニコード文字列ならそれでエンコードされるはず。
ただし、utf8にしかならない。
日本語しか使わないかつ互換性の問題などでどうしてもiso-2022-jpにしたければ、
'MIME-Header-ISO_2022_JP'というのも用意されている。
詳しくはEncode::MIME::Header参照。
0983nobodyさん
2006/06/26(月) 19:44:59ID:???この中身が消えちゃうのは何故でしょうか・・・
0984nobodyさん
2006/06/26(月) 20:05:42ID:???0985nobodyさん
2006/06/26(月) 20:07:33ID:???どうしたいか分からないが
@splitdata = map { $_ =~ s/( )+$//; $_; } @splitdata;
だと予想。
0986nobodyさん
2006/06/26(月) 20:17:37ID:???grep { s/( )+$//; } @splitdata;
だけでいけるはず
0987nobodyさん
2006/06/26(月) 20:18:45ID:???0988nobodyさん
2006/06/26(月) 20:19:12ID:???0989nobodyさん
2006/06/26(月) 20:31:47ID:???ふぉ〜い〜ち → 書くことが沢山あるとき
適材適所
0990nobodyさん
2006/06/26(月) 20:33:09ID:???0992nobodyさん
2006/06/26(月) 20:40:33ID:???それとどれだけ短く書けるかで上級度も図ってた。
0993nobodyさん
2006/06/26(月) 20:44:11ID:???0994nobodyさん
2006/06/26(月) 20:44:51ID:???例えばウィニー作った人なんて相当なもんなんでしょ。
あーいう人。というか金子って人はウィニのソースの全てを把握をしてるのかな?
それとも全体の:kg:jgん;kjdgんljng;owjdgnbl;djgblaijdbga
youhasa .
毎度自分のプログラムの改造をするときにまず自分のプログラムを読んで把握のしなおしからするのかな。
0995nobodyさん
2006/06/26(月) 20:45:26ID:???0996nobodyさん
NGNG0997nobodyさん
2006/06/26(月) 20:46:13ID:???そもそもCGIで処理効率なんて考える?
回線状況による誤差を考えるとどうでもよくない?
いや、CGIでなくてもさ。
0999nobodyさん
2006/06/26(月) 20:49:24ID:???いや、そういう問題じゃなくねw
>>998
なんで好きじゃないんだか。覚えれば普通のことだと思うよ。
999get!
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。