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

このエントリーをはてなブックマークに追加
1nobodyさん
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
2nobodyさん:2006/05/31(水) 04:33:02 ID:???
関連スレ
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/
3nobodyさん:2006/05/31(水) 04:35:21 ID:???
4nobodyさん:2006/05/31(水) 04:36:16 ID:???
5nobodyさん:2006/05/31(水) 04:37:00 ID:???
6nobodyさん:2006/05/31(水) 04:37:37 ID:???
7nobodyさん:2006/05/31(水) 04:38:17 ID:???
8nobodyさん:2006/05/31(水) 04:45:38 ID:11hxgwku BE:590474276-
ム板Perlスレより 1 of 2

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

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

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.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/
9nobodyさん:2006/05/31(水) 04:46:09 ID:11hxgwku BE:899770188-
10nobodyさん:2006/05/31(水) 06:57:08 ID:???
>>1-9
11前スレ992:2006/05/31(水) 07:10:12 ID:???
前スレ998
ありがとうございます。euc-jpにエンコードすればいいことがわかりました。
jcode.plを使い&jcode::convert(\$str, "euc");のようにしてエンコードしたところ正しく表示されました。
本当にありがとうございます。情報が小出しで申し訳ありませんでした。
12nobodyさん:2006/05/31(水) 08:08:01 ID:???
前スレ・・・寝てる間に変な流れで終わってゆ(´;ω;`)
13nobodyさん:2006/05/31(水) 10:34:09 ID:upa0fhXd
とりあえずおっぱいうp
14nobodyさん:2006/05/31(水) 12:55:08 ID:???
>>13
> とりあえずおっぱいうp
http://search.cpan.org/perldoc?Acme::Oppai
15nobodyさん:2006/05/31(水) 13:59:38 ID:???
恥さらしだからこんなことするなよ。アホ。
16nobodyさん:2006/05/31(水) 14:06:05 ID:???
こんなのあったのかwww
17nobodyさん:2006/05/31(水) 17:57:14 ID:???
$a = "a,b,c,d,";
という1つの文字列を元に
@b=(a,b,c,d,);
のような配列に代入する方法はないでしょうか?

18nobodyさん:2006/05/31(水) 18:06:09 ID:???
split
19nobodyさん:2006/05/31(水) 18:07:54 ID:???
初心者とはいえ少しは勉強しようよ・・・
20nobodyさん:2006/05/31(水) 18:47:06 ID:???
でも、クックブックみたいな逆引き系マニュアル持ってないと
まず目的ありきの時に、どの関数・どのモジュールを使えばいいかわからないよね

オライリー有用だけど高いよ('A`) 貢ぎましたけど・・・
21nobodyさん:2006/05/31(水) 18:53:43 ID:???
つぐぐる
22nobodyさん:2006/05/31(水) 18:57:04 ID:???
>>21
アーッ!!          いや   ほら    クックブック  あると 便利よ・・・  うん
23nobodyさん:2006/05/31(水) 19:08:04 ID:qTr6Ebfx
HTTPレスポンスヘッダに206を指定しファイルをCGI経由でDL
させようとすると、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を返す手段があれば
ご教示いただきたく思っております。
宜しくお願いいたします。
24nobodyさん:2006/05/31(水) 19:29:32 ID:???
>>23
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/
25nobodyさん:2006/05/31(水) 19:45:57 ID:???
>>24
すみません。
誘導先で質問させていただきました。有難うございました。
26nobodyさん:2006/05/31(水) 20:06:46 ID:???
投稿されたテキスト本文の最後に、無駄な空白と改行が入っている
場合、これを取り除いて別の著名などを挿入したいのですが
取り除くにはどうしたらいいか教えてください
27nobodyさん:2006/05/31(水) 20:18:04 ID:???
>>26
$text =~ s/\s+$/$chomei/s;
別の著名ってなんだ?
28nobodyさん:2006/05/31(水) 20:25:57 ID:???
>>27
有り難うございます
日付、新規なのか更新(修正)なのかです
本文の最後に付けると見栄えが良いので
29nobodyさん:2006/05/31(水) 20:29:54 ID:???
>>28
本文の最後に空白がない場合にも著名を挿入したい場合は、
$text =~ s/\s*$/$chomei/s;
な。それから、著名でなくて署名じゃないのか?
30nobodyさん:2006/05/31(水) 20:31:16 ID:???
>>20
クックブックの方が便利なの?
これ↓を買おうと思っているんだけど。。

Perl/CGI逆引き大全 600の極意
http://www.amazon.co.jp/gp/product/4798010774/
31nobodyさん:2006/05/31(水) 20:31:30 ID:???
すみません
32nobodyさん:2006/05/31(水) 21:14:12 ID:???
>>17
@b = eval $a;
で万全。
33nobodyさん:2006/05/31(水) 21:18:39 ID:??? BE:106128634-#
>>30
その本持ってる。旧版だけど。
34nobodyさん:2006/05/31(水) 21:29:39 ID:???
>>33
ちょーだい
35nobodyさん:2006/05/31(水) 21:58:58 ID:???
俺は技術評論社の perl リファレンス使ってる

おらいりーは有用だけど余計な文が多くてあまり馴染めんかった
36nobodyさん:2006/05/31(水) 22:30:57 ID:??? BE:123817027-#
>>35
それも持ってるわ
37nobodyさん:2006/05/31(水) 23:33:41 ID:???
書式だけ確認したいときはラクダはちょっと邪魔かも
38nobodyさん:2006/05/31(水) 23:36:50 ID:???
リファレンスは perldoc 一本に絞った。
ラクダ本は、必要な所だけスキャンして処分(ボロボロだったので)。
現在うちにあるPerlの本はAdvanced Perl のみ…。
39nobodyさん:2006/05/31(水) 23:39:11 ID:???
紙で見る利便さは捨てない方がいい
40nobodyさん:2006/06/01(木) 00:00:48 ID:???
書式だけなら手書きでも充分!(`・ω・´)
41nobodyさん:2006/06/01(木) 00:14:11 ID:???
わろすwww
4217:2006/06/01(木) 11:55:18 ID:???
>>32
$aが
$a = "あいうえお,かきくけこ,さしすせそ";
みたいな時は、無理でしょうか?
43nobodyさん:2006/06/01(木) 12:09:27 ID:???
>>42
>>18を無視するな…>>32はネタだ。
@splited = split /,/, $csv
まあ要するに>>19。split(とeval)を提示された時点で検索していれば、
splitが求めるものだとすぐ分かるはずなのにそれを怠っているとしか思えない。
44nobodyさん:2006/06/01(木) 14:17:44 ID:???
しょうがないよ>>17超初心者なんだから
45nobodyさん:2006/06/01(木) 18:57:05 ID:???
めんどくさいので答えちゃいますよ〜
>17=42
my @array = split(/,/, $string);

split → 文字列(第2引数)を区切り子(第1引数)で分断し、その配列を返します。
my → 変数の局所化
/,/ → 正規表現でカンマ区切りを指定
$string → ここではカンマで区切られた文字列が入ってると仮定
@array → split関数によって返された配列が入る

以上

スクリプトを組む上で必ず使うような関数は、書式を完全に覚えろとは言いません。
せめてやりたいことから関数名を連想(要は逆引き)できるようにしませう。
46nobodyさん:2006/06/01(木) 19:05:28 ID:???
>>45
あんた優しすぎw
47nobodyさん:2006/06/01(木) 19:24:16 ID:???
>>45
こ、これが大人の余裕ってやつなのか…?
48nobodyさん:2006/06/01(木) 19:28:45 ID:??? BE:397980195-#
ここのリンク貼るだけでええやん
http://perl.misty.ne.jp/function02/split.html
49nobodyさん:2006/06/01(木) 19:41:05 ID:???
.htmlで
<!--start-->
cgiからの書込み
<!--end-->
って出来るのを最近知ったんですがどういう風に書くんですか?
ネットで探してもこのスクリプトが載ってないのだが・・・。
50nobodyさん:2006/06/01(木) 19:45:57 ID:???
SSI exec でぐぐれ?
51nobodyさん:2006/06/01(木) 19:48:35 ID:???
SSIは関係無い

テンプレートとなるHTMLを1行ずつ読み込む
<!--start-->が現れたら処理開始
<!--end-->が現れたら処理終了

そんなことよりも(すごい巨大なデータでなければ)
<!--INSERT-->とかを置換した方がスマートかな
52nobodyさん:2006/06/01(木) 19:55:42 ID:??? BE:495264487-#
意味不明情報小出な質問大杉
53nobodyさん:2006/06/01(木) 19:56:54 ID:???
質問が意味分からないのに良く答えるなぁ
54nobodyさん:2006/06/01(木) 19:57:40 ID:???
>>51
む?
「 .htmlで 」 って拡張子でかいてるから、HTMLファイルにアクセスしてやりたいってことじゃないの?
エスパー失敗?
55nobodyさん:2006/06/01(木) 20:09:17 ID:???
テンプレートファイルを用意して、それをCGIでごにょごにょしてから表示する方法
を求めてると判断した次第

>54
SSIだったら<!--#exec 〜-->って表記をするはずだし、startとendとペアで記述するもんじゃないから
SSIは違うんじゃね?と思った

よく見たらいきなりスバっと書きすぎてたかな
気分を害してたらゴメ
56nobodyさん:2006/06/01(木) 20:51:11 ID:???
本人だが>>55の言うとおりです。
そんな感じのを教えてほしいわけです。
宜しくお願いします。
57nobodyさん:2006/06/01(木) 20:55:56 ID:???
HTML::Template でも使えばええがな('A`)
58nobodyさん:2006/06/01(木) 20:57:12 ID:???
>>56
多くの住人もエスパーさんも「そんな感じの」ではわからんのです。
>>55の冒頭が「やりたいこと」だったら、>>51とか。

「だから>>51のやりかたを…」とか言われると果てしなく続くのです。
59nobodyさん:2006/06/01(木) 21:03:32 ID:???
>>58
その辺の事が分からないので詳しく教えてほしいのです。
60nobodyさん:2006/06/01(木) 21:04:54 ID:???
>56
>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です
61nobodyさん:2006/06/01(木) 21:06:57 ID:??? BE:132660353-#
放置すればいいのに
62nobodyさん:2006/06/01(木) 21:09:47 ID:???
60だけど、これ以上は書かないつもり
これ以上書くならテンプレート形式を使ってるスクリプトを眺めろとしか言えないし
63nobodyさん:2006/06/01(木) 21:10:01 ID:???
be付けてる人って、いつも煽ってばっかりだよね。
64nobodyさん:2006/06/01(木) 21:10:34 ID:???
>>63
ニュルーしてあげるのもやさしさですw
65nobodyさん:2006/06/01(木) 21:12:43 ID:??? BE:212256364-#
うわぁ…
66nobodyさん:2006/06/01(木) 21:42:09 ID:???
ではこのような事をなんと言うのかお教え下さい。
67nobodyさん:2006/06/01(木) 21:50:08 ID:???
>66
散々単語が出てきてるのに・・・おまえもう来るなカス
68nobodyさん:2006/06/02(金) 00:14:24 ID:???
テキストに[A-z]を書き出すにはどうすればいいですか?
69nobodyさん:2006/06/02(金) 00:18:17 ID:??? BE:159192263-#
print a..z;

とか
70nobodyさん:2006/06/02(金) 00:43:27 ID:???
>>69
できましたありがとうございます

[Aa][Aa]などのような場合はどうすればよいでしょうか?
71nobodyさん:2006/06/02(金) 00:45:57 ID:???
日本語でおk
72nobodyさん:2006/06/02(金) 01:30:15 ID:???
ここでESPを発揮!

print lc().uc() for (a..z);
73nobodyさん:2006/06/02(金) 01:31:18 ID:???
>>72
いやいや敢えてこんな感じで。

my $m = 25;
$_ -= $m--, print chr $_ - 32, chr and --$m for reverse 97..122;
74nobodyさん:2006/06/02(金) 01:43:41 ID:???
なかなかやるな!
75nobodyさん:2006/06/02(金) 02:16:24 ID:???
>>72>>73
ありがとうございました

それから、マイドキュメントにあるホームページアップ用の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;

どこがミスってますか?
76nobodyさん:2006/06/02(金) 02:22:13 ID:??? BE:265320465-#
拡張子変えるだけでいいの?
77nobodyさん:2006/06/02(金) 02:37:17 ID:???
>>76
はい!
htmlのソースの中にあるjpgをpngに変えるのが目的です
78nobodyさん:2006/06/02(金) 03:12:56 ID:???
じゃ今度は僕がテレパス化に挑戦。

>>77
全部の open と close の後に or die $! って書いてみよう。

open IN, "./1.html" or die $!;
...中略...
close IN or die $!;

というふうにね。
困った時に時々原因を教えてくれるおまじないだよ。
これからは必ず付けるようにしてね♪
79nobodyさん:2006/06/02(金) 03:29:31 ID:???
>>78
うーん、、、やはりなにも起こりません。
80nobodyさん:2006/06/02(金) 03:49:36 ID:???
問題を細かくする事がデバッグのコツ。

まず、置換・書き込み部分はコメントアウトして、読み込んだ後に
$words を print して正常に読み込めているか確かめる。

正常に読み込めているのを確認したら、置換部分を有効にして、置換した後に
$words を print して本当に置換されているか確かめる。

正常に置換されていたら、書き込み部分を有効にして、書き込みファイル名を変えてみる。
・書き込み先のパスをフルパスで指定してみて、正常に書き込めるか確かめる
・存在しないファイル名を指定して、新規作成してみる
・既存のファイル名を指定して、上書きしてみる

これだけやれば原因がわかるはず。
8179:2006/06/02(金) 04:02:27 ID:???
>>80
とりあえずこんな感じでテストしてみました
デスクトップのaフォルダの中に1.htmlとtest.pl
# test.plの中身
$name = "./1.html";
open OUT,">>$name";
print OUT "test\n";
close OUT;

これでコマンドプロンプトから実行してもだめでした
82nobodyさん:2006/06/02(金) 04:43:31 ID:???
一応聞くけど、hello world は動くの?
でなけりゃ一回ファイル名変えてやってみ。
たまに自分のアホなスクリプト実行したせいでファイルがロックされてる場合がある。
ソース自体は普通みたいだから、絶対なんかヘンなことしてるしw
83nobodyさん:2006/06/02(金) 04:59:21 ID:???
openのあとエラートラップしてみたら?
open errorだったりして…
84nobodyさん:2006/06/02(金) 05:32:21 ID:???
関連付けされてねぇんじゃ?
85nobodyさん:2006/06/02(金) 09:47:40 ID:???
$a1 ="あ";
$a2 ="い";
$a3 ="う";

$a50="ん";

このスカラー変数を、連結して表示したい場合、
print $a1.$a2.$a3.〜$a50;

perlでは、このような表記の仕方しかないでしょうか?
86nobodyさん:2006/06/02(金) 09:55:34 ID:???
$sname='a';
while(1..50){
 $tmpsname = $sname . $_;
 $val = \${$tmpsname};
 $renketu .= $val;
}

すげぇテキトーw
つかね、配列使ってください
87nobodyさん:2006/06/02(金) 10:15:26 ID:???
最近みんな優しいなあ・・・
88nobodyさん:2006/06/02(金) 10:54:24 ID:???
my @Hiragana = qw(
  あ い う え お
  か き く け こ
....
  わ を ん
);
local $, = "";
print @hiragana;
qwはタブも改行もスペース扱いしてくれるぞ
89nobodyさん:2006/06/02(金) 10:55:50 ID:???
あ、
print @Hiragana;
ちなみに$a50="ん";にはならんぞ。50音て50個じゃないから
90nobodyさん:2006/06/02(金) 10:59:55 ID:???
>>86は間違い
リファレンスを連結している
my $sname='a';
print join '', map { ${"$sname.$_"} } (1..50);

動かしてないがこれでよくね?
91nobodyさん:2006/06/02(金) 11:22:34 ID:???
最近 use strict してたから、そういう記法もあったの忘れてたな・・・。

とりあえずグローバル変数やたら定義すると面倒で適わんね。
92nobodyさん:2006/06/02(金) 11:25:06 ID:???
今携帯だから確認出来ないけど、\ は要りませんでしたか。


… 実は map の使い方というか使う意義がわかんねw
あとでリファレンス立ち読みしてみるかにゃ
93nobodyさん:2006/06/02(金) 11:35:03 ID:???
日本語が不自由な質問に携帯から答えたおまいは優しいな・・・
94nobodyさん:2006/06/02(金) 13:54:21 ID:???
この優しさが怖い
95nobodyさん:2006/06/02(金) 14:26:56 ID:???
my @hiragana = qw(あ い う え お か き く け こ
さ し す せ そ た ち つ て と な に ぬ ね の
は ひ ふ へ ほ ま み む め も や ゆ よ
ら り る れ ろ わ を ん);
print map{${$_->[0]} = $_->[1]}map{['a'.$_ ,$hiragana[$_-1]]}(1..46);

なんか質問の主旨とは違うよーな気もするが
96nobodyさん:2006/06/02(金) 15:05:28 ID:???
なんでデリファレンスやねん

97nobodyさん:2006/06/02(金) 15:25:35 ID:???
>90
ん〜、エラーっすねぇ
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
98nobodyさん:2006/06/02(金) 16:09:13 ID:lBhNFSRP
$s = "aあいうえおかきくけこ";
${"@{[substr($s,0,1]}$_"}=substr($s,$_*2-1,2)for(1..length($s)/2); #ここまでセットアップ

print join '', map ${"a$_"}, (1..10); # 好きな数だけloopすれば?
99nobodyさん:2006/06/02(金) 16:18:21 ID:???
>>85
print eval(join('.', map{ '$a'.$_ } (1..50)));
100nobodyさん:2006/06/02(金) 16:28:49 ID:??? BE:318384566-#
Perl臭ぇーッ!!
101nobodyさん:2006/06/02(金) 17:16:07 ID:???
>>97
当然 no strict 'refs';の前提だが。
シンボリックリファレンス使ってるだろ?
102nobodyさん:2006/06/02(金) 17:22:15 ID:???
あ、コピーしたときにドット入ったんだな。抜いてくれ

no strict 'refs';
my $sname='a';
print join '', map { ${"$sname$_"} } (1..50);
103nobodyさん:2006/06/02(金) 18:06:46 ID:???
>>100
文句多いな。
local $r = sub{((@_[0] > 1) ? $r->(@_[0]-1) : ''). eval('$a'.@_[0])};
print $r->(50);
104nobodyさん:2006/06/02(金) 20:13:53 ID:???
やったー Hello World できたよ\(^o^)/

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);
105nobodyさん:2006/06/02(金) 20:16:51 ID:???
$test=1; # この状態ではシンボリック
print $test; # ここで実体化(ハード)
代入する段階でハードリファレンスってどうやるの?
106nobodyさん:2006/06/02(金) 20:22:18 ID:???
日本語でおk
107nobodyさん:2006/06/02(金) 20:22:33 ID:???
日本語でおk
108nobodyさん:2006/06/02(金) 20:23:28 ID:???
久々にケコーンしたw
109nobodyさん:2006/06/02(金) 20:24:21 ID:???
ふつつかものだけど幸せにしてね('A`*)
110nobodyさん:2006/06/02(金) 20:25:29 ID:???
男同士だったらどうすんだよ
111nobodyさん:2006/06/02(金) 20:35:06 ID:???
問題なく結合します。
use Tie::Man::And::Man;
my $happy = tie $res106, Tie::Man::And::Man, $res107;
112nobodyさん:2006/06/02(金) 20:37:13 ID:???
my $happy = tie $res106, Tie::Man::And::Man, $res107; # この状態ではシンボリック
$happy->insert(); # ここで実体化(ハード)
挿入する段階でハードリファレンスってどうやるの?
113nobodyさん:2006/06/02(金) 20:43:35 ID:???
>>105 が聞きたかったのはこういう事かな? と ESP を発揮!

$test = \1; # リテラルスカラー値に対するハードリファレンス
print $$test; # デリファレンス

多分シンボリック=リテラルだと思ってるのかな と想像。

シンボリック=実体はただの文字列。文字列をデリファレンスするとシンボルテーブルから
         その名前を持つモノをひっぱってきてくれる。
114nobodyさん:2006/06/02(金) 20:52:42 ID:??? BE:265320465-#
エスパーすげー
115nobodyさん:2006/06/02(金) 21:01:00 ID:???
エスパースレいる?
116nobodyさん:2006/06/02(金) 21:46:32 ID:???
リテラルとかハードリファレンスとかシンボリックとかわかんね〜!!!詳しく解説してるとこキボン
117nobodyさん:2006/06/02(金) 22:15:15 ID:???
>>116
俺もよくわかんなくて、ガンガッってググったよ。
ここ↓とかどう? perl-解説ってとこ。

山口家の逆襲
http://kabocha.org/jelfe/

118nobodyさん:2006/06/02(金) 22:23:29 ID:???
もうやめたw
119nobodyさん:2006/06/02(金) 22:38:40 ID:???
wwwww
120nobodyさん:2006/06/02(金) 22:45:09 ID:???
Perl歴1ヶ月とちょっとなんですけど、こんな理解であってますか?

●リテラル
コードに直接埋め込まれている値
・123 3.14 のような数値
・"abc" 'hoge' のような文字列
・(1, 2, 3) (hoge=>123, huge=>456) のようなリスト  など

●ハードリファレンス(ただ単にリファレンスと言った場合はこれ)
値に対する参照。これ自体もスカラー値。C言語やってた人はポインタと考えれば良い。
ハードリファレンスを生成するには、以下の方法がある。
・値や変数の前に「\」を付ける → その値に対してのリファレンス
・[1, 2, 3] → 無名の配列が自動的に作られて、その無名配列に対するリファレンス
・{hoge=>123, huge=>456} → 無名のハッシュに対するリファレンス
・sub { CODE } → 無名の関数に対するリファレンス(クロージャ)

●シンボリックリファレンス
ただの文字列。文字列をデリファレンスすると、パッケージが持つシンボルテーブル
(パッケージ変数の名前と実体を結び付ける表)を通じて、その文字列の名前を持つ
実体を得る事ができる。誤爆しやすいので use strict; すると使えない。
121nobodyさん:2006/06/03(土) 00:18:22 ID:???
1ヶ月ならその理解で十分だよ。
122nobodyさん:2006/06/03(土) 02:04:02 ID:???
俺は4年やってるがリファレンスなんてサッパリのクソ野郎だぜ
123nobodyさん:2006/06/03(土) 02:21:53 ID:???
>>122
are u mr.kent?
124nobodyさん:2006/06/03(土) 18:24:46 ID:???
ちょっと質問。

$" = '/';
@list = (10, 20, 30, 40, 50);
$scalar = "@list";
これで
$scalar = join( "/" , @list);
と同じ結果になるようだけど、「$" = '/';」を使った場合には、
特殊変数$"のデフォルトの値を変えてしまうから
その後もずっとjoinせずとも/で区切られた値になるという感じなのかな。

他にはサブルーチンの@_とかは元の値が変わっちゃうみたいだけど、
特殊変数の扱いはブロックの中だけ?それともブロックの中とか関係なし?
どちらの場合もある?

その辺は一時的なものなのか、恒久的(ちょっと変な表現だけどw)なのか教えて下され。
125nobodyさん:2006/06/03(土) 18:54:27 ID:???
上はあってる。
ただし、mod_perl とか $" とかだとうまくできない場合があるね。

「特殊変数」 が 「$"」 とかを指すなら、
それの有効範囲はグローバル変数と一緒。
local $" とかもできるよ。
126nobodyさん:2006/06/03(土) 18:56:58 ID:???
perl -e '@a=qw/a b c/; {local $"=q!/!; print "@a\n";} print "@a\n";'
perl -e '@a=qw/a b c/; {$"=q!/!; print "@a\n";} print "@a\n";'
127nobodyさん:2006/06/03(土) 20:34:18 ID:???
個人的には「join」使っておけって思う
128nobodyさん:2006/06/03(土) 20:39:11 ID:??? BE:495264678-#
$"は遅いよ
129124:2006/06/03(土) 22:08:37 ID:???
サンクス。
なんとなくイメージがつかめたよ。
130nobodyさん:2006/06/03(土) 23:16:29 ID:???
localを使わなければ永久に変わる。
my にはグローバル変数およびパッケージ変数を宣言する能力がないので
ここにlocalとmyの大きな差がある。
呼び出し先のサブルーチンでの参照可能性でlocalとmyの差を説明するやつはウンコ
131nobodyさん:2006/06/04(日) 00:07:15 ID:???
my→レキシカル変数の宣言
our→パッケージ変数の宣言
local→パッケージ変数のダイナミックスコープ化
という理解でおk?
132nobodyさん:2006/06/04(日) 00:46:14 ID:???
our は C で言う static ?
133nobodyさん:2006/06/04(日) 01:08:44 ID:???
ちゃうちゃう。
134nobodyさん:2006/06/04(日) 01:18:27 ID:???
ちゃうのか・・・それなら覚えやすいな。 とか思ったのに (´ω`)
135nobodyさん:2006/06/04(日) 09:23:10 ID:???
Javaのstaticに近くない?
136nobodyさん:2006/06/04(日) 10:40:42 ID:???
CGI::Prettyを使って、ちょっと大きめのテーブルを表示し
ようとしたんです。
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し始めて、サーバが応答しなくなることがあるみたい
ですので、試すときは注意してください。
137nobodyさん:2006/06/04(日) 11:49:27 ID:???
テーブルなら、

HTML::Table
ttp://homepage3.nifty.com/hippo2000/perltips/html/table.htm

があるけど、こちらを使ってみてはいかがでしょうか?
138nobodyさん:2006/06/04(日) 12:18:09 ID:???
for (0..255);
で試した。
別 PC のブラウザで開いて、サーバーのメモリを監視してたら、ピークで 400MB 突破して、
250-350MB で変動してました。
で、500 Error で止まったw

Windows2000 + Perl 5.8.4 で試した。

自力で表示した方がいいんじゃないの?
139nobodyさん:2006/06/04(日) 12:24:48 ID:???
for (0..128);
だと 143MB ピークで正常終了
140nobodyさん:2006/06/04(日) 12:46:25 ID:???
たった256行表示するのに200メガ以上使ってエラー?
やっぱりモジュール使って書くメリットってのがわからない。
モジュール使ったほうがいいって言ってるヤツの意見を聞いてみたいね。
141nobodyさん:2006/06/04(日) 12:59:04 ID:???
>>136
この程度のテキスト処理にそんなにメモリを使うはずがない。
と思って試したら本当にものすごい負荷がかかる。何なんだコレ?
142nobodyさん:2006/06/04(日) 13:13:35 ID:???
ぃゃぃゃぃゃ、1つの悪で全てが悪と決め付けるのはいくないかと
143nobodyさん:2006/06/04(日) 14:07:00 ID:???
>>136
@CGI::Pretty::AS_IS = grep !/^td$/, @CGI::Pretty::AS_IS;

これを use CGI::Pretty; の後に差し挟むことで耐用限界を引き上げることができるはず。
アドホックでバッドプラクティス全開なので、あくまで応急処置。

こういうの思いついちゃう自分が嫌い。
144nobodyさん:2006/06/04(日) 15:43:10 ID:???
Win32::OLEを使って以下のようにExcelのセルのデータを取り出しています。
その場合、元の値が「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;
}
145nobodyさん:2006/06/04(日) 17:00:56 ID:???
CGI::Pretty って標準モジュールなのなw
256程度でエラーとか、全然かわいくねーよw
146nobodyさん:2006/06/04(日) 17:05:04 ID:???
CGI::Prettyの_prettyPrintがあまり実行効率を考えていないようなので
書き直してみた。いちおう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;
}
147nobodyさん:2006/06/04(日) 17:21:35 ID:???
爆速になった
せっかくだからオリジナルを保存して書き換えてしまうか
148nobodyさん:2006/06/04(日) 17:24:55 ID:???
>>146
え、それで同じ結果になるの? すごくね?
後学のために _prettyPrint の問題点を教えてください。
149nobodyさん:2006/06/04(日) 17:50:35 ID:???
>>146
これすげぇ
150nobodyさん:2006/06/04(日) 18:20:33 ID:???
オリジナルの_prettyPrintは再帰しまくってるからメモリと速度が駄目駄目なのかな?
とか思いつつお買い物・・・
151nobodyさん:2006/06/04(日) 18:23:50 ID:???
>>145
専門用語として伝統的にPretty Printって言ったら整形出力の意味な。
つまり、かわいいHTMLソースを作る職人が大喰ら(ry

>>146
それ処理的に等価じゃないな…
例えばpreの中身がインデントされちゃうから実用的にも影響が出る。
div( pre( "hoge\nfuga" ) )
しかしそれにしても元のやつには改善の余地があるような…漏れもリファクタリングやってみよう
152nobodyさん:2006/06/04(日) 18:49:36 ID:???
>>151
すまん、バグっていた。s修飾しないと「.」が改行にマッチしないから
@AS_ISで指定されるタグに囲まれる部分が複数行にまたがるときに
おかしくなるね。

$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egi;



$$input =~ s:(<($as_is)[\s>].*?</\2>):_deIndent($1):egis;

これでその例も同じ結果になるはず。
153nobodyさん:2006/06/04(日) 19:02:53 ID:???
>>148,150
@AS_ISで指定したタグに囲まれた部分はインデントを追加しないで
他の部分に追加ということをやりたいようなのだが、オリジナルは
以下のような処理になっている。

if (@AS_ISタグに囲まれた部分がある) {
文字列を 「囲まれた部分の前」、「囲まれた部分」「囲まれた部分の後」
 の3つに分割

「囲まれた部分の前」「囲まれた部分の後」をそれぞれ再帰的に
自分を呼んでインデント

「囲まれた部分の前」をインデントしたもの,「囲まれた部分」,
「囲まれた部分の後」をインデントしたものを連結して返す
} else {
改行の後ろにインデントを追加する
}

デフォルトで@AS_ISにtdが含まれているので、<td>〜</td>の数だけ
再帰する。再帰するごとにだんだん短くなるが文字列がコピーされるので
O(n^2)のメモリを消費し、コピー処理でCPUも同じオーダで食うようだ。

書き直した奴は、

とりあえず全部の改行にインデントをつける
@AS_ISで指定されたタグに囲まれた部分の改行の後のインデントを削って戻す

という処理にしてみた。
154nobodyさん:2006/06/04(日) 19:43:37 ID:tvwlqg+d
すいません、質問です

ActivePerlの導入をしようと思い、msi版をダウンロードしても、
”有効なwin32アプリケーションではありません ”
になります。
当方、Win98なんですがどうすれば導入できますか?
155nobodyさん:2006/06/04(日) 20:20:57 ID:???
>>154
ActivePerlをダウンロードしたページの
Installation Notes
の部分をよく読めば導入できます
156nobodyさん:2006/06/04(日) 20:51:15 ID:??? BE:35376522-#
勉強になるなぁ
157nobodyさん:2006/06/04(日) 21:24:40 ID:???
>>153
わかりやすい解説ありがとう!
なるほどなるほどって感じ。
発想変えるだけでコードがガラっとかわる手本だね。
158nobodyさん:2006/06/04(日) 22:05:46 ID:???
CGI::Pretty たんのドジッ娘属性に萌えた。
159154:2006/06/04(日) 22:29:14 ID:???
>>155
Windows Installer 2.0+ is required for Windows.
download for 9x/Me

ってことですね。ありがとうございました。
160nobodyさん:2006/06/05(月) 04:51:59 ID:???
ねえねえ。
ベンチとったら、(10000回)

my $string2 = lc $string;

が 5.7 秒で

my $string2 = $string;
$string2 =~ tr/A-Z/a-z/;

が 2.6 秒だったんだけど、これどういうこと?
同じことしてるんじゃないんだっけ?
161nobodyさん:2006/06/05(月) 06:47:28 ID:???
>>160
うちではどっちもどっちだったよ
$ 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)
162nobodyさん:2006/06/05(月) 07:48:02 ID:???
>>161
あれ、ほんとだね。わざわざありがとう。
置換するソースによって違うんかなあ?

うちは google に perl って入れてでてきた 56kb くらいのソースでやったんだけど。
それともアルファベット以外がたくさん入ってると lc は遅くなるとか? うーん・・・
perl の ver だったらやだなw

ちなみに
uc $string : 6.58 [s]
tr/a-z/A-Z/ : 5.50 [s]
163nobodyさん:2006/06/05(月) 11:03:38 ID:GKAwUgKi
@xの配列が変動する状態で、
10個目以降全てに対して処理をしたい場合、
foreachで、1〜9回目のループをifで飛ばすようなやり方以外で、
何かスマートな方法はありますか?
164nobodyさん:2006/06/05(月) 11:07:12 ID:???
for
165nobodyさん:2006/06/05(月) 11:23:55 ID:???
>>163
配列スライスに対してforeachでいいんでね?

foreach my $i (@x[9..$#x]) { ... }
166nobodyさん:2006/06/05(月) 12:24:24 ID:???
>>162
> うちは 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)
167nobodyさん:2006/06/05(月) 12:35:00 ID:???
> 何回やってもlcの方が速かった。
訂正。今やったら逆転した。(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)

168nobodyさん:2006/06/05(月) 15:17:59 ID:??? BE:212256083-#
もう誤差の範囲だろ…
169nobodyさん:2006/06/05(月) 18:57:41 ID:???
>>167
ってか、うち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/;},
});
170nobodyさん:2006/06/05(月) 19:14:18 ID:0Db/Ehfs
文字列を一文字ずつ処理して
とある文字が出てきたところで区切って
その区切ったそれぞれの文字を配列に入れるということをしたいのですけど、l
やり方が浮かばなくて・・・
どのようにコーディングすればいいのでしょうか?
171nobodyさん:2006/06/05(月) 19:25:39 ID:??? BE:132660353-#
日本語でもう一度
172nobodyさん:2006/06/05(月) 19:28:24 ID:???
>>170
split
173nobodyさん:2006/06/05(月) 19:39:21 ID:0Db/Ehfs
>>172
あっ 出来ました。 ありがとうございます
174nobodyさん:2006/06/05(月) 19:52:22 ID:JTs163rf
CPANのインストールディレクトリってどこにしてる?
デフォの /home/~username/.cpan にしとく?自分用に変える?
dotディレクトリに入れるのがなんか気持ち悪いんだが、、、
175nobodyさん:2006/06/05(月) 21:46:17 ID:???
>>174
> dotディレクトリに入れるのがなんか気持ち悪いんだが、、、

そんなことないよ。気持ちいいよ。
176nobodyさん:2006/06/06(火) 01:40:03 ID:???
テキストファイルから読み込んだ@listに対して
それぞれ一行ずつを取り出して表示させるにはどうすればよいでしょうか?
177nobodyさん:2006/06/06(火) 01:53:24 ID:???
foreach
ていうか、本くらい読め。基本過ぎる
178nobodyさん:2006/06/06(火) 02:06:41 ID:???
>>177
本だと私のやりたいことが載ってなかったので質問してしまいました
すいません、、、

@listに代入させた各行の1番目の<p></p>はそのまま、2番目の<p></p>を削除したいのですが、、、
179nobodyさん:2006/06/06(火) 02:11:03 ID:???
>>178
その foreach の載ってない本の題名を教えてください。
180nobodyさん:2006/06/06(火) 02:18:35 ID:???
以前、正規表現道場というスレがあったと思うのですが、
なくなっちゃったんですか?探してもないんだけど。
181nobodyさん:2006/06/06(火) 02:18:54 ID:???
>>178
その s の載っていない本の題名を教えてください。
182nobodyさん:2006/06/06(火) 02:25:49 ID:???
>>179>>181
「Perl&CGI入門」という本です

1番目の<p></p>はそのまま、2番目の<p></p>を削除がちょっと、、、

183nobodyさん:2006/06/06(火) 03:09:49 ID:???
本当に本を読んでいるとしたら、もしかして応用力のない子ですか?
正規表現くわしくのってないのかな? 持ってないから分からん・・。

$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 どう使うのか予想つかないわ。
184nobodyさん:2006/06/06(火) 03:13:16 ID:???
>>180
たぶん、ム板にあるからいいじゃんということになったんだと思う
正規表現 part2
http://pc8.2ch.net/test/read.cgi/tech/1131028296/
185nobodyさん:2006/06/06(火) 03:16:48 ID:???
>>169
> これ何もでなくね?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)
186nobodyさん:2006/06/06(火) 06:19:56 ID:???
trで代わりの動作が出来る場合はtrの方が早いというのは周知の事実かと思ってたが・・・
187nobodyさん:2006/06/06(火) 10:15:26 ID:???
手持ちのカードで何ができるかを考えるのは自分ですよ
自分はこうやってるんだけど他にいい方法ない?ならわかるけどさ。
188nobodyさん:2006/06/06(火) 11:17:16 ID:???
どこのはなし?
189nobodyさん:2006/06/06(火) 11:22:27 ID:???
>>178あたり。
190nobodyさん:2006/06/06(火) 14:59:19 ID:Re1RmuFG
簡易予定表のようなものを組んでみたんですが、なんだかモッサリしてる気がします。
もっと簡潔に書けるような気がするんですが自分ではこれが限界でした。
あと、ファイルロックのやり方が合っているのか自信がありません。
一応動いていることは動いているんですが、問題はないでしょうか。
改良すべき点、根本的にこういう書き方に直した方が良い、とかあればアドバイスお願いします。
大まかな内容は以下のようなものです。

予定として保存する内容は「予定日(月と日)」と
「予定内容(長くても200バイト程度)」の2つでフォームから渡します。
予定を保存するファイルは月単位で作成します。
例えば2006年5月の予定の場合なら「200605.txt」というファイル名です。
保存するファイルがないときはその都度作成し、

6月1日

6月2日

6月3日
.
.
.
という風に日付だけを先に入れておきます。
保存するファイルがあるときは、
フォームから渡された「予定日」とマッチした日付の次の行に「予定内容」を書き込みます。

内容は以上です。次レスにコードを晒します。
191190(前半):2006/06/06(火) 15:03:27 ID:???
# 保存するファイル名
$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";
}
192190(後半):2006/06/06(火) 15:04:16 ID:???
# 該当する月のファイルがなければ作成
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);
193nobodyさん:2006/06/06(火) 15:04:28 ID:???
194190:2006/06/06(火) 15:20:53 ID:???
>>193
そちらで質問してきます。
195nobodyさん:2006/06/06(火) 17:58:30 ID:???
if($MON == 1|3|5|7|8|10|12)

これ斬新だな。当然Warning出るけど一応動くんだw
196nobodyさん:2006/06/06(火) 18:26:58 ID:???
>>195
動くって、意図した通りに動くっていう意味?
197nobodyさん:2006/06/06(火) 18:31:07 ID:???
>>196
いや、意図した通りには動かない。だって15だよ。比較の右辺。
198nobodyさん:2006/06/06(火) 18:34:39 ID:???
配列(コンマ区切り)の中身を一定の数ごとに折り返して再び配列(コンマ区切り)に
入れ直したいんですが良い方法が浮かびません。
うまく表現できないので例を挙げると、
「@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];
199nobodyさん:2006/06/06(火) 18:37:06 ID:???
法則性を見つけろ
200nobodyさん:2006/06/06(火) 18:45:28 ID:???
>>198
そういう処理が必要になった時点で何か間違ってる
201nobodyさん:2006/06/06(火) 18:46:12 ID:???
>>195
そらビット演算するだろなw
やりたかったのは
if($MON =~ /^1|3|5|7|8|10|12$/)
こうだろうね
202nobodyさん:2006/06/06(火) 18:47:16 ID:???
ぶw もろカッコつけるのわすれたw アホかw
if($MON =~ /^(?:1|3|5|7|8|10|12)$/)
203nobodyさん:2006/06/06(火) 18:56:40 ID:???
うるう年の判定も間違ってるし日付関連のモジュールを使うべきだと思った。
204nobodyさん:2006/06/06(火) 19:04:10 ID:???
>>199
も、もう少しヒントお願いします。

>>200
例えば、EXCELのフォーマットの関係でCSV出力のときだけ
こういう処理をしたりするのって変ですか?
205nobodyさん:2006/06/06(火) 19:18:40 ID:???
ちょと質問です

標準入力の読み込み位置を変更したいのですが
seek STDIN, 0, 0;
ではダメなようでして
なにか術があれば教えてください
206nobodyさん:2006/06/06(火) 19:21:39 ID:???
>204
1つのループでいけるかとおもったけど、前半と後半でちゃうのか・・・
処理方法を見直したほうが良いかと思うw
207nobodyさん:2006/06/06(火) 19:23:03 ID:???
>>198=204
1行でもできるんでない?

ヒントをいえば、
右側は常に list[n] + list[n+5]
になってて、
その n ってのは、左側を list[i] とすれば、
i が 5回ごとに 10 足されていって、それに、 i 回目を 5 で割ったあまりを足したもの。
208nobodyさん:2006/06/06(火) 19:24:49 ID:???
STDIN は前方向にしか進めないですよ

(1) 一旦ファイルに書き出したのを利用する
(2)そんなにでかくないのなら read で読み込んだものを利用する

の2通りがあります。
大きいファイル、環境にも夜でしょうが 5MB あたりを境に (1) か (2) かを使い分ければ良いかと思います。
209nobodyさん:2006/06/06(火) 19:29:08 ID:???
>>208
そういうことでしたか
ありがとです
210nobodyさん:2006/06/06(火) 19:41:34 ID:???
>207
あ〜、無理に $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);

211nobodyさん:2006/06/06(火) 19:44:07 ID:???
>>198
エレガントじゃないけど、こんなのどうかな・・・

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";
212nobodyさん:2006/06/06(火) 20:00:57 ID:???
>>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];
}
213nobodyさん:2006/06/06(火) 20:02:43 ID:???
すまん自己レス。文字列連結するのか。一行間違った。

>>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];
}
214nobodyさん:2006/06/06(火) 20:05:47 ID:???
>>210-213
うはw 答え書いちゃうとわざわざヒント出した意味がww

まあありか。

自分が書いたのは >>213 まんまっす。

配列数がわからない場合、$i < 10 の部分は、事前に
my $limit = (scalar @list) / 2; で $i < $limit; とでも。 # @list は偶数であること。
215198:2006/06/06(火) 20:08:34 ID:???
>>207
こういうことでしょうか・・・でも結果がうまく出ないです。
どこが間違ってるんでしょうか?

for($i=0;$i<10;$i++){
if($i>=5){
$n = ($i%5) + 10 + $i;
}else{
$n = $i;
}
$list[$i] = $list[$n] . $list[$n+5];
}
216nobodyさん:2006/06/06(火) 20:09:18 ID:???
>>198 は「一定の数」って書いてるから20と5はあくまで例じゃないの?
217198:2006/06/06(火) 20:10:27 ID:???
>>210-213
あわわ、レスあったのに気付かなくてすみませんでした!
ありがとうございます!ゆっくり拝見させていただきます。
218nobodyさん:2006/06/06(火) 20:11:28 ID:???
>>215 にワロタ。
219nobodyさん:2006/06/06(火) 20:12:27 ID:???
>>216
あ、ズバリその通りです。
ただ、自分の場合いきなり任意の数でできるレベルじゃなかったので・・・。
どんな数にでもすぐ応用できるものがあれば一番良いと思っています。
220198:2006/06/06(火) 20:13:40 ID:???
219=198です。
>>218
お恥ずかしいです・・・。
221nobodyさん:2006/06/06(火) 20:15:15 ID:???
あ、>>213 よ。
$list[10] から先が残ったまんまだぞ。
まあ >>198 見ると残らせるのか残らせないのか分からないけどねw
>>198 は残らせないなら @newlist に入れるべし。
222nobodyさん:2006/06/06(火) 20:19:35 ID:???
さあ、ここで拡張性のテスト
>>198の動作を、2行の折り返しから3行の折り返しにしたくなった」
「3行どころかn行(任意の行数)に折り返したくなった」

ちゃんと拡張できますか?
223nobodyさん:2006/06/06(火) 20:21:42 ID:???
それは回答者へのテスト?w
224nobodyさん:2006/06/06(火) 20:23:45 ID:???
>>223
そうw 普段から、あとで拡張しやすいように書いてますか? という抜き打ちみたいなw
225207:2006/06/06(火) 20:29:44 ID:???
>>222=224
んじゃ、ちょっと面白そうなのでやってみた。
>>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) ];
    }
}

# print
for (my $i = 0; $i < scalar @newlist; $i++) {
    print "$i : $newlist[$i]\n";
}
exit;

連結に2重 for 使うのはしょうがないよね・・・。
226198:2006/06/06(火) 20:29:59 ID:???
>>221
そうですね。その点を見落としていました。

>>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];
}
任意の行については・・・もうちょっと待って下さい・・・。
227211:2006/06/06(火) 20:30:39 ID:???
>>222
引数で$n(行数)を受け取ったとして
$wrap = !$wrap;
$i -= $width if $wrap;

if ($wrap++ < $n-1) { $i -= $width }
else { $wrap = 0; }
に直したらできます。
228222:2006/06/06(火) 20:37:25 ID:???
くっw 抜き打ちなのに簡単に修正しやがって!

   _、_
 ( ,_ノ` )      n
 ̄     \    ( E) グッジョブ!!
フ     /ヽ ヽ_//
229nobodyさん:2006/06/06(火) 20:38:06 ID:???
>>211=227 も面白いね。考え付かないなあ・・・。
230198:2006/06/06(火) 20:59:42 ID:???
みなさん、すごいですねぇ。
解答を見てもよく分からない部分もあるようなレベルなので
参考にしつつ勉強してきます。
お付き合いしていただいた方々、本当にありがとうございました。
231nobodyさん:2006/06/06(火) 21:29:12 ID:???
中身が数字のid.txt というファイルを読み込んで
中身を表示→数字に1を足す という動作をさせたいのですが、

中身をセットする時点で数字が消去されてしまうようです。

open (ID,">id.txt");
$id = <ID>; #ここの時点で中身が消去?

print "$id";

$id++;
print ID "$id";
close(ID);

例えばファイルの中身の初期値が100ならば、
最初は100、リロードの度に101、102・・・と表示されると思うのですが
上手くいきません。

ご指摘のほどよろしくお願いいたします。
232nobodyさん:2006/06/06(火) 21:35:14 ID:???
>>231
>open (ID,">id.txt");
書き込みでopenしているので、中身はこの時点で消去です。
一度読み込んでから、書き込むように変えましょう。
233nobodyさん:2006/06/06(火) 21:35:56 ID:???
>>231
openのモードがNG
「>」「>>」「<」「+<」の違いはわかってる?
234nobodyさん:2006/06/06(火) 21:41:43 ID:???
+< id.txt
seek
減る事もある場合、桁数に注意
235nobodyさん:2006/06/06(火) 23:19:31 ID:???
ねえ、
$word が任意の入力できる文字列で、文字コードが EUC か UTF8 だとして、

$word = quotemeta $word;
$word =~ /$word/;

に、セキュリティホールってある? 普通に通るかすら。
236nobodyさん:2006/06/06(火) 23:22:01 ID:???
なんで $word を $word で検索してんだw
$word = quotemeta $word;
$text =~ /$word/;
こうですた。
237nobodyさん:2006/06/06(火) 23:31:12 ID:??? BE:70752724-#
何がしたいねん
238nobodyさん:2006/06/06(火) 23:43:29 ID:???
おそらくは検索か
俺は\x00-\x19までを削除してるのと、正規表現で意味のもつものをエスケープする以外はなんもやってない
239nobodyさん:2006/06/07(水) 00:01:52 ID:Z9iT2VzK
勉強中の身に、どなたか教えてください。

open(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が動かなくなりますた。
どっかで勘違いしてるんだろうと思うんだけど、
勘違いのポイントかヒントだけでも教えてください。
240nobodyさん:2006/06/07(水) 00:16:13 ID:???
while(<FILE>)ってwhile($_ = shift <FILE>)と同じなんで、そこで抜ける判定をしなんでも
print; の前に抜ける条件を書いて lastしてみればいいんじゃないかと。
241nobodyさん:2006/06/07(水) 00:41:37 ID:DSNCvTMF
勘違いじゃなくて勉強が足りんかったわけですね。
つーか500エラーが出ました。

while(<FILE>) {
if($_ eq '<!-- ここまで -->') { last; }
print;
}

これで合ってますか?
242nobodyさん:2006/06/07(水) 00:47:38 ID:DSNCvTMF
あ、できた。

でも<!-- ここまで -->を読んでくれません。
''で囲むんじゃダメなんですかね?
それとも改行コードも考慮しないといけないとか?
243nobodyさん:2006/06/07(水) 00:47:47 ID:???
>>240
shift はつかなくね? $_ = <FILE> じゃ?
244nobodyさん:2006/06/07(水) 00:49:12 ID:???
>>242
$_ は最後の行じゃない限り、最後に改行がついてるよ
245nobodyさん:2006/06/07(水) 00:51:05 ID:???
>>232>>233>>234
有難うございました。

246nobodyさん:2006/06/07(水) 00:59:40 ID:???
>>243
defined($_ = <FILE>) じゃね?
247nobodyさん:2006/06/07(水) 01:03:44 ID:???
でもさあ、1行ずつ読み込んで、その都度あるかないかわからない文字列をチェックして途中で終了させるより、
一気に全部読んで文字列に入れてから、その文字があるなら正規表現でずばっと削除したほうが早いよね。
248nobodyさん:2006/06/07(水) 01:09:16 ID:???
>>247
んなこた環境とデータセットによる。
249nobodyさん:2006/06/07(水) 01:11:19 ID:???
I/Oやメモリをそこまで気にする時代じゃないだろうに
250248:2006/06/07(水) 01:18:21 ID:???
>>249
「早いよね」ってことだったので、速いか遅いかは読込むデータの傾向や動作環境によるっつー話。
メモリやら I/O の話はどこから出てきた?
251nobodyさん:2006/06/07(水) 01:20:34 ID:???
っていうか、いま気づいたんだけど、
>>239 の場合

local $/ = '<!--ここまで-->';
open (FILE, '2get.txt');
$_ = <FILE>;
close (FILE);
print $_;

ってやると解決しないか?
速度的にも一番早い。
252nobodyさん:2006/06/07(水) 01:23:04 ID:???
>>240
>>244
ありがとうございました。なんとか動くものになりました。

>>247
正規表現もまだ理解しきっていないので…
今後のメンテナンスの時に考えることにします。
253251:2006/06/07(水) 01:24:25 ID:???
あ、 print 前に chomp; もか。
254nobodyさん:2006/06/07(水) 01:29:15 ID:???
>>251
激しく意味不明のテキストが発生しますた…
255nobodyさん:2006/06/07(水) 01:38:27 ID:???
>>254
まじで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だと思ったんだがなあ。
256nobodyさん:2006/06/07(水) 01:43:22 ID:???
$/ 自体に長さの制限とかあるのかな?
257nobodyさん:2006/06/07(水) 01:52:11 ID:???
>>256
どうなんだろ?
とりあえず試しに 200kb くらいのテキスト用意して、

- - - - - - - - - - - - - - - - - - - - - - - - - - -
$/ = '『根掘り 葉掘り 聞き回る』の・・・『根掘り 葉掘り』・・・・・ってよォ〜〜〜
『根を掘る』ってのはわかる・・・・・スゲーよくわかる 根っこは土の中に埋っとるからな・・・
だが「葉掘り」って部分はどういう事だあああ〜〜〜〜〜っ!?
葉っぱが掘れるかっつーのよーーーーーーッ!
ナメやがってこの言葉ァ 超イラつくぜぇ〜〜〜ッ!!
葉っぱ掘ったら裏側へやぶれちまうじゃあねーか!
掘れるもんなら掘ってみやがれってんだ!チクショーーッ
どういう事だ!どういう事だよッ!クソッ!葉堀ってどういう事だッ!
ナメやがってクソッ!クソッ!';
- - - - - - - - - - - - - - - - - - - - - - - - - - -

・・・って入れてやってみたけど、こっちでは無事その前部分だけに切り取られたよw
258nobodyさん:2006/06/07(水) 01:52:17 ID:???
>>255
ファイル作ってみましたが500エラーです…

おかすい。なぜだ。
259nobodyさん:2006/06/07(水) 01:59:10 ID:???
>>258
え、どんなエラーでてる?

ブラウザでやってるなら
#!/usr/bin/perl
print "Content-type: text/html\n\n";
も入れてね?
260nobodyさん:2006/06/07(水) 02:03:21 ID:???
>>257
その文章の方が気になりますがw

すんません、Content-typeを入れるの忘れてますた。
んで、今度こそ大丈夫だと思ったら空白ページ。

鯖環境かなんかですかね?
261nobodyさん:2006/06/07(水) 02:07:38 ID:???
できたー!
262nobodyさん:2006/06/07(水) 02:11:01 ID:???
ええw ('A`)

まあおめでとう!w 何が悪かったのやらw

てか自分のPCに perl 入れて、コマンドプロンプトとかから perl 実行すること覚えようぜ。エラーメッセージでて便利よ。
263nobodyさん:2006/06/07(水) 02:14:36 ID:???
> てか自分のPCに perl 入れて、コマンドプロンプトとかから perl 実行すること覚えようぜ。エラーメッセージでて便利よ。

無限 fork するようなもの書いたときにおかしくなるから嫌。
264nobodyさん:2006/06/07(水) 02:14:53 ID:???
>>262
うい。perlは入れた(はず)ですが、実行の仕方(設定の仕方?)が分からんとです。
これから覚えます。

ちなみに、もともと作ってた方のページも直しましたが、
読み込み元ファイルの内容が表示されんとです。

まだまだ道は長いとです。

ありがとうございました。
265nobodyさん:2006/06/07(水) 02:19:08 ID:???
>>263
えぇw

>>264
そのフォルダからcmd開いて、 「perl hoge.cgi」 とか打つだけだす。
あと、$/ 変えて読み終わったあとは、変な挙動起こさないように、
$/ = "\n"; って設定しなおしていくといいかも。
266nobodyさん:2006/06/07(水) 02:23:00 ID:???
>>265
> そのフォルダからcmd開いて

いきなり意味分かんないんで、このスレのログ保存しておきました。
もうちょっと頭が良くなってから読み返します。

こんな夜中までありがとうございます。
267nobodyさん:2006/06/07(水) 02:29:37 ID:???
>>184 ありがトン
268nobodyさん:2006/06/07(水) 02:37:25 ID:???
> そのフォルダからcmd開いて

確かに、意味不明ですね。
269nobodyさん:2006/06/07(水) 03:07:49 ID:???
意味不明だけど言いたいことは分かる
270nobodyさん:2006/06/07(水) 03:08:00 ID:???
まじかw

↓こういうのをやるとか、
http://arena.nikkeibp.co.jp/tec/winxp/20050309/111687/

どっかのフォルダの ツール → フォルダオプション → ファイルの種類 → CGI ファイル → 詳細設定 で、
新規 → アクション 「cmd」 → アクションを実行するアプリケーション 「cmd.exe "cd %l"」

ってやると、「そのフォルダからcmd開いて」 な感覚になるんだけど・・・普通そう言わないのかな・・・(´・ω・`)
271nobodyさん:2006/06/07(水) 04:27:27 ID:???
アクセサリ -> コマンドプロンプト を実行して、
cd "c:\perlスクリプトがあるディレクトリ"
perl スクリプト名.pl

が親切では?
272nobodyさん:2006/06/07(水) 05:24:07 ID:???
>>271
うん、そうなんだけど、
ファイルのディレクトリが D:ドライブだとまた違うし、
何度も使うなら、cd 〜フォルダ名 とか打つの省略できる方が楽だと思って。
273nobodyさん:2006/06/07(水) 05:51:48 ID:???
>>272
今日から perl 勉強します yo! ってひとが、そんな設定やると思う?

コマンドプロンプト開いた時点で、その人のホームディレクトリにいるから
誘導するのはそれほど難しくないよね。
274nobodyさん:2006/06/07(水) 08:11:05 ID:???
Microsooftが配布してるツールとか、窓の手とかのカスタマイズツールで、
エクスプローラのフォルダから DOS 窓を開けるようになる。
そうすれば一々 CD しなくてもいいし、perl への PATH が通ってれば perl ってだけで
起動できる。

ちなみに cmd とか commasnd とかから起動すると速攻で窓閉じるから駄目よw
275nobodyさん:2006/06/07(水) 10:29:37 ID:???
あるソースを読んでいて分からないところがあるので質問させて下さい。

@{$a}{@$b}

これってどういう意味なんでしょう?
そんなに難しいことじゃないと思うんですが、
perlは慣れていないので苦労しています。
宜しくお願いします。
276nobodyさん:2006/06/07(水) 10:44:11 ID:???
>>275
例えば、
$a = 'hash';
$b = ['a', 'b']; # 配列のリファレンス
とすると、
@{$a}{@$b} → @hash{'a', 'b'} → ($hash{'a'}, $hash{'b'})
のこと。
277275:2006/06/07(水) 10:54:10 ID:???
>>276さん
そういうことだったんですね。
助かりました。有難うございました。
278nobodyさん:2006/06/07(水) 13:05:38 ID:???
配列とソートに関しての質問です
左は日付です

--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};}

とし、これをもう一度展開して表示させてみると、同じ日付がある場合に
誤動作して読み込まれません
改善するにはどうしたらいいでしょうか?
279nobodyさん:2006/06/07(水) 13:14:37 ID:???
>>278
行と改行コードに関する質問です

読み込み
もう一度展開

なんてのが書かれている質問を読み込みます
これはなんでしょうか?

> 頭に半角のスペースが入ります
> これはなんでしょうか?
 自分で書いているとおり半角のスペースなのではないでしょうか。

さらに

誤動作して読み込まれません

と書いてあるので考えてみると、コードは動いているのに質問する場合なので
解釈がうまくできません
改善するにはどうしたらいいでしょうか?
280278:2006/06/07(水) 13:20:29 ID:???
質問の仕方が悪いのはご容赦ください
281nobodyさん:2006/06/07(水) 13:28:36 ID:???
>>278
> 半角スペース
定番FAQ
print "@data";とやってるだろ。
配列を文字列内に入れようとすると$"(デフォルトで半角スペース)で連結されるからこうなる。
むやみにダブルクォーテーションで囲むのは止めましょう。
ちなみにprint @data;の場合は$,で連結される。これはデフォルトで空文字列。

> 同じ日付
%listの中に配列を作って複数の値を記録できるようにすれば良い。
foreach (@data) {
push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
}

foreach my $key (sort keys %list){
push @htm, @{$list{$key}};
}
282nobodyさん:2006/06/07(水) 13:29:56 ID:???
>>278
@dataはファイルから丸ごと読み込み
@data = <FH>;
で、@dataを表示する時に
print "@data";
とかやってるんじゃないの?
だったら頭にスペース入るだろうね。

2つめは当たり前でしょう。
同じ日付があれば、データが上書きされるので。
ハッシュの先を配列にするとかしないと。
283nobodyさん:2006/06/07(水) 14:35:06 ID:CY60cgj5
wiki記法で書いたテキストをhtmlに反映したいのですけど
そういったモジュールってありますでしょうか?

CPANでwikiで検索したら数があまりに多すぎて。。。。。

284278:2006/06/07(水) 14:55:55 ID:???
>>281 >>282
有り難うございます

push @{$list{$1}}, $_ if /--(\d*)--\w*----/;
この部分がエラーを発生します

もうちょっと勉強してみます
285278:2006/06/07(水) 14:57:52 ID:???
失礼しました、大丈夫でした、m(_ _)m
286nobodyさん:2006/06/07(水) 16:04:17 ID:???
それだと要素数が1の配列ができまくってモヤっする
287nobodyさん:2006/06/07(水) 16:08:10 ID:???
文法的に正しいとか間違ってるとかは置いといて、スカラーとか配列とか、
最初に空のデータとして宣言しとかないと何か不具合起こすことってあるの?
288nobodyさん:2006/06/07(水) 16:22:34 ID:???
>>287
Cみたいに初期化しないと変な値が書き込まれてるって事は無い。

ただし、配列かどうか分からない所にいきなりpushしたりするとエラーになる。

my %hash;
my %data = ('a' => 1, 'b' => 2, 'c' => 3);
while (my($key, $val) = each %data) {
 push($hash{$key}, $val); # Error(配列に初期化してないから)
}
289nobodyさん:2006/06/07(水) 16:25:30 ID:4ldG4rWr
winxp
perl5.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
とエラー内容が変わるのはなんですかね。

ウェブ上ではなんのエラーもなく動作してる時点でコードに問題はないと思うのですが。
290nobodyさん:2006/06/07(水) 16:28:46 ID:???
>>288
ほぉ、なるほど、そういうケースがあったのね。
勉強になりました。ども。
291nobodyさん:2006/06/07(水) 16:28:50 ID:???
>>289
apachのえらーろぐみたらえーやん。
292nobodyさん:2006/06/07(水) 16:30:26 ID:???
>>289
use strict; してるかどうかによって警告が出る位置が違ってる。
それから、エラー読もうよ…。
substr が文字列境界超えてるって。

多分、見えないだけで、webサーバ側のログには延々とそれが書き込まれてる。
293289:2006/06/07(水) 16:40:43 ID:4ldG4rWr
>>291
すみません。先ほどの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でてる以上
何をすればいいかわからなくて。
294nobodyさん:2006/06/07(水) 16:41:02 ID:???
>>288
僕の個人的かつ大胆な推測によると、
仮に $hash{$key} の値を配列リファレンスで初期化していたとしてもエラーが出ると思うのだ。

それ、デリファレンスしてねえからな。
295294:2006/06/07(水) 16:48:28 ID:???
補足:
未初期化なナニをデリファレンスすると、perl はその時点から「そのように」扱ってくれる。
だから >>288 のようなケースでは個別の初期化は不要。いや、してもいいけどさ。
296nobodyさん:2006/06/07(水) 17:09:37 ID:???
>>294
その通りだw
297nobodyさん:2006/06/07(水) 17:10:08 ID:???
>>293
何か値が入るとあなたが仮定している変数が、どこかで undef ってると思われます。
それぞれのタイミングで各変数の値が期待通りになっているかチェックしましょう。。

-c スイッチの syntax OK は 「perl によって曖昧さなくパースできますよ。一応ね」 という意味なので、セマンティクス上のバグは見つけてくれません。
代わりに -wc を使うようにすると警告も併せて示してくれます。
298nobodyさん:2006/06/07(水) 17:15:43 ID:???
てかこれ、他人のサーバにエラーログを延々と残す迷惑な奴の典型例だな。
299289:2006/06/07(水) 17:20:02 ID:4ldG4rWr
>>297
ありがとうございます。
-wcやってみます。

とりあえずsubstrのあの記述を抜いて、strictを外すと表示ができるようになりました。
今はstrictでない部分を探してます。

ところでもしかして、5.8.1と5.8.8では何か違うんですかね。そう思えてならないです。
5.8.1が手に入ればわかりやすいですが。
300nobodyさん:2006/06/07(水) 17:48:23 ID:???
末尾以外の改行(特定の文字列でも良いんですが)を取るにはどうすれば良いですか?
$text =~ s/\r\n\w//g;
とかだと、直後の1文字も消えてしまうし・・・ヒント下さい。
301nobodyさん:2006/06/07(水) 17:52:35 ID:???
>>299
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
302300:2006/06/07(水) 18:01:42 ID:???
>>301
ありがとうございます!
$が末尾、!$が末尾じゃない、ってことで?が条件文として働いてるってことですかね。

改行コードって実は結構複雑だったんですね。参考にします。
みなさんデータの読み込みのときに毎回コードの変換して・・・
って、書き込みの段階で変換してれば読み込みのときには必要ないのか・・・。
303nobodyさん:2006/06/07(水) 18:11:06 ID:???
>>293
perldiagによると、左辺値コンテキストの時にエラーが出るとあるけど、
そこらへんは大丈夫?
304nobodyさん:2006/06/07(水) 18:26:26 ID:???
305nobodyさん:2006/06/07(水) 18:30:05 ID:???
配列の任意の位置の要素を削除したり追加したりする簡単な方法ってありますか?

[例]
@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番目に要素を追加
としたり。
306nobodyさん:2006/06/07(水) 18:35:35 ID:???
splice
ぐぐれって・・・
307nobodyさん:2006/06/07(水) 18:41:37 ID:???
>>306
すみません。
超初歩的な質問だったようですね。
308nobodyさん:2006/06/07(水) 21:34:12 ID:???
http://d.hatena.ne.jp/palmo/20060606/grep
ここの最後の疑問を読んで、確かにそうだなぁと思ったので、こちらで質問させてください。

grepやmapの第一引数にEXPRを指定すると、何度も評価されますよね?
でも、普通に考えたらgrepやmapが実行される前に評価されてしまうのではないでしょうか。
この遅延評価はgrepやmapだけ特別なんでしょうか。
BLOCKを渡すと遅延評価される、というのは納得できますが…。

同じような事がforやwhileなどにも言えますけど、あちらは構文ですよね。
309nobodyさん:2006/06/07(水) 22:43:06 ID:???
ん? よくわからんけど

/e$/ は $_ =~ /e$/の略で、普通は

my @e_fruits = grep $_ =~ /e$/, @fruits;
ではなく
my @e_fruits = grep /e$/, @fruits;
って書くと思う。これ関係ない?

ちなみにgrepもmapもforのような書き方もできるぞ。
310nobodyさん:2006/06/07(水) 22:55:49 ID:???
>>308
grep は最初の引数(あるいは間接オブジェクトスロット)にコードリファレンスを取る。
それは後続の引数をリスト展開して得られた最初の要素から順に $_ にセットして繰返し呼び出される。

ユーザサブルーチンのプロトタイプで言うと (&@) ね。完全に同一じゃないけれど。

>>309
grep や map を連結できるのは、それぞれが返した値を前の関数に引数として渡しているから。だから両者は全く別物。
for(each), while, if などの修飾子は引数として渡されているわけではなく、スコープを生じるブロックを持たないだけでそれぞれが元来の制御構造であることに変わりがないので。
311308:2006/06/07(水) 23:03:22 ID:???
>>309
わかりづらくてすいません。
例えば

$_ = 10;
my @r = map $_ * 2, (1..5);
print "@r";

と書いた時に、@r の中身は (10, 10, 10, 10, 10) じゃなくて (2, 4, 6, 8, 10) とできるのは
なぜなんでしょう?
312308:2006/06/07(水) 23:06:03 ID:???
リロードしてませんでした orz

>>310
ありがとうございます。スッキリしました。プロトタイプの仕業でしたか。
てことは、EXPRの場合もBLOCKの場合も、結局コードリファレンスとして渡されるわけですね。
313nobodyさん:2006/06/07(水) 23:42:47 ID:???
ぐえー、難しすぎて意味がわからん。
使う分にはそこまでわからなくても問題ないけど。
314nobodyさん:2006/06/08(木) 00:11:28 ID:???
>>313
思考停止はもったいないよ(´・ω・)
意味がわからなければ調べたり質問したりすればいいのに。
315nobodyさん:2006/06/08(木) 00:16:48 ID:???
プロトタイプでブロックとるgrepは書けるけど式の方はできないから
やっぱり組み込み関数なのでズルしてると思ったほうがいいね。
316308:2006/06/08(木) 00:33:23 ID:???
>>315
そうみたいですね…。試しに 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";
317nobodyさん:2006/06/08(木) 00:40:21 ID:???
>>316
> やはり式やブロックだけでは渡せず、無名関数を作ってコードリファレンスを渡さなきゃダメみたいです。
おいおい。呼び出し方が間違ってるだけだよ。

× @r = mymap { $_ * 2 }, (1..5); # NG
○ @r = mymap { $_ * 2 } (1..5); # OK
318308:2006/06/08(木) 00:44:04 ID:???
うわ・・・orz お恥ずかしい。
という事は、式の場合だけは裏でトリックが使われてる、て事でいいのでしょうか…
319nobodyさん:2006/06/08(木) 01:04:38 ID:???
>311
別に難しく考えなくても、変数のスコープが違うだけじゃん。
$_ = 10;
print map $_ * 2, (1..5);
print $_ * 2 for(1..5);
print $_;
320308:2006/06/08(木) 01:20:55 ID:???
>>319
「スコープが違う」というのはわかるのですが、
「なぜgrepやmapの引数に書いた時だけスコープが違うのか」がわかりませんでした。

特別な構文もなしに書いた「$_ * 2」が、mapを呼び出す時点でなぜ「20」と評価されずに
「$_ * 2」という式そのものとして渡せるのかが不思議でした。

紛らわしい書き方ですいません。質問するのは難しいですね……。
長くなってしまいました。皆様お答え頂きありがとうございました。
321nobodyさん:2006/06/08(木) 01:29:33 ID:???
少なくとも初心者質問スレ向けの質問ではないなw
322239:2006/06/08(木) 01:58:38 ID:???
ども、昨晩お世話になった者です。

あの後も、動作確認ができたプログラムを自分の作ったページに組み込んでみるとやっぱり動かない。
試行錯誤の末、サブルーチン名に予約語を使っていたことが分かりました。
で、ようやくさっき、思い通りのページが作れました。

ということで、とことん勉強不足を痛感したわけですが、
ここでのアドバイスがあってなんとかなったもので、一言だけお礼を言いに。
特に>>251氏。ありがとうございました。
他の皆さんも参考になりました。ありがとうです。

またトラブったら泣きつきにくるかもしれませんが、その時はその時でまたよろしくです。
323nobodyさん:2006/06/08(木) 07:12:51 ID:??? BE:276713377-#
$obj->func のfunc部分を変数$val='func' を使って実行できるようにしたいと
思っているのですが、eval使うぐらいしか方法はないでしょうか?
324nobodyさん:2006/06/08(木) 07:39:13 ID:???
掲示板プログラムを作成しているのですが、
書き込んだり削除したりした後に、掲示板表示画面に戻ってきた際に
キャッシュされた以前の状態の画面が表示されてしまいます。
ブラウザに更新を知らせるにはどのようにするのがよいのでしょうか?
325nobodyさん:2006/06/08(木) 08:28:37 ID:???
>>323
my $func = $obj->can($val) and $obj->$func();

いきなり$obj->$val()で動かなかったっけ?
326nobodyさん:2006/06/08(木) 15:06:05 ID:iBH9Xn1C
新しくプログラムを作ってみるのに以下をインストールしました。
apache1.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が使えませんでしょうか。

アドバイス宜しくお願いします。
327326:2006/06/08(木) 15:08:17 ID:iBH9Xn1C
すみません。winXPにて上記をやっています。
失礼しました。
328nobodyさん:2006/06/08(木) 15:20:30 ID:???
data-dumper は Data-Dumper-Simple じゃなくて?
329nobodyさん:2006/06/08(木) 15:21:25 ID:???
その他のモジュールはWindowsへは対応が遅れてるとかかも
というのも、以前Encodeモジュールでエラーがあり調べてたらWinとLinux環境とでバージョンの違いが酷かったので・・・
330326:2006/06/08(木) 15:33:20 ID:iBH9Xn1C
>>328
http://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
そうでしたか。
でも過去動作していたコードと考えると逆にバージョンがアップしたせいなのかもしれませんが。
331nobodyさん:2006/06/08(木) 15:41:28 ID:???
formの要素に配列は使用出来るのでしょか?

たとえば
<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');
どなたかご教授お願い致します。
332326:2006/06/08(木) 15:43:30 ID:iBH9Xn1C
Data-Dumper-Simpleいれてみました。
特にかわりありません。
やはりstrict環境下では$sth->fetchrow_hashrefが不正扱いされるようです。
333326:2006/06/08(木) 15:45:36 ID:iBH9Xn1C
>>331
それはできません。あくまでHTMLとPERLは違う言語でHTMLには配列という概念がありません。
334nobodyさん:2006/06/08(木) 15:46:14 ID:???
>>331
inputタグ内の添え字は要らない。(PHPはできたかも)
あとは@test = $query->param('test'); で読めるんじゃなかったかな?
335nobodyさん:2006/06/08(木) 16:24:15 ID:???
>それはできません。あくまでHTMLとPERLは違う言語でHTMLには配列という概念がありません。
そうですか・・・
input type=textを、type=checkboxのようにに同一要素名で
送信する事は出来ないのでしょうか?
・・・とおもったら
>inputタグ内の添え字は要らない。
こちらで解決しました!!
添え字無しできちんと配列データとして送られていました。
ありがとうございます。

336nobodyさん:2006/06/08(木) 16:29:01 ID:???
>331
同じnameで配列の様に受け取りたいならcgi-libのReadParseを使ってみてください
たしか\0を区切り文字として渡してくるので
@array = split(/\0/, $in{'param'});
で配列にできたかと
337326:2006/06/08(木) 16:37:38 ID:iBH9Xn1C
>>334
知識不足ですみません。
>>335
惑わせてしまいすみませんでした。
338326:2006/06/08(木) 17:00:06 ID:iBH9Xn1C
for ($form{index}..($form{index}+10)){
my $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とでした。

面目ありません。
339nobodyさん:2006/06/08(木) 18:11:03 ID:iBH9Xn1C
ようやく問題が解決したので本題をすすめています。

たまにチャットとかで
只今の閲覧者5人 参加者1人
っていう表示を見かけます。

あれはどうやって実現するのでしょうか。

例えばHTMLのmetaでrefleshを使って30秒毎に相手のIPを確認して
閲覧人数を割り出すのでしょうか?

相手がCGIにアクセスしてきたらIPを取って、取得時間をデータベースに入れておく。
で、1分毎にそのデータベース内のレコードを確認して取得から1分以上になっていたら
削除する。

でもイマイチな仕様ですね。これじゃ。ああ。もっといい方法があると思うのですが。
340nobodyさん:2006/06/08(木) 18:11:51 ID:MZDW6IYK
すいません、変数からから指定文字列を抜いた後に
残った数値に1を足したいんですがうまくいきません

$line="hoge100";     
$line =~ s/hoge//;     
$line=$line+1;     
print $line;      何も表示されない

どこが悪いんでしょうか、お願いします。
341nobodyさん:2006/06/08(木) 18:21:17 ID:???
>>339
ここはおまえの日記じゃない。
342nobodyさん:2006/06/08(木) 18:26:57 ID:??? BE:35376522-#
脳味噌
343nobodyさん:2006/06/08(木) 18:43:37 ID:???
>>340
とりあえず

$line='101';
print $line;

で表示されるかどうか確かめることをお勧めする。
344nobodyさん:2006/06/08(木) 19:00:59 ID:???
>340
セミコロンの後ろにある全角空白を削除すれば動く
345nobodyさん:2006/06/08(木) 19:43:03 ID:iBH9Xn1C
http://modskona.clash.cgiboy.com/

ここ閲覧者数がでますが、これをperlCGIで実現する方法はわかる方いますでしょうか?
346nobodyさん:2006/06/08(木) 19:52:07 ID:???
来訪者がCGIを動かしてから1分以内はそこに居ると仮定する
ただこれだけですよ
347nobodyさん:2006/06/08(木) 19:56:01 ID:??? BE:318384094-#
俺んとこにもついてるな
348345:2006/06/08(木) 20:02:06 ID:iBH9Xn1C
>>346
それで1分たったらどうするんですか?
cronとかで1分毎に削除CGIを動かすとかですか?
例えば今自分のサイトのどこに何人いるかを確認できるようにするには、
CSV形式で
1.IPアドレス
2.パスインフォ?でしたっけ
3.リクエスト時刻(秒単位)
でやって毎回誰かがアクセスしてきたらそのCSVのIPで正規表現、重複しないように更新をやって、
削除はcronで別CGIを動かして3のリクエスト時刻が既定タイムを超えてたら
削除。

1分毎にcron起動ってなんかあれですね。
訪問者が来た時に削除プログラムも動かす方がスマートですかね。

と考えてみて一応できそうですが、やり方が下手なような気もします。
指摘などありましたらお願いします
349nobodyさん:2006/06/08(木) 20:04:22 ID:??? BE:238787993-#
後者で正解
350345:2006/06/08(木) 20:10:23 ID:iBH9Xn1C
>>349
ありがとうございます。
とりあえず徹夜で作ってみます。
強制的に訪問者に話かけることができるサイトを。
351nobodyさん:2006/06/08(木) 20:15:48 ID:???
>>350
そんなサイトがあったら、怖くて二度といかなくなるような…
352nobodyさん:2006/06/08(木) 20:28:53 ID:???
JライクなP使いだな。
353nobodyさん:2006/06/08(木) 21:03:01 ID:???
open(FILE, ">test.dat") or die;
print FILE, @stream;
close(FILE);

みたいにして簡単に配列の中身をtest.datに書き込みたいんですが、
エラーになってしまいます。

やっぱり配列をループ回して一行ずつ書き込んでいくしかないんでしょうか。
アドバイスよろしくおねがいします。
354nobodyさん:2006/06/08(木) 21:05:39 ID:??? BE:106128634-#
エラーメッセージ読めよ
コンマイラネって書いてあるだろ
355nobodyさん:2006/06/08(木) 21:08:05 ID:???
エラーになるといってエラーメッセージ晒さないのはまじめに
回答を求めてないと思われてもしょうがないな...
356nobodyさん:2006/06/08(木) 21:13:05 ID:???
ほんとだ、カンマ取ったらいけました
ありがとうございます。
357nobodyさん:2006/06/08(木) 21:17:23 ID:???
許さんよ
358nobodyさん:2006/06/08(木) 23:57:04 ID:???
htmlログなんですが2chブラウザで読み込めるようにするにはどうすればいいでしょうか?
書き込み禁止の読み込み限定にしたいんですが
359nobodyさん:2006/06/09(金) 00:01:33 ID:???
>>358
日本語でおk
360358:2006/06/09(金) 00:10:31 ID:CHuIt143
>>359
日本語とは?
361nobodyさん:2006/06/09(金) 00:13:46 ID:??? BE:106128443-#
にほん‐ご【日本語】

古来日本民族が用いてきた言語で、日本国の公用語。
北海道から沖縄までの島々にわたり、一億余の人々に使用されている。
音韻面では、一つの子音と一つの母音との結合音節を基調とし、
母音で終わる開音節を特徴とする。「ガ・ッ・コ・オ(学校)」という発音にも見られるような
等時的なリズム上の単位、すなわち拍(モーラ)をもち、高低アクセントを伴う。
文法面では膠着語(こうちやくご)に属し、助詞・助動詞が文の成立について
大きな役割を果たしており、また、述語が文の最後にくるという文法構造をもつ。
複雑な敬語法が発達していることもその特徴の一つに数えられる。
中国語から借用した漢字と、漢字を母胎として成立した仮名との併用で表記されるのが普通である。
語彙(ごい)には日本固有の語である和語のほかに、漢字音に基づく漢語も多い。
近年は、西欧語からはいってきた外来語も多く用いられる。国土の面積の割には、
方言による違いも著しく、男女や職業などの別による用語差も大きい。
系統はアルタイ諸語の一つに属するものか、などとも言われるが、いまだに定説とはなっていない。
362nobodyさん:2006/06/09(金) 00:13:57 ID:???
>>360
こいつ最高にアホ
363nobodyさん:2006/06/09(金) 10:11:56 ID:???
日本語でおk=文章がわかりにくい
364nobodyさん:2006/06/09(金) 15:58:08 ID:???
$file1から読み込んだデータを処理した上で$file2に書き込む場合は
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にすれば良いんでしょうか?
それとも処理の前にクローズするのはマズイんでしょうか?
365nobodyさん:2006/06/09(金) 17:45:02 ID:???
>>364
file2をそのままfile1にすると、ロックが効かない典型。
http://web.archive.org/web/20040216083853/www98.sakura.ne.jp/~jun/perl/flock.html
366nobodyさん:2006/06/10(土) 01:04:27 ID:???
if(!open(FH, "+< $file2")){&file_err;};
↑こういう書き方を誰が広めてるの?
open FH, "+< $file2" or file_err();
のほうが自然言語に近くて読みやすいしタイプもすくない。
367nobodyさん:2006/06/10(土) 01:06:14 ID:???
・・・ kent とか?
368358:2006/06/10(土) 01:10:25 ID:fHtGRC+E
htmlログなんですが2chブラウザで読み込めるようにするにはどうすればいいでしょうか?
書き込み禁止の読み込み限定にしたいんですが
369nobodyさん:2006/06/10(土) 01:21:13 ID:???
>>368
日本語でおk
370nobodyさん:2006/06/10(土) 01:30:58 ID:???
失敗したら何か複数の処理って時に or を使ってると
open(FH, "file") or do { a(); b(); };
とかなってキモス。
371358:2006/06/10(土) 01:49:00 ID:fHtGRC+E
>>369
たんなるHTMLのみだと
JaneStyleで読みこめません
かちゅでも読みこめません

372nobodyさん:2006/06/10(土) 01:54:26 ID:???
>>370
or ( a() , b() ); でもいかね?

>>371
その2ちゃんブラウザのデータのフォーマット見ればどうすればいいのかわかるじゃん。
何がわかんないかさっぱりわかんないから相手にされないんだよ。 現時点じゃ perl の話題とも思えないしな。
373nobodyさん:2006/06/10(土) 02:34:33 ID:???
>>372
動く動かないの問題じゃなくて、
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() );
位になるとどこで折り曲げるか悩むだろ。
374nobodyさん:2006/06/10(土) 02:45:21 ID:???
>>373
なるほ。 まあそれはいくらなんでもそりゃ if 文使うだろーね。
あるいは前もって無名サブルーチン作っておいて、そこでまとめて処理するとかかな。
375nobodyさん:2006/06/10(土) 03:03:50 ID:???
おれならorやandで改行しちまうね。
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();

しかしこんぐらいなら別のサブルーチン作るかも
376nobodyさん:2006/06/10(土) 03:06:37 ID:???
open $io, "./3/2/1/0/0/321001056131731037.dat"
or map { $obj->can("method_$_")->($obj) } (a..e);
とか。この場合ね。
377nobodyさん:2006/06/10(土) 03:13:25 ID:???
うぁああキモシキモシキモシなんだこの言語はっ
378nobodyさん:2006/06/10(土) 03:20:09 ID:???
2chを支える言語です
379nobodyさん:2006/06/10(土) 03:32:05 ID:???
There's more than one way to do it.
380358:2006/06/10(土) 03:35:54 ID:YyFvvuc/
htmlログなんですが2chブラウザで読み込めるようにするにはどうすればいいでしょうか?
書き込み禁止の読み込み限定にしたいんですが
381nobodyさん:2006/06/10(土) 03:39:26 ID:???
>>380
日本語でおk
382358:2006/06/10(土) 04:01:25 ID:YyFvvuc/
>>381
たんなるHTMLのみだと
JaneViewで読みこめません
ギコナビでも読みこめません
383nobodyさん:2006/06/10(土) 04:11:44 ID:???
JaneViewのスレに逝けばいいと思うよ。
384nobodyさん:2006/06/10(土) 04:13:02 ID:???
先生、質問ー。

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 が通るのは何でなのかな?
385nobodyさん:2006/06/10(土) 04:52:18 ID:???
そんなはずは…

use strict;
(\&{"test"})->();
exit;

sub test{ print "hello, world!"}

って、こんなのも通るのね…。
386nobodyさん:2006/06/10(土) 05:05:09 ID:???
AUTOLOADかけなきゃならんからじゃないかな?
387nobodyさん:2006/06/10(土) 06:17:24 ID:???
ちゃんとstrictのドキュメントに書いてあるな。386正解
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.
388nobodyさん:2006/06/10(土) 06:30:15 ID:???
389nobodyさん:2006/06/10(土) 07:23:45 ID:???
例外だったんだ!

( ・∀・)シ∩<へぇーへぇーへぇー

先生方さすがです。
390nobodyさん:2006/06/10(土) 15:22:30 ID:+aR8vdDY
htmlとshtmlの違いは何でしょうか?
shtmlにしないとSSIディレクティブはできないんでしょうか??
391nobodyさん:2006/06/10(土) 15:24:39 ID:??? BE:159191892-#
すでにPerlの質問じゃネェェェェエェー!!!
392nobodyさん:2006/06/10(土) 15:24:45 ID:???
>390
perlと何の関係もないな。
スレ違い。
393nobodyさん:2006/06/10(土) 15:25:38 ID:???
FORMから飛ばしてきた内容はどのように扱えばいいのでしょう?

<input name="NAME" type="hidden" value="hoge">

というタグを送信元のページに入れておき、
それをcgiの中で、別の変数に移す時、

$hage = $FORM{ 'hoge' };

と記述したのですがうまくいきません。
記述が間違っていますか?
394390:2006/06/10(土) 15:28:43 ID:+aR8vdDY
あぁすみません
カウントダウンのCGI作ってたもんで
395nobodyさん:2006/06/10(土) 15:37:06 ID:???
>>393
CGIの勉強しろよ…。CGI.pmとか。
PHPじゃないんだからいきなりそんな風には記述できない。
396nobodyさん:2006/06/10(土) 15:43:39 ID:???
>>395
某サイトからダウソしたcgiファイルに、FORMで受け取った内容を
>>393の記述で使っている部分があったんで、これでおkと思ってますた。

で、今そのcgiファイルの中に>>393の記述でおkにする部分(らしきもの)を見つけたんで、
それを処理の一番上に持ってきたら思い通りに動作しました。

ありがとうございます。
397nobodyさん:2006/06/10(土) 16:59:32 ID:???
切り貼りしてすごい汚いソース作ってそうだなー・・・。
まあ最初は自分もそうだったけどw
398nobodyさん:2006/06/10(土) 17:21:59 ID:???
うわー 自分が今その状態…
いろんなところから切り貼りして汚い…('A`)
誰にも見せられない…
399nobodyさん:2006/06/10(土) 21:50:32 ID:???
誰もみねえよ
400nobodyさん:2006/06/10(土) 22:06:47 ID:???
もっとエレファントに書けよ。
401nobodyさん:2006/06/10(土) 23:02:04 ID:???
もっとゴージャスに書いたよくださいほうがいいよ
402nobodyさん:2006/06/10(土) 23:30:24 ID:???
書いたよくださいほうがいいよ
403nobodyさん:2006/06/10(土) 23:52:59 ID:???
|∀`)ホントニダレモ ミナイ?
404nobodyさん:2006/06/11(日) 01:30:03 ID:???
誰も見てないって、
そんな、へんてこで読みにくいスクリプトなんて。
use strictを使えばいいのに。ふぅ。

だから、絶対見てないって!
405nobodyさん:2006/06/11(日) 01:44:54 ID:???
>>400
#!/usr/local/bin/perl
どかーん!
(⌒⌒⌒)
 ||

/ ̄ ̄ ̄ ̄ ̄\
| ・ U      |
| |ι        |つ
U||  ̄ ̄ ||
   ̄      ̄
もうおこったぞう
406nobodyさん:2006/06/11(日) 01:52:53 ID:???
けつからでてるのはunko?
407nobodyさん:2006/06/11(日) 01:55:40 ID:???
掲示板などを作る際にjcode.plを使わないとどんな不具合が出るのですか?
408nobodyさん:2006/06/11(日) 02:03:10 ID:???
>>407
、ウ、?ハノヤカ?遑ゥ
409nobodyさん:2006/06/11(日) 02:04:17 ID:???
>>407
シコヌヤ。」、ウ、ハノヤカ遉タ、ハ。」
410nobodyさん:2006/06/11(日) 02:11:27 ID:??? BE:397980195-#
今時のブラウザはフォームがあるページのエンコードで送ってくるから
別に使わなくていいと思う
411nobodyさん:2006/06/11(日) 02:12:30 ID:???
   _、_         こんなトコロで
 ( ,_ノ` )     n     私に質問するんですか?
 ̄    \   ( E)      だったら答えてあげますよ!
フKENT /ヽ ヽ_//   初心者にも簡単!
                文字化けは回避できるわ鯖落ちは回避できるわ
                  とりあえず使っとけな雰囲気があるわで大騒ぎ!
412nobodyさん:2006/06/11(日) 02:15:31 ID:???
>407
>409さんが書いている通り
ただ、他のページからデータを持ってこようとしたり、自分の管理外の色んなページから
GET・POSTを受ける場合は文字コード変換が必要
413nobodyさん:2006/06/11(日) 02:38:31 ID:???
鯖落ちが回避できるのか
414nobodyさん:2006/06/11(日) 02:49:36 ID:???
さすがのKENT様だからな
415407:2006/06/11(日) 03:18:44 ID:???
>>410
それは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を使わなくても何の問題も無かったんで気になったんですが。
416nobodyさん:2006/06/11(日) 03:41:11 ID:???
KENTわろすww
417nobodyさん:2006/06/11(日) 03:47:49 ID:???
むしろ Shift_JIS だけでデータ書いたり保存したりするなら、
j(J)code でデータうけとったときに何でもかんでも変換してると半角カナで文字化けするので、
どうせ変換するなら method get だけにしとくとかのがいいと思った。
他のとこから post でデータ送ってくるのって一部を除いてイタズラ以外にないしな。

まあ get にするにしても utf-8 に対応してない jcode.pl じゃあんま役に立たないとは思うけど。
どうなんでしょうKENT様
418nobodyさん:2006/06/11(日) 04:33:43 ID:???
KENTすげーwwwwwwwwwwwww
419nobodyさん:2006/06/11(日) 04:50:51 ID:???
一方的にシステムの文字コードで送りつけるブラウザはあるらしい(あったらしい?)。

私は、コードを決めておいて、文字コードが合わなかったら変換しないで、
エラーを出すように作ってる。
420nobodyさん:2006/06/11(日) 05:01:19 ID:???
美乳をhiddenで送ってもらって美乳じゃなかったら汚乳エラーでいいじゃん
421nobodyさん:2006/06/11(日) 05:11:02 ID:???
>>420
うわ、それ考え付かなかったなあ。
422nobodyさん:2006/06/11(日) 05:25:55 ID:???
form 要素の accept-charset を使って、変なデータはエラー表示するのが
正しいんだと思うんだがね。

対応してないブラウザってあるの?
423nobodyさん:2006/06/11(日) 08:33:22 ID:???
perl始めると共にいきなりcgi作ってるんですが、何かまずいでしょうか?
プロンプトで色々やってからcgiってのが王道?なんでしょうか?

あとKENTのところのソースを参考にしてるんですが、ここでは評判悪いようですが参考にしない方がいいですか?
424407:2006/06/11(日) 09:15:29 ID:???
どうも勉強になりました
425nobodyさん:2006/06/11(日) 09:35:16 ID:???
>>423
KENT氏のはモジュールなどを使わない枯れた古い方式なので、
車輪の再発明に苦労することになるでしょう。

これからPerlを始めるのなら、モジュールをバシバシ使った
お手軽プログラミングをおすすめします。
426nobodyさん:2006/06/11(日) 09:38:19 ID:???
>>423
cgi はいいんじゃない?
最初は形に残ったほうが面白いしね。

KENTはまあ、一回参考にしてもいいかもね。
反面教師って言葉もあるし。

use strict; して↓これみとk
http://www.perldoc.jp/docs/perl/5.8.0/perlstyle.pod
427nobodyさん:2006/06/11(日) 12:24:35 ID:???
頑張って、人気投票ができるCGI作ってるんですが、プラウザの更新ボタンを押すと、
「情報を再送信しないと、ページを更新できません。「再試行」をクリックして〜」と表示され、
「再試行」を押すと、2重投稿っぽい感じに投票が行われてしまいます・・・・・。

更新ボタンを押しても、CGIにデータを送らないようにはできないでしょうか?
428nobodyさん:2006/06/11(日) 12:27:26 ID:???
そりゃブラウザが情報保持して再送信してるだけ
情報送って登録したらprint "Location: ..."すりゃ一応回避できるけど
もしくは同一IPから同一情報の登録はブロックするとか
429nobodyさん:2006/06/11(日) 12:34:09 ID:???
>>428
やっぱ同一IP、同一内容の投稿を規制するしか方法はないですか・・・ orz
ありがとうございます。
430nobodyさん:2006/06/11(日) 14:25:32 ID:???
>>423
> perl始めると共にいきなりcgi作ってるんですが、何かまずいでしょうか?

ダメとは言いませんけれど、少し不安です。
他はともかく、安全性についての配慮は忘れないでください。できる限り -Tw スイッチを使うようにしてください。ユーザという種族はいつでも、プログラムの動作にとって最も都合の悪い操作を選択的に行うものです。

> プロンプトで色々やってからcgiってのが王道?なんでしょうか?

CGI はサーバサイドプログラムの出力をサーバ応答として返す仕組なので、コマンドプロンプト (のことですよね?) 上でプログラムがどのように動作し、どんな出力を吐くのかを知っていたほうが有利であることは確かです。

> あとKENTのところのソースを参考にしてるんですが、ここでは評判悪いようですが参考にしない方がいいですか?

氏の CGI スクリプトは動作環境の範囲を広く取るために後方互換性を重視したスタイルのようです。
あなた (あるいはあなたのユーザ) がこれから何年もの間、比較的古い (and|or) 制限の多い環境を使い続けるなら、その点で参考になる部分は多いかもしれません。
431nobodyさん:2006/06/11(日) 14:27:28 ID:???
>>430
何かを翻訳したの?
432nobodyさん:2006/06/11(日) 14:40:36 ID:???
KENTについて意見の翻訳wwwww

広い動作環境ゆっても、perl4 とかのがめずらしいよな。
local だけだと全部グローバルになるせいか、少し長い script 組むとたまーにありえない挙動するから困る。
433nobodyさん:2006/06/11(日) 15:14:21 ID:???
>>432
> local だけだと全部グローバルになるせいか、少し長い script 組むとたまーにありえない挙動するから困る。

それはあなたがそのように書いたからです。
また、こういった認識は上達の妨げになるので気をつけてくださいね。
プログラムは (処理系のバグも含めて) 「書いたなり」にしか動かないことを忘れちゃいけません。
434nobodyさん:2006/06/11(日) 15:41:32 ID: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
435nobodyさん:2006/06/11(日) 15:54:20 ID:???
>>434
処理の流れがわからんのだろうかね…これは
答えを書くのは五行足らずだがそれじゃ本人のためにならないのでヒント

まず、その処理で必要なことは何かを考える
・ファイルを開いて
・一行一行読み取って
・カンマで切り分ける
・その最初の五つを取り出して
・足し合わせる

で、これをコードに落とす
ファイルを開くのは"open"(読み取るサンプルも大抵一緒に解説されてる)
切り分けは"split"、初めの五つを取りだすには"配列のスライス"辺りで検索汁
436nobodyさん:2006/06/11(日) 15:59:53 ID:???
map{}(@)の方がスマートかと
437nobodyさん:2006/06/11(日) 16:07:20 ID:???
この流れを考えられないのを相手にいきなりmapを説くか?
438434:2006/06/11(日) 16:16:01 ID:aFjDPMnZ
open(FP,"log.dat") || &error("ログファイルが開けませんでした。");
@logs=<FP>;
close(PF);

foreach $line(@logs) {
chop($line);
($atai1,$atai2,$atai3,$atai4,$atai5,$dat,$value,) = split(/\,/,$line);
if (!$line){last;}

print
"<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;」と書いてみましたが、全然駄目でした・・・

正直、自分の頭では・・・・・
439nobodyさん:2006/06/11(日) 16:19:22 ID:??? BE:79596533-#
$tasu += $atai1+$atai2+$atai3+$atai4+$atai5;
440nobodyさん:2006/06/11(日) 16:46:10 ID:???
>>439
教えていただいて申し訳ないのですが、このようにログが一番古いものしか、ちゃんと表示されません。。。。
http://ranobe.sakuratan.com/up/src/up113712.jpg
441nobodyさん:2006/06/11(日) 17:23:33 ID:???
>>440
つまりあれか、その全てに同じ値、全体の合計を表示したいわけか。
それなら二段階に分ける必要がある。
事前に合計を調べた上で、その後に表示。

>>436
reduceの処理でmapを使うのはスマートに思えないな…
$sum += $_ foreach @list[0..4];
reduce処理にはmapを使ってもそう大差無い様に思うのだけれども
442nobodyさん:2006/06/11(日) 17:28:59 ID:???
>>434
>一応自分で調べようと努力はしたのですが、検索しきれなくて・・・・・
ていうか、なんで考えないで検索しようとするんだろうね。

自分と全く同じ状況にあるコードの書き方なんて
検索してもなかなか出てくるもんじゃないのに。
443nobodyさん:2006/06/11(日) 18:00:25 ID:l/QD+3uq
444434:2006/06/11(日) 18:51:48 ID:aFjDPMnZ
>>441
ログファイルを2つに分けるってことでしょうか?・・・・ orz
ありがとうございます。やってみます。

>>442
「ファイル perl」、「open perl」等、とりあえずファイル関係で調べていました・・・ orz
445nobodyさん:2006/06/11(日) 18:59:18 ID:???
>>444
> ログファイルを2つに分けるってことでしょうか?

そうじゃなくて、1つのログファイルから内容を読み込んだ後
1. 合計を求める foreach
2. 結果を表示する foreach
の2つのforeachを書く必要がある、という事だと思うよ。
446nobodyさん:2006/06/11(日) 19:01:16 ID:???
>444
>442は
>なんで考えないで検索しようとするんだろうね。
と書いているんだが・・・お前は日本語が読めないのか?
まず日本語がちゃんと理解できるように勉強し直せ。
447nobodyさん:2006/06/11(日) 19:34:32 ID:???
2chクオリティ
448nobodyさん:2006/06/11(日) 20:44:56 ID:???
use strict;

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";

449nobodyさん:2006/06/11(日) 21:42:55 ID:???
今日Perl始めた新米なんだが、例えば
sub test {

$a = 5

}
sub test2 {

print "値は$aだお\n";

}
みたいなノリで、”test”サブルーチン内の変数を”test2”のサブルーチン内で使うことってできる?
上のだとうまく行かなくて…
450nobodyさん:2006/06/11(日) 21:57:42 ID:???
もちろんできるよ。ちゃんと定義したサブルーチンを呼び出してる?
パッケージ変数(グローバル変数)を使う時はなるべく our で宣言しておいた方がわかりやすい。
後々「use strict;」を覚えた時にこの事は役に立つはず。

our $a = 0;

sub test { $a = 5; }
sub test2 { print "値は$aだお\n"; }

test();
test2();

実行結果:値は5だお

ところで、 $a と $b はソートに使う特殊な変数なので、なるべく使わない方がいいよ。$c 以降は問題ない。
451nobodyさん:2006/06/11(日) 23:45:03 ID:???
>>449
>$a = 5
452nobodyさん:2006/06/11(日) 23:50:12 ID:???
だから、いくらサンプルなり例だったりしても$aとか$bは使うなよorz
453nobodyさん:2006/06/12(月) 00:00:13 ID:???
漢は黙って$hoge, $fuga


ただしドメインの例示だけはexample.com
454nobodyさん:2006/06/12(月) 01:00:03 ID:???
オレは$yakiniku, $oyakodon, $namahamu
455nobodyさん:2006/06/12(月) 01:01:25 ID:???
hoge fuga に続くものってなんなんかな。5つくらいだしたいときって例に悩むわ。
foo bar だと baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud とかあるんだけど
456nobodyさん:2006/06/12(月) 01:02:57 ID:???
>foo bar だと baz, qux, quux, corge, grault, garply, waldo, fred, plugh, xyzzy, thud とかあるんだけど
初めて知った
457nobodyさん:2006/06/12(月) 01:12:21 ID:???
$hoge, $fugaみたいなのって意味あるのかな?
それともただ"ほげほげふがふが"?(ダレてるときの擬音??)

そういえば変数名でよくみかける$lnがピンとこない。
$imgとか$cntだったらパッとみて内容を想像できるんだけど
lnは何を略してるんですか!!
入ってる内容から察するにlineですかね?(´・ω・`)
458nobodyさん:2006/06/12(月) 01:29:00 ID:???
>>455
もう一つだけならpiyoかmogeか、かな。しかしあわせて検索すると恐ろしく件数が減る罠

>>456
RFC3092読んどけw
459nobodyさん:2006/06/12(月) 01:33:49 ID:???
$a、$bを使うことで何か弊害が?
っていうやりとりに繋がっちゃうか恐れてたけど無駄に終わってよかったですw
460nobodyさん:2006/06/12(月) 02:08:47 ID:???
461nobodyさん:2006/06/12(月) 03:44:18 ID:???
>>457
そうか、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 とか使ってみたす。
462nobodyさん:2006/06/12(月) 03:49:56 ID:???
>>433
お前ちょっと、CODE COMPLETE読め。
463nobodyさん:2006/06/12(月) 03:51:21 ID:???
>>457
line か length だろね。
length とか割とよく使うのに長いんだもんな。
464nobodyさん:2006/06/12(月) 17:44:14 ID:m4uvfRE1
質問です。

配列@sclArrayには
@sclArray = (●●大学,△△大学,●●大学,□□大学,●●大学,XX高校・・・);
というような形で200種、1,000件くらいの学校名が入っています。

これを

%schHash = (
●●大学=>'15',
△△大学=>'8',
□□大学=>'7',
XX高校=>'14',
・・・
);

という形にしたいのですが、根本的にやりかたがわかりません。
調べ方が悪いのかgoogle様にお伺い立てても出てきません・・・

よろしくお願い致します。
465nobodyさん:2006/06/12(月) 17:54:14 ID:??? BE:123816072-#
もうちょっと何がしたいのか具体的に
466nobodyさん:2006/06/12(月) 17:55:56 ID:???
>>464
その数字の意味はエスパーを御所望か
$schHash{$_}++ foreach @sclArray;
467nobodyさん:2006/06/12(月) 18:11:03 ID:???
googleにも聞きようが無いじゃん。
自分で考えろってこった。
どうも考える事を放棄して、ぐぐってる人が多いよね。
468278:2006/06/12(月) 19:04:02 ID:???
すみませんソートについてもう一度お教えください

前回、配列にするということでご指導頂き、ソートはできました
それでなんですが、実はもう一個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}};
}
469nobodyさん:2006/06/13(火) 00:52:20 ID:???
>>464
大学ごとに固有の識別番号が決まっているのでしょうか?
それとも入試合格ラインの偏差値のようなデータ?
大学名と番号の対応が、名称から番号を導けるような規則性を持っていないのなら、
元となるデータなしに自動的に番号の入ったハッシュを作るのは不可能なんじゃないですか。
その対応はExcelの表かコンマ区切りテキストか何かの形で手元にあるのですか?
470457:2006/06/13(火) 01:17:24 ID:???
>>463
なるほど。コード読むとき少し楽になりそうです。アリトゥース!!

>>464の数字は配列内での同じ学校名の登場回数と推測。
けどおれのスキルでパッと思いつくのはパターンマッチごにょごにょ・・・
ハッシュのキーごとにインクリメントごにょごにょ・・・が精一杯orz
↑まったく当たっていないかも
471nobodyさん:2006/06/13(火) 05:43:37 ID:???
>>468
同時に比較すればいいんでね?

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
472nobodyさん:2006/06/13(火) 06:10:34 ID:???
>>468
とりあえずこれ。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_sort_an_array_by__anything_

ググればもっといいドキュメントが出てくる。
473nobodyさん:2006/06/13(火) 08:04:09 ID:???
>>470
後者で行うのが一般的

>>471
<=>とcmpは両辺同じだったら0を返すからorや||で繋ぐだけでいい
474468:2006/06/13(火) 12:07:21 ID:???
有り難うございます
これは難しい・・・
475468:2006/06/13(火) 12:34:52 ID:???
まずこれから教えてください
1行のラインが
<>a<>b<>c<>d<>e
という風に、要素が<>で区切られ、それが格納された@dataがあるとします
この中の2つの要素でソートしたいのです、要素には同じ値もあります

2つのkeyをどういう風に考えハッシュを作ったらいいのでしょう?

大変初歩的で申し訳ありませんが、リンク先をプリントしていくら
読んでも簡単に理解できません。
476nobodyさん:2006/06/13(火) 12:55:07 ID:???
>>475
無理を承知でお願いします。
どうかうちのバカ息子に因数分解を教えてやってくれませんか?
何度教科書を読んでも理解できないって言うんです。
そのくせ、友達が「こうじゃない?」って親切にヒント出してくれてるのに
無視したりするような非常識な子で…でも、根は優しい良いコなんです。

ちなみに、息子は足し算と引き算はできるらしいんですが
掛け算と割り算はよく分かってないようです。
だから、まず掛け算から教えて欲しいそうです。
おそらく相当な時間が掛かると思いますが、
どうかタダで息子が納得できるまでお付き合い下さいますようお願い申し上げます。
477nobodyさん:2006/06/13(火) 13:15:40 ID:???
>475
> リンク先をプリントしていくら
> 読んでも簡単に理解できません。
理解できるまで何百回でも読んでください。
478nobodyさん:2006/06/13(火) 13:21:15 ID:???
なんでハッシュとかいう言葉が出てきたのかわからねえw
結果としては >>471 で既にできてるじゃんな。それすら理解してないのかね?
479468:2006/06/13(火) 14:10:46 ID:???
すみません、他の作業しながらしばらく自習してきます
480464:2006/06/13(火) 18:12:16 ID:???
「(何種類でてくるかわからない)大学名と、
その大学名の出現回数をハッシュにしたい」でした。
質問が悪くてごめんね。

>>466であっさりできました。
ありがとう。
481nobodyさん:2006/06/13(火) 22:03:14 ID:???
>>468
少しはググった?
「perl sort 複数 項目」でぐぐれば、コピペプログラミングできる程度の情報が出てくる。
482nobodyさん:2006/06/14(水) 00:39:55 ID:???
綺麗な書き方をしていて、誰にでも見やすいcgiがあったら参考にしたいのですが、無いでしょうか?
他人が見ても何をやってるか分かるプログラムを書きたいのですが、汚い書き方が身についてしまい困ってます。
簡単なBBS程度のものだと助かります。
483nobodyさん:2006/06/14(水) 01:15:45 ID:???
>>482
「KENT」で検索すれば、掲示板関係を色々配布している人のサイトがあるよ^^
484nobodyさん:2006/06/14(水) 01:20:32 ID:???
個人的に結城さんのコードとか読みやすくて好きだなぁ。
use strict; しつつCPANモジュールを駆使したCGI。

Tropy のソースはタイ変数が使われてて面白い。
http://www.hyuki.com/tropy/

YukiWikiMini は200行ぐらいでWiki書いてる。こちらもなかなか。
http://www.hyuki.com/yukiwiki/mini/index.html

コメントが少ないから、ちょっと難しいかも。
485nobodyさん:2006/06/14(水) 02:11:28 ID:???
>>483
ちょwwwwww
486nobodyさん:2006/06/15(木) 12:01:24 ID:???
[ main.cgi ]

#!/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で読み込むと必ずエラーになってしまうのですが、どうしてでしょうか?
487nobodyさん:2006/06/15(木) 12:08:41 ID:???
requreは真の値を返さないとダメでした…。

1;か。
488sage:2006/06/15(木) 21:58:51 ID:gFTNSvnG
最近Perlはじめたのですが、
Perlで

print $cgi -> header(-charset=>"EUC-JP");

と記述したのですが、作ってブラウザーでみると
文字化けしてます。。。
ブラウザーの「表示」→「エンコード」を見ると
西ヨーロッパ言語が設定されてます。。。
これをEUC−JPに直すと文字化けしないのですが、
どうやれば、最初から文字化けしないようにできるのでしょうか?
489nobodyさん:2006/06/15(木) 22:14:33 ID:???
>>488
多分、HTMLの出力もCGIモジュールを使ってると思うんだけど、出てきたHTML見て見れ。
start_htmlのほうで何も指定しないとlang=en-USのcharset=iso-8859-1になる。

ということで
start_html(-encoding => "EUC-JP", lang => "ja")
490nobodyさん:2006/06/15(木) 22:18:23 ID:???
未だに print "content-type: text/html;charset=euc-jp\n\n"; と書きたくなってしまう俺はオールドスタイル…
491489:2006/06/15(木) 22:27:19 ID:???
あ、ごめんlangのほうに-が抜けた。-langに脳内置換頼む。

ところでふと気づいたけれど、CGIモジュールって
Content-Typeのmetaタグよりtitleのほうが先に来ちゃうのね。
エンコーディングの指定を一番最初に書くことが推奨されてたと思ったけれど・・・
492nobodyさん:2006/06/15(木) 22:27:38 ID:???
>490
別にそれでいいじゃん
それぐらい手前で出力しろとか思うわけよ
493nobodyさん:2006/06/15(木) 23:08:38 ID:???
>>489-491
なんか文字化けしたままなんですが。。。
レスついたことに(^人^)感謝♪
いわれた辺りをいじってみます。
ありがとうございました。
-------
print $cgi -> header(-cahrset=>"EUC-JP");
print $cgi -> start_html(-title=>$title,
-BGCOLOR => $bg,
-TEXT => $fg,
-encoding => "EUC-JP",
-lang => "ja",
);

-----------
といいつつ
ソース載せてみた。。。orz
494nobodyさん:2006/06/15(木) 23:28:00 ID:???
>>493
-cahrsetになってる…
495nobodyさん:2006/06/16(金) 00:24:31 ID:???
cgi以下のディレクトリのファイルの存在を参照したい時どうしたらいいのでしょうか?

$check = 'デイレクトリ名/ファイル名';
if (-e $check){
&sonzai
}

上記のようにしてやってみましたがどうもifをスルーしてelseのルーチンばかり実行してしまいます。
496nobodyさん:2006/06/16(金) 01:15:09 ID:???
CGIはどこのディレクトリで動いてんだ
497nobodyさん:2006/06/16(金) 01:15:42 ID:???
>>496
>cgi以下のディレクトリのファイル
と書いてあります
498nobodyさん:2006/06/16(金) 05:13:12 ID:???
スクリプトの動いてるディレクトリと調べたいファイルのディレクトリを考えましょう
499nobodyさん:2006/06/16(金) 08:01:47 ID:???
./だろ?
500nobodyさん:2006/06/16(金) 08:42:03 ID:???
いや、mod_perl で動かしてるのかもわからないぞ…!
501nobodyさん:2006/06/16(金) 08:44:36 ID:??? BE:185724173-#
sjisの嫌な予感が…
502nobodyさん:2006/06/16(金) 08:53:11 ID:???
いや、まさかぁ
マルチバイトのファイル名をつける超絶バカは居ないでしょ…
503nobodyさん:2006/06/16(金) 09:06:03 ID:???
>>502
マルチバイトのファイル名を扱う業務も普通にあるぞ。
もちろんフリーソフトを使って英数字にリネームしてから作業しても構わないわけだが、
全部Perl一本で済ませたいタイプの俺としては非常に面倒いのだ。
504nobodyさん:2006/06/16(金) 09:07:12 ID:???
そろそろKENTが使ってるif{}elsif{}elseから抜け出したいと思ってるんですが、
皆さんって最初の大まかな処理分岐ってどうやってますか?

今、テストで1関数で1ファイルで作って
eval{
  require '$in{exec};'.'.pl';
  &$in{exec};
}
の様に呼ぼうかと思ってるのですが(エラー処理とかばっさり切って略記しました)、
この考え方よらもスマートなやり方があったら教えて頂ければ幸いです
505nobodyさん:2006/06/16(金) 09:23:19 ID:???
if 文使うと低レベル みたいな言い方なのはなんなんだw
506nobodyさん:2006/06/16(金) 09:31:11 ID:???
大まかならif elsif elseだな。
まぁperlsynでも読めみたいな。
507nobodyさん:2006/06/16(金) 10:11:47 ID:???
>>505
KENTが使ってるから低レベルにみえるんジャマイカ?
508nobodyさん:2006/06/16(金) 10:18:29 ID:???
アッー!!
509nobodyさん:2006/06/16(金) 10:20:03 ID:???
「if」も悪くないでしょ、処理速度が遅いわけじゃない
長くなってもわかりやすければそれに越したことはないし、
作成したスクリプトを他人が触る可能性があれば
その方が管理委託しやすいしね
510nobodyさん:2006/06/16(金) 10:25:22 ID:???
>>507
まあKENTがアレなのは認めるし笑えるんだが、
if 文や local 自体は全然悪くないぞ >>504
うちには関数 (サブルーチンのことだと解釈したが) ひとつひとつを1ファイルにするとかのが面倒でありえないw
511nobodyさん:2006/06/16(金) 10:34:11 ID:???
eval使うくらいならelsif
512nobodyさん:2006/06/16(金) 12:51:25 ID:???
僕は建都とか救援とか改造しやすくて好きですけどね
サブルーチンを使い回しまくっていると、結局条件分岐
を入れ込む回数が増えて大変だから
HTMLの構文エラー等はなくして欲しいけど
513nobodyさん:2006/06/16(金) 13:21:21 ID:???
救援ってどこだ?(’’
514nobodyさん:2006/06/16(金) 13:25:39 ID:???
rescueでしょ
515nobodyさん:2006/06/16(金) 13:57:10 ID:???
>>514
thx 見たことなかったので見てきた。

すごいなこれw
KENTは perl4 とか過去のでも動くように、とかでしょうがないのかなとも思っていたけど、
ここは1年前作った 5.6 以上推奨のでもまったく同じ書き方でしたw
まあわかりやすいっちゃわかりやすい・・・のかな。
516nobodyさん:2006/06/16(金) 14:18:31 ID:???
KENTとかのは無駄にファイル分割したオブジェクトバリバリ指向のものよりも
妙にレスポンスだけは良かったりするから困るw
517nobodyさん:2006/06/16(金) 14:48:05 ID:???
基本を学ぶにはいいんじゃね?
簡単なものならフルスクラッチしたほうが早い場合もあるし。
518nobodyさん:2006/06/16(金) 15:16:01 ID:???
性器表現を使って、空白文字のトリミングを行いたいんですが

$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;

というふうにやると $timp が空になってしまいます。
どうしたらよいでしょうか。
519nobodyさん:2006/06/16(金) 15:18:08 ID:??? BE:176880645-#
アッー
520nobodyさん:2006/06/16(金) 15:22:19 ID:???
$timp =~ s/^\s*(.*?)\s*$/$1/mg;
521nobodyさん:2006/06/16(金) 16:17:30 ID:???
>>520
ありがとう。これかっこいいです。
522nobodyさん:2006/06/16(金) 16:29:57 ID:???
標準出力と標準でない出力を等価に扱いたいんですが

今は 出力する前に
if( $flag==1 ){ open(NKFOUT, "| nkf"); }
とやっておいて、出力時に
if( $flag==1 ){ print NKFOUT "ちんこ"; }
else { print "ちんこ"; }
とやろうと思うのですが、ちょっと
523nobodyさん:2006/06/16(金) 16:34:42 ID:???
性器表現を使って、空白文字のトリミングを行いたいんですが

$timp =~ m/^\s*(.*)\s*$/g;
$timp = $1;

というふうにやると $timpo が空になってしまいます。
どうしたらよいでしょうか。
524nobodyさん:2006/06/16(金) 16:36:13 ID:??? BE:265320465-#
チンポが定義されてないからじゃー!!
525nobodyさん:2006/06/16(金) 16:37:56 ID:???
ネタにマジレス乙。











正直嬉しかったぞw
526ヽ(´ー`)ノ ◆.ogCuANUcE :2006/06/16(金) 16:46:15 ID:???
>>522
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 を読むと良い。
527nobodyさん:2006/06/16(金) 16:59:43 ID:???
>>526
ありがとう。それを参考に
if( $flag==1 ){ open(STDOUT, "| nkf"); }
とやったらだいたいうまくイキました。
528nobodyさん:2006/06/16(金) 17:31:55 ID:???
<input type="text" name="F" value="&">
で送ったFと
<input type="text" name="F" value="">
に & を入れて送ったF
って違いますよね?
529nobodyさん:2006/06/16(金) 17:33:13 ID:???
ああ、失礼。
&→&amp;
530nobodyさん:2006/06/16(金) 17:36:21 ID:???
同意を求めないでください!><;;

HTMLなら表示されてる通り送られると思う普通。
531nobodyさん:2006/06/16(金) 17:45:41 ID:???
普通のブラウザならURL中の&amp;は自動的に&に置換するから一緒じゃないか?

試せばすぐ分かることに対してまじめに答える気にはならん
532nobodyさん:2006/06/16(金) 17:46:42 ID:???
#!/usr/local/bin/perl

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;

下のフォームに&amp;と入れて送信するとあら不思議。
同じような挙動をする文字を知りたいんですがどこかにドキュメントありませんか?
533nobodyさん:2006/06/16(金) 17:49:12 ID:???
×<input type="text" name="111" value="&"><br>
○<input type="text" name="111" value="&&"><br>
534nobodyさん:2006/06/16(金) 17:49:56 ID:???
ご、ごめんなさい><
◎<input type="text" name="111" value="&amp;"><br>
535nobodyさん:2006/06/16(金) 18:04:29 ID:??? BE:318384094-#
ヒント:文字参照
536nobodyさん:2006/06/16(金) 18:16:46 ID:???
スレ違い…と言おうと思ったけれど、深読みしてPerlコーディングの話と考えてみる。
$hogeにはブラウザから送られてきたのをデコードしただけの物が入っていて、
print <<END;
<form method="post">
<input type="text" name="hoge" value="$hoge"><br>
<input type="submit">
</form>
こんなことをやって、&が入っていたら&に変わっちゃう…とかいう理由での質問なんじゃないか。
HTMLに流し込む前に実体文字参照に変換汁。
$hoge =~ s/&/&amp;/g;
$hoge =~ s/</&lt;/g;
$hoge =~ s/>/&gt;/g;
$hoge =~ s/"/&quot;/g;
# というかこれを知らないなら、頼むから公開するCGIなんか作らないでくれよ…
# XSS脆弱、下手するとScript Insertion脆弱だから…
537nobodyさん:2006/06/16(金) 18:40:41 ID:???
>>535
ありがとうございます!!
マークアップ記号、Laten-1、ラテン拡張とアクセント記号までは
&があっても直接変換されるようですね。

>>536
そうです、受け取り側での処理に影響するのか?という部分です。
ただし変換自体が問題ではなく、2回以上変換する場合が気になったんです。
というのもHTML::FillInFormの中で変換されてるっぽくて
先に変換かませるとひどいことに・・・
いろいろ試しているうちに上記の実態参照も考慮するべきか悩んだ次第であります。
538536:2006/06/16(金) 19:30:41 ID:???
>>537
スマソ、ちょっとレベルを低く見すぎた。しかしそういうことは初めに(ry
混乱してるだけだと思うが、そう悩むことではないと思うぞ。

まずCGI側がFormに流し込む、生のテキスト「&amp;」を持っているとする。
HTML::FillInFormは生のテキストをHTMLに変換する。「value="&amp;amp;"」
で、ブラウザはHTMLを解釈して元のテキストに戻してからフォームを表示する。[&amp;]
Submitされると"生のテキストを"URLエンコードなり何なりしてCGIに送り返す。「hoge=%26amp%3B」
で、CGIはURLエンコードのデコード処理をして、生のテキスト「&amp;」を受け取ることになるわけだ。

なぜに二回以上変換するようなことになるのかな…
539nobodyさん:2006/06/16(金) 19:51:08 ID:???
>>538
非常に混乱しております・・・
2回以上の変換なんですが、実はTTのPluginでFillInFormを使ってるんです。
他で変換しないと生のデータとFillInFormで変換されたデータが混在してしまって。
TTのタグでひとつひとつFILTERつければ回避できそうではありますが
できれば一元管理したいなあと・・・。
クエリを受け取った段階で変換してみたらFillInFormで不具合。
TTに渡す時点で変換すれば良さそうですが、データ構造が結構深いんです・・・
540nobodyさん:2006/06/16(金) 23:41:05 ID:???
>>516
perlはオブジェクト指向の書き方すると遅くなるのは当然。
「ハードの性能がどんどん上がってるからかまわない」なんて言い訳してるが、
簡単なスクリプトの時にperlでオブジェクト指向の書き方するのはやめたほうがいい。
みんなKENTをけなすが、実はKENTはそれほど悪くないのかもしれない。

こういうと、きっと「コードの再利用が...」「保守のしやすさが....」って言い始めるヤツが必ず出てくる。
でもあの程度の規模だと、動作速度以外にも、理解しやすさとか、動作に必要な条件を考えると
必ずしも悪いと言い切ることは難しいんじゃなかろうか?
541nobodyさん:2006/06/17(土) 00:24:46 ID:???
> 理解しやすさとか、
どうやったらあんなコードになるのか理解できない。
542nobodyさん:2006/06/17(土) 00:25:29 ID:???
このジョークのことかーっ
ttp://www.lri.fr/~filliatr/evolution

ごめんなさい。言ってみたかっただけです。
543nobodyさん:2006/06/17(土) 00:28:14 ID:???
>>540
> perlはオブジェクト指向の書き方すると遅くなるのは当然。

デマですね。
544nobodyさん:2006/06/17(土) 00:29:58 ID:???
デマであるというソースが欲しい
545nobodyさん:2006/06/17(土) 00:30:49 ID:???
そもそも

> perlはオブジェクト指向の書き方すると遅くなるのは当然。

というソースが欲しい。
546not 540:2006/06/17(土) 01:52:07 ID:???
ダミアン・コンウェイ著オブジェクト指向Perlマスターコースのはじめにかな?
んー、でも、それほど問題になる部分じゃないと思う。
547nobodyさん:2006/06/17(土) 01:55:18 ID:???
>>545
残念ながら、実行速度に関してだけは >>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

オブジェクト指向は遅いというのは共通認識だと思っていたのだが。

だがオブジェクト指向は実行速度を上回るメリットがある。
548nobodyさん:2006/06/17(土) 02:06:34 ID:???
自クラス AUTOLOAD
親クラスのサブルーチン
親クラスのAUTOLOAD
UNIVERSAL のクラスのサブルーチン
と探すんだから多少は遅くなるのは仕方がない
549nobodyさん:2006/06/17(土) 02:07:45 ID:???
>>547
オブジェクト指向型プログラミングがバカみたいに遅いのは
インタプリタ言語特有の問題だな

コンパイルすれば、かなりその差はちぢまる
550nobodyさん:2006/06/17(土) 02:31:10 ID:???
>>549
でも結局は遅いんでしょ?
551nobodyさん:2006/06/17(土) 02:34:36 ID:???
>>547
メリットって何?
改造したり再利用しないし。
速いならそれでいいじゃん。
552nobodyさん:2006/06/17(土) 02:52:44 ID:???
>>551
お前はしないのかもしれないが、他の人間はするんだよ。
第一、スクラッチから書く人間の労力だって圧倒的に違う。
553nobodyさん:2006/06/17(土) 03:20:47 ID:???
>>550
うまく作れば 気のせい 程度にはなる
554nobodyさん:2006/06/17(土) 04:45:08 ID:???
>>540
そそw
いきなりメソッド呼んで、このメソッドはどのファイルにあるのかな?
これかな?誤爆。。なんて事をするくらいなら、1枚板のKENTの方が
改造なんかも手早くやりやすい。
しかもダメと叩かれる部分を修正してやると、さらに体感速度が上がるのも
教材に適してるような…w
555nobodyさん:2006/06/17(土) 05:44:41 ID:4rge2G1J
しかしそれで複数メンバーでの開発には適さない。
どこになにがあるのかを説明するより、モジュールリストを共有するほうが効率がいい。
今はひとりでやってるからいいかもしれないがちょっとは先を見ることを勧める。
体感なんてそんな変わらんから、規模の大きい開発の手間のほうが重要。
556nobodyさん:2006/06/17(土) 05:45:31 ID:4rge2G1J
ごめんねパパ酔ってるからごめんね
557nobodyさん:2006/06/17(土) 06:31:48 ID:???
>>547 のURLのベンチは面白かった。



まあ、なんていうか、
それ以外に、

オブジェクト指向では、use とか require したときの速度が遅いのが結構ネックでな。
mod_perl はその時間が減るからいいんだけど。



関数呼び出しが 1.5倍遅い、とか言っても、
それ自体は 1秒間に 45万回 か 64万回 かって違いで、ほとんど気のせい程度の時間でしょ。
問題は何回も実行する、例えば値を取得する param() 呼び出しとかなんだろうね。
それでも param() 程度なら 1000回実行して 0.01 秒か 0.002 秒の違いなんだけど。

つまり、OOPが悪いっていうけど、require とかの時間を考えなければ、そーそー体感で変わるもんじゃないと思う。
実際は他のトコで無駄省いたりして速くするようにすれば、そっちのが変わりそうだよね。
558nobodyさん:2006/06/17(土) 06:33:38 ID:???
なぜか改行が増えてる orz
Jane で書き込むとたまにこうなるんだよなあ・・・。 スペース無駄にしてスマソ。
559nobodyさん:2006/06/17(土) 07:01:46 ID:???
自称KE○Tよりまともってスクリプトを拾ってきて展開してみると
作者が再利用しやすいってだけの分割されたスクリプトファイルが
20〜30個って事が結構あるぞ?
しかもKENT製を静的なページを表示するのと同じレベルで実行できる環境で
実行してみると多少の引っ掛かりを感じる。
しかもファイルが分割されてるのにpackageはmainのままだったりするから、
mod_perlで修正することなく動いてもファイルシステム上の位置が変わると
別キャッシュになってメモリを馬鹿食いに。
560nobodyさん:2006/06/17(土) 07:12:57 ID:???
> スクリプトファイルが20〜30個
> ファイルが分割されてるのにpackageはmain

全然まともなスクリプトじゃねえよw さすが自称www
561nobodyさん:2006/06/17(土) 07:54:09 ID:???
>>559
こう言う人たまに見かけるよね。
ファイルを分割したりモジュール使うことがオブジェクト指向だと思ってる人。
他にも sub 使えば関数指向だと思ってる人とかさ。
562nobodyさん:2006/06/17(土) 09:33:44 ID:???

正規表現について質問です。

たとえば、 'abc' 以外の全ての文字にマッチする場合はどのように書けばいいでしょうか。

acb にはマッチします。
abcaa にもマッチします。
aaabc にはマッチしません。


m演算子の真偽の逆転ではなくて、正規表現内で解決する必要があります。
563nobodyさん:2006/06/17(土) 09:47:34 ID:???
前方一致 とかでぐぐってみたら。
/.(?!abc)/ こういうのね
564562:2006/06/17(土) 10:01:24 ID:???
>>563
前方一致とかじゃ無理な気がする…って思ってたけど、できるんですね。すんません。
なんか正規表現超苦手です。。。頭いたくなるぜ。

/^(.(?!abc))+$/

まだ試してないけどたぶん大丈夫な予感です。ありがとうございますた。
565nobodyさん:2006/06/17(土) 10:05:24 ID:???
>>564
まあ /^(.(?!abc))+$/ だと 文字列の最初が abc だとマッチしちゃうけどね。なんとかがんばって。
566nobodyさん:2006/06/17(土) 11:22:56 ID:??? BE:477576869-#
正規表現ってか…これってPerlの独自拡張じゃなかったっけ
567nobodyさん:2006/06/17(土) 12:38:20 ID:???
Catalyst(+TT)に慣れると楽で戻れないが、これをCGIで毎回
キックするのはムリなのは確かだね。必要なファイル読むだけで
しばらくかかるし(笑) レン鯖でCGIしか使えない人は残念でした。
568nobodyさん:2006/06/17(土) 15:58:17 ID:YHZ73bls
なんか暇つぶしに遊びプログラムで作ろうかと。
あんまり複雑なのだと遊びじゃなくなるので。

15分くらいで作れる、簡単だけど面白いのってなんかないかな。
アイデアくだなさいあな。
569nobodyさん:2006/06/17(土) 16:00:34 ID:???
>>568
tropyクローンなんかどう?
570nobodyさん:2006/06/17(土) 16:03:45 ID:YHZ73bls
>>569
なんですかそれ?
ちょっと検索してみますよ。
571nobodyさん:2006/06/17(土) 16:03:46 ID:???
>>569
うちもそれ思ったw
でも 15分で作れるかなあ。>>568がんば。
572nobodyさん:2006/06/17(土) 16:06:57 ID:YHZ73bls
なにやら難しそうな。
以前にショッピングカートを作ったんです。
もう覚えてないのでそのレベルでさえ遊びにならない。

すごい低級になるんですが、低級なりの楽しみ方がないかなと。
少しづつ拡張できるようなのでもいいかなと。

う〜ん。スレ違いっぽ。とりあえずこれにて書込みはおしまいにします。
何かアドバイスが見には来ますのでありがたく。
それでは。
573nobodyさん:2006/06/17(土) 18:17:27 ID:???
tropyクローン なら、はてなおやのがあるじゃん。
書き方おかしいけど。
574nobodyさん:2006/06/17(土) 20:51:25 ID:???
ハテナオヤのはCatalyst使うじゃん。インストール面倒だよ。
結城のオリジナルのクローンを書くほうがほうがシンプルだし勉強目的にはちょうどいい。
575nobodyさん:2006/06/17(土) 21:20:25 ID:???
> ハテナオヤのはCatalyst使うじゃん。インストール面倒だよ。

そうなの? CPAN コマンドで簡単に入ったんだけど。
576nobodyさん:2006/06/17(土) 22:42:28 ID:???
質問ー。
外部モジュールを使わないで UTF8フラグをつけたり、ついてるかどうか検査したりするのってどうしたらいいんですかね?

どっかに誤爆したのは内緒w
577nobodyさん:2006/06/17(土) 22:55:42 ID:???
>>576
utf8::*はそもそも外部モジュール不要
utf8::is_utf8
578nobodyさん:2006/06/17(土) 22:58:03 ID:???
>>576
言い忘れ。utf8::以下についてはテンプレの[Perl5.8Unicodeメモ]参照
utf8プラグマと混同しないように。
579nobodyさん:2006/06/17(土) 23:03:30 ID:???
>>577
え、まぢで? v5.5 とか 5.6 でもできる?
ピンクのサイトの方は見てたんだけど、v5.8 だったkら・・・
580nobodyさん:2006/06/17(土) 23:17:27 ID:???
v5.5てのが5.005のことだとすると、まだutf8関係の機能が入る前だから
そもそもutf8フラグはありません。
581nobodyさん:2006/06/17(土) 23:42:47 ID:???
>>580
ううーん、そうなのか・・・。
情報ありがとうー。
582nobodyさん:2006/06/18(日) 02:12:27 ID:LFB3TFsx
$LOGPATH = './logs/';# ログ保存ディレクトリのパス
$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;
}
583582 583:2006/06/18(日) 02:13:02 ID:LFB3TFsx
>>582のプログラムで
$delfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
となぜ形成してるんでしょうか??
消すためにはいちいち作らないとだめなんでしょうか??
これを消したとしても$logfile にログは残るんじゃないでしょうか??
584nobodyさん:2006/06/18(日) 02:38:28 ID:???
>>583
$logfile と $delfile はファイル名が違う。

$logfile は新規のログのファイル名
$delfile は何日か前のログのファイル名

コメント読もうよ。
> # 古いログファイルの削除
とあって、
> $tm -= $EXPIRES * 60 * 60 * 24;
で数日前の日付を出してる。
585583:2006/06/18(日) 03:08:41 ID:Kocek/q+
いやそれはわかるんですが
古いファイルを作ってなぜまた消すんでしょうか?
586nobodyさん:2006/06/18(日) 03:11:44 ID:???
> 古いファイルを作ってなぜまた消すんでしょうか?

どこで古いファイルを作っていることにしたいんだろう。
587nobodyさん:2006/06/18(日) 03:16:15 ID:Kocek/q+
>>583の最初の行です
588nobodyさん:2006/06/18(日) 03:17:00 ID:???
> >>583の最初の行です

って、

> >>582のプログラムで

これ?
589nobodyさん:2006/06/18(日) 03:23:31 ID:???
ファイルを作るのとファイルの名前を作るのを近藤してるとか?
590nobodyさん:2006/06/18(日) 03:24:41 ID:???
それにしてもそのスクリプトだと、”チョウド3日”目にアクセスされないと
不要なログファイルがドンドン溜まっていきそうな気が・・・
591583:2006/06/18(日) 03:38:10 ID:Kocek/q+
>>588
いえ二行目です
>>589
そうなんでしょうか?
>>590
そうなんです
このスクリプトは
592nobodyさん:2006/06/18(日) 03:57:55 ID:???
$delfile = sprintf(
"$LOGPATH%04d%02d%02d.dat", $year, $mon, $mday);
で3日前のファイル名を$delfileに入れている。
unlink $delfile;
で3日前のログファイルを実際に消している。

>>$logfile にログは残るんじゃないでしょうか??
それはその日のログなので残してOK
593nobodyさん:2006/06/18(日) 07:30:51 ID:???
なぜ、連想配列の連想をhashというのでしょうか

あ、hashが先か
なぜhashを連想と訳すのでしょうか

どうして? 細切れ=連想なの? 教えて!
594nobodyさん:2006/06/18(日) 09:14:10 ID:???
現在は連想とは呼ばない罠
あと正確には 連想配列=hash変数 ではない。
595nobodyさん:2006/06/18(日) 11:00:31 ID:???
まじ? じゃあ今はなんと呼ぶのがトレンドなの?
596nobodyさん:2006/06/18(日) 11:21:18 ID:???
まあ、連想配列でも間違いではない気がするけどなあ。
perl の連想配列は内部でハッシュ法が使われているからだろうけど、
配列みたく入れた順番に取り出せないし、みんな区別して ハッシュ って呼ぶ気がする。
597nobodyさん:2006/06/18(日) 12:02:53 ID:Kocek/q+
>>582ー583のもんです

>>582ー592まで質問してたんですが
古いログはlogsというファイルに残ったままにならないんでしょうか?
598nobodyさん:2006/06/18(日) 12:13:01 ID:???
>597
>584-592を百回読み直せ。それでも理解できないようならとっとと市ね。
599nobodyさん:2006/06/18(日) 12:16:51 ID:Kocek/q+
死んできます
600nobodyさん:2006/06/18(日) 17:41:34 ID:???
質問があります。

ファイルから文章を読み出して正規表現でマッチングしようとしてるんですが
「ー」文字が入る単語をマッチング条件とするとエラーがでてしまいます。
-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.

原因がまったく分からず困っています。どなたかご教授下さい。
601nobodyさん:2006/06/18(日) 17:42:09 ID:???
EUCでやれ
602nobodyさん:2006/06/18(日) 17:49:00 ID:??? BE:53064623-#
\Q\Eでも入れとけ
603nobodyさん:2006/06/18(日) 17:52:27 ID:???
文字コードの違いが問題のようですね
参考になりそうなサイトをいくつかググって探せたので、調べながら頑張ってみます。
ありがとうございました
604nobodyさん:2006/06/18(日) 18:24:16 ID:???
HTML作成したアンケートフォームから送信したキーとデータを
ハッシュに格納してそこからCSVに出力したいのですが、
ハッシュからキーとデータをCSVに出力すると順番がランダムになってしまいます。
キーとデータを自分の意図した順番通りにCSVに出力するにはどうしたらいいのでしょうか?
sort関数を使用しても辞書順にしかならないので、意図した通りの順番で
CSVに出力することが出来ません。

どなたかアドバイスをください。よろしくお願いします。l
605nobodyさん:2006/06/18(日) 18:27:52 ID:???
>>604
1. 並べたい順にキーを並べた配列を作る
2. 1. の配列をforeach か何かで回してハッシュを引く
3. CSVに出力

606604:2006/06/18(日) 18:31:47 ID:???
>>605
即レスありがとうございます。
試してみます。
607600:2006/06/18(日) 19:21:32 ID:???
>>601,602
フォームからcgi起動してフォームから送られた単語に基づいて検索するサイトを作ってたんですけど
アドバイス頂いた事を元に、cgiとHTMLフォームのソース、検索元csvファイルをEUC-JPに変換したらうまくいきました。

初歩的な質問だったようですけど、お答えいただきありがとうございました。
608nobodyさん:2006/06/18(日) 20:05:50 ID:???
>>607
ユーザ入力をメタキャラクタも含めてそのままパターンに取るような CGI を晒しておくと、イイカンジにアッー! されて色々と被害をまき散らしたりするんで安全性について要再考。取り急ぎ。
609nobodyさん:2006/06/18(日) 20:27:30 ID:???
>>608
気をつけます。調べてみたんですが、

つまりデータとしてとりたい文字列がperlプログラム上で特別な意味を持つ文字になってしまって
プログラムが意図しない動作をする可能性があるってことですよね
610nobodyさん:2006/06/19(月) 12:44:33 ID:???
>>593
連想配列(associative array)をラリーウォールが勝手にhashと名づけた。
けど、それに賛成できない訳者がそのまま連想配列と訳した、とか?
611nobodyさん:2006/06/19(月) 14:25:24 ID:???
>>610
をいをい、あんまり勝手な事言わんでよ。
逆なら分かるけど。
612nobodyさん:2006/06/19(月) 14:36:59 ID:???
、とか?
、とか?
、とか?
妙な推測するほうもアレだが
釣られるほうもアレ。
613nobodyさん:2006/06/19(月) 14:37:54 ID:???
>>612
ヒント:おまえも釣られてる
614nobodyさん:2006/06/19(月) 14:38:47 ID:???
アッー!
615nobodyさん:2006/06/19(月) 14:40:28 ID:???
以上自演でしたまる
616nobodyさん:2006/06/19(月) 15:13:28 ID:???
ファイルを開くときは

open(FILE, "$file") or die "エラーだ";

みたいな感じでdie使うもんだと思ってて深く考えたことなかったんだけど
これって、何かモジュール入れてないとエラーメッセージは表示できない?
単にInternal Server Errorが返されるだけなんだけど。
617nobodyさん:2006/06/19(月) 15:15:58 ID:???
>>609
理解の方向性は合ってます。ただ危険性のレベルは一般にもっと高いです。
特に Perl の場合、値をそのままパターン内で展開する、ということは「任意のコードが実行できる」と同義なので大変危険です。
618nobodyさん:2006/06/19(月) 15:17:21 ID:???
>>616
そういう問題じゃないんだけど…。
エラーメッセージはサーバのログに吐かれてる。
ブラウザに出したいなら自前でエラー処理書いて、dieじゃなくてexitする。

ちなみにその$fileをダブルクォートで括る必要は全くない。
619nobodyさん:2006/06/19(月) 15:32:57 ID:???
>>618
あぁ、なるほど。die以下のメッセージはサーバのログに出てるだけだったのか。
じゃあ、レンタルサーバで不特定多数が使うcgiの場合には
dieより自前で用意したエラー処理に飛ばす方が良いってことか。

>ちなみにその$fileをダブルクォートで括る必要は全くない。
でも、シングルクォートとかダブルクォートとかで括ってるの多い気ガス。
単に好みの問題?
620nobodyさん:2006/06/19(月) 15:35:50 ID:???
>シングルクォートとかダブルクォートとかで
oioi
621nobodyさん:2006/06/19(月) 15:36:41 ID:???
>>617
漏れも先日までそう思ってたんだがな、実際にやって見れ。
安全措置が施されていて、use re 'eval';しないとデフォルトでは動かないんだこれが。

まあ、汚染された正規表現を実行するなんて真似は、やっぱり止めておいたほうが良いのは確かだと思うけれど。

>>619
とりあえず公式にも非推奨。
ttp://www.kt.rim.or.jp/%7Ekbk/perl-5.8/perlfaq4.html#what_s_wrong_with_always_quoting__vars
これをわきまえた上で、好みをとりたいと言うのであれば何も言うまい。
622nobodyさん:2006/06/19(月) 15:36:48 ID:??? BE:106128162-#
ヒント: use CGI::Carp qw(fatalsToBrowser);
623616=619:2006/06/19(月) 15:49:01 ID:???
大変勉強になります。しかも即レスだし。

>>621
なななるほど。そう言われてみれば、そうだ。
とりあえずダブルクォートで括ってみた。
中身は何でも良かった。今は反省している。

>>622
標準装備にそんなのあったんだ。
で、実際のところdieで>>622のモジュール使うのと
自前でエラー処理用意して飛ばすのと、
どっちが一般的なんだすか?
いや、それこそ好みの問題かもしれないけど。
624nobodyさん:2006/06/19(月) 15:52:21 ID:???
恐ろしい子っ!!
625nobodyさん:2006/06/19(月) 15:54:57 ID:???
>>623
CGI.pm を使う書き方をしてるのであれば、>>622 で良いんじゃないかな。
die のメッセージをHTMLで吐いてくれるし。

ただし、エラーがあってdieしてもHTTP的に50x系のエラーにならないのと、
デバッグが終わったら >>622 は外さないといけない事に注意。
エラーメッセージを見せるのは、セキュリティー的によろしくない。
626616:2006/06/19(月) 16:05:52 ID:???
>>625
アドバイス感謝です!
>エラーメッセージを見せるのは、セキュリティー的によろしくない。
言われてみればグレート当たり前のことだよね。でも、この視点完全に欠落してた…。
フォームの入力値のエラーなんかと同様に、エラーだったら何でもかんでも
ブラウザで教えてあげるのが、イケてると思ってた…。

ここは本当に恐ろしい知識の泉でつね。
オレ、今、かなり賢くなってる。
627nobodyさん:2006/06/19(月) 16:06:51 ID:???
要するに最初からエラー処理用意しとけと。
628nobodyさん:2006/06/19(月) 16:12:56 ID:???
$SIG{__DIE__} とかを書き換えて $! 表示して exit
629nobodyさん:2006/06/19(月) 16:21:34 ID:???
>>593, 610

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の第二版(青本の分冊になっていない方)に書かれていたと思うんだけど、本が見つからなかったので
紹介できん。スマン。


630616:2006/06/19(月) 16:53:42 ID:???
open(FILE, $file);
は通るけど、
open(FILE, +< $file);
はダメなんだね。入出力の記号を付けるときはダブルクォート必須?
なら、
open(FILE, $file);

open(FILE, "< $file");
と同じだから、やっぱ
open(FILE, "$file");
と書くのが正しいんじゃね?とか思ってしまうんです。
それとも記号の付け方がおかしいのか??
そこんとこもう少しヒントを!
631nobodyさん:2006/06/19(月) 16:56:54 ID:???
>>629
Programming Perl(第二版:青らくだ本)の日本語版8ページから引用

1.2 自然言語と人工言語
ハッシュ:ハッシュ(hash)は、順序付けられていないスカラーの集合で、
各スカラーに関連付けれれた文字列によってアクセスされる。
そのためハッシュは「連想配列」(associative array)と呼ばれることもある。
しかし、これは怠惰なタイピストにとってタイプするのが面倒だし、
頻繁に使われるので、私たちはもっと短くて、ぴりっとした(snappy)呼び名を
付けることにしたのだ。

ということらしい。
632nobodyさん:2006/06/19(月) 17:15:39 ID:5NRkvew2
メールフォームにBBQを組み込んでいるのですが
昨日みたいに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")}
}
633nobodyさん:2006/06/19(月) 17:17:11 ID:???
>>630
これじゃ、質問の答えにはなってないと思うが
> open(FILE, +< $file);
perlfunc嫁。modeは別の引数に出来る。
open(FILE, '+<', $file);
634nobodyさん:2006/06/19(月) 17:19:08 ID:???
>>632
試してないがNet::DNS使えばタイムアウトの設定が出来るんじゃないか?
ttp://search.cpan.org/~olaf/Net-DNS-0.57/lib/Net/DNS.pm
635632:2006/06/19(月) 17:28:09 ID:???
>>633
ありがとうございます。試してみます
636nobodyさん:2006/06/19(月) 17:30:07 ID:??? BE:123816072-#
ネットワーク通信系のモジュールのタイムアウト実装ってかなりいい加減だよ
あんま信用しない方がいい
実際にやってみれば分かると思うけど
637616:2006/06/19(月) 17:37:51 ID:???
>>633
別の引数にしたら…??
すません。よく分かりません。
open(FILE, "+< $file");
は正しくなくて
open(FILE, '+<', $file);
が正しい書き方ってこと??
638nobodyさん:2006/06/19(月) 17:38:59 ID:???
>>633
ちょw 知らなかったwww
639nobodyさん:2006/06/19(月) 17:41:19 ID:??? BE:424512386-#
>>636

なんで俺のBeが
bbs.cgiのバグですか
640nobodyさん:2006/06/19(月) 17:48:45 ID:???
>>637
>open(FILE, "+< $file");
いや、これでも正しいよ。
openの引数をいくつにするかってだけだから。
ただ、"$file" は無駄やってるよってこと。理由は >>621 のリンク参照。
641629:2006/06/19(月) 17:50:36 ID:???
>>631

おおthx。
文面が記憶と違うけど載ってるのは
まちがってなかったか。

あ、俺の記憶が怪しかったってことね。
642616:2006/06/19(月) 18:06:04 ID:???
>>640
なぁんとなく解ってきたようなきてないような。

$hoge = '質問スレ';
print "初心者$hoge";
と書くのは正しいけど、
$hoge = '初心者質問スレ';
print "$hoge";
と書くのは厳密には正しくない、みたいなことかな。

上の例で言えば、どうしてもダブルクォートで揃えたいなら
open(FILE, "$file");
とは書かず
open(FILE, "< $file");
と書いた方が文法的(?)にはオケってことか。

ちょっとスッキリした。サンキューです!
643nobodyさん:2006/06/19(月) 18:18:13 ID:???
>>642
いや、正しい正しくないの話じゃなくて。例えば、0から9まで処理するときに
for my $i (0..9) { }
と書いても、
{ my $i = 0;
while ($i <= 9) { }
continue { $i++ }
}
と書いても文法的には正しいし、同じように動くけれど、
前者のほうが無駄が無いし、間違い起こしにくいでしょ?みたいな話かと。
644nobodyさん:2006/06/19(月) 18:24:02 ID:???
>>642
> print "初心者$hoge";

これも

print '初心者', $hoge;
こうか
print '初心者' . $hoge;
こう書かない?
645616:2006/06/19(月) 18:43:23 ID:???
>>643
そっちの解釈か!
ロクに入門書も読まず他人様の書いたコードを切ったり貼ったりしながら
適当に「学んだつもり」になってた人種にとっては耳の痛いお話ですわ。
システム面でのエラーが起こりにくい無駄のない書き方に拘泥して
稚拙なヒューマンエラー続発とか…自分には有り得そうで怖いなぁ。
とは言っても、そんなんでは進歩はないので心掛けて書き直すかな!

>>644
例が悪かったかもかも。
print "<SPAN STYLE=\"color:$hoge\">2ちゃんねる</SPAN>";
みたいなのを想定で。
646nobodyさん:2006/06/19(月) 18:46:17 ID:???
ラクダ本の24章Perlの常識を読むといいよ。
647nobodyさん:2006/06/19(月) 18:53:57 ID:???
>>644
>print '初心者' . $hoge;
これは無いなぁ。連結コストかかるから
648616:2006/06/19(月) 18:54:13 ID:???
>>646
刮目します。
649nobodyさん:2006/06/19(月) 19:10:40 ID:???
>>642
んー。他の人も言ってるけどちと違う。
別にどっちで書いても文法的には正しいし動作もする。

"$file" みたいにダブルクォートで括ると(無名の)「文字列の生成」が起こる。
内容は$fileと全く同じ。

だったら新しく生成しなくても良いんじゃないの?って話。
同じもの2個作ってどうするよ。無駄だよね。
しかも、 open(FH, "$file"); じゃ、生成した所ですぐに使い捨て。
だったら open(FH, $file); の方が無駄な変数作らなくて良い。
まぁそんだけだけど。
650616:2006/06/19(月) 19:41:40 ID:???
>>649
>"$file" みたいにダブルクォートで括ると(無名の)「文字列の生成」が起こる。
!!
先生『週刊そーなんだ』にも掲載すべきだと思います。
懇切丁寧な説明により、ようやく合点がいきました。

しかし、ラクダ本読むのには時間もだけど体力要るな…。
651nobodyさん:2006/06/19(月) 22:55:15 ID:Fr5nT8/W
久しぶりにperlCGIで遊んでいます。
ちょっと知り合いのサイトを作ってあげよかなと思いまして、
いろいろ遊びたいのでとりあえず全部のページをCGIにしようと今メモ帳を眺めてるのですが。

プログラム本体にHTMLを書いていくとなんか物凄く長くなってしまいますよね。
でも10ページくらいでも1000行くらいは簡単に超えますね。

なんかそのやり方がすきになれないのですが、かといって.txtにhtml本文を書いておいて
読み込み手法も納得いかない。

出力内容を作成するルーチンだけ.plで別にしても結局はイマイチ。

読みやすく拡張しやすくスッキリとした手法をかなり神経質なレベルで考えていますが、
アドバイスもらえたらとおもって投稿しました。

少しコーディングから離れるというか、前段階の話になるので気が向いた方だけで
かまいませんので宜しくお願いします。
652nobodyさん:2006/06/19(月) 23:06:33 ID:???
何を言ってるのか意味が分からないけど
とりあえず HTML::Template でも使っとけ
653nobodyさん:2006/06/19(月) 23:08:51 ID:???
Template Toolkitを勧めたいところだがCGIじゃ重いかねぇ。
最近Catalystばかりなのでわかんね。
654651:2006/06/19(月) 23:12:39 ID:Fr5nT8/W
>>652
HTML::Templateは知っていますが、そういうことではないんです。
うまく説明できませんのでスルーしてもらってもm(__)mごめんなさい。


例えば普通にhtmlファイルのまま全部のページを公開してるとしますよね。
10ページだろうが100ページだろうが、拡張していくときに面倒はありませんし、
把握もとても単純なんですよね。

それをCGIにするとイマイチなんです。
スマートじゃなくなるというか。ゴミゴミするというか。
もちろん同じフォーマットの文章だけ違うような場合はいいのですが。

それぞれのページで違いますので。
655nobodyさん:2006/06/19(月) 23:34:45 ID:??? BE:495264487-#
なぜ全部のページをCGIにしようと思ったの?
656nobodyさん:2006/06/20(火) 00:18:19 ID:???
>>653
TTは重すぎてCGIじゃ無理。
657617:2006/06/20(火) 00:38:01 ID:???
>>621
> 安全措置が施されていて、use re 'eval';しないとデフォルトでは動かないんだこれが。

ウホッ! ありがと。
658nobodyさん:2006/06/20(火) 01:00:18 ID:???
>>645
他を選択する合理的な理由がない場合、ファイルオープンには常に 3引数の open を使うのが良い習慣だと思います。
正しくは、「どんな場合でも、その必要がなければ 2引数の open を使わない」なんだけれど。
659nobodyさん:2006/06/20(火) 01:21:04 ID:???
>>654
・共通する部品と各ページに固有の部品をそれぞれ抽出
・各部品をファイルに保存 # この時、プログラムから利用しやすい形で保存しておく
・CGI が叩かれた時に必要な部品を読込み、それらを組み合わせて返す

全リソースが静的なら、こーゆーのは SSI の仕事で CGI でやるメリットはないと思う。
抽出の粒度と保存スタイルさえ適切ならディスクの節約にはなるかもね。
660nobodyさん:2006/06/20(火) 01:29:57 ID:???
>>651
ヒアドキュメント使えば、表示したいHTML+5行ぐらいでcgiに出来ますよね?
”拡張性がある”というのをどういう状況を指して言ってるのか分からないですが、・・・
661nobodyさん:2006/06/20(火) 03:32:08 ID:???
すいませんちょっと質問させていただきます。
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

正直、自分でやってもうまくいかないし、何て検索していいのかも分からず途方に暮れています・・・

よろしくお願いします。
662nobodyさん:2006/06/20(火) 03:59:35 ID:???
$ENV{'QUERY_STRING'}をいろいろ条件にかければOK
CGI.pmを使ってるならparam('mode')、param('kt')で欲しい値が取れる
ので、それを条件にかければOK
663nobodyさん:2006/06/20(火) 04:48:28 ID:???
>651
自分のスクリプトではこんな感じにしてます。


$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;
}
※ ここに貼り付けるにあたってエラー処理とかはばっさり削除してます
664nobodyさん:2006/06/20(火) 07:13:05 ID:???
なんで全部のページを CGI でやろうと思うんだろ。
テンプレート使うとかブラウザからページ作成する、とかでない限り無駄でしかないんだけどw
665nobodyさん:2006/06/20(火) 07:27:32 ID:???
デザインの統一&デザイン変更時を考えると管理しやすいと思うが・・・
あと HTML 編集時のミスも極力防げるし。
サーバーの負担以外はプラス面ばかりだとは思う。個人的にはだけどね
666651:2006/06/20(火) 08:03:26 ID:5983Ww81
>>660
例えば10ページ分を一つのファイルにまとめると物凄いうざくなりますよね。
HTML自体が長くても所詮は.htmlで保存公開してるならスッキリ感があるんですが、
それをひとつのファイルにまとめると最悪な感じなんです。
html的に最悪ということです。

見渡しにくいコード・ソースというのが嫌いなのです。

逆に外部ファイルが10個も20個もあるのもイヤなんです。

というジレンマなんです。
667nobodyさん:2006/06/20(火) 08:27:29 ID:???
>>665
デザインなんてCSSファイル変えるだけじゃん。
テーブルレイアウトやってるならあれだけどね。

>>666
CGI でやること自体見渡しにくいし、何kbのCGIファイル作る気だよ・・・
テンプレートは嫌だって言うし・・・
もう、あれだ、perl より php でやったらw
668nobodyさん:2006/06/20(火) 09:59:21 ID:???
>>666
普通に1つのページに対して、1個のCGIにすれば?
というかperlはヒア演算子があるから、既にHTMLが出来てるなら、
#!/dir/perl
print <<HTML;
content-type:xxxx

HTML
で、とりあえずすぐにcgiになる。で、なんか動的要素追加したかったら
前の部分にちゃちゃっと書けば、ある程度拡張できるし・・・
というか何を目指してるのかがいまいち分からない・・・
669nobodyさん:2006/06/20(火) 10:21:31 ID:???
質問:
10ページ分のHTMLを一つのCGIファイルにまとめてたい。
でも、大きくなって見通しも悪いのでどうにかしたい。
複数ファイルは死んでも嫌。

回答:
HTML::Templateは変数にテンプレート入れて動かせるよ。
670nobodyさん:2006/06/20(火) 11:14:51 ID:???
sub >>669 {
 return >>654
}

これ多分無限ループ
671nobodyさん:2006/06/20(火) 11:57:30 ID:???
CGI.pmでさえ、ちょっとしたHTMLを吐けるのに
672nobodyさん:2006/06/20(火) 11:57:50 ID:???
HTMLでいいじゃん
673nobodyさん:2006/06/20(火) 12:18:08 ID:??? BE:397980959-#
うちはhtmlにjavascript(cgi)入れて
動的なページっぽく見せてるお^^
674nobodyさん:2006/06/20(火) 12:20:28 ID:5Ut+7oeu
あるPerlプログラムを実行したら
セグメンテーションエラーになってperl.coreというファイルを吐いて死んでしまいます。
perl.coreというファイルは何に使うのでしょうか?
675nobodyさん:2006/06/20(火) 12:26:38 ID:???
651について考証。

[ケース1]
Perlを熟知しているが無意識に「Perl(CGI) > HTML」というイメージにとらわれている。

[ケース2]
Perlはそこそこできるが、HTML::Templateについて実はよく理解していない。

[ケース3]
Perl習いたてで、Perlを万能低級言語であるかのような錯覚に陥っている。

[ケース4]
HTML、CSS、JavaScriptについて実はよく理解していない。

[ケース5]
そもそも、対象としているHTMLソース自体が汚いから誰がやってもまとまらない。
676nobodyさん:2006/06/20(火) 12:31:09 ID:??? BE:88440825-#
普通にコアダンプじゃねーの
アセンブラの知識があれば読めます
677nobodyさん:2006/06/20(火) 12:31:44 ID:???
[ケース6]
>>675 は、「ケース」「考証」という単語を並べてみたかった。
678nobodyさん:2006/06/20(火) 12:39:34 ID:???
651はdbで解決だな
679674:2006/06/20(火) 12:49:03 ID:5Ut+7oeu
Segmentation fault (core dumped)
とでています。
perl -dでデバッグを行ってみたのですが、ある部分でずっとCPUを100%使い切ったまま止まっているように見えます。

このperl.coreはどのように役立てればよいのでしょう?
ググっても参考になる情報が載っていないので‥
680nobodyさん:2006/06/20(火) 12:59:03 ID:??? BE:35376522-#
バグとして報告するか
デバッガ使って読んで下さい
681nobodyさん:2006/06/20(火) 14:11:30 ID:T0oahEq/
whileについて質問。

ファイル($log)の中身を1行ずつチェックしながら処理する場合、
open ( FH, $log );
と開いたとして、

@array = <FH>;
$limiti = @array;
while ( $limiti > 0 ) {
 処理;
 $limiti --;
}
とするのと
while(<FH>){
 処理;
}
とするのは同じこと?
どっちでもできるなら後者の方が無駄な変数無い分よろしい?
682nobodyさん:2006/06/20(火) 14:14:01 ID:??? BE:185724937-#
前者は一気に読み込んでるのでメモリを多く使用する
683nobodyさん:2006/06/20(火) 14:18:25 ID:???
>>681
明らかに前者は分かりにくい。ありえない。メリットも少ないし。
それでもメモリに展開するなら foreach (@array) {} にでもしなよ。
684681:2006/06/20(火) 14:32:11 ID:???
>>682>>683
後者の方法最近知ったんだけど、それまでずっと前者の方法でやってた・・・orz.

>明らかに前者は分かりにくい。ありえない。メリットも少ないし。
だよね!だよね!ハッキリ答えてもらえてかなりスッキリ。
しかも代替案まで出してもらって恐縮です。

どうもでした!
685nobodyさん:2006/06/20(火) 14:44:49 ID:???
コアは食べろ。体にいいぞ。
686651:2006/06/20(火) 18:41:22 ID:5983Ww81
>>667
CSSレイアウトは正確に書いても正確にレンダリングされるわけではありませんので、
バグ対応を考えるとテーブルレイアウトの方がよほどデザインの変更は私にとっては簡単です。
687651:2006/06/20(火) 18:54:06 ID:5983Ww81
>>675
ケース6

ある一つのファイルを開けた時の見渡しやすさを確保するには一ページずつhoge.cgiにすれば
.htmlほどではないが準じたレベルで解決。
でもそれだとperlとしてボツ。

要は見渡しやすさと効率と利便性と拡張的と省エネと論理的という理想がそれぞれで
ぶつかりあって毎度動きはするけど納得いかないレベルのものになってしまうのです。

ここらでこのジレンマを解決したいのですが。

strictHTMLと作る側の利便性と効率的且つ拡張的なHTMLは反発しますよね。
そんな感じかもしれません。

m(__)m
688nobodyさん:2006/06/20(火) 18:56:49 ID:??? BE:361325748-#
完全CGIのサイトを作ってあげる

高負荷でレスポンス激重or鯖缶から垢デリ

水の泡
689651:2006/06/20(火) 19:19:53 ID:5983Ww81
>>688
いや。まあかまわないのですがそれも。
作る自体遊びなので。
690nobodyさん:2006/06/20(火) 19:37:08 ID:???
a;a1;10
b;b1;10
c;c1;10

と記述したファイルがあるのですが、
例えばb;b1;10の10を11に書き換えたい場合はどうすればいいのでしょうか?
691nobodyさん:2006/06/20(火) 19:40:22 ID:???
HTMLのソースが見難いものである以上無理じゃね?
692nobodyさん:2006/06/20(火) 19:45:22 ID:???

ファイルじゃなくてどうゆうふうに変数に入れてるのか家




まぁ、データ整理がうまく言ってないだけだと思うけど、たぶん想像だけど無難なトコでは

@file = (
  ['a', 'a1', 10],
  ['b', 'b1', 10],
  ['c', 'c1', 10],
);

って感じでいいのか?
だとしたら

$file[1][2]++;
となる
693nobodyさん:2006/06/20(火) 20:02:06 ID:???
>>651のやろうとしている事をやるなら、まずページごとに異なる部分だけを
データファイルなりなんなりで保存しておいて、Apacheのmod_rewrite使って
自動的にCGIにパスを渡すようにするかなー

ってこれブログじゃねえか!
694nobodyさん:2006/06/20(火) 20:09:48 ID:??? BE:265320465-#
アロー演算子って省略できたのか、、
695nobodyさん:2006/06/20(火) 20:09:48 ID:???
普通にMovaleTypeとどう違うんだろう。
Perlは初心者レベルの俺から見ても、
外部にhtmlの共通部分をテンプレートとして用意しておいて、
コンテンツをそこに流し込むだけでいい気がするんだけど。

>>686
それはCSSを知らないだけじゃない?
よっぽど変なレイアウトをしない限り、CSSハックとかちょっと組み合わせれば
主要ブラウザの表示の差異ぐらい普通に取り除けるぞ。
IE7でちょっと混乱しそうだが、IE7でCSSハックもできるようだから問題ないだろうし。
696nobodyさん:2006/06/20(火) 20:12:07 ID:???
>>692
ファイルを読み込んで該当の一行を返し、それを;でsplitしています
ですので、変数としては@datに配列として入っています。
その@datの値を変更したのですが、ファイルに書き戻す方法がわかりません
697nobodyさん:2006/06/20(火) 20:13:41 ID:??? BE:371448667-#
joinでおk
698nobodyさん:2006/06/20(火) 20:23:24 ID:???
grepとsedを組み合わせることは出来ないですか?
マッチした行をsedしたいのですが
699698:2006/06/20(火) 20:25:48 ID:???
すいませんsedというか
s///です。
700692:2006/06/20(火) 20:32:32 ID:???
最初の質問と全然違うじゃねーかよ
>>697でおk
701nobodyさん:2006/06/20(火) 20:42:57 ID:???
>>698
そのgrepはどっちのgrep?
コマンドか関数か
702nobodyさん:2006/06/20(火) 21:04:47 ID:???
>>694
2個目以降は省略できるぉ
703651:2006/06/20(火) 21:04:52 ID:5983Ww81
>>691
いえ、htmlのソースは十分見やすいのです。
ただ、それを一つにまとめると長くなって見渡しやすさがなくなるのです。

>>693
昔携帯用サイトをそんな感じで作りました。

>>695
それはCSSに適したレイアウトをしてるからじゃないですか?
デザインレベルの段階で「これはCSSだと云々」と考えたりするのは
個人的には邪道なのです。

例えば写真がページごとに入る枚数が違って、写真と文字の位置の関係や
回り込みの仕方。文字のサイズを変えたときのかわり方、全体の長さによる背景の可変。

そして久しぶりにソース、コードを見た時のわかりやすさ。論理的でありながら効率的で。

長くお邪魔してしまいましたが、スレ汚しになってしまいますのでここらへんで消えます。
ありがとうございました。
704nobodyさん:2006/06/20(火) 21:08:51 ID:???
>>696
そこまで分かってて自分で考えられないようじゃ(ry
705651:2006/06/20(火) 21:17:35 ID: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を使ってるのですが、このインターフェースに慣れてるので
サブルーチンはデフォルトでは表示されないとかになればいいのに。行数はもちろんトビトビになる仕様で。
706nobodyさん:2006/06/20(火) 21:19:50 ID:??? BE:141505128-#
VisualStudioのエディタはそんな風になってるね
707nobodyさん:2006/06/20(火) 21:19:55 ID:???
IDE使えや
708nobodyさん:2006/06/20(火) 21:20:03 ID:???
CSSは邪道
ファイル複数にするのも邪道
HTML::Templateは使いたくない

これじゃどうしようもない…。
>>651 は何がしたかったんだろう。
709nobodyさん:2006/06/20(火) 21:22:25 ID:???
なんだ、、サブルーチンが折り畳めるエディタはないですか?
っていう質問だったのか。。。
710nobodyさん:2006/06/20(火) 21:22:39 ID:??? BE:176880454-#
むしろ適当なCMS使え
711nobodyさん:2006/06/20(火) 21:27:06 ID:???
>>703
その辺も普通にCSSで実現できるな。
tableデザインにはそれなりのメリットがあるのはわかるが、
貴方は多分CSSデザインを過小評価しすぎてるよ。
否定するならちゃんと勉強してからがお勧め。
712nobodyさん:2006/06/20(火) 21:27:45 ID:???
>>705
>こんな感じになれば最高なんです。
そういう風にコードを書けばいいんじゃね?w
713nobodyさん:2006/06/20(火) 21:33:58 ID:???
>>707
あまりの遅さにスーパーライセンスを剥奪されたっぽいから使えん。
714651:2006/06/20(火) 21:34:10 ID:5983Ww81
>>706-710
そういうエディタもあったのですか。
しょぼい結末になってすみませんです。

>>711
そうでしたか。CSSスレで回答者をしていたころはよく回答者同士で
実装について嘆いたものですが。
1年ほどCSSから離れていたあいだにブラウザに革命でもおきて全て解消されたのでしょうか。
失礼いたしました。
715nobodyさん:2006/06/20(火) 21:35:11 ID:???
最後までちゃんと説明出来ない子だったな
716651:2006/06/20(火) 21:40:19 ID:5983Ww81
ごめんなさいm(__)m
優しくしてくれてありがとうございました。
717nobodyさん:2006/06/20(火) 21:59:49 ID:???
651のIDが神がかりな件
718nobodyさん:2006/06/20(火) 22:01:41 ID:???
なにがどう神がかりなのか、それを表す正規表現を書いてみてください。
719nobodyさん:2006/06/20(火) 22:14:59 ID:???
皆様ありがとうございます。

ファイルを直接書き換えたいので、
open( FILE, ">>./dat/img_data.dat");
while(<FILE>){
s/$FORM{'tmp'}.*/$dat/;
print;
}
close( FILE);
このようにしているのですが、うまく動きません
原因がわかるかたいますでしょうか?
720nobodyさん:2006/06/20(火) 22:19:50 ID:???
>>714
奇遇だな。
俺もそのスレの回答者をしていたりする。
721nobodyさん:2006/06/20(火) 22:20:56 ID:???
>>714
amazon参考にしたら?w
722nobodyさん:2006/06/20(火) 22:22:13 ID:???
お、気づかない間に終わってる。
最後まで言ってることチンプンカンプンだったな。
どうでもいいけど、strict-HTMLとかCSSとかを心底使いこなせるほど覚えたのに、でもテーブルレイアウトのがいい、って言う人はじめて見た。
723nobodyさん:2006/06/20(火) 22:24:28 ID:???
>>719
はちゃめちゃ過ぎる
724nobodyさん:2006/06/20(火) 22:27:29 ID:???
かじった程度でやってたんじゃね?
CSSハック駆使してその程度のデザインが出来ないっておかしい
amazonがまさにやりたいデザインを実践してるように見えるし
725nobodyさん:2006/06/20(火) 22:31:51 ID:???
>>723
すいません、
どこか教えてもらえませんか?
726nobodyさん:2006/06/20(火) 22:32:50 ID:???
「ファイルを直接書き換えたい」ってのが既におかしいという話。

>>719
解決法そのいち:(メモリ喰うけど簡単だよ!)
配列に一回読み込んでから好きに書き換え、同じファイルに書き出す

解決法そのに:(メモリ喰わないけどちょっと面倒だよ!)
INとOUT、二つのファイルハンドルを作り、INで一行読んで好きに書き換え、OUTに書き出す
全部終わったら元ファイルを削除し、新ファイルを元ファイルと同じ名前にリネーム
727nobodyさん:2006/06/20(火) 22:36:01 ID:???
どこがと言われてもなぁ。

>>719
> open( FILE, ">>./dat/img_data.dat");
追加書き込みで open してるのに
> while(<FILE>){
読もうとしてる。

しかも出力してるのはファイルじゃなくて
> print;
標準出力

そりゃうまく動かない。
というかこれが通るperlって凄いな。ある意味。

728nobodyさん:2006/06/20(火) 22:36:16 ID:???
>>726
フォームから受け取ってるんだからそれは出来んでしょ
729nobodyさん:2006/06/20(火) 22:37:42 ID:???
>>725
ここを直しても動かないけど、明らかにおかしいところ。

そのいち:
open( FILE, ">>./dat/img_data.dat"); は、追記オープンでしょ。

そのに:
print; は標準出力でしょ。少なくとも print FILE $_; にしないとFILEの意味がない!

と書いてたら>>727に先を越された。

>>728
意味が分からない。
730nobodyさん:2006/06/20(火) 22:39:45 ID:???
>>724
なんで amazon? テーブルレイアウトバリバリじゃね?
731nobodyさん:2006/06/20(火) 22:51:15 ID:???
レイアウトはリキッドデザインのCSSだよ。
732nobodyさん:2006/06/20(火) 22:54:19 ID:???
ゴメ、思いっきり記憶違いだったw
733nobodyさん:2006/06/20(火) 22:56:30 ID:???
CSSとかスレ違いどころか板違いなんだから、あまりひっぱりすぎちゃダメだぞ☆

とW3C信者の俺が言ってみる
734nobodyさん:2006/06/20(火) 22:58:09 ID:???
商品紹介のとこはリキッドデザインでCSSでfloat指定してるな。
この部分のことかね?
735nobodyさん:2006/06/20(火) 23:21:15 ID:???
>>725
File::Inplace 使っとけ。
736nobodyさん:2006/06/21(水) 01:11:43 ID:???
話がずれてるので、そろそろ終わりにしようや
737nobodyさん:2006/06/21(水) 12:25:23 ID:Jpc8QU0a
・name.txtの中には「名前<>年齢<>性別<>電話番号<>住所」
 という情報が入っている。
・これを「住所」でソートして結果を出力(都道府県別という程度のソート)。
・その際、ブラウザにはフォームで選択した項目の情報だけを吐き出す。

ということをやりたいんですが、

1.openしてwhileで1行ずつ配列(@temp)に入れて処理。
 1-1.フォームで選択されていないものを@tempからspliceして除去。
 1-2.全ての都道府県にあらかじめ番号を付けておき、
   $temp[4]に当たる値とマッチングさせて、unshiftで@tempの頭にその番号を付ける。
 1-3.@newdataに@tempをpushで追加していく。
2.@newdataをソートして出力。

という方法しか思いつきませんでした。
でも、これだと不要な項目をループ処理の中で1回1回チェックしていて
ものすごく無駄なことをしている感じがします。
ファイルを開く前に必要な項目をチェックしておいて、
ファイルを開くときにはそれだけを取り出して処理する、
ということはできないでしょうか?
738nobodyさん:2006/06/21(水) 12:42:09 ID:???
「自分で決めた順番でソートする」でググってそこをブックマークしとけ
あと>>681とそれに対するレス見て
739737:2006/06/21(水) 12:56:08 ID:Jpc8QU0a
>>738
ありがとうございます。
それにしても「自分で決めた順番でソートする」という
ピンポイントな文章で結果が出るとは・・・。
しっかりブックマークして読んできます。
740nobodyさん:2006/06/21(水) 13:10:47 ID:QAUqj+Eu
1: 自分はこういう事がしたい。
cvs?といいますか、特定の文字で区切られた(12個)ファイルを読み込んで
二次元配列に入れて、処理をしたい。
2: それでこんな風にやってみたが・・・
for文(i++)で行を読み込んでから、それをさらにfor文(j++)で区切りずつに
わけ、その都度$list[$i][$j]に入れていくようにしました。
3: こんなエラーが出て上手く行かなかった。
12行目に来たところで突然ちゃんと配列に入らなくなってしまいました・・・。
読み込むファイルに原因があるのかと思い、1行から20行まで同じ内容のファイルを作ったのですが
同じように読み込めませんでした・・・。どのようなことが原因と考えられるでしょうか・・・?
741nobodyさん:2006/06/21(水) 13:21:16 ID:???
>>739
Perlメモには多くの人がお世話になっているはず。
そのページの他の項目も非常に為になりますよ。

>>740
どんなエラーですか・・・
742nobodyさん:2006/06/21(水) 13:45:57 ID:???
>>740
どっかでindex付け間違いと予想。
というか説明わかりにくすぎなので、ソース晒してください。
743737:2006/06/21(水) 13:46:58 ID:Jpc8QU0a
>>741
これはとても勉強になりそうです。
逆引きなのが助かります。

ところで、>>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の方法しかないんでしょうか?
744nobodyさん:2006/06/21(水) 13:49:01 ID:???
$&を使ってマッチした部分を表示しようと思ったら、
マッチする前の部分も表示されました。

一応$& $'と書くことで、自分のやりたいことはできてるんですが、
なぜこうなるのか気になります。
何か特別な理由があるんでしょうか?
745nobodyさん:2006/06/21(水) 13:49:48 ID:???
>>740
別に20行目とか多次元配列で何か起こるってことはないと思う。
どうみても処理のせいです。
同じように多次元配列(ハッシュ) にいれるモジュール作ったけど、そんなことは起きなかったし。
データが shiftjis で、その特定のマーカーと知らないうちにかぶってるとか。
746nobodyさん:2006/06/21(水) 13:51:14 ID:???
>>744
だからさ、そのような挙動をする最低限のソースを載せようよ。
みんなそんなエスパーできないって。
747nobodyさん:2006/06/21(水) 14:00:01 ID:???
>>743
応用しようぜw

@data = map {$_->[0]}
sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}
map { my @tmp = split(/<>/); $tmp[5] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1] } @data;

まあニュアンスね。試してないけど。
748nobodyさん:2006/06/21(水) 14:00:50 ID:???
直そう思ってたのに忘れてたw

sort {$jusho{$a->[1]} <=> $jusho{$b->[1]}}

sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
749737:2006/06/21(水) 14:20:59 ID:Jpc8QU0a
>>747-748
>sort {$jusho{$a->[1]} cmp $jusho{$b->[1]}}
これは「名前」でソートするってことですか?

>$tmp[5] =~ /^(.*?)(?:県|都|府|道)/; [ $_, $1]
この部分が分かりません・・・。
簡単にで良いので解説を・・・。
750nobodyさん:2006/06/21(水) 14:35:16 ID:???
ただの正規表現ですがな。
()の中身を取って$1に入れときたいのです。
751nobodyさん:2006/06/21(水) 14:35:26 ID:???
>>747
とりあえず「京都府」のときに困りそうなコードだと指摘しておこうw
752nobodyさん:2006/06/21(水) 14:44:47 ID:???
京都は意地汚い奴が多いから捨ててもいい。
753737:2006/06/21(水) 14:54:48 ID:Jpc8QU0a
>>750
解説ありがとうございます。

とすると、
>>747の処理をして一旦「都道府県」だけを取り出して>>743の処理をする
という解釈で良いんでしょうか?
それとも>>743のコードの6行目以下を>>747のニュアンスのように書き換える
ということなんでしょうか?

京都府に関しては岸部四郎に免じてお許しを。
754nobodyさん:2006/06/21(水) 15:02:29 ID:???
東京は困らないんですか?
755nobodyさん:2006/06/21(水) 15:11:00 ID:???
困らないよ。
756737:2006/06/21(水) 15:19:55 ID:Jpc8QU0a
>>753については後者ですね・・・くだらないことを聞いてすみません。
757nobodyさん:2006/06/21(水) 15:26:09 ID:???
もしSJISだったらいくらなんでもエスケープくらいしてねw
758nobodyさん:2006/06/21(水) 15:27:40 ID:???
流れはutf8なんでしょ?
759nobodyさん:2006/06/21(水) 15:33:54 ID:???
utf8 は便利だよね。
760nobodyさん:2006/06/21(水) 15:40:10 ID:???
既存コードがeuc-jpで、HTMLとして送り出すときはiso-2022-jpにしてあるからなぁ。。。
761nobodyさん:2006/06/21(水) 15:42:59 ID:???
なんでわざわざjis w
762nobodyさん:2006/06/21(水) 15:47:58 ID:???
昔は(ってもう10年以上前か)、ネット上を流すにはJIS、つまり7bitで、という話があったのよ。
HTTP上の問題は今になって考えればなかっただろうが。
UAでの解釈問題はあるかもな。

今の出力コードでおすすめは何?
c-HTMLではSJIS onlyなi-modeも拡張されたの?
763nobodyさん:2006/06/21(水) 15:50:04 ID:???
メールは7bitだけど、HTTPで7bitなんて聞いた事無いなぁ
764744:2006/06/21(水) 15:51:28 ID:sa5CDJCk
>>746
すみません、こんな感じです。

$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";
  }
 }
}
765744:2006/06/21(水) 15:52:07 ID:sa5CDJCk
挙動はたとえば石で検索した場合、
………石
のように表示されます。

質問は「なぜ$&を使ったのにマッチした部分以前も表示されてしまうか」です。

最低限がどれくらいかわからなかったんですが、
もっとソースの大部分を書いたほうがいいでしょうか?
766nobodyさん:2006/06/21(水) 15:55:04 ID:???
なるほ(´・ω・`)
メールも7bitだけだしなー。

携帯のブラウザのプログラマはほんと何考えて作ってんだと思うよ。
767nobodyさん:2006/06/21(水) 15:55:41 ID:???
contentのencode見ずに、mailに変換して配信するgatewayでもいたんですかね。
768nobodyさん:2006/06/21(水) 15:56:15 ID:???
>>764
$euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";

ちょw おまwww
769nobodyさん:2006/06/21(水) 15:59:46 ID:???
>>765
> $euc_regex = "(?:$ascii|$two_bytes|$three_bytes)*?";
> if (/^$euc_regex($key1)/) {

え、当たり前では。
「石」で検索かけるってことは、$key1 = "石"なんだよね。多分。

このとき正規表現は
/^(?:$ascii|$two_bytes|$three_bytes)*?(石)/
なんだから、$&ではマッチした部分全部が取れる。
"石"だけ取りたいなら $& じゃなくて $1 でしょう。
770737:2006/06/21(水) 16:30:27 ID: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]}}となるのか分かりません。

岸部四郎の件で気分を害されたならお詫びします。
771nobodyさん:2006/06/21(水) 16:36:13 ID:???
てゆうかうちの解釈が間違ってるのかもしらん。
解読してみる。

$jusho{ $a->[1] }
・↑の $a の部分は [ $_, $1 ] である、
・つまり $a は [ 元のデータ , 県名 ]
・なので、 $a->[1] は 県名
・$jusho{ $a->[1] } は
$jusho{ 県名 } ということ。

あってる?
772737:2006/06/21(水) 17:07:18 ID:Jpc8QU0a
>>771
解説ありがとうございます。ラスト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<>京都府京都市伏見区・・・<>
のような形態です。
773nobodyさん:2006/06/21(水) 17:07:26 ID:???
>>762
公開資料上で全機種対応なのはSJIS。
だが実際は、ほとんどの機種は四大エンコードに対応している。
>>766
糞仕様を決めたのはドコモ。
774nobodyさん:2006/06/21(水) 17:39:12 ID:???
>>772
こらっ!
「京都府京都市伏見区」って俺の住所と同じじゃんか。
775nobodyさん:2006/06/21(水) 17:50:44 ID:???
>>772
鵜呑みじゃなくて、ちょっと考えて流用しようよ。
>>747 のコードが間違ってるんだってば。
本人ニュアンスだけで試してないって書いてあるし。
それと >>751 も忘れずに。
776nobodyさん:2006/06/21(水) 18:05:31 ID:???
>>772
>>743 に ('北海道', '東京', '愛知', '', '大阪', '福岡') ってあったけど
今度 ('北海道', '東京都', '愛知県' , '大阪府', '福岡県') ってしてるのに、コード変えてないから・・
その場合 /^(.*?(?:県|都|府|道))/ こうねw
まあ京都府問題あるけどね。
777nobodyさん:2006/06/21(水) 18:06:54 ID:???
それと、cmp じゃなくて <=> のままでよかったw
778nobodyさん:2006/06/21(水) 18:10:36 ID:???
ちなみに、京都だけ "京都府" じゃなくて "京都" ってやればおk

('北海道', '東京都', '愛知県', '京都', '大阪府', '福岡県')

うわー頭の悪い解決法w
779 ◆TWARamEjuA :2006/06/21(水) 18:53:38 ID:??? BE:1089825-#
>>774
漏れの出生地だったりもします♪

そういや本7も京都府、、、
780nobodyさん:2006/06/21(水) 19:54:18 ID:???
素直にデータファイルの構造を変えれば済むのに・・・
781740:2006/06/21(水) 21:36:56 ID: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?でした。
782nobodyさん:2006/06/21(水) 21:48:58 ID:???
何言ってるか分からん…。
$j は 13個で回ってるんだがそれはOKなの?
783nobodyさん:2006/06/21(水) 21:56:27 ID:???
うちも何言ってるかさっぱりわかんねえ。。。
784 ◆TWARamEjuA :2006/06/21(水) 22:56:19 ID:??? BE:1307726-#
日本語で桶。
ですよねぇ。。。

SOCKETなんて名前を使っているところを見ると何かしら通信しているのかしら?
となると、改行問題とかもありそうな。

しかし、whileでSOCKETを読み捨てているのもなんだかなぁ。。。
785nobodyさん:2006/06/21(水) 23:05:30 ID:???
WEBのテンプレートシステムを作ってます。

ユーザディレクトリ内に任意のディレクトリ構造を作って利用できます。
ユーザディレクトリ内はCGI経由で閲覧しますので、画像などもCGI経由でバイナリで書き出そうと思い
実際やってみたのですが、画像へ直リンク張るのに比べ、格段に表示が遅いです。

よく、画像の無断直リンク防止のためにCGI経由ってのはあると思うのですが、上記のように、
サイトの全画像をCGI経由ってのは設計としてよろしくないのでしょうか。
786nobodyさん:2006/06/21(水) 23:08:34 ID:???
それはそうでしょう。
1ページでプロセスいくつ使ってると…。

787785:2006/06/21(水) 23:11:12 ID:???
>>740
HTTPで通信してデータ取得する場合、一行のサイズに限界があるから、
サーバ側が勝手に(というか仕様に基づいて)改行コードを入れる可能性がある。
サイズが長い行でずれてるのでは?
788nobodyさん:2006/06/21(水) 23:15:33 ID:???
>>786
ですよね・・。既存のテンプレートシステムってどうやってるのか調べてみます。
789740:2006/06/21(水) 23:56:42 ID:???
>>785
仕様でしたか・・・。
情報ありがとうございます。
どーにかしてみます。
790nobodyさん:2006/06/22(木) 00:07:54 ID:???
>>789
いや、ファイルから読んでるんでしょ?HTTPじゃないじゃん。
791nobodyさん:2006/06/22(木) 00:09:28 ID:???
>>789
本当にあのコードで12行目まで動いてるのだとしたら、
何がやりたいのか分からんのでお手上げだが。
やりたいのは実はこういうことじゃないのか?
while (<SOCKET>){ chomp; push @list, [(split /特定の文字/, $_)[0..11]]; }
792nobodyさん:2006/06/22(木) 00:58:05 ID:???
>786
.htaccess が利用できるなら
<FilesMatch "\.(gif|jpe?g|png)$">
  SetEnvIf Referer "^$" shutout
  Deny from env=shutout
</FilesMatch>

でどうです?
793nobodyさん:2006/06/22(木) 00:58:34 ID:???
まちがえた
>785 宛でした
794nobodyさん:2006/06/22(木) 00:59:58 ID: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;
}
795nobodyさん:2006/06/22(木) 01:04:29 ID:???
>>794
error() の最後で exitしてるので、当たり前です。
796nobodyさん:2006/06/22(木) 01:07:27 ID:???
一度実行されたら exit; されてるので1つしか表示されないです。

my $errormsg = "";
if(!$come){ $errormsg .= "コメントが入力されていません<br>\n"; }
if(!$name){ $errormsg .= 名前が入力されていません<br>\n"; }
if(!$title){ $errormsg .= タイトルが入力されていません<br>\n";}
if($errormsg){ &error($errormsg); }

こんな感じでしょか
797nobodyさん:2006/06/22(木) 01:09:10 ID:???
ダブルクオーテーション抜けた
実行してるソースに書くときは忘れずに・・・
798794:2006/06/22(木) 01:11:04 ID:???
>>795-797
あぁ、もう夜遅くなのに、本当に感謝・・・orz
ありがとうございます。本当にありがとうございます。 orz
799nobodyさん:2006/06/22(木) 01:30:47 ID:???
>>796
$come eq ""を!$comeに変えたのはあまり宜しくないと思うぞ
"0"が入ってきたらどうする
# 確かに無意味そうな投稿だから弾いても良いかも知れんが
800785:2006/06/22(木) 01:42:48 ID:???
>>792
ありがとうございます!
今回、CGI経由にする目的の一つに、テンプレート内の相対パス指定がCGI経由で
崩れるのを回避するため、ファイル指定関数でfile.cgiを呼び出す、というのが
あったのですが、それは別の方法で解決するとして、一般的な直リンク防止の仕組みは
おっしゃる方法でみんなやってそうですね。試してみます。

>>789
ごめん、全く憶測で言ってるので鵜呑みにしないでください。
801nobodyさん:2006/06/22(木) 10:08:11 ID:???
質問です
1000を1,000に変換する関数とかってありますか?
802nobodyさん:2006/06/22(木) 10:14:14 ID:???
Perlメモ
803nobodyさん:2006/06/22(木) 10:47:24 ID:???
>>785
> 画像を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 それとも何十個のファイルを一度に出すとか?
まあ、いちいち負荷かけるのはうちもどうかとは思うけど。
804nobodyさん:2006/06/22(木) 10:49:30 ID:???
素朴な疑問。
ある値を空にするとき
$scalar = "";とするのと$scalar = '';とするのとは厳密に言えばどっちが正しいの?
あと、要素が空かどうかを調べるとき
if($scalar eq "")とif($scalar eq '')とか。
805nobodyさん:2006/06/22(木) 10:52:09 ID:???
感覚的にはシングルにしたいw
806nobodyさん:2006/06/22(木) 10:58:57 ID:??? BE:265320465-#
シングルクォートは美しくないし遅い
807nobodyさん:2006/06/22(木) 11:03:05 ID:???
>>806
mjd? ソースとかある?
808nobodyさん:2006/06/22(木) 11:06:11 ID:??? BE:221100555-#
ありゃ、eqの場合はシングルクォートの方が早かった
代入の場合はダブルの方が高速だったんだけどなぁ
スマソ ソースはム板だったような
809nobodyさん:2006/06/22(木) 11:09:06 ID:??? BE:424512386-#
まぁどちらにせよ誤差の範囲なので
好みの問題なのでわ
810nobodyさん:2006/06/22(木) 11:15:30 ID:???
そうなんや? どこで速度差がでてるんだろう・・・。
811804:2006/06/22(木) 11:15:45 ID:???
>>805-809
ども!まさかベンチまでしてもらってたとは恐れ入りまする。
すっきりしました。
812nobodyさん:2006/06/22(木) 11:16:59 ID:??? BE:123817027-#
ベンチしてて分かったけど
比較対象or代入対象が長い文字列な程
ダブルクオートの方が速くなった
813801:2006/06/22(木) 12:03:04 ID:???
すみません
何気にスルーされてる801です。

1000を1,000のように変換することってできませんでしょうか?
814nobodyさん:2006/06/22(木) 12:04:36 ID:???
いや、802が答えてるしw
815801:2006/06/22(木) 12:18:36 ID:???
$a = 1000;
$a = Perlメモ($a);
こんなかんじ?

Perlメモの意味がわかりません・・・
816nobodyさん:2006/06/22(木) 12:21:19 ID:??? BE:106128162-#
テンプレぐらい読もうや
817nobodyさん:2006/06/22(木) 12:35:31 ID:???
>>815
ちょっとだけ面白かったw
818nobodyさん:2006/06/22(木) 12:55:09 ID:???
819737:2006/06/22(木) 12:58:32 ID:fNuZm9nk
昨日お世話になりました737です。返事とお礼が遅くなってすみません。

>>775-778
ありがとうございます。
お蔭で住所によるソートについてうまく動作するようになりました。
本当に助かりました。

>>780
「住所」の項を「都道府県」と「それ以下」に分けることも考えたのですが
さらに「市町村」でソートすることも今後ないとは言えないので
柔軟に対応できるようなコードがあれば、そっちの方が良いかなと思った次第でした。
820737:2006/06/22(木) 13:04:30 ID: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を出力。
821nobodyさん:2006/06/22(木) 13:39:30 ID:???
>>804
ダブルクォートだと変数展開しようとするから遅いんじゃないの??

>>815
ワロタww
「Perlメモ」でググってみ
822nobodyさん:2006/06/22(木) 13:41:23 ID:???
全部書かせる気じゃないだろーねw
ってか >>820 のやりかただとデータの配列ぶっこわれて map 内の $tmp[4] が違うくなるよーな。
splice するより、$tmp[3] = ''; とか空白にすればいいんでないかい?
823nobodyさん:2006/06/22(木) 13:43:16 ID:???
>819
その時は文字列を連結すりゃいいじゃん

データ構造を考えるのもプログラミングのうちですよ。
824nobodyさん:2006/06/22(木) 13:52:02 ID:???
ソートとか検索考えると細かく分けたほうが後々対応しやすい
都道府県/市区町村/それ以下
の3つのカラムに分けておくね、俺なら。
既存のデータがあるの?
825nobodyさん:2006/06/22(木) 13:54:34 ID:???
だな。実行速度も速いし。
826nobodyさん:2006/06/22(木) 14:01:39 ID:1JauVdIN
@a=("a,1","b,2","c,1");
上記のように、カンマ区切りのCSVデータを文字列として配列に入れた状態で、

CSV内、2つめの値が1のものだけを@bの配列にいれるには、
foreachで全レコードを回し、条件式を使って@bにpushするしかないんでしょうか?

こういった状態にしたいんですが。
@b=("a,1","c,1");
827nobodyさん:2006/06/22(木) 14:05:22 ID:???
まp
828nobodyさん:2006/06/22(木) 14:05:51 ID:???
gれp か・・・
829737:2006/06/22(木) 14:17:17 ID:fNuZm9nk
>>822
あ!その通りですね・・・。
できるなら配列を短くした方が処理としては良いと思って削ってました。

>>823-824
なるほど。最初から細かい部品に分けておいて
必要に応じて連結して対応する形にする方が効率的ですね。
一応、既存のデータはありますがそれほど数は多くありませんし
テキストエディタでも使えばすぐに書き換えられそうなので
データファイルの構造を変えようと思います。

繰り返しになりますが「フォームで選択された項目のみを出力する」という方法については
whileで1回1回全て開いてから、選択されているかどうかをチェックする方法(>>820の前段)で良いんでしょうか?
もちろん動くことは動くんですが、選択の有無のチェックを各行ごとに行う処理を
1回のチェックでできないかと悩んでいます。
830nobodyさん:2006/06/22(木) 14:21:42 ID:???
いつまでデバッグさせるの?
そろそろ自分でやりなよ
831nobodyさん:2006/06/22(木) 14:24:10 ID:???
spliceしたら配列ずれませんかね・・・
832nobodyさん:2006/06/22(木) 14:26:23 ID:???
わざわざ消すぐらいならView側で表示しないよう分岐させちゃう
のはダメ?
833nobodyさん:2006/06/22(木) 14:28:18 ID:???
>>829
アイデア次第でできないこたないけど、たいして変わらないからいいんでねw
834nobodyさん:2006/06/22(木) 14:28:59 ID:???
>>832
ああ、うちもそうする。
835nobodyさん:2006/06/22(木) 14:33:56 ID:/RLzZFvL
sub password{
undef 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って呼び出しできるの一回だけなんですよね。
836nobodyさん:2006/06/22(木) 14:37:24 ID:???
srand しなきゃいいんじゃね
837nobodyさん:2006/06/22(木) 14:43:03 ID:???
5.004以降はsrand(time)が自動で呼ばれます
838nobodyさん:2006/06/22(木) 14:43:23 ID:/RLzZFvL
>>836
おお。できました
ありがとです<(_ _)>
839737:2006/06/22(木) 14:45:33 ID:fNuZm9nk
>>830
デバッグ・・・そんなつもりはなかったんですけど、
結果的にそういうことになってましたか・・・。
すみません。
「配列の中から必要なものだけ」という点についても
何かアドバイスが欲しかったので、しつこく聞いてしまいました。
すみませんでした。

>>831
その通りでした。
>>822にて指摘していただいた通り
spliceするのではなく要素を空にする方法にします。

>>832>>834
>View側で表示しないよう分岐
にしても、結局同じように@data内を1行ずつ展開して
表示させるかどうかのチェックをする方法しか思いつきませんでした。
アドバイスありがとうございました。

>>833
もしかしたら、自分のやりたいことと書いてるコードが全然見当違いのことをやっていて
「そんな無駄な処理しなくても、こうやった方が良い」というのがあるのかな、と思って質問しました。
特段、妙なコードを書いているわけではないと分かっただけでもありがたいです。

同じような質問、くだらないことを何度もしつこく書き込みをしてすみませんでした。
今まで懇切丁寧に色々と教えて下さった方々本当にありがとうございました。
840nobodyさん:2006/06/22(木) 14:53:39 ID:???
#先に設定
my @checked = qw(1 0 1);# 「年齢」「性別」「電話番号」を出すか

#ループ内で消す
my $i = 0;
foreach my $flg (@checked){
undef $tmp[$i] if $flg;
}

こうするとか。
まぁViewでやるけど。
841nobodyさん:2006/06/22(木) 15:24:19 ID:???
>>839
じゃあ最後に土産

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;
# print
foreach my $d (@data) { while (my ($k, $v) = each %$d) { print $k, ': ', $v, ', '; } print "\n"; }
842nobodyさん:2006/06/22(木) 15:27:23 ID:???
甘やかすなw
843nobodyさん:2006/06/22(木) 15:30:29 ID:???
もう来ないらしいからいいかと思ってww
844nobodyさん:2006/06/22(木) 17:30:21 ID:???
$hoge{"aaa1"} を参照する際、
$i = 1;
print $hoge{aaa$i}; だとエラーになるのですが、正しい記述方法は何でしょうか?
845nobodyさん:2006/06/22(木) 17:36:13 ID:???
なんでわざわざダブルクオーテーション外したのかkwsk
846nobodyさん:2006/06/22(木) 17:38:57 ID:???
こういうのって bare word で書くから出て来ちゃった弊害だよね
847nobodyさん:2006/06/22(木) 17:50:11 ID:fJKTYP9w
関数で帰ってきた文字列を、そのままprintの中に埋め込みたい時は
どうすれば良いのでしょうか?現在は↓のように書いています。
  print "ほげ".&hoge('abcd')."ほげ";
しかし、なんか綺麗じゃないので、↓のような感じで書く方法とか
あったら、良いなぁと思ってます。
  print "ほげ&hoge('abcd')ほげ";
↓のような書き方も良いのですが…。
  print sprintf("ほげ%sほげ",&hoge('abcd'));
まだPerlを始めたばかりなので、皆さんの知恵をかしてください。
848nobodyさん:2006/06/22(木) 17:52:45 ID:???
>>847
print
    "ほげほげほげ",
    hoge('abcd'),
    "はげはげはげ";

とか?
849nobodyさん:2006/06/22(木) 17:54:49 ID:???
print
"ほげ",
&hoge('abcd'),
"ほげ"
;
#改行しちゃえば?
850nobodyさん:2006/06/22(木) 17:57:17 ID:???
>>847
printの中に埋め込まない方が良い

個人的には、
print "ほげ", &hoge('abcd'), "ほげ"; # 連結コスト無し

print "ほげ" . &hoge('abcd') . "ほげ"; # だと2回分、文字列連結コストがかかる
print "ほげ&hoge('abcd')ほげ"; # 動作せず
printf("ほげ%sほげ", &hoge('abcd')); # printf, sprintf のコストは重い
851nobodyさん:2006/06/22(木) 18:02:27 ID:???
配列リファレンスをデリファレンス、だけど、、、。
見栄えはあまりねぇ。

逐次出力したくないときは、どっちにしろ文字列連結コストがかかるし。
852nobodyさん:2006/06/22(木) 18:03:49 ID:???
>>844
print $hoge{ 'aaa' . $i };
853847:2006/06/22(木) 18:05:43 ID:???
なるほど。" ."で連結するのと" ,"で繋げる事に
対するコストなんて考えてませんでした。

皆さんの意見が" ,"で繋げる事で一致しているみたいなので、
これからは、" ,"で繋げる方法でいこうと思います。
854nobodyさん:2006/06/22(木) 18:10:46 ID:???
そこで、@{[]}
855nobodyさん:2006/06/22(木) 19:14:15 ID:???
そこでPerl6ですよ
856nobodyさん:2006/06/23(金) 00:51:44 ID:???
Script Error
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のログファイルに、既にデータが入っていれば、↑のエラーは出ないのですが、
ログファイルの中身が空っぽの場合↑のエラーが出ます。

なぜでしょうか?ログファイルを処理するコードに問題があるのでしょうか・・・・・・?
857856:2006/06/23(金) 00:52:17 ID:???
ちなみに問題があると思しきソースはこんな感じです
─────────────────────────────────────
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";

}

}
858nobodyさん:2006/06/23(金) 01:09:56 ID:???
>>856
見慣れないエラーだな…XREAの鯖か?
それを見る限り、ログファイルが空というだけじゃ特に問題を起こしそうなコードじゃない。
が、それが出るのってもしかしてログファイルが存在しない場合、じゃない?
そうだとしたらerrorサブルーチンのほうをチェック。
特にHTTPヘッダをちゃんと出しているかどうかを確認汁。

どうでも良いが変数名はもうちょっと考えたほうが良いぞ…
valueって日本語で値なんだが…本文は大抵bodyとかtextとかかと。あとなぜにtitleが複数形なのよ。
859nobodyさん:2006/06/23(金) 01:42:46 ID:???
860856:2006/06/23(金) 01:57:18 ID:???
今ちょっと調べてみたところ、無限ループがありました。
それがどうも、>>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;
}
─────────────────────────────────────
861nobodyさん:2006/06/23(金) 02:32:49 ID:???
sub errorの中で&dataを呼んでるので、またエラーが出る、さらにエラーが出る、→無限ルーーーーーーーーーープ!
862nobodyさん:2006/06/23(金) 07:34:25 ID:???
なんでエラー表示するときにデータ読もうと思ったのかkwsk
863nobodyさん:2006/06/23(金) 14:40:13 ID:???
なんでこういうの自分で気付かずに掲示板で質問しちゃうんだろうね…。
そこが分からん
自分では分からないものなのか?
864nobodyさん:2006/06/23(金) 15:26:05 ID:???
>>863
考える前に聞く癖がある。聞いてから考えようと思ってる。そもそも考えない。
の、どれかではないでしょうか。
865nobodyさん:2006/06/23(金) 16:01:22 ID:???
考えて分かるような人は、始めからこんなスレ来ないから
866nobodyさん:2006/06/23(金) 16:58:29 ID:QUOZQBvk
Perl5.8.8 をWindowsXP上で、コマンドプロンプトで実行してます。
しょーもないところでハマってしまったので、教えてください。

pack("C",8) → 0x08
pack("C",9) → 0x09
pack("C",10) → 0x0D 0x0A
pack("C",11) → 0x0B

どうも10をバイナリ変換したときだけ0x0Dがついてしまうんですが、
これってなんでですか?
867nobodyさん:2006/06/23(金) 17:07:46 ID:???
868nobodyさん:2006/06/23(金) 17:08:13 ID:???
windowsの改行。
大雑把に書けば \r\n
869nobodyさん:2006/06/23(金) 17:18:27 ID:QUOZQBvk
やっぱ改行コードが絡むのか。。。orz

$bin='';
for(1..100){
$bin.=pack("C",$_)
}
open(OUT, "> test.bin");
print(OUT $bin);
close(OUT);
exit 0;

↑のコードに意味はないですが、こんな感じで「pack()の第2引数に何か数値が入る」という場合に、
10が入ってきても正しく動くようにするにはどうすればよいのでしょう?
870nobodyさん:2006/06/23(金) 17:20:41 ID:???
ボインモード
871nobodyさん:2006/06/23(金) 17:22:53 ID:QUOZQBvk
そうか!!!
助かりました。ほんとにありがとう。
872nobodyさん:2006/06/23(金) 22:21:11 ID:HrkNw3LR
Bzというバイナリエディタを入れてみました。

print "content-type:image/gif;\n\n";

というヘッダを吐き出して試しに画像を返すCGIを作ってみようと思いました。
最終的には画像をいじるCGIを作ろうと思ってるのですが。

バイナリをコピーしてテキストファイルに貼り付けても何故か

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

という形で張り付きません。何か方法がありますでしょうか?
873nobodyさん:2006/06/23(金) 22:34:29 ID:??? BE:176880645-#
クリップボードの末尾はNULLで判断されるから
874872:2006/06/23(金) 22:58:10 ID:HrkNw3LR
>>873
なるほど。
それではどうすればいいのでしょうか?
手書きで移すしかないのでしょうか。
875nobodyさん:2006/06/23(金) 23:16:19 ID:???
画像ファイルとして保存しておいて読み込めばいいじゃない。
ソースにバイナリを埋め込もうとするなよ、と。
876nobodyさん:2006/06/24(土) 00:26:02 ID:???
すいません質問があるんですが

「 $hoge /= $fuga; 」

で、$hugaの値は始め「0」なのですが、この場合どうすればよろしいでしょうか?
割る数が0だとエラーですよね・・・・
877nobodyさん:2006/06/24(土) 00:32:56 ID:???
$hoge /= $fuga unless $fuga == 0;
878nobodyさん:2006/06/24(土) 00:34:07 ID:???
>>876
経験からすると、そういう時はだいたい計算方法自体が間違ってる。ループの開始値は実は1とか。
まあこれで正しい計算ができると言うのなら $hoge /= $fuga || 1 とか。
879876:2006/06/24(土) 01:54:46 ID:???
>>877-878
ありがとうございます。

一応いろいろいじっていて、「$hogehoge = eval { $hoge / $fuga; };
と、形が崩れてしまったのですがこれで動きました・・・が、これでも問題ないでしょうか?
880nobodyさん:2006/06/24(土) 02:02:12 ID:???
>>879
$fugaが0のとき、$hogehogeの値は何になって欲しいの?
881876:2006/06/24(土) 02:06:23 ID:???
>>880
一応「0」が入って欲しいと思っています。
882876:2006/06/24(土) 02:10:30 ID:???
あぁ、すいません・・・・
素直に>>877さんのを使わせていただきます。うまくいきました。

ありがとうございます。
883nobodyさん:2006/06/24(土) 02:17:12 ID:???
>>881
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)
884876:2006/06/24(土) 02:18:28 ID:???
>>883
あ、はい。
こんな夜遅くにありがとうございます。
885nobodyさん:2006/06/24(土) 02:48:48 ID:LjIFBTan
自分が借りてる鯖では「flock関数」が使えるんですが
その場合ためらいも無く「flock(LOG,2);」とかやっても問題無いですか?
886nobodyさん:2006/06/24(土) 04:03:57 ID:???
>>885
flockが使えないような鯖で動かす予定がないなら良いんじゃない?
漏れは、もう長いことflockのためにeval使ったことなんて無いな…
# っつか、flock非対応の環境に出会ったことが無いんで、
# 対応してない環境では致命的なエラーになる事をすっかり忘れてた。
887872:2006/06/24(土) 17:30:41 ID:1EkY/rQf
>>875
それじゃあ画像をいじるCGIを作るのが難しいですよ。
どこの何番が何に当たるとか、逐一みたいですし。

あ、勘違いしてるかもしれません。
ASCIIコードで埋め込みたいんです。
バイナリで埋め込むという表現は間違いでした。すみません。
888nobodyさん:2006/06/24(土) 17:42:56 ID:??? BE:247632847-#
$binary = "\x00\x01\x02\x03\x04";

とか、packとか
889872:2006/06/24(土) 17:52:23 ID:1EkY/rQf
>>888
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52


こういう感じです。
件のものですが、locationと同じですよね。
まあ

print "location:/img/logo.gif;\n\n";

でやってもエラーが出てしまって困ってるのですが。。。。
なんかスランプです。あつくtえ
890nobodyさん:2006/06/24(土) 18:06:51 ID:???
どうでもいいけど、>>872が何をやりたいのかさっぱり分からない。
891nobodyさん:2006/06/24(土) 18:18:08 ID:???
Locationはhttp://から
892nobodyさん:2006/06/24(土) 19:40:28 ID:???
Spreadsheet::ParseExcelについての質問です。

英語で記載したセルとハイパーリンクだけは抽出してくれるのですが、日本語部分が文字化けしてしまいます。
モジュール部分には、以下のように記載しています。

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
use Unicode::String;

Googleなどの検索では、これで上手く言っている人が大部分でした。お判りになる方がいたら、教えてください。
893872:2006/06/24(土) 21:10:03 ID:1EkY/rQf
とりあえず以下で件の読み込んでやるというのをやってみました。

print "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
894872:2006/06/24(土) 21:12:18 ID:1EkY/rQf
>>892
文字コード問題では?
モジュールに渡す時に決められた文字コードにしておかないといけないとかはないのですか?
その他もジーコ度全般を見直してみhてあ。
895nobodyさん:2006/06/24(土) 21:23:27 ID:???
>>894
ありがとうございます。
とりあえず、そこから調べてみることにします。
896nobodyさん:2006/06/24(土) 22:54:50 ID:???
>>893
おそらくbinmodeでrawにすればおk
さもないと改行コードが自動的に変換されたりしてしまうので。
897nobodyさん:2006/06/25(日) 00:04:20 ID:???
ログから特定の行数だけ抜き出す時は、どうしたらいいんでしょうか。
掲示板ログから出力すると、行数が多いので、
件名だけか、本文の何行まで抜き出すという風に出来たらと思うんですけど。

@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);
898nobodyさん:2006/06/25(日) 00:14:20 ID:???
エスパーかもーん
899872:2006/06/25(日) 00:28:43 ID:CLTK8aRM
>>896
binmodeで、rawにやってみます。ありがとうございます。
>>897
決めたバイトだけ読み取るとか・・・・というかどういう形式で保存されてるのかさえ
わかりやすく説明したらきっと詳しい人がズバリで教えてくれると思いますよ。
900nobodyさん:2006/06/25(日) 01:37:46 ID:???
>897
spliceで削除しちゃえばいいんじゃないのか?
901897:2006/06/25(日) 03:45:53 ID:???
>>899
ありがとうございます。
バイトで読み取りをしてみたのですが、うまくいかず…。
もっと勉強します…。
spliceでいけました。

>>900
spliceでいけました。
ヒントありがとうございます。
本当に本当に助かりました!
ありがとうございました。
902nobodyさん:2006/06/25(日) 06:35:30 ID:???
>>893
img/logo.gifが純正のgifファイルなら、
何も変換せずにprint <FH>で表示できる。
windows環境ならbinmodeが必要。

binaryが見たいなら、とりあえず
print unpack"H*",join"",<FH>で見れる

各要素を配列として得たいなら
my@a=unpack"C*",join"",<FH>など、・・・
903nobodyさん:2006/06/25(日) 07:42:22 ID:???
>^)+++< (^_^#) (*^(^ *) [^<>^]
904nobodyさん:2006/06/25(日) 10:22:03 ID:???
>>893 の 「フォトショップみたいなCGI」 ってのがすごく気になる・・・
フォトショップの何をしたいのかさっぱりわからんw 全体だったらかなり無謀だよね。
905nobodyさん:2006/06/25(日) 12:03:42 ID:???
>>904
Photoshop を Web アプリとして再実装できたら面白いと思ふ。
例えば中小規模でのグラフィックワークステーション共有とか、コスト面でのメリットが出るならいけそうじゃないか?
906nobodyさん:2006/06/25(日) 12:06:28 ID:???
0;
907872:2006/06/25(日) 12:47:39 ID:CLTK8aRM
print "Content-type: image/gif\n\n";
open 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
です。
908nobodyさん:2006/06/25(日) 13:10:04 ID:???
binmode STDOUT;

もお忘れなく
909872:2006/06/25(日) 13:22:05 ID:CLTK8aRM
>>908

print "Content-type: image/gif\n\n";
open FH,"../img/logo.gif";
binmode STDOUT;
print <FH>;
close;

ありがとうございました。これでできました。
binmode FH;はファイルをバイナリレベルでいじる時で、出力をバイナリにするには
binmode STDOUT;が必須だったのですね。

ありがとうございました。

>>904-905
専用サーバを借りてるので、時間掛けながらゆっくりやろうとかと思います。
どこらへんまで出来るのかは現時点の私ではわかりませんので、みなさんからすると
アホなことかもしれません。でも面白そうなので。
910nobodyさん:2006/06/25(日) 13:44:45 ID:???
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)
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の影響だとは思うのですが。
911nobodyさん:2006/06/25(日) 13:46:56 ID:???
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)
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のモードを変える方法でもあるのでしょうか?
912nobodyさん:2006/06/25(日) 14:09:12 ID:???
ImageMagickがインストールされてないサーバで、インストールする権限もない状態で、
なんとか使うことは出来ないのでしょうか?
913nobodyさん:2006/06/25(日) 16:30:20 ID:???
>>912
鯖缶にお願いメールを送信する
914nobodyさん:2006/06/25(日) 16:38:32 ID:???
>>911
何言ってんの?

while (<FD>){
print $_;
}

こうすれば行ごとになるんでしょ? それに加えて \n 入れたら2行になるの当たり前じゃん。
915915:2006/06/25(日) 16:58:59 ID:???
$rand = int(rand(6));

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しているので重なることはないと思うのですが
なぜ同じ数値が出るのでしょうか?
どこか間違っている場所があればアドバイスいただければと思います。
916nobodyさん:2006/06/25(日) 17:05:01 ID:??? BE:141505128-#
よくわかんないけど、
+=とsprintf使った方がよさげ
917nobodyさん:2006/06/25(日) 17:13:02 ID:???
$rand = int(rand(6));

$rand += 1 if ($old_rand == $rand);
if ($rand < 5) {
 $key = sprintf("%03d", $rand);
} else {
 $key = "006";
}
$old_rand = $rand;

006は重なるだろうけど、他の部分で$old_rand変更しちゃってるとか。
918915:2006/06/25(日) 17:21:20 ID:???
レスありがとうございます。
もしかして
{}内で$old_randに入れても{}内だけで有効で
{}外では$old_randって何も入ってない状態になりますか?
もしそうなら私のバカなミスということになりますが・・・。
919nobodyさん:2006/06/25(日) 17:23:14 ID:???
いや、そんな事は無い。
同じ処理が全部の条件に入っていたから括り出しただけ
920 ◆TWARamEjuA :2006/06/25(日) 18:03:04 ID:??? BE:7841298-#
(´-`).。oO(前回と同じ数字が出るのも乱数(疑似乱数)だと思うけれども、、、)
921nobodyさん:2006/06/25(日) 18:51:53 ID:???
>>915
こんなコード書いてみた。いろいろ弄って考えてみて。

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;
}
}

# 本当は、元のままのコードを使いたかったのだけれど、
# プログラム関連の板で改行制限が厳しいとはどういうこった!>ひろゆき
922nobodyさん:2006/06/25(日) 19:09:56 ID:???
なぜBEGINブロックなのか不明
923nobodyさん:2006/06/25(日) 19:17:36 ID:???
>>922
初期化してるから。
924nobodyさん:2006/06/25(日) 21:05:56 ID:???
>>920
だから前回と同じ乱数字が出たら+1してるんじゃない?
925911:2006/06/25(日) 21:28:57 ID:???
>>914
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でやれば問題は解消します。
なぜでしょうか?
926nobodyさん:2006/06/25(日) 21:52:14 ID:???
よくそんなに分かりにくく書くなぁ
配列を<>に入れてるのも初めて見たわ。
927nobodyさん:2006/06/25(日) 22:03:36 ID:???
質問に無関係なところを除去しようとするのは良い心がけだが、動作チェックくらいしよう、な?
+>で開いて読み込めるわけないし。+<の間違いだとしても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)
こんな感じになるって意味?
928 ◆TWARamEjuA :2006/06/25(日) 22:10:34 ID:??? BE:1742944-#
>>924
そうなるとせっかくの乱数が偏って、ますます乱数から遠のくかと♪
929911:2006/06/25(日) 22:28:53 ID:???
>>927
え?実際にそのソースで動作させた結果をお話してるのですが?
+>で読み込めますよ?
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だけの問題ではなさそうですが。
930nobodyさん:2006/06/25(日) 22:30:25 ID:???
重複しない乱数が欲しいなら
(1)欲しい乱数の範囲を連番で配列へ格納
(2)その配列をシャッフル
これでOKよ
931911:2006/06/25(日) 22:31:28 ID:???
>>927
>split /,/,@lineって$i使ってないし。
あ、ありがとうございます。

・・・やっぱり普通に親切な人なのかな?
932911:2006/06/25(日) 22:36:58 ID:???
しかし
>split /,/,@lineって$i使ってないし。
なんでこれで動いてるんでしょうか。
ちゃんと書き込まれる内容があってるというのは不思議です。
ローカルレベルなのでipが一つだけなのでたまたま動いてるんだと思いますが。

my @temp = split /,/,@line;
これの結果って@lineをスカラで評価するわけですから、本来@tempには
数字しか入らないとおもうのですが。

なぜまともに中身が入ってるのですかね・・・
933nobodyさん:2006/06/25(日) 22:43:11 ID:???
while ( <@new_line> ){

ここが原因。
<> でくくると空白ごとに改行に置換される模様。

つかですね、配列に入ってるなら
print FH @new_line;
でえぇですやん
934911:2006/06/25(日) 22:52:08 ID:???
>>933
空白ごとですか。
でもそれだとどうしてブラウザに出力したときは違う結果になるのでしょうか。
よければ>>925のソースにHTTPヘッダをプラスして実行してみてください。

whileでブラウザに出力してソースをみてもブラウザの種類のところに改行は
自動挿入されてないのです。

ファイルに書き込む時だけそうなってるんですよね。

確かに
$`="\n";
print FH "@new_line";
でよかったですね。
935911:2006/06/25(日) 22:54:37 ID:???
>>934の追記です。以下でやってみてもらえるとわかってもらえると思います。

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;

ブラウザでは普通に出力され、ファイルには変な改行が加えられて書き込まれます。
936927:2006/06/25(日) 22:56:13 ID:???
>>929
そこのサイトかー勘違いしやすい書き方なんだよな…これ。
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に何も入ってきてないはず。

# 口調は雑だけど煽りのつもりは無いのでキニスンナ
# うっかり素を出すと敬語もどきになってしまうんですよ
937911:2006/06/25(日) 23:17:15 ID:???
>>936
なるほど!
ローカルチェックだったので初め消されても支障がなかったようです。
自分のipは一つで>>935をなんどやってもどちらにせよ中身を読み込む必要がなかったので。
splitとopenで間違いがあるのを教えてくれてありがとうございました。
すみませんあらぬ疑いを向けてしまって。質問者の分際でごめんなさいm(__)m

それでですが、本来の目的である「期待の動作をするスクリプトの作成」
からはちょっと脱線してしまってまして、なぜ>>935のソースでブラウザ出力内容と
ファイル書込み内容に差がでるのかが気になってしょうがないのですが。
>>936さんはわかりますでしょうか。

ファイルの書込みとwhileと。複雑に絡んだ現象なのでしょうか。
ちなみにperlのバージョンは5.8.1のwinxPです。
938927:2006/06/25(日) 23:33:09 ID:???
>>937
ブラウザではHTMLとして解釈されていると言うことを忘れているのではないか。
HTMLソースを見るか、
while ( <@new_line> ){ print $_,"<br>\n" }
while ( <@new_line> ){ print FH $_,"\n" }
とすれば同じように表示されると思う。
939911:2006/06/25(日) 23:35:41 ID:???
>>938
いえ、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)

こうなってしまうのです。
940nobodyさん:2006/06/25(日) 23:41:23 ID:???
なんで else if が elsif なんて珍妙な省略されてるのはどうしてだぜ?
941927:2006/06/25(日) 23:53:03 ID:???
>>939
ああスマソ、>>934にソース見てもと書いてあったか。
漏れのところじゃファイルに書き出された物と同様に、ブラウザの方のHTMLソースにも改行が入ってるよ。
多分、Perl上の問題じゃなくて間に入ってるウェブサーバかエディタか…ともかく環境の問題だと思う。
# それにしてもperl5.8.1って随分とまた古いものを…

>>940
else ifじゃ無いのはぶら下がりが禁止されてるから。
Cなんかのelse ifは
if (expression)
 statement;
else
 if (expression)
  statement;
と言うのをくっつけて書いてるだけだからな。しかし、elseifにしなかった訳はわからん…
言語によってelifだったりelsifだったりelseifだったり覚えるの大変('A`)
942911:2006/06/26(月) 00:08:33 ID:???
>>941
周辺環境によるのですか。
エディタはterapadで、apache1.3.31です。
どうやらスッキリ解決という感じにはなりそうもないですね。

ちなみに<>は空白にも反応してしまうという話ですが。
それではよくある
open FH,"hoge.txt";
my @array = <FH>;
close;

open FH,"hoge.txt";
while (<FH>){ print $_,"\n" }
close;
の精度はイマイチということでしょうか。
色々なサイトに前者の方法でファイルを読み込んで行ごとに配列に入れられる
という説明があったと思いますが。

実際は半角空白?か何かがあると行ごとにはいかないということですよね。
943nobodyさん:2006/06/26(月) 00:10:42 ID:???
だからファイルハンドルじゃなくて
配列を <> に入れるとそうなるって話でしょう。
見た事無いよ <@array> なんて使い方は。
944911:2006/06/26(月) 00:13:37 ID:???
>>943
なるほど。
ちょっと試してみます。
945nobodyさん:2006/06/26(月) 00:15:00 ID:??? BE:212256364-#
ヘタクソ!!
946911:2006/06/26(月) 00:23:18 ID:???
>>943
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)

でした。
947nobodyさん:2006/06/26(月) 00:27:07 ID:???
>>912
鯖と同じOSのマシンを用意してコンパイルしてuse lib
948911:2006/06/26(月) 00:27:26 ID:???
上記をやったらaccess.logの中身は ではなくてtest.logの中身でした。

続き

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の中身は
949nobodyさん:2006/06/26(月) 00:28:23 ID:???
単に while (<@new_line>) { ... } っていう変なのをやめればいいだけじゃないか。
どういう勉強の仕方したらこう書くようになるんだろう…。
ネットだけでやってきたのかなぁ。
950911:2006/06/26(月) 00:28:34 ID:???
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)

でした。
951nobodyさん:2006/06/26(月) 00:29:19 ID:???
行入力演算子(<>)を配列変数に対して使うなんて初めてみた。
普通そこはfor(foreach)じゃないの?
952nobodyさん:2006/06/26(月) 00:31:01 ID:???
while (<@line>) を for (@line) にすれば済む話じゃないのか 何でこんな長々と続いてんの?
953nobodyさん:2006/06/26(月) 00:31:50 ID:???
だよね。911はその書き方じゃなきゃイヤみたいなんだよ。
954911:2006/06/26(月) 00:32:25 ID:???
>>943
で、まとめですが。

わかったこと
@array = <FH>とやると格納されるときに行末の改行コードがなくなってる。
<@array>の時点では既に改行はない。
<@array>の中には改行は既にないが、配列の要素を一つづつ出すわけではない。

つまり<@array>なんて使うなということだと思いますが、もしかしたら
$`の区切り文字設定と同じものを見つけると<@array>これが反応する?

少し眠くなってきました。勉強になりました。
955911:2006/06/26(月) 00:34:20 ID:???
>>952
いえ、どうすればキチント動くかという話ではなくて、何であれであの動きをしたのかということが
気になったので。

ちなみに<@array>の方法はここで数年前にここで教わりました^^;
956nobodyさん:2006/06/26(月) 00:34:42 ID:???
> @array = <FH>とやると格納されるときに行末の改行コードがなくなってる。

んなこたない
957nobodyさん:2006/06/26(月) 00:37:15 ID:???
>>954
>@array = <FH>とやると格納されるときに行末の改行コードがなくなってる。
間違い。

>>948 での君のコードが間違ってる。
出力する時にまた同じく
> while (<@line>){ print DH $_;}
やってるから、この時点で空白文字(改行)がカットされてるだけ。
958911:2006/06/26(月) 00:37:44 ID:???
>>956
>>948を見てください。>>954は実際に動作させて得た結果のまとめのつもりです。
>>948をやると改行が全てなくなってtest.logに書かれてるということは
どこかで消されてるはずなのです。

で、それを配列に入れたときだろうと推測しました。
959nobodyさん:2006/06/26(月) 00:37:46 ID:??? BE:53064432-#
そろそろ次スレ〜
960911:2006/06/26(月) 00:40:05 ID:???
>>957
なるほど。そこで消えてたのですか。
一応>>943を受けての一連の実験だったので、あのコードは間違いではないのですが。

しかしみなさん<@array>って本当にありえないんですね。
数年前に教えてもらってからずっと正しいやりかただと思って使ってました。
961nobodyさん:2006/06/26(月) 00:43:26 ID:???
数年前からPerlやってて、+>とか<@line>とか書いちゃうのか・・・(´・ω・)
962nobodyさん:2006/06/26(月) 00:44:29 ID:???
その使い方で数年間問題がなかった方が不思議だ
963nobodyさん:2006/06/26(月) 00:44:52 ID:???
>>960
> 数年前に教えてもらって
((( ;゜д゜)))ガクガクブルブル

911が納得したところで次スレ建てトライしてくる。
964nobodyさん:2006/06/26(月) 00:51:24 ID:???
readline 関数にファイルハンドルか型グロブ以外のものを渡した時の動作なんて
保障されてないと思うんだけど。
少なくともperldocにもラクダ本にも明記されてないね。
965nobodyさん:2006/06/26(月) 00:52:50 ID:???
全く関係ない $` といい記憶違いでしょ。
どの板のスレかとその時のキーワード分かるならログから探してくるよ。
966nobodyさん:2006/06/26(月) 00:58:50 ID:???
$self->{next} = new BBS2ch::Thread 'Perlコーディング初心者質問スレ Part 50';
$self->{next}->lead($self);
# テンプレ多いっす(;´Д`A
__END__
次スレ
http://pc8.2ch.net/test/read.cgi/php/1151250398/
967nobodyさん:2006/06/26(月) 01:34:27 ID:??? BE:283008184-#
968nobodyさん
#!/usr/bin/>>966 -乙
package >>966;
use AutoLoader qw/AUTOLOAD/;
. . .