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

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

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

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

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

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
2nobodyさん:2006/11/26(日) 14:40:22 ID:???
ム板Perlスレより 1 of 2

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

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

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
3nobodyさん:2006/11/26(日) 14:41:13 ID:???
4nobodyさん:2006/11/26(日) 14:41:45 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/

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/
5nobodyさん:2006/11/26(日) 14:51:35 ID:tkb0DDKs
>>1
61:2006/11/26(日) 17:42:11 ID:???
貼り順まちがいた...orz
7nobodyさん:2006/11/26(日) 17:50:07 ID:???
jcode.plでutf-8→eucの変換って行えないのでしょうか?

jcode::convert(\$Line,'euc');
8nobodyさん:2006/11/26(日) 19:05:37 ID:???
UTF8非対応だから
9nobodyさん:2006/11/26(日) 22:01:06 ID:???
いい加減Jcode.pmなりEncode.pm使おう
10nobodyさん:2006/11/26(日) 22:46:05 ID:???
2chのように、時間に22:27:00:00まで表示するにはどうすれば良いのでしょうか?
11nobodyさん:2006/11/26(日) 23:15:07 ID:???
表示されてないお
12nobodyさん:2006/11/26(日) 23:22:34 ID:???
>>11
VIPでは00:00:00:00まで出るよ
13 ◆TWARamEjuA :2006/11/27(月) 00:03:22 ID:??? BE:2614346-BRZ(6677)
00:00:00.00ですね♪
Time::HiRes 使ってるです♪
14nobodyさん:2006/11/27(月) 01:00:43 ID:???
>>13
どうもありがとうございます。
15nobodyさん:2006/11/27(月) 01:47:56 ID:VGuJADoD
あぁ、そんな無駄なことに貴重なCPUサイクルを消費して・・・
16nobodyさん:2006/11/27(月) 04:01:18 ID:???
関数のエラー時の戻り値って何にしてます?
0や-1を返す場合が多いと思いますが、undefにしない理由って何かあるんでしょうか。
undefなら0と同じくfunc() or dieなんて呼び方もできるし、undefの可能性ありと
常に思っておけばprint func()なんて不用意に書かなくなるかなと思ったんですが。

use warningでundefをprintするなと大量に警告されて、関数の書き方間違ったかなと
思ったりしました。

17nobodyさん:2006/11/27(月) 09:39:53 ID:???
undefを返せばいいと思いますよ
私は以前から 0 or DATA で返してるので、今からそのクセを治すのに苦労しそう・・・
18nobodyさん:2006/11/27(月) 11:28:23 ID:???
undef 一択
19nobodyさん:2006/11/27(月) 11:43:26 ID:???
return ();

なんて記述もよく見かけるけど、これは
・リストコンテキストなら空リスト
・スカラコンテキストならundef
になるって事でおk?
20nobodyさん:2006/11/27(月) 14:23:58 ID:???
>>19
むしろ return; だけでおk
21nobodyさん:2006/11/27(月) 15:21:54 ID:???
return (); と return; の違いはなんじゃらほい?
22nobodyさん:2006/11/27(月) 16:19:33 ID:???
2chの30秒規制みたいなのをつけたいんですが
どのようにすればいいでしょうか?
23nobodyさん:2006/11/27(月) 16:26:08 ID:w7/znFw6
cookie
24nobodyさん:2006/11/27(月) 18:28:22 ID:???
>>21
横だけど、
処理を意識して書くか perl に任せるかの違いじゃね?
呼び出し元にとってみればどっちも同じ挙動でしょ。
25nobodyさん:2006/11/27(月) 18:34:15 ID:???
配列にundef代入したら要素数==1
26nobodyさん:2006/11/27(月) 18:53:55 ID:???
>>16
分ってる人もいるっぽいが、
return () ; or return ; の二択しかないよ(実質一択)。
かなり有名なネタだ。

初心者スレなので参考 URL を。
ttp://d.hatena.ne.jp/hyuki/20060406
27nobodyさん:2006/11/27(月) 19:13:29 ID:???
crypt (angokashitaimoji,'$1$$');

↑このようなほうほうで暗号可したのですが
アルファベットのほかに、どのような記号が使われるのでしょうか?
リストがのってるサイトがあったらお願いします。
28nobodyさん:2006/11/27(月) 19:21:19 ID:???
>>27
perldoc -f crypt
29nobodyさん:2006/11/27(月) 19:27:39 ID:???
>>28
30nobodyさん:2006/11/27(月) 20:00:40 ID:???
>>27
perlでは決まっていないので使用するシステムのcryptライブラリのマニュアルなどを
参照。たとえばこんなの。

ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/crypt.3.html
31nobodyさん:2006/11/27(月) 20:05:25 ID:???
>>30
どうもありがとうございます
32nobodyさん:2006/11/27(月) 21:24:09 ID:???
お聞きしたいのですが
CGIファイルの中身って見ることってできるんでしょうか?
HTMLは見れますが
CGIの中身って見れませんよね?
CGIの中身というのは、.cgiファイルのうp前の状態です。
33nobodyさん:2006/11/27(月) 21:27:54 ID:???
鯖の設定によっては見れる
34nobodyさん:2006/11/27(月) 21:56:02 ID:???
>>33
返信ありがとうございます。
どのような設定をすれば見れなくできますかね?
有料鯖なのですが
わたしでもその設定はいじれるのでしょうか?
35nobodyさん:2006/11/27(月) 22:10:03 ID:???
.htaccessで
または全ディレクトリにindex.htmlを
36nobodyさん:2006/11/27(月) 22:14:13 ID:???
CGIのソースの読める読めないはindex.htmlがどうとかそういう問題とは違わないか?

とりあえず>>34の使っている鯖がCGI可なのかどうかが問題だ。
そういえばちょっと前にCGI不可の鯖に.cgiで置いてソース晒してた椰子が居たなあ…。
3716:2006/11/27(月) 22:21:07 ID:???
みなさん、どうもありがとうございます!
特に>>25,>>26 ありがとう

今日まさにこんなことやりそうになってました。undef返したら真なんですね。
(@array = &func()) or 〜

return;と書くとリストコンテキストでは空の配列を、スカラコンテキストでは
undefを返す、つまり
return wantarray ? () : undef;
と書くのといっしょってことですね。危うく間違った理解で突き進むところでした。
38nobodyさん:2006/11/27(月) 22:23:31 ID:???
undefを返すなら、definedでチェックするようにしようぜ
39nobodyさん:2006/11/27(月) 22:58:38 ID:???
>>35-36
どうもありがとうございます。
.htaccessで設定できるのでしょうか?
やりかたがのってるサイトが見つからないので
よかったら教えてください
40nobodyさん:2006/11/27(月) 23:13:26 ID:???
>>39
その前にちゃんとCGIが動く鯖なんだろうね?
41nobodyさん:2006/11/27(月) 23:13:59 ID:???
>>40
はい
42nobodyさん:2006/11/27(月) 23:19:09 ID:???
それなら適切にパーミッションを設定してやれば
ブラウザでアクセスしていきなりソース丸見えという事はないと思うよ。
43nobodyさん:2006/11/27(月) 23:19:55 ID:???
とりあえず実行属性つけちゃえば問題ない
44nobodyさん:2006/11/27(月) 23:25:23 ID:???
>>42
ブラウザというのは、「IE」や「Sleipnir」のことでしょうか?
>>43
やってみます。
45nobodyさん:2006/11/27(月) 23:26:52 ID:???
知識が底辺過ぎるし、スレ違いというか板違いなので終了
4616:2006/11/27(月) 23:35:54 ID:???
昔、CGIのソース丸出ししたことあるなあ。当時は原因不明だったけど、
大方htaccessの設定だったんだろうなあ。下記とかかな。

AddHandler cgi-script .cgi
47nobodyさん:2006/11/28(火) 00:12:50 ID:???
>>46
httpd.confですかね?
48nobodyさん:2006/11/28(火) 00:15:03 ID:???
htaccessを無視するのか
おまえ酷すぎ
49nobodyさん:2006/11/28(火) 00:40:58 ID:???
httpd.confであってるんだけど、レンタルサーバだといじれないので、
httpd.confの設定をhtaccessで上書きするってこと。

全然はずしてるかもしれないけど、CGIは基本的にcgi-bin内で実行、
それ以外はhtaccessいじってね、っていう仕様なのかもね。
50nobodyさん:2006/11/28(火) 00:43:31 ID:???
ほぉほぉ
51nobodyさん:2006/11/28(火) 00:44:27 ID:???
ありがとうございます。
52nobodyさん:2006/11/28(火) 00:45:28 ID:5n8a+rNm
文字列の入った変数中に、指定した文字が
ある場合true、ない場合falseを返す変数があったら教えてください。
53nobodyさん:2006/11/28(火) 00:46:41 ID:???
index
54nobodyさん:2006/11/28(火) 00:47:22 ID:???
どうしてもTRUE|FALSEでほしいなら自前の関数でラッピングしてください
55nobodyさん:2006/11/28(火) 00:48:20 ID:???
return undef;の話はPerlベストプラクティスに載ってるね。
56nobodyさん:2006/11/28(火) 02:23:57 ID:???
<FORM action="a.cgi" method="POST">
#いろいろな項目入力
<INPUT type="submit" value="実行a">
</FORM>

実行aボタンを押すと、a.cgiが実行されますが、
実行aボタンを押して同時に下のb.cgiを実行する
方法ありますでしょうか。

<FORM action="b.cgi" method="POST">
#いろいろな項目入力
<INPUT type="submit" value="実行b">
</FORM>

a.cgiの処理コードの中に、b.cgiの処理コードを
書くぐらいしか思いつきません。

よろしくお願いします。
57nobodyさん:2006/11/28(火) 05:30:21 ID:PG2nYwJ4
こんな時間にすいません。誰かいたら教えて下さい
phpで例えば<?php include("○○.php"); ?>というのがあります。
これは○○.phpを上の記述を書いたphpに表示させることができます。

perl(cgi)も同様なことできますでしょうか?
index.cgiにabc.cgiを表示させたいんですけど。
やり方ありましたら教えて下さい m(_ _"m)ペコリ
58nobodyさん:2006/11/28(火) 09:44:54 ID:???
>>56
一つの体で、別々の場所に行く電車に乗れますか?
自分で思いついた方法で大丈夫です。

>>57
つ require、or module
59nobodyさん:2006/11/28(火) 10:10:33 ID:???
>>58
レスありがとうございます
軽くしらべてみたんですが難しいですね
それでできればいいんですが・・・
がんばってみます
60nobodyさん:2006/11/28(火) 10:44:39 ID:???
>>58
多重影分身すればいいのか
61nobodyさん:2006/11/28(火) 10:54:01 ID:???
チャクラが人並以上に必要だってばよ
62nobodyさん:2006/11/28(火) 14:47:00 ID:???
@grepedarray = grep(/^[A-Z]/,@array);
こういう文に置換 - s/ / / -を組み合わせたいのですが出力が上手く表示できません
どうしたらよいでしょうか?
63nobodyさん:2006/11/28(火) 15:01:43 ID:???
ようわからんが map も使えば?
64nobodyさん:2006/11/28(火) 15:08:26 ID:???
@grepedarray = map { /^o^\ } grep(/^[A-Z]/,@array);
65nobodyさん:2006/11/28(火) 15:13:05 ID:???
ちょw 誰が フッジサーン 使えと言ったwwwww
66nobodyさん:2006/11/28(火) 15:16:09 ID:???
map {push(@grepedarray) if(s///);} @array;
これでもおk?
6766:2006/11/28(火) 15:21:19 ID:???
連投すまん
push(@grepedarray)
じゃなくて
push(@grepedarray, $_)
じゃないとだめかも
68nobodyさん:2006/11/28(火) 15:55:32 ID:???
それならforeach使えばいいのに。
69nobodyさん:2006/11/28(火) 19:55:31 ID:???
>>66-67
それはダメ。mapを使うなら、返り値を利用するべき。
70nobodyさん:2006/11/28(火) 19:56:25 ID:???
ごめん、「ダメ」はいいすぎた。あくまで「おすすめできない」って事でひとつ・・・
71nobodyさん:2006/11/28(火) 20:59:18 ID:???
素直に block で
@grepedarray = grep { s/ / / ; /^[A-Z]/ } @array ;
@grepedarray = grep { $flag ++ if /^[A-Z]/ ; s/ / / ; $flag } @array ;
じゃ駄目なのか?(適当に書いたが)
72nobodyさん:2006/11/28(火) 21:04:48 ID:???
取得しない値まで置換とかする必要ないだろ・・・常識的に考えて・・・
7371:2006/11/28(火) 21:17:03 ID:???
>>72
そうだ罠。(実際書く時には当然もっと丁寧に if 文書くけどさw)

ただ @array に grep でアクセスした後、map or foreach で
アクセスするなら実質 2 回のループなわけで…。
そっちも十分に無駄っぽいよね。
74nobodyさん:2006/11/28(火) 21:34:23 ID:???
そんな事言ってたらPerlでプログラミングできませんよ(´・ω・)
もっと富豪的に
75nobodyさん:2006/11/28(火) 21:43:35 ID:???
grep 使ってる時点で十分富豪w
76 ◆TWARamEjuA :2006/11/28(火) 22:00:53 ID:??? BE:1089825-BRZ(6677)
@grepedarray = grep {
 /^[A-Z]/
  ? s/ / /
   ? 1
   : 1
  : undef
 } @array;
77nobodyさん:2006/11/28(火) 22:05:24 ID:???
ここらへんで誰かが Bench ってくるとエスパー
78nobodyさん:2006/11/28(火) 22:10:11 ID:???
ふと思ったんだが、処理速度のbenchならBenchmark.pmだけど
メモリのbenchってどうやんだ?やる方法ある?
79nobodyさん:2006/11/28(火) 22:24:28 ID:???
>>76
そう来るならこっちの方がもっとスマート
grep { /^[A-Z]/ ? s/ / / || 1 : undef } @array;
80nobodyさん:2006/11/28(火) 22:39:36 ID:???
だったら grep { /^[A-Z]/ and s/ / / || 1 } @array; でもいくね?
81nobodyさん:2006/11/28(火) 22:43:03 ID:???
そうデスorz...
82nobodyさん:2006/11/28(火) 22:48:03 ID:???
>>78
Windowsじゃ動かんし使ったことも無いのだけれど、
forkしてから走らせて使用メモリサイズを調べるmemchならあるね…
ttp://search.cpan.org/~salva/Memchmark-0.01/lib/Memchmark.pm
freeで確保した領域をOSに返しちゃうタイプのライブラリだとそもそも成立しない方法っぽい

それから、Perlをデバッグオプションつきでコンパイルしておけば、
色々メモリ関連情報が調べられるんだったと記憶しているけれど、
どの程度できるのかよく知らんです。
83nobodyさん:2006/11/28(火) 22:54:46 ID:???
>>82
> Memchmark.pm
ああ!それがあったか。試してみよ。THX!
84nobodyさん:2006/11/29(水) 00:11:52 ID:YenD9j36
25桁*1000万件の重複しない数値データをcsvファイルに格納させるため、
以下のようなプログラムを書きました。


my %no;

for (my $cnt = 1; $cnt <= 10000000; $cnt++) {
my $s_no = main::create_no();

$no{$s_no} = 1;


if(!open(FH, ">>./no.csv")){
print "Error " . __LINE__ . "\n";
exit;
}
flock(FH, 2);
print FH $s_no . "\r\n";
flock(FH, 8);
close(FH);
}


create_no内では
if(not exists $no{$c_no}){ return $c_no; }
このようにハッシュのexsistsを使用して重複チェックをかけているのですが、
やはりメモリを大量に消費してしまうため、900万あたりからものすごい時間が
かかってしまいます。

効率的な方法があればどうかご教示ください。
恐れ入りますが宜しくお願いいたします。
85nobodyさん:2006/11/29(水) 00:19:15 ID:???
25桁で連番で1000万件書き出す
桁数が決まってるのでバイナリアクセスで

filepos1 = rnd * 総レコード数
filepos2 = rnd * 総レコード数

この pos1 と pos2 を入れ替え
あとは好きな回数だけswapすればいいかと思います

すべての件をメモリに保持しないので仕様メモリは極小で済みますが、
ディスクI/O がかなり発生します。
86nobodyさん:2006/11/29(水) 00:59:08 ID:???
>>85
ご教示有難うございます。

この方法ですと、1000万回ファイルを読み込む、という
解釈で宜しいでしょうか。
87nobodyさん:2006/11/29(水) 01:15:11 ID:???
50万回シャッフルする場合は

1000万回ライト
50万回シーク
50万回リード
50万回シーク
50万回ライト

って感じです
88nobodyさん:2006/11/29(水) 01:15:58 ID:???
Perl5.8以降なら、こんな事もできます。
http://blog.livedoor.jp/dankogai/archives/50681645.html
89nobodyさん:2006/11/29(水) 22:03:44 ID:???
>>58
お礼すごい遅れました。
ありがとうございました。
90nobodyさん:2006/11/29(水) 23:37:00 ID:???
>>62です。
みなさん色々ありがとうございました。
91nobodyさん:2006/11/29(水) 23:58:32 ID:???
@grepedarray = grep { /win/ and s/win/BIG/ } @array;

$cnt = grep(/win/,@array);

print "大文字\n@grepedarray\n計$cnt個\n";

この文で$cntの部分が 計0個とでてしまんですが何が問題なんでしょう?
92nobodyさん:2006/11/30(木) 00:14:17 ID:???
>>91
grep{} 内の $_ は元 array の要素のエイリアスだから、
一行目にて $_ を直接変更してしまっている。それがやなら
@grepedarray = map { $foo = $_ ; $foo =〜 s/win/BIG/ ; $foo } grep { /win/ } @array ;
てなかんじで map 中で $foo にいったん代入してから変更する事
ちなみに上の map 中の $_ も @array の要素のエイリアス( s/// したら変更されちまう)
93nobodyさん:2006/11/30(木) 00:17:52 ID:???
map っていまいちつかいどころ分からない
ブロックで囲っちゃえばいいじゃんとか思うのだが
94nobodyさん:2006/11/30(木) 00:18:50 ID:???
×一行目にて $_ を直接変更してしまっている。それがやなら
○一行目にて元要素を直接変更してしまっている。それがやなら
95nobodyさん:2006/11/30(木) 00:30:46 ID:???
>>92さん
ありがとうございます。理解できました。^^
96nobodyさん:2006/11/30(木) 00:32:28 ID:???
>>93
例を挙げるとシュワルツ変換には必須。
my @array = ( '1,2', '2,1' ) ;
my @sorted = map { $_->[0] }
        sort { $a->[1]<=>$b->[1] }
        map { [ $_, (split /,/, $_ )[1]] } @array ;
上を普通の for 文で書くと捨て array を数個書くはめになり、7 行以上になることは確定。
とは言いながらも使うかどうかは完全に趣味の問題
97nobodyさん:2006/11/30(木) 01:25:15 ID:???
>>93
何を抜かしてるのかと思ったら、ここ WebProg 板なのね…。
98nobodyさん:2006/11/30(木) 02:58:21 ID:???
>>93
たとえばだけど、ハッシュを引数に取るサブルーチンに
foo( map { $_ => $hash{$_} =~ /^\d+$/ ? $hash{$_} * 2 : "str".$hash{$_} } keys %hash);
などと使えて便利。
99 ◆TWARamEjuA :2006/11/30(木) 07:00:27 ID:??? BE:436122-BRZ(6677)
my $Now_date = sprintf qq|%04d/%02d/%02d|, # 日付を生成
map {
$_->[0] += 1900;
$_->[1]++;
@$_
} [(localtime)[5,4,3]];
100nobodyさん:2006/11/30(木) 08:57:31 ID:???
>>99
…さすがにそれは普通に sub に渡すだろ
my $Now_date = sprintf qq|%04d/%02d/%02d|,
sub { $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
もしくは
my $Now_date
  = sub{ sprintf qq|%04d/%02d/%02d|, $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
101nobodyさん:2006/11/30(木) 10:53:04 ID:???
>>9
Jcode.pm は知らんけど、Encode.pm は重い。
一般的な掲示板CGIで use Encode; しただけで、2〜3割CPU負荷が高くなった。

102nobodyさん:2006/11/30(木) 10:55:09 ID:???
ファイルを開く時に、

open(FILEHANDLE, ">> filename") ;

という書き方をしますよね。

この書き方はファイル名がダブルクォーテーションで囲われないのでいまいち好きになれません。

例えば、ファイル名が " test.txt" (半角スペースが左にある) だった場合にはどうすればいいんでしょうか?
103nobodyさん:2006/11/30(木) 11:08:52 ID:???
>>102
open(FILEHANDLE, ">>", " test.txt");
104nobodyさん:2006/11/30(木) 11:10:16 ID:???
殆どの解説サイトでは、フォームの要素を取り出す場合などに、

use CGI;
$q = new CGI;
print $q->param('name');

と解説していますが、

use CGI":all"
print param("name")

というコードを見つけました。(両方ともXSS脆弱性がありますがこれはサンプルです。)

後者だと関数名の重複が起こる可能性が高くなるかと思いますが、
速度低下などのデメリットはないでしょうか?
105102:2006/11/30(木) 11:11:04 ID:???
>>103
カンマで区切って3つめのパラメーラーにすることも可能でしたか
そっちの方が美しいので全部をそっちに統一しようかとおもいます
ありがとです
106nobodyさん:2006/11/30(木) 11:23:07 ID:???
>>104
速度はどうせ全体からすれば誤差ぐらいしか違わない。
むしろ関数名重複の方の問題でいまどきは普通使わない
書き方だから、既にそういう風に書かれているプログラムを
読まなきゃいけないならしょうがないが、これから書くのなら
前者の書き方にしとけ。
107104:2006/11/30(木) 11:27:47 ID:???
>>106
なるほど。
見た目は美しくなくなりますが、パッケージ同士で同じ関数名が使われていたら困るのでそうしてみます。
ありがとうございました。
108nobodyさん:2006/11/30(木) 18:04:24 ID:???
Perlスクリプトの処理時間を計測したいのですが、
(times)[0]を使うやり方で出てくる数値が、実時間と違うような気がします。
これで求められる時間の単位は何なんでしょうか?
109nobodyさん:2006/11/30(木) 18:33:33 ID:???
CPU秒
110nobodyさん:2006/11/30(木) 19:51:57 ID:???
Benchmark 使えばいいじゃん
111JAPU ◆lVJAPUTeX. :2006/11/30(木) 20:29:39 ID:???
>>93

map はあるリストを元にして別のリストを作るために使います。
もちろん、map を利用しなくてもプログラムは書けますが、map を利用したほうがすっきりと書けることが多いのです。

@odds = (20, 16, 4, 8, 12);
print_odds(map { $_*2 } @odds);

@ids = qw[mami pelsia emi yumi];
@names = map { $userinfo{$_}{name} } @ids;

>>100

むしろ、strftime

>>101

多く起動される環境であれば、mod_perl, SpeedyCGI, FastCGI を検討するべきかと。

たしかに Encode は重いけど…
% /usr/bin/time perl -e ''
0.00 real 0.00 user 0.00 sys
% /usr/bin/time perl -MEncode -e ''
0.07 real 0.01 user 0.01 sys
Perl v5.8.1以降であれば、JcodeはEncodeのwrapperとして動作するので、Encode単体より重くなります。

>>102

open FH, "> ./ filename"; としても良いです。
112nobodyさん:2006/11/30(木) 21:31:15 ID:???
COOKIEについて質問です。

今まで、COOKIEが有効かどうかって、
x.cgiでCOOKIEセット、y.cgiに飛ばす
y.cgiでCOOKIE読んで、書き込みできたかチェック
こんなことしてました。

COOKIEが有効か調べる関数ってありますでしょうか。
よろしくお願いします。
113nobodyさん:2006/11/30(木) 21:42:53 ID:???
>>107
個人的な嗜好の問題だけど俺は前者の方が美しいと思う
114nobodyさん:2006/11/30(木) 22:28:40 ID:???
ちょいと質問させてください。

my %func = (
'1'=>'\&hoge',
);

sub hoge
{
処理
}

$func{'1'}->();

ぐぐってみたらこれでhogeが実行できる
みたいなことが書いてあったんですが
ダメみたいなんすよ。
なぜかわかりませんかねぇ?
115nobodyさん:2006/11/30(木) 22:46:53 ID:???
>>114
'1'=>\&hoge

の間違いでしょう? クォートしちゃダメ。
116nobodyさん:2006/11/30(木) 23:24:54 ID:???
ありがとうございやす!動きました。
ぐぐって見つけたページもクォートなしでした。
いやはやお恥ずかしい。
117nobodyさん:2006/12/01(金) 01:14:03 ID:???
明らかに文字列を受け取って文字列を返す関数にundef渡したとき、
戻り値はundefと0文字列のどっちが安全で親切なんだろうか。
ケース倍ケースかな。

118nobodyさん:2006/12/01(金) 02:08:36 ID:???
お願いします。

sub aaa{
 my $select;
 foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){
  $select .= qq|<option value="$count">$l</option>\n|;
 }
 return $select;
}
上記をCGIで動かすと
「Can't use "my $a" in sort comparison at ...」
というエラーがでます。どう改善したらよいのでしょうか...
環境は
windowsXPsp2
ActivPerl 5.8.7
です。
119nobodyさん:2006/12/01(金) 02:22:30 ID:???
use strict;

my %ir = (
'kaede' => '大瀬 楓',
'mikitty' => '藤本 美貴',
'maasa' => '須藤 茉麻'
);

foreach my $l (sort { $a cmp $b } keys %ir){
  print "<option value=\"$l\">$ir{$l}</option>\n";
}

うちではエラー出ず。

で、ちょっと突っ込みを

key で sort 掛けようとしてるんですよね?
なのにデータで sort 書けちゃってますよ?
120nobodyさん:2006/12/01(金) 02:38:41 ID:???
>>119
はい。
以下のようなハッシュを値でソートしたいと思いまして・・・。

%ir = (
"あああ" => 1,
"いいい" => 2,
"ううう" => 3,
"えええ" => 4,
"おおお" => 5,
"かかか" => 6,
"ききき" => 7
}

.pl単体では上手くテストで動いたんですけど、いざCGI用に
コピーするとエラーがでます(T_T)
121nobodyさん:2006/12/01(金) 03:20:08 ID:???
>>118
$count はどっからでてきたの? パッケージ変数? $ir{$l} の間違いじゃない?
それに、『sort に渡してる関数の中で「my $a」とは書けません』ってエラーなんだから
実際の CGI ファイルのコードは違うんじゃないの? ちゃんと確認した?
122nobodyさん:2006/12/01(金) 08:18:39 ID:???
>>111
> むしろ、strftime
POSIX::strftime か。しらなんだ、とんくす。
123nobodyさん:2006/12/01(金) 10:57:45 ID:???
Shift_JIS 環境です。

CGI.pm の escapeHTML 関数を使うと、「規制」 が 「&#8249;K制」 (実際には、&と#は半角) になっちゃうんですが、
どうにかならないものでしょうか…。

これじゃあ、日本語を処理する上で実用性が無いので困っています。
124123:2006/12/01(金) 11:01:25 ID:???
というより、何故こんな風になるのかが知りたいです。

HTMLの特殊文字は↓ですよね。
< = 0x3C
> = 0x3E
& = 0x26
" = 0x22
' = 0x27

そして、問題となる "規" は、0x8B4B です。

特殊文字にあたるコード(16進レベル)が含まれていないので、
おかしくなる理由がないと思うのですが…。
125nobodyさん:2006/12/01(金) 11:10:09 ID:???
>>123
CGI.pmを読めばわかるが、charsetがISO-8859-1かWINDOWS-1252のときに
その変換が行われるようになっていて、charsetは特に指定がなければISO-8859-1
だからほっとくとそうなる。CGI.pmのescapeHTML使うんならcharset設定すればよい
と思われる。あるいは別のを自分で書くなりどっかから探してくるなりして使うかだな。
126nobodyさん:2006/12/01(金) 11:16:18 ID:???
データベース検索のCGIを作っているのですがサーバ負荷(CPU)が高くて困っています。
ファイル数は200個、容量は全部で40MB程のテキストファイルで、ファイル数と容量はだんだん増えていきそうです。
数回実行しただけで Load Average が 1.00 を超えるような状況で、このままじゃサイト閲覧者向けに公開できそうにないです。

データベースの構造はこんなこんな感じです。
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)

ちなみに、検索処理には index 関数を使っています。
ファイル内容は一回変数にいれるといったことはせずに、openでよみとって 1行ずつ検索して、おわったら閉じる。openでファイル開いて・・・ の繰り返しです。
負荷の原因と考えられるのはどこらへんでしょうか?

(1) 200個 のファイルを open 関数で開く処理。
(2) index関数での検索

ちなみに、必要なのは要素1と要素2だけ、しかも、完全一致でいいので、
split関数で要素毎に分割して == を使って等しければー、にしたほうが負荷は少なくなるもんなんでしょうか?

ある程度絞り込めれば実験でもいいんですが、
負荷関係に詳しい方がいたらお願いします。
127123:2006/12/01(金) 11:21:25 ID:???
>>125
回答ありがとうございます。

charset指定というのはどんな感じにやるもんなんでしょうか?

use Encode 風に指定して、

use CGI 'sjis';
use CGI 'shift_jis';

とかやってみましたが、駄目だったようですorz
128nobodyさん:2006/12/01(金) 11:31:17 ID:???
>>121
sub aaa{
my $count = 1;
my $irselect;
foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){
next if ($l == 99);#("99"=>"99")というデータを省く
$irselect .= qq|<option value="$count">$l</option>\n|;
 $count++;
}
print<<"_EOT";
.
.
<select>
$irselect
</select>
.
.
_EOT
}
こんな感じです。
一応並び順を考えない仕方で解決しました。
もう少し自分で調べてみます。ありがとうございました。
129nobodyさん:2006/12/01(金) 11:32:40 ID:???
>>127
キーワード教えてもらったんだからマニュアルぐらい読めよ...

Provided that you have specified a character set of ISO-8859-1 (the
default), the standard HTML escaping rules will be used. The "<" char-
acter becomes "<", ">" becomes ">", "&" becomes "&", and the
quote character becomes """. In addition, the hexadecimal 0x8b
and 0x9b characters, which some browsers incorrectly interpret as the
left and right angle-bracket characters, are replaced by their numeric
character entities ("?" and "?"). If you manually change
the charset, either by calling the charset() method explicitly or by
passing a -charset argument to header(), then all characters will be
replaced by their numeric entities, since CGI.pm has no lookup table
for all the possible encodings.

charset()メソッドを使うか、header()に-charset引数を渡せばいいらしい。
130123:2006/12/01(金) 11:35:16 ID:???
>>129
ご親切にありがとうございます。
次からなるべくマニュアル読むようにします。

131123:2006/12/01(金) 11:39:27 ID:???
実際に使ってみたら解決しました。

$CGI->charset('Shift_JIS');

ありがとうございました。
132126:2006/12/01(金) 11:43:37 ID:???
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2306988 を参考に時間の計測をしてみたら、

全体で 1秒ちょっとだったのが、index関数の部分をコメントアウトしたら、
0.01秒ぐらいに…。

ここまで極端に分かるとはおもいませんでした
133126:2006/12/01(金) 11:47:52 ID:???
勘違いでしたorz
while (my $line = <IN>)
の部分もコメントアウトしてました。
これを外したら、0.6秒ぐらいに…。

膨大なデータを1行ずつ読み込む、ここが負荷のメインだったようです。

こうなると、namazuとか他の言語を使うぐらいしか負荷削減の方法はないですね。
134nobodyさん:2006/12/01(金) 11:49:40 ID:???
>>126
毎回40MBあってこれからもどんどん増える予定のファイルを全部なめるのがそもそもだめ。
もう少しデータの持ち方を工夫した方がいいよ。バークレーDBぐらいはせめて使え。あるいは
インスコ面倒でなければまともなDB(mysqlとかpostgresとか)つかっちゃったほうが楽な気も
する。
135126:2006/12/01(金) 11:54:15 ID:???
>>134
なるほど
DB使ったほうがいいわけですか…
それは思いつきませんでした

実はこれフリーで配布されているCGIスクリプトのログファイルでして
過去ログも含めた検索をやりたいのでその検索スクリプトを自作していたとこなんです

ログファイルをHTML化して namazu かなんかで検索させるのとDB化、両方を検討してみます。
136nobodyさん:2006/12/01(金) 12:07:44 ID:???
read(FH, $buff, (-s FH));

でログを読んだときは負荷減りませんか?
137nobodyさん:2006/12/01(金) 12:40:28 ID:???
ファイルを全部読む時点で負けだろ
138126:2006/12/01(金) 12:42:32 ID:???
>>136
サンクスです。
読み込んだ時点の負荷は 1/3 〜 1/2 程度になりました。(でも1行ずつの処理を加えると同じかそれ以上になるかも…)

ただ、変数 $buff には全データが入っていることになるので、これを1行ずつ処理するときにどうすべきかが悩みます。
split 関数 で改行コードでの分割をして、配列にいれてから、while 関数で1行毎に処理したくなりますが、
これだとメモリ山ほど食いそうですし…。
139nobodyさん:2006/12/01(金) 13:28:54 ID:???
>>126
>>134に禿同です。
検索対象が決まっているのなら、その元のデータから検索用のデータ(インデックス)を作るプログラムを作り、
定期的に保守をするのが楽です。この処理自体が多少重くても、バックグラウンドで1日数回で済むのなら
いいのではないかと。
インデックスデータは、DBMに持たせる(検索対象文字列をキーにする)のが一番効率がいいと思います。
プレーンテキストでも、元のデータを丸々スキャンするよりはるかにましです。
140126:2006/12/01(金) 13:43:25 ID:???
>>139
やはりその方法がベストですよね。
データベースの勉強をしてやってみようかと思います。
ありがとうございました。
141nobodyさん:2006/12/01(金) 14:04:00 ID:???
正規表現で、エスケープをつけて表す文字は
+ * ? . ( ) [ ] { } | \
らしいのですが、/もですよね?
if($aaa =~ /\//)
とすれば望みどおりの動作をするのでこう思うのですが、間違ってますか?
142nobodyさん:2006/12/01(金) 14:26:10 ID:???
/そのものじゃなくて区切り文字
当然要エスケープ
143nobodyさん:2006/12/01(金) 18:30:05 ID:???
でも区切り文字変えたほうが読みやすいと思う
$hoge =~ m{/}
144nobodyさん:2006/12/01(金) 18:55:31 ID:???
ttp://www.sk.aitai.ne.jp/~shim/Workshop/html/wlist.htm

ここの真ん中付近にあるリスト作成を使ってファイルを出力しようとしてるんですが、
出力ファイル先のカタカナのサ行などが文字化けしてしまいます。
jcode.pl を使えば直るんじゃないかと思っているのですが、どこに何を書き足せばいいのでしょうか?
145nobodyさん:2006/12/01(金) 18:58:33 ID:???
スクリプト改造依頼スレへどうぞ
http://pc8.2ch.net/test/read.cgi/php/1157787046/
146nobodyさん:2006/12/01(金) 19:39:42 ID:???
>>145
そんなに大変な事だったんですか。
どこかを書き足すだけで解決できると思ってたのですが、大変そうなので諦めます・・・。
申し訳ありませんでした。
147nobodyさん:2006/12/02(土) 00:17:21 ID:???
<FORM action="xxx.cgi" method="POST">
<INPUT type="submit" value="送信">
</FORM>
これを送信ボタン押すとPOST形式で送信されると思いますが、
プログラムが自動でPOST送信する方法ありますでしょうか。

GET形式の場合は、"http://xxx/xxx.cgi?xxx=xxx"
wget すればよいでしょうか。

よろしくお願いします。
148nobodyさん:2006/12/02(土) 02:43:19 ID:???
>>147
GETの場合そのとおり。「送信」はURL encodeしる。curl なら
curl -d xx=送信(URL ncodeしる) "http://xxx/xxx.cgi"
でPOSTできる。ってかここperlスレなんだが。
LWPでもできるよ。
149nobodyさん:2006/12/02(土) 08:58:16 ID:???
>>147
LWPっていうモジュールがあったんですね。
こういうのが知りたかったんです。
ありがとうございました。
150nobodyさん:2006/12/02(土) 11:24:22 ID:???
WindowsでCGIを作っています。
GDで日本語文字列を出力したいのですがうまくいきません。
現状、stringTTFメソッドでTrueTypeフォントのパスを指定してるのですが(WindowsのFontsフォルダ内)
エラーは出ないものの「・・・」といった出力にしかなりません。英数字でも同様です。
Winで画像出力の際にbinmodeを指定するような感じで
何かあるのかも、と思って調べてるのですが・・・
ちょっと漠然としていますが、チェックポイントなど気がついた方いましたら
おしえてください。よろしくおねがいします。
151nobodyさん:2006/12/02(土) 12:46:30 ID:???
自作の関数で、エラーのときにエラーメッセージを返したいときに、
$@とか勝手に上書きしたらまずいですか?
#やってみたらできましたが・・
何か専用の特殊変数ってありますか?
152nobodyさん:2006/12/02(土) 13:03:38 ID:???
$gErrStr のようなエラー用のグローバル変数を用意するか、

my $err = &testfunc(\$ret, \$val1, \$val2);

のように渡して、戻り値は \$ret へ入れて、エラーコードとこエラー文字列は $err に返す
といったことも出来る

エラー無しの場合は $err は undef であるか "" または 0 です。
153nobodyさん:2006/12/02(土) 13:23:08 ID:???
どうもです。
関数はモジュール化したいので、自前のグローバル変数は使いたくないんですよねえ。
しかもオブジェクト指向にしたいんですが、returnでエラー返す以外に
定番の方法ってないですか?
154nobodyさん:2006/12/02(土) 13:29:26 ID:???
エラーメッセージを取得するメソッドを定義するとか、Error.pm使う前提で例外に
しちゃうとか。
155nobodyさん:2006/12/02(土) 14:11:21 ID:???
Perlはそんなに厳密にオブジェクト指向で書ける言語じゃないよ。そういうのが希望なら、RubyとかJavaやった方がいい。
156nobodyさん:2006/12/02(土) 14:25:39 ID:???
うーん、どうしようかなー
157nobodyさん:2006/12/02(土) 14:27:33 ID:???
>>153
結果をオブジェクトで返したらどうか
正常ならnew HogeResultして情報をそれに格納し、そのリファレンスを返す
エラーなら文字列を返す
受け取り側は
my $res = getHoge($foo);
if (ref $res) {
 # 成功
} elsif {
 # 失敗
}
158nobodyさん:2006/12/02(土) 14:41:08 ID:???
ほほう、ref関数の使い方を初めて知った。
ありがとうございます・
159nobodyさん:2006/12/02(土) 16:25:39 ID:???
いくら勉強しても次々に知らないことが出てくるんですが、
Perlをすべて把握している人って世の中にいるんでしょうか。
オライリーさん以外に。
160nobodyさん:2006/12/02(土) 16:41:38 ID:???
そんなの誰もいないだろ。PerlコミュニティはLarryでも把握しきれない規模だろうから。
たとえばEncodeだけに限っても、メインのメンテナーのdankogai以外にも何人もかかわってる。
個人ですべてを把握するのは無理じゃないか?

# オライリーさんって誰? Tim O'Reillyのことか?
161 ◆TWARamEjuA :2006/12/02(土) 18:48:07 ID:???
オライリーオライリー♪
ワタシニ電話シテクダサイ ドーゾヨロシク♪
162JAPU ◆lVJAPUTeX. :2006/12/02(土) 20:09:06 ID:???
ごきげんよう。

>>112
ない。Cookieが読み込まれていない場合でも動作するように書くべし。(エラー出して終了でもいいけど。)

>>117
個人的には undef が好み。処理によっては結果的に空文字列を返すこともあるから、undef に統一しておいたほうが分かりやすい。

>>135
HTML化して、Googleに検索させる作戦もあり。自前でやる場合は他の方が書かれている通り。

>>141
迷ったら、記号類はとりあえず \ を前置しておけばOK。記号類 → \ をつけた場合、それがメタ文字であってもそうではなくてもその文字自身を表す。
英数字 → \ をつけた場合、メタ文字になる場合がある。

>>151
問題ない。やりたまえ。

>>151,154
多くのモジュールでは error みたいなメソッドを定義していますね。んで、そのメッセージを格納しておくにはグローバル変数を使っているわけですが。
グローバル変数 == 悪 というわけではないので、ホゲホゲ。外部から隠蔽したいなら、
{ my $ERRORMSG; sub _set_error { $ERRORMSG = "@_" } sub error { $ERRORMSG } }
こんな感じ? さらに、_set_error も隠蔽したいなら、
{ my $ERRORMSG; my $_set_error = sub { $ERRORMSG = "@_" }; sub error { $ERRORMSG } sub hoge { $_set_error->("hoge"); return undef; } }
163nobodyさん:2006/12/03(日) 01:37:01 ID:???
連続投稿10秒規制を付けたいのですが
どのようにすれば良いでしょうか?

if(現在の時間 - 最終投稿時間 < 10秒)er{エラー}

このような感じでしたいのですが
最終投稿時間の取得はどのようにすれば良いでしょうか?
164nobodyさん:2006/12/03(日) 02:25:35 ID:???
クッキーか、最新投稿100件ぐらいを別ファイルに保存
(クッキーが処理できない場合は投稿そのものを拒否)
165nobodyさん:2006/12/03(日) 02:49:58 ID:???
>>163
いろいろ調べたんだね。えらいぞ。

これはぼくの想像だけど、恐らくは既存の何がしかの Web アプリケーションに機能追加しようとしているんだね。
そしてその機能は(恐らくは同一端末からの)投稿間隔が短くなりすぎないように制限したい、とそういうわけだ。
で、不明点が「最終投稿時間の取得」方法ということだけれど、「取得」というからには保存しているのだろうね。
「現在の時間」は恐らくアプリケーションが動作する機械のシステム時刻なので、そこから取ってくることができるけれど、あなたのアプリケーションにおける特定端末からの投稿履歴は、あなた以外に面倒を見てくれる人はいないはずなので保存しているはず。
保存の目的がそもそも「最終投稿時間の取得」なのであれば、そこから取り出す事も考えていたはずですよね。

あとはそのようにコードを書くだけだよ。がんばって。
166nobodyさん:2006/12/03(日) 03:31:47 ID:???
>>163
セッション管理しているかどうかで変わってくる。
セッション管理不可な場合、IPアドレスで判断することになるかな。
単純にIPアドレスに対応するファイルを更新して、そのファイルのタイムスタンプと比較するのは簡単だね。
ただし、プロキシ経由のクライアントは一緒くたに判断されちゃうかな。

セッション管理してれば、セッションに関連づけて何らかの方法で更新時刻を保存するんだろうね。

なんか抽象的な答えだな。
色々やり方があると思うんだが、アプリケーションの要件用途で適切な道具は変わってくるからね。
167nobodyさん:2006/12/03(日) 08:01:07 ID:???
>>165-166
とりあえず日本語の勉強だぜ?
168151:2006/12/03(日) 10:08:46 ID:???
$@でエラーを返す件、自己レス。evalで呼ぶときには
evalが正常時に$@を初期化してしまうので、呼び側で配慮が必要ですね。

sub hoge {$@ = 'hoge'; return}
eval '&hoge(); $gERROR = $@';
$@ and die;
print $gERROR if $gERROR;
169nobodyさん:2006/12/03(日) 17:00:34 ID:???
>>150
文字コードをutf-8に
>>155
そうでもない
170nobodyさん:2006/12/03(日) 19:59:04 ID:???
まあ自分一人でしか使わないんだったら御自由にってとこだが
>>168
呼び出し側に配慮が必要って時点で止めないか?普通。
お前さんが体感した通り $@ を書き換えるのはお行儀が悪いし呼出側に負担を強いる。
171nobodyさん:2006/12/03(日) 22:05:01 ID:???
「ご自由に」と言って頂いている前提で反論しますが、
数件、代案を教えて頂いた限りで、「エラーは$@を参照してくれ」という
取り決めが一番呼び側の負担が少ない気がするのですが、どうでしょう。
$@はevalとバッティングするのでevalの場合のみ168のように書かなければ
ならないことは、もし説明がなかったとしても自明なことのように思います。
ほかに$@を使うデメリットってあるでしょうか。
172nobodyさん:2006/12/03(日) 22:15:17 ID:???
あ、ref関数を参照させるのは行儀もよく、負担も少ないかも知れないとは思います。
だったらそうしろよ、って話なのですが、本当にそれでいいのか、検討しているところです。
173nobodyさん:2006/12/04(月) 00:26:50 ID:???
>>171
本当に「エラー」ならば Carp or wanings ( $SIG{__WARN__} ) に任せれば?
もしくは誰かがレスした Error.pm
単なる「制御上のメッセージ 」を返したいならば戻り値を下みたいな
ref にしちまえばいいだけじゃねーの?
return { 'data' => undef, 'msg' => 'お前さんの望んだメッセージ' } ;

$@ に関するルールを変更してまで $@ を参照させるってのは傲岸に
感じる。上の例で云うと前者には用意がされてるわけだし、後者は
エラーですらない。
CPAN でそんなモジュールに当った事がないがそういうモジュール
に当ったら、別モジュールを探すなあ。
そういうモジュールがあったら後学のために教えてください。
174nobodyさん:2006/12/04(月) 00:33:59 ID:???
eval で catch したいなら素直に die したらいいじゃない。
死にたくないなら生きればいいじゃない。
175nobodyさん:2006/12/04(月) 16:55:58 ID:???
HTMLで、フレーム表示させたいんですが、
どういうふうにすればよいのでしょうか?

index.htm(フレームについて書いたページ)
^^^^^^^^^^|^^^^^^^^^^^^^^^^^^^^|
メニュー | メインページ   |
menu.htm | main.htm     |
     |          |
     |          |
     |          |
     |          |
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

普通一ページだけだったら、
print <<"HTML"
<html>
・・・
</html>
HTML
ですよね。

print <<"HTML"
#indexを書く
HTML
print <<"HTML"
#menuを書く
HTML
print <<"HTML"
#mainを書く
HTML
これだけで、OKでしょうか?
よろしくお願いします。
176nobodyさん:2006/12/04(月) 17:08:08 ID:???
>>175
それぞれのxx.htmに対応するcgiを用意する。
複数用意するか、なんかパラメタ与えて動作を
切り替えるかはお好みで。

クライアントからは別々にリクエストが来るので、
情報をひきつぎたければそれもパラメタで引き継ぐ
とかセッション使うとかいろいろ必要。

たぶん質問の仕方からいってこの辺の仕組みは
すぐには理解できないと思うので地道に勉強して
くれ。
177nobodyさん:2006/12/04(月) 17:27:59 ID:???
つか、フレームは時代遅れ
178nobodyさん:2006/12/04(月) 17:52:25 ID:???
>>176
ありがとうございます。
ちょっとずつ勉強してみます。

>>177
なるほどぉ。
フレーム使わない方法もありますね。
179nobodyさん:2006/12/04(月) 18:23:52 ID:???
フレームはstrictじゃないから使わないほうがいい
180nobodyさん:2006/12/04(月) 18:24:06 ID:???
>>178
で、いつ Perl の話になるんだ?ならないんだったらスレ違いだから。
181nobodyさん:2006/12/04(月) 21:26:59 ID:???
こっちで、質問していいのかわかりませんが
ActivePerl Build 819 MSWin32
には、HTML埋め込み型のaspl(C:\Perl\eg\PerlEx\examples.aspl)とか
あるんですが

Apache(Linux系)とかでも、埋め込み型で動かせるのって
なかったでしょうか?
昔に、そんなのがあった気がするんですが
名前が思い出せなくて
182181:2006/12/04(月) 21:29:45 ID:???
すみません
思い出しました。
Embperlとかでした
183nobodyさん:2006/12/05(火) 00:10:37 ID:???
$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq";
$str =~ s/[C-G][pqst]/1-9/g;
print $str;

置き換えたところ1から9と順に置きかえたいのですが
置き換えた部分すべて1-9と表示されてしまいます。
どの部分を変えればよいのでしょうか??
184nobodyさん:2006/12/05(火) 00:35:41 ID:???
>>183
これがお望みのものか?

$str = "AoUDqGrsqcUSgVGsCphafNXhkEtsfCcANeLDsTFq";
$cnt = 1 ;
$str =〜 s/[C-G][pqst]/$cnt ++/eg ;
print $str . "\n" ;
185183:2006/12/05(火) 00:43:04 ID:???
>>184
すっげぇ簡単ですね・・・できない自分にショックです。
教えてくれてありがとうございます。
186nobodyさん:2006/12/05(火) 01:58:21 ID:???
正規表現中でインクリメントって出来るのか
知らなかった (;゚Д゚)
187nobodyさん:2006/12/05(火) 02:21:49 ID:???
まあPerlの正規表現に慣れると、PHPのpreg_なんとかって、てんでウンコだね。
188nobodyさん:2006/12/05(火) 02:23:05 ID:???
画像を連続で出力する時、以下の場合だと画像名が同一で
後から送られてきた画像が上書きされてしまいます。

binmode(STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );

print "Content-type: image/jpg\n\n";
open(IMG,">sample.jpg");
binmode(IMG);
print IMG $buffer;
close(IMG);

これを No1.jpg No2.jpg・・・のように連番で保存させたいのですが
どこを変えればいいのでしょうか?
よろしくお願いします。
189nobodyさん:2006/12/05(火) 04:54:50 ID:???
初めてのperlの練習問題で、引数で指定したファイルの
最後の行から順番に表示するってのがあって、答えは納得できたのですが
↓でうまくいくのが、foreachをwhileにするとうまくいかない理由がわかりません
reverseがなければwhileでもエラー出ないのですが・・・
何故なんでしょうか?よろしくお願いします

foreach (reverse <>) {
chomp;
print "$_\n";
}
190nobodyさん:2006/12/05(火) 12:05:35 ID:???
>>189
それ、あなたの期待する $_ もしくは @_ への代入が実行されてない。
以下が機能しないのと同じこと。
reverse 'foo' ;
print $_ . "\n" ;
print @_ . "\n" ;

reverse 関数は単独使用時に「左辺が指定されてなかったら $_ or @_ に代入する」
なんて機能を持ってない(つーか勝手にコンテキストの判断してもらっても困るw)。
foreach VAR ( LIST) BLOCK の場合は () 内のリストを暗黙の内に一個一個 $_ に
入れてくれるけど while ( EXPR ) BLOCK は、そんな器用なことはしてくれない。
() 内に条件式を必要とするだけ。
while ( <> ){ } は、あくまでも while ( defined ( $_ = <> ) ) { } の省略。

foreach と同一結果を得たければ、やはり一旦配列に突っ込むのが正攻法
@foo = reverse <> ;
while ( defined ( $_ = shift @foo ) ){ print $_ ; }

以下は見た目、正解っぽく感じるかも知れないが当然ダメ。
while ( defined ( $_ = reverse <> ) ){ print $_ ; }
別のお話しになってしまうので説明割愛。
191nobodyさん:2006/12/06(水) 00:09:51 ID:???
>>186
> 正規表現中でインクリメントって出来るのか
> 知らなかった (;゚Д゚)

s/// 式の右部分は正規表現じゃないということも知らなかったんだね。ふぁいと。
192nobodyさん:2006/12/06(水) 00:57:09 ID:???
…言われて見ればそうだね・・・orz
193189:2006/12/06(水) 05:32:50 ID:???
>>190
ありがとうございました
同じように使われることはあるけど
そもそも機能がかなり違うのですね
勉強になりました
194nobodyさん:2006/12/06(水) 17:53:32 ID:???
$a = "1167354687","3546879867321","735246;
1 while $a =~ s/(.*\d)(\d\d\d)/$1,$2/;

配列の最初の部分しか出力されないのですがどうしたらよいでしょう?
195nobodyさん:2006/12/06(水) 18:14:05 ID:???
配列について勉強し直してはどうかな。
196nobodyさん:2006/12/06(水) 19:17:48 ID:???
>>191-192
わかってると思うけど、式が評価されるのは /e オプションの効果です。
ただ単に右部分に式書いても評価されないので注意。

>>194
まず書いたスクリプトが動くかどうか確かめましょう。
197nobodyさん:2006/12/06(水) 23:57:05 ID:???
ブラウザ上で更新したcsvファイルを
即時別のサーバーへftp接続してアップロードしたいと思っています。
サーバーにNet::FTPをインストールすることができない状況で可能ですか?
良い手があれば教えてください。
サーバーのOSはSolaris9、CGIバージョンは5.8.8です
198nobodyさん:2006/12/07(木) 00:53:15 ID:???
flockについて質問です。

x.cgiを
open(OUT,"+<$file") ;
flock(OUT, 2);
@data = <OUT>;
#close(OUT); closeしません。

ブラウザでx.cgiをcloseしないで処理終わりました。
違うブラウザでx.cgiを実行したんですが、flockで止まりませんでした。

x.cgiのプロセスが終わると、flockはcloseしなくても
解除されるんでしょうか?
ループとかさせて、プロセスが生きてたりすると
x.cgiのflockで止まりますか?

よろしくお願いします。
199nobodyさん:2006/12/07(木) 01:38:36 ID:???
プロセスがexitする時、全てのファイルはcloseされる。
200nobodyさん:2006/12/07(木) 01:41:43 ID:???
プロセスが死ねばロックも解除されます
で、flockはアドバイザリなのでflockを使ってないプログラムなどからは問答無用で読み書きできます
201nobodyさん:2006/12/07(木) 07:35:05 ID:???
たとえプロセスが死んでなくても再びopenされるときにcloseされます
202nobodyさん:2006/12/07(木) 11:11:15 ID:SekHzZx8
shift JISのページに設置したテキストボックスのボタンを押すと、euc-jpのページ
で使われている検索エンジンにジャンプし検索結果を表示したく思います。
今のままですと、文字化けが起きてしまいます。

(HTMLソース)
<form method="POST" action="http://www.hogehoge.co.jp/cgi-bin/search/" target="_blank">
<input type="text" name=textdata size="20">
<input type="submit" name=botan value="Search">
</form>


文字化けがしないようperlプログラムをかませて、shift JISに変換してから変換させたい
のですが、どのようなコードを書いたらよいでしょうか?
203nobodyさん:2006/12/07(木) 11:26:48 ID:???
Encodeで変換後にURLエンコードしてリダイレクトが簡単かと思う
204nobodyさん:2006/12/07(木) 11:27:17 ID:???
テンプレぐらいは読みましょう
こっちのスレのほうがオススメ
http://pc8.2ch.net/test/read.cgi/php/1145308869/
205nobodyさん:2006/12/07(木) 12:06:04 ID:???
>>203-204
ありがとうございます。
206nobodyさん:2006/12/07(木) 16:35:47 ID:???
>>200
そうなのか。
それは知らなかった…。

質問なのですが、

・Perl で flock したファイルを php で読み書き。
・php で flock したファイルを perl で読み書き。
・test1.cgi で flock したファイルを test2.cgi で読み書き。

この場合って、正常にロックはされるのでしょうか。
207nobodyさん:2006/12/07(木) 16:40:00 ID:???
>>206
flockがちゃんと動作する環境で正しくプログラムかけば。
208206:2006/12/07(木) 16:53:51 ID:???
>>207
なるほど
私はflockがちゃんと動作する環境で正しくプログラミングしていると思われるので大丈夫ですねb

安心致しました^^
209nobodyさん:2006/12/07(木) 18:20:59 ID:???
>>199
>>200
>>201
お礼遅れました。
flockわかりました。
ありがとうございました。
210nobodyさん:2006/12/07(木) 20:53:15 ID:???
WindowsXP上でコマンドプロンプトを作業ディレクトリの指定なしに起動させて、
プロンプトに最初から C:\DOCUME~1\user\デスク~1> となっているときに
perl -MCwd -e "print cwd"
とすると、C:/DOCUME~1/user/デスク~1 を返すのですが、
C:\DOCUME~1\user\デスク~1> cd "C:\Documents and Settings\user\デスクトップ"
C:\Documents and Settings\user\デスクトップ> perl -MCwd -e "print cwd"
とすると、C:/Documents and Settings/user/デスクトップ を返してしまいます。
これを、常に C:/DOCUME~1/user/デスク~1 を返して欲しいのです。
どなたかご存じでしょうか。
211nobodyさん:2006/12/07(木) 21:02:43 ID:???
>>210
perl -MWin32 -MCwd -e "print Win32::GetShortPathName(cwd)"
でも何に使うの?
212210:2006/12/07(木) 21:52:30 ID:???
>>211
おお素晴らしい。ありがとうございます。
ファイルメーカーPro内で外部コマンドを呼べる外部関数(Peta-Execute)があるんですが、
この中で短いパスで呼ばないとコマンドが動かないみたいなんです。長いパス付のコマンド
(というかperlの第一引数となるplファイル)にダブルクォーテーション付で呼んでも動作しなかった
ものですから。Winの問題なのか、関数の問題なのか、ファイルメーカーProの問題なのかわからず、
今試行錯誤中です。
213nobodyさん:2006/12/07(木) 23:14:06 ID:SekHzZx8
perlの質問になるか微妙なところですが、


<form method="POST" action="hogehoge.cgi" target="_blank">
<input type="text" name="text_name" size="25">
<input type=submit name="img_botan" value=OK>
</form>

↑のボタン(type=submit)を↓のようにして、同じ機能を持たせるには、
formタグ内をどのように変更したらよいでしょうか?
<input type="image" name="img_botan" value="OK" src="hogehoge.gif">


「type="image"」で作成してしまうと、postで上のデータを受け取った時
img_botanのvalue値の「OK」が受け取れない状況です。
214nobodyさん:2006/12/07(木) 23:17:11 ID:???
ボタン → button
まず英単語からな
215nobodyさん:2006/12/07(木) 23:30:43 ID:???
>>213
微妙どころか全然Perlから離れとるがな(´・ω・)

<input type="hidden" name="img_botan" value="OK">
<input type="image" src="hogehoge.gif">
216nobodyさん:2006/12/07(木) 23:56:27 ID:???
submitはnameの値を見るといいよ
217nobodyさん:2006/12/08(金) 09:56:10 ID:ewFyIfPg
http://www.matubusi.com/cart/cgi-bin/kaitori.cgi?id=5
ここの買取口数とメールフォームの口数を買い取り口数にマイナスする計算の連動
似たようなスクリプトありませんか?もしくは作れますか?
よろしくお願いいたします
218nobodyさん:2006/12/08(金) 10:03:05 ID:???
やりたいことをもっと具体的に書け
219nobodyさん:2006/12/08(金) 10:48:17 ID:joMMTMjE

<form method="POST" action="hogehoge.cgi" target="_blank">
<input type="text" name="text_name" size="25">
<input type=submit name="img_button1" value=action1>
<input type=submit name="img_button2" value=action2>
</form>

↑のボタン(type=submit)を↓のようにして、同じ機能を持たせるには、
formタグ内をどのように変更したらよいでしょうか?
<input type="image" name="img_button1" value="action1" src="hogehoge1.gif">
<input type="image" name="img_button2" value="action2" src="hogehoge2.gif">

「type="image"」で作成してしまうと、postで上のデータを受け取った時、
「img_botan1」のvalue値の「action1」と
「img_botan2」のvalue値の「action2」が受け取れない状況です。


>>215
すみません、質問が悪かったです。
1つのform内でしたらhiddenを使えば解決するのは分かってました。
ごめんなさい。
220nobodyさん:2006/12/08(金) 11:25:23 ID:???
>>219
もともとイメージマップの機能だから値はボタンを押したときの画像内でのマウス
カーソルの座標が送られてくるんじゃなかったっけ。どのボタンかを識別する
用途ならnameを一意につけて値のありなしだけ判定すれば分だと思われる。
221nobodyさん:2006/12/08(金) 14:19:44 ID:???
>>220
ありがとうございました!
222nobodyさん:2006/12/08(金) 14:31:08 ID:???
YouTubeの動画掲示板を作ろうと思ってます
例えば書き込みの際、動画場所を
http://www.youtube.com/watch?v=2m0P-Q0joxU
のように指定させます。

そこからflvと再生待ち画像のパラメータを取得したいのですが

$url= http://www.youtube.com/v/2m0P-Q0joxU
#↓(ここに飛ぶ)
$url= http://www.youtube.com/p.swf?video_id=2m0P-Q0joxU&eurl=&iurl=http%3A//sjc-static6.sjc.youtube.com/vi/2m0P-Q0joxU/2.jpg&t=OEgsToPDskKKNZHbTD7d-oE2My88f86P

のように飛び先のアドレスに変換するにはどうしたらいいのでしょうか?
分かりづらくてすいません。
2231/2:2006/12/08(金) 15:14:42 ID:EPvPWdgJ
すみません、質問させてください。

ttp://www.nishishi.com/cgi/tinyurl/
ここのcgiを設置したのですが、設定ファイルをfileopenする所でエラーになるようです。
(配布されている状態のままアップすれば動くはずなのですがエラーになりました)

原因としては何が考えられるでしょうか?

環境:Windows IIS 6.0
   Activeperl 5.6.1
2242/2:2006/12/08(金) 15:15:52 ID:???
多分ここでエラーになっていると思うのですが↓

# -------------------------- #
# データの読み込みと一致確認 #
# -------------------------- #
sub checkdatas
{
  my $checkstring = shift @_;
  # データファイルを呼んで一致項目を探す
  my $redurl = "";
  if( open(IN,"$datafile") ) {
    foreach my $oneline ( <IN> ) {
      if( $oneline =~ m/^$checkstring,(.*)/ ) {
        # 見つかったらループを抜ける
        $redurl = $1;
        last;
      }
    }
    close(IN);  # ファイルを閉じる
  }
  else {
    # 読めなかったらエラー
    &errorexit("設定ファイルが読み込めませんでした。");
  }
  return $redurl;
}

-----
よろしくお願いします。
225nobodyさん:2006/12/08(金) 15:50:17 ID:???
>>223
作者に聞けよ・・・
226223:2006/12/08(金) 16:13:02 ID:???
すみません。質問書いた直後に自己解決しましたorz
サーバの設定により、設定ファイルのパスをフルパスで設定する必要があったようです。
お騒がせ&スレ汚しすみませんでした。。。
227nobodyさん:2006/12/08(金) 17:01:59 ID:???
>>222
マルチポスト乙
228nobodyさん:2006/12/09(土) 03:02:11 ID:MKj32g5X
質問です。
perlのセッション管理について教えてください。
CGI::Sessionモジュールでセッション管理を行おうと思っているのですが、このソースでセッションがブラウザに表示されるのですが、
セッションが/cgi-bin/sessionフォルダに保存されません。
コマンドラインで perl session.cgiと実行すると正常にセッションが保存されます。
どなたか解決法教えて頂けませんか。

session.cgi
#!/usr/bin/perl
use strict;
use CGI;
use CGI::Session;

my $cgi=new CGI;
my $session=CGI::Session->new(undef,$cgi,{Directory=>'./session'});
$session->expire('+10m');

my $cookie=$cgi->cookie(-name=>"CGISID",
-value=>$session->id(),
-expires=>"+30m");
print $cgi->header(-charset=>'euc-jp',
-cookie=>$cookie),

$cgi->start_html('セッションテスト'),
$cgi->h1($session->id);
print $cgi->end_html;

コマンドラインで perl session.cgiと実行するとセッションIDが作成されますが、ブラウザで実行するとなぜか生成されません。
どなたか教えて頂けませんか。
229nobodyさん:2006/12/09(土) 03:05:44 ID:MKj32g5X
すいません最後の2行間違いです 読み飛ばしてください;;

ブラウザだとセッションが保存されなくて困っています。
230nobodyさん:2006/12/09(土) 11:36:47 ID:???
セッションディレクトリをフルPATHで書いてみて
231nobodyさん:2006/12/09(土) 17:43:35 ID:???
セッションフォルダに書き込み権が無いんでしょ。
232nobodyさん:2006/12/09(土) 21:29:28 ID:???
>>222
↓のスレッドにレス付けておきました。

Perlについての質問箱 28箱目
http://pc8.2ch.net/test/read.cgi/tech/1162273941/
233nobodyさん:2006/12/10(日) 11:50:46 ID:Mfd0yjZD
Perlのオブジェクト指向について、インスタンスの変数名は何にしてる?例えば、日付取得モジュールで言うと、

例1:my $date = new Date;
例2:my $date_ins = new Date;
例3:my $date_obj = new Date;

例1だと、日付を格納する変数名と被るから、別の名前にしようと思うんだけど・・・
みなさんのご意見をお聞かせ下さい(´・ω・`)
234nobodyさん:2006/12/10(日) 13:38:22 ID:???
コーディングの質問をどうぞ
スタイルはご自由に
235nobodyさん:2006/12/10(日) 14:14:09 ID:???
1か3が好み。間接オブジェクトはやめれ。
$date = Date->new;
$data_obj = Date->new;
236nobodyさん:2006/12/10(日) 14:16:42 ID:???
my($nam, $date, $name, $email, $d_may, $comment, $url, $font, $ico, $type, $del, $ip) = split(/<>/, $line);

上のようなコードで、$date を受け取れますが、$date のみを受け取りたい場合にはどうすれば良いのでしょうか?

他を $hoge とかにすればいいという考えもできますが、それだと一度変数にいれるという処理が無駄であり
高速で処理をしたいので処理速度低下に繋がると思います。

シンプルな方法があれば教えて下さい。

たしか、変数部分に何かの定義済み定数をいれたら、その部分を受け取らないということになったようなきがしたんですが、
忘れてしまいましたorz
237nobodyさん:2006/12/10(日) 14:28:59 ID:???
my $date = ( split /<>/, $line )[1];

my( undef, $date ) = split /<>/, $line;

my( undef, $date, undef, undef, undef, undef, undef, undef, undef, undef, undef, undef) = split /<>/, $line;
238236:2006/12/10(日) 14:34:16 ID:???
>>237
なるほど
undef でしたか…。
こんなに早く回答をいただけるとは幸いです。
ありがとうございました。
239nobodyさん:2006/12/10(日) 15:35:39 ID:???
perlのcryptが異常に遅いのですが、なんとかならないでしょうか?

今時貧民的プログラミングをする必要はない、ログやロジックはシンプルにした方が良い、と思って掲示板作ったんですが、
速度が異常に遅いんです。

原因調べたら、掲示板のID生産のために crypt を使っているのですが、そこがとっても遅いんですね。
それを外したら100倍近いスピードに。

ようするにIPからIDを生成のために crypt を使っているんですが、表示のたびに全員分の生成をするので時間がかかるんです。
高速で実行できる crypt モジュールみたいのはないでしょうか?


240nobodyさん:2006/12/10(日) 15:48:35 ID:???
> 表示のたびに全員分の生成をするので
書き込み時にcryptも作ってログに書けばおk。
time→書き込み日時も同様。

もしくは、ある程度ユニークな文字列が得られればそれで良いというのなら
cryptなんて使わなくても自分で適当なサブルーチン組めばいい。
241239:2006/12/10(日) 15:53:23 ID:???
>>240
> 書き込み時にcryptも作ってログに書けばおk。
やっぱそうですよね(´・ω・`)

もう完成しちゃったし使用を開始しているので既にログがある状態なんです

・ファイルを読み取ってIDをファイルに書き込むプログラムを作る
・それを使って既にあるログにIDを追加する
・掲示板CGIへの投稿時にログにIDを追加するようにする

面倒ですが上の手順でやってみます

242nobodyさん:2006/12/10(日) 16:04:54 ID:???
ログが永遠に保存されるような構造でないなら
・新規の書き込みにはcryptでID情報を追加
・既存のID無しログはいちいちcryptするか適当な嘘IDを表示
というようにしておけばそのうち古いログが流されて問題なくなるよ。

なお、ログの修正をするのなら一度落としてきてローカルでやるように。
243239:2006/12/10(日) 16:15:27 ID:???
>>242
なるほど…

ログは永久保存な仕様なんです
なので諦めてログ修正することにします

ローカルにはPerlとかインスコされてなくて面倒なので鯖でやることにします
専鯖なので負荷は余裕です>A<
244nobodyさん:2006/12/10(日) 16:27:25 ID:???
> ローカルにはPerlとかインスコされてなくて面倒なので鯖でやることにします
> 専鯖なので負荷は余裕です>A<

(゚Д゚)ハァ?

俺の中に僅かに芽生えていたこいつに協力しようという感情が消滅した。
後はもう勝手にやってくれ。
245nobodyさん:2006/12/10(日) 16:28:14 ID:???
2chの特定の板の全datファイルを定期的に取得したいのですが、参考になるサイトはありませんか?
2chに負荷がかからないように、差分のみを取得するようにしたいのですが。
246nobodyさん:2006/12/10(日) 16:53:29 ID:???
>>245
それで何をしたいのかにもよる。
247nobodyさん:2006/12/10(日) 16:58:21 ID:???
>>244
別にどっちでやったって関係なくね?
一度DLする意味が何処にあるんだろうか
248nobodyさん:2006/12/10(日) 19:12:06 ID:???
>>245
差分取得の参考にでもして。
ttp://makegumi.no-ip.info:8080/src/makegumi1702.lzh.html
ハナモゲラ追加すれば今でも使えるはず。
板のdat取得は、subject.txtよめばいだけだから。
249nobodyさん:2006/12/10(日) 22:53:28 ID:???
ファイルを開いて、中身を全部一旦取り込むっていうのは
open(EN,"hoge.txt");
@old = <EN>;
close(EN);
これで@oldにファイルの中身(複数行)全て入ってますよね・・・?
リファレンス見ていたら益々分からなくなってきた(´△`;)

hoge.txtの中身をhoge2.txtに移すっていうのをやりたいのだけど
・・・動かねぇorz
250nobodyさん:2006/12/10(日) 23:05:46 ID:???
my $buff;
open(EN,"hoge.txt");
read(EN, $buff, (-s EN));
close(EN);
でもおk
251 ◆TWARamEjuA :2006/12/10(日) 23:48:32 ID:??? BE:3920966-BRZ(6677)
qx|cp hoge.txt hoge2.txt|;♪
File::Copyとかとか♪
252nobodyさん:2006/12/11(月) 01:30:10 ID:???
>>250
レスありです。
読み込んだ@oldを新たなファイルに書こうとすると
1行しか書かれず。。。

もう訳が分からないのでシンプルにファイルリネームで対応しました・・・。
253nobodyさん:2006/12/11(月) 01:31:19 ID:???
そんなヴァカな…
読み込み&書き込みらへんのソース晒してみて
254nobodyさん:2006/12/11(月) 16:28:57 ID:???
某Osの某ブラウザで掲示板投稿すると「~」が全角に変わってしまいます
問題はurlのリンク記載なので修正すればいいと思うのですが、これがうまくいきません

以下の自動リンクの正規表現の置換部分で、リンクの記載内に「〜」がある場合、
強制的に「~」にする方法をご指導ください

$tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/<A HREF="$1.$2$3$4" TARGET="_blank">$1.$2$3$4<\/A>/ig;

255nobodyさん:2006/12/11(月) 17:28:11 ID:???
そんなマジカルなブラウザがあるのか
256nobodyさん:2006/12/11(月) 18:27:02 ID:???
はい、林檎さんの正妻です
257nobodyさん:2006/12/11(月) 18:44:20 ID:???
マジカルっつーか、Safariを始めとするOS Xの一部ブラウザでは
Shift_JISのHTMLで書かれたフォームから送信すると
そういう不具合が起こることがある。
Shift_JISとユニコードの変換を厳密にやりすぎるからとか
どこかで読んだような気もするがどこだったかは忘れた。

まあ「safari チルダ」あたりでググると対処法とか色々出てくるよ。
258 ◆TWARamEjuA :2006/12/11(月) 19:51:49 ID:??? BE:1960092-BRZ(6677)
んじゃ妾ってとこか?@FireFox(lzyc)
259nobodyさん:2006/12/11(月) 19:58:53 ID:???
くぐりました、今のところ良い方法が見あたりません
また探してはみます
利用者にあれこれさせるのは難しいので、置換部分の
アドバイスがありましたら宜しくお願いします
260nobodyさん:2006/12/11(月) 21:26:03 ID:???
ググれば置換に関する情報も出てくるはずだけどな。

ていうかShift_JISでフォームを書かなきゃいいんじゃね?
261nobodyさん:2006/12/11(月) 23:07:25 ID:???
検索文字列で 〜 にマッチするようにして、
置換文字列を make_link みたいな関数にして /e で評価する。
その関数の中で 〜 → ~ の変換を行う。とか。

sub make_link {
  my $url = shift;
  $url =~ s/〜/~/;
  return qq{<A HREF="$url" TARGET="_blank">$url</A>};
}

$tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~〜\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/ make_link("$1.$2$3$4") /ieg;
262nobodyさん:2006/12/11(月) 23:27:08 ID:???
>>260
だめでした
>>261
いろいろ考えましたが、私とは次元が違いますね
凄い
有り難うございます
263nobodyさん:2006/12/12(火) 03:31:20 ID:???
multipleの受け取り方教えてください。
$name=$FORM{'name'};
のように、nameを受け取ったとして、
複数選択されてるときhogeは、
どんな風に受け取ればよいでしょうか。
$hoge=$FORM{'hoge'};
ってすると、$hogeの値はhoge2になっているみたいなんです。
hoge1も受け取りたいのですが。

<INPUT type="text" size="20" name="name" value="">
<select size="〜" name="hoge" multiple>
<option value="hoge1" selected>hoge1</option>
<option value="hoge2" selected>hoge2</option>
</select>

よろしくお願いします。
264nobodyさん:2006/12/12(火) 05:19:33 ID:???
CGI.pm使えば配列で取得できる
265nobodyさん:2006/12/12(火) 05:50:23 ID:???
>>264
ありがとうございます。
先ほど、CGI.pmで取得の仕方を解説してる
ページ見つけました。
動きが全然想像できないです。

CGI.pm使ってない方法検索しております。
よろしくお願いします。

266nobodyさん:2006/12/12(火) 09:42:44 ID:???
$forms{$name} = $val;
って感じで入れてると思うけど、簡単に書いちゃうと

if(deinfed($forms{$name}){
  $forms{$name} .= "\0" . $val;
}else{
  $forms{$name} = $val;
}

のようにして、取り出すときは

my @tmpdata = split(/\0/, $forms{'hoge'});

とすれば複数選択したデータが @tmpdata に入ります。
ただしバイナリデータに対しては有効な技じゃないし、入力されたデータに対して \0 の存在をチェックし
エスケープしてやるなどの対策も考慮してください。

バイナリデータとか不正なデータをとりあえず無視して動作を確認したいなら上記可能。 なはずです
267nobodyさん:2006/12/12(火) 10:31:41 ID:???
複数値を受け取るのは $FORM{'hoge'} だけと決まってるんだったら
配列に叩き込むほうが手っ取り早いしわかりやすいのかも。

if ($name eq 'hoge') {
  push @hoge, $value;
} else {
  $FORM{$name} = $value;
}

>>266 =~ s/deinfed/defined/ のcgi-lib.pl方式でもいいし、あとは質問者さんの好みで。
268nobodyさん:2006/12/12(火) 10:50:06 ID:???
なかなか面白い間違いをしてたなorz
訂正thx
269nobodyさん:2006/12/12(火) 10:54:18 ID:???
肝心なことが書き込まれてないが
hoge=hoge1とhoge=hoge2が順番に送られてくる
受け取ったものがhoge=hoge2になってるのは順番に同じ変数に入れてるから。
$hoge='hoge1';
$hoge='hoge2';
print $hoge;
こうなってるので後はどうするかは受け取り側で変えればいい。
270nobodyさん:2006/12/12(火) 20:02:31 ID:???
関数の引数に配列を使った場合、配列のn番目ってどう指定すればいいんですか?
例えば
&func(@list1,@list2);

としたら、funcの中で$list1[4]とか$list2[6]とかを参照したいんです。
271nobodyさん:2006/12/12(火) 20:12:36 ID:???
すればいいじゃない
272nobodyさん:2006/12/12(火) 20:48:08 ID:???
ヒント:
&func(\@list1, \@list2);
273nobodyさん:2006/12/12(火) 21:16:11 ID:???
>>270
&func( \@list1, \@list2 );

sub func {
  my( $list1, $list2 ) = @_;
  $$list1[4];
  $$list2[6];
}
274nobodyさん:2006/12/12(火) 21:23:56 ID:???
考えることをさせるためにヒントだけにしたのに…
275nobodyさん:2006/12/12(火) 21:50:20 ID:???
mkdir "foo/bar/baz"
ってやったときに、foo/barが存在しないとエラーで死ぬんだけど、再帰的に掘ってくれるような
モジュールってない?ないんなら自前で組んでもいいけど、あるんなら再発明したくないし。
276nobodyさん:2006/12/12(火) 22:12:56 ID:???
sub mkdir2{
my @subdirs = split(/\/, shift);

my $curdir = curdir();

foreach my $subd (@subdirs){
  mkdir $subd if !-e $subd;
  chdir $subd;
}

chdir($curdir);
}
277nobodyさん:2006/12/12(火) 22:14:40 ID:???
>>269
嘘こけ、順序は保証されてねーぞ。ブラウザの実装依存。
278nobodyさん:2006/12/12(火) 22:18:53 ID:???
279nobodyさん:2006/12/12(火) 23:15:54 ID:???
>>275
`mkdir -p foo/bar/baz`とかじゃ嫌?
280nobodyさん:2006/12/12(火) 23:16:19 ID:???
>>275
File::Path
281nobodyさん:2006/12/13(水) 04:02:25 ID:???
>>267
>>267
>>269
おかげさまで受け取り方良くわかりました。
ありがとうございました。
282nobodyさん:2006/12/13(水) 11:01:17 ID:???
>>275
File::Pathはデフォで入ってないっけ?

>>277
順序が保証されてるなんて書いてないだろ
順序は知らんがひとつずつ順番に入ってくるってのは合ってるんじゃね?
283275:2006/12/13(水) 15:21:34 ID:???
>276,278
ありがと。

>279
それやるとシステム依存するかなと思ってさ。

>280,282
ごめん、探し方が足りなかったみたい。吊ってくるorz
284nobodyさん:2006/12/13(水) 16:44:36 ID:???
数値を3バイト長でデータ化したいんですけど、packだけではできないんですか?

$n= 1000000;
if (($c1=chr(int($n / 256**2)))){
$n= $n % 256**2;
}
else { $c1= "\0"; }
if (($c2=chr(int($n / 256)))){
$n= $n % 256;
}
else { $c2= "\0"; }
$c= $c1 . $c2 . chr($n);
285nobodyさん:2006/12/13(水) 16:52:52 ID:???
4バイトにpackして1バイト削るとかは?
286 ◆TWARamEjuA :2006/12/13(水) 22:36:29 ID:??? BE:5336677-BRZ(6677)
24ビットにして以下(ry
287nobodyさん:2006/12/14(木) 13:53:01 ID:???
POSTでログインしてセッションが必要なサイトで
LWP::UserAgentなどを使用してCGIからアクセスするのは無理でしょうか?

一定時間経過するとセッションが切れて再ログインしないとダメだったり
サイト内での検索結果などをコピペするのがマンドクサイのです
288nobodyさん:2006/12/14(木) 16:20:40 ID:???
逆に8バイト長のデータ化はどうやったらいいのやら
やっぱ256**4で割るっきゃないか
289nobodyさん:2006/12/14(木) 22:55:01 ID:???
64bit整数が使えるのならpackのqやQも使えるのではないか?
290nobodyさん:2006/12/15(金) 03:08:09 ID:???
rand関数って、ポケットリファレンスでは指定値"まで"の
ランダム数値を返すとなっていたので、7年間ずっと
rand(3)は0〜3までを返すと思っていたのですが、実際は
3未満(つまりは2.99999...)だったんですね。

上記の場合だと、3が出る確率は限りなく少ないことになる
ので今まで面倒なことをしてましたが、これから今まで
書いたプログラムの見直しをするようになるっぽいです。

一応同じように思い込んでた人のためになればと書き込
んでおきました。
291nobodyさん:2006/12/15(金) 03:15:41 ID:???
>>290
ま、割と常識というかrand(3)で3は出ない
292nobodyさん:2006/12/15(金) 10:52:56 ID:???
substrで文字数をカットした場合に発生する文字化けを回避する方法を教えて

$sex = substr(キーワード, カット開始位置, 文字数);
print "$sex<br>\n";

とするとたまに改行タグがおかしくなってしまう


print "$sex.<br>\n"
とすると改行タグはちゃんとされるけど・が$sexの後に表示されてしまう
293nobodyさん:2006/12/15(金) 10:59:38 ID:???
文字コードがわからないとやりようがないし
294nobodyさん:2006/12/15(金) 10:59:58 ID:???
2byte文字に対応してるわけないだろ・・・常識的に考えて・・・
「perl substr 日本語」でぐぐるといい
295nobodyさん:2006/12/15(金) 12:26:12 ID:???
文字コードはシフトJIS
296293:2006/12/15(金) 12:49:12 ID:???
$from= 3;
$count= 5;
$s=~/(?:[\201-\237\340-\374]?.){$from}((?:[\201-\237\340-\374]?.){$count})/;
print $1,"\n";
297293:2006/12/15(金) 12:56:47 ID:???
あ、sオプションも要るか・・
298nobodyさん:2006/12/15(金) 13:54:29 ID:???
299nobodyさん:2006/12/16(土) 14:00:26 ID:???
urlデコードしたフォーム情報と、openしたテキストファイル(shift-jis)で
文字のマッチングしたいのですが、何をやってもうまくいきません。
どうか助けてください。

 <例>
 use CGI;
 use Encode;
 
 my $query = CGI->new;
 foreach ($query->param() ){
 $form{$_}=$query->param($_);
 }
 open (FILE,"<:encoding(shiftjis)","text.txt");
 @aaa = split(//,<AAA>);
 if ($form{bbb} eq $aaa[0]) {
  print "一致";
 }
 close(FILE);
300nobodyさん:2006/12/16(土) 14:02:20 ID:???
split(//,<AAA>)はsplit(//,<FILE>)の間違いです。

<訂正>
 open (FILE,"<:encoding(shiftjis)","text.txt");
 @aaa = split(//,<FILE>);
 if ($form{bbb} eq $aaa[0]) {
  print "一致";
 }
301nobodyさん:2006/12/16(土) 14:49:58 ID:???
>>299
なんか勘違いしてるっぽいので、
文章でどうしたいか説明して。
302299:2006/12/16(土) 16:25:29 ID:???
>>301
htmlのフォームに入力された文字と、txt(本当はcsv)のデータとが合致するときに、
なにかを表示するという簡易なデータベースを作っているところなんです。

 open (FILE,"<:encoding(shiftjis)","text.txt");
とかでtxtを開いて、クエリと合致するかどうかをみたいのですが、
cgi.pmでデコードした文字(クエリ)と、openで開いた文字の
デコード(?)が違うようで、他のコーディングとやらの
何をやっても一致しないという状態に陥ってます。

ものすごく初歩的・根本的な間違いをおかしているとは思います。
303nobodyさん:2006/12/16(土) 16:36:16 ID:???
>>302
text.txtのカンマ区切りのデータとフォームが一致するかを見たいということかな?
text.txtは1行のみ?
改行は入っている?
split /,/, <FILE>; じゃだめ?

文字コード気にする前に、単純な英数字で確認してみて。
304299:2006/12/16(土) 18:07:20 ID:???
>>303さん、ありがとうございます。

>>299のようにクエリを受け取ってから、
自分のやりたいことをカンタンにしたのが下記のプログラムです。

 open (FILE,"<:encoding(shiftjis)","aaa.csv");
 while(<FILE>) {
  @aaa = split(/,/,$_);
  foreach(@aaa) {
   if ($form{namae} eq $aaa[$i]) {
    print encode("shiftjis","$aaa[$i]:match<br>");
   } else {
    print encode("shiftjis","$aaa[$i]:---<br>");
   }
   $i++;
  }
  $i =0;
 }
 close(FILE);

カンマ区切りのデータとフォームの一致をみるのが目的で、
csvは複数行に渡っています(改行入り)。
半角英数の場合はマッチングできるのですが、
平仮名・漢字は一致しません。
また、半角英数・仮名漢字に共通して、
open FILEで引っ張ってきた@aaa{$1}を表示しようとすると
文字化けが起こってしまいます。
305nobodyさん:2006/12/16(土) 18:35:53 ID:???
>>304
ひとまず、エンコードの処理を忘れて、全てのファイルの文字コードを統一して保存して下さい。
次にコードをシンプルにして、試してみましょう。

open FILE, 'aaa.csv' or die;
while( <FILE> ){
 chomp;
 my @aaa = split /,/;
 for( my $i = 0; $i < @aaa; $i ){
  print $form{namae} eq $aaa[$i] ? 'true' : 'false';
 }
}
close FILE;

余計なお世話だけど、そんなforeachの使い方教えてるところは参考にしないほうがいいと思われ。
306nobodyさん:2006/12/16(土) 19:07:56 ID:???
○ for( my $i = 0; $i < @aaa; $i ++ ){
307nobodyさん:2006/12/16(土) 20:54:54 ID:???
for my $i ( 0..$#aaa )
こっちのが書くの楽だろ常識的に考えて
308 ◆TWARamEjuA :2006/12/16(土) 21:59:41 ID:??? BE:3811875-BRZ(6677)
>>307
楽と云うよりも効率が良くなったからこちらの方が良さそうな。
という思想で。

それはそうともう $i とはもう書かなくなったよなぁ。。。
ついでに回数を指定したループも書かなくなったよなぁ。。。
309nobodyさん:2006/12/16(土) 22:24:50 ID:???
このスレでfor、foreach論争はやめてくれ
310nobodyさん:2006/12/16(土) 22:27:29 ID:???
↑ どこが論争だよ
311299:2006/12/16(土) 22:32:58 ID:???
>>305-307
アドバイスの通りにしたら無事解決しました。
結局エンコード云々はいじらないでよかったようです。

ありがとうございました。
312nobodyさん:2006/12/16(土) 22:42:14 ID:lMy9T+vR
(プログラム技術版で質問したところ、ここで質問した方がよいと言われたため、マルチポストしました)

perlに触れて2日目です。。かない痛いミスしてるかもしれませんが、何方か教えてください。

Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると
すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、

require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*name);
&jcode::convert(*name,'sjis');
print "$name";

としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。
どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。


313nobodyさん:2006/12/16(土) 22:55:56 ID:???
for (keys %name){
&jcode::convert(\$name{$_},'sjis');
}
314nobodyさん:2006/12/16(土) 23:05:09 ID:lMy9T+vR
それでも文字化けします…。どうしてだろう。。
315nobodyさん:2006/12/16(土) 23:10:28 ID:???
>>314
ver6ぐらいからutfでないっけ
316287:2006/12/17(日) 12:12:23 ID:???
あーダメだ。Yahoo!JapanとかならOKだがログイン画面すら取ってこれない
java.lang.NullPointerException のみが出力されてくるのですが、御教示お願いします。


use LWP::UserAgent;
$url = "https://example.com/test.jsp"; #実際にはログイン画面のURLが入ってる
$ua = LWP::UserAgent->new;
$req = new HTTP::Request GET => $url;
$res = $ua->request($req);
print "Content-type: text/html\n\n";
print $res->content;
317nobodyさん:2006/12/17(日) 12:34:57 ID:???
>>316
とりあえず普通にアクセスしたときの通信をトレースして
それを忠実に再現するしかないんじゃまいか
318287:2006/12/17(日) 13:35:07 ID:???
>>317さん
やっぱ皆さんこういう高度なのもサクっと作ってcron自動化とかしてたりするんでしょうか

ID・PASSなどをフォームに入れるログイン作業程度なら、
ローカルHTMLのformにhiddenで入れてしまって、jsで一発ログインとかしてるのですが、
一定時間ごとに自動ログイン→一連の作業→処理保存までするのは難しいですね。
もっと色々頑張ってみます
319 ◆TWARamEjuA :2006/12/17(日) 15:50:40 ID:??? BE:1307243-BRZ(6677)
>>318
その点、LWPモジュールも然りサンプルが必ずと言っていいほど掲載されているので、熟読すると良いかもしれませんです♪@CPAN
あっと、そのときには、解説の英文を1から10まで読むよりも、サンプルを1から10まできっちりと読むと判りやすいかと♪
320nobodyさん:2006/12/17(日) 15:56:53 ID:8qXdAMYD
教えてください!
www.xxx.com/aaa.php?id=1&next=1
nextの1で処理を行っているのですが
リロードでも有効になってしまいます。
これを回避する方法などありますでしょうか。

submitからなら対策できるのですが、埋め込んだURLからは
どうしたら回避できるかわからず詰まっています。
321nobodyさん:2006/12/17(日) 15:58:27 ID:8qXdAMYD
かくとこ間違えました。すいません。。
322nobodyさん:2006/12/17(日) 22:23:05 ID:???
>>318
WWW::Mechanize とか
323nobodyさん:2006/12/18(月) 16:04:35 ID:otF+VpE2
質問させてください。

POSTで$nameを送信($nameは日本語)
    ↓
cgi側が$nameを受け取って、namelist.datをオープンして、$nameを書き込んでクローズ。
    ↓
namelist.datを開くと、日本語が%83g%83%7D%83gといった感じで書き込まれている。

これを直したいのですが、namelist.datに書き込む前にjcodeで変換しても駄目でした。
文字コードはsjisで統一してあります。どのようにすれば文字化けせずに書き込めるのでしょうか。
324nobodyさん:2006/12/18(月) 16:09:24 ID:???
受け取りと変換部分kwsk
325nobodyさん:2006/12/18(月) 16:27:36 ID:otF+VpE2
323です。解決しました。。URLデコード&エンコードが原因でした。

>>324
お手数かけました。
326nobodyさん:2006/12/18(月) 20:56:29 ID:???
sub disp_HTML {
print "Content-type: text/html\n\n";
print <<EOS;
<HTML lang="ja">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<TITLE>$_[0]</TITLE>
</HEAD><BODY>
$_[1]
</BODY></HTML>
EOS
exit;
}
POSTされた文字列が不正だった場合等に、ちょっとしたエラー出力をするのに、
こんな感じで単純な出力をするサブルーチンを作って実行するのと、
print "Content-type: text/html\n\n";
print <<EOS;
<HTML lang="ja">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<TITLE>エラー</TITLE>
</HEAD><BODY>
えらーです
</BODY></HTML>
EOS
exit;
}
そのままサブルーチンを作らずにHTMLを出力するのとではどれくらい速度に違いが出たりするのでしょうか。
327nobodyさん:2006/12/18(月) 21:00:45 ID:???
エラー画面ということは、いろんな場所から呼び出される可能性があるので、サブルーチンにする。
またはテンプレート化する。
しかし、速度を気にするほど頻繁にエラー画面が出てしまう設計はどうかと。
328nobodyさん:2006/12/18(月) 21:03:25 ID:???
content-type が出力されたかどうかのフラグは保持しておいた方がいいよ
329nobodyさん:2006/12/18(月) 21:14:08 ID:???
>>327
どうもです。
エラーは極力でないように、悪意に対応できるようには作っているつもりなんですが
なんせ自分で一から作るのは初めてなもので、単純に速度が気になったのです。
それほどアクセスが掛かるようなものでもないですし、自分で使う分にはエラーなんて出さないように使うので
そんなに問題でもないんですが一応。

>>328
具体的にはどうすればよいのでしょうか。
print "Content-type: text/html\n\n";
はサブルーチンにせずに都度出力すると言うことでしょうか。
330nobodyさん:2006/12/18(月) 21:25:58 ID:???
フラグなんて不要
いちいちフラグ確認しないとダメな書き方はよほどおかしい
331nobodyさん:2006/12/18(月) 21:39:31 ID:???
>>329
処女作おめでとう。
速度なんか後回しで、まずは思うように作ってご覧。

そして、>>330が正解。
エラーチェックを全て終わらせてから出力をはじめよう。
332nobodyさん:2006/12/18(月) 21:57:14 ID:???
>>331
そうですね。そうすることにします。

ありがとうございました。
333nobodyさん:2006/12/18(月) 23:22:23 ID:???
サブルーチンが定義されているかどうかを調べるにはどうすればいいでしょうか。
条件として、サブルーチン自体にエラーがない保証というのがあり、
evalだと単純に$@の有無だけでサブルーチンの有無とすることができません。

シンボルテーブルを覗いたり、いろいろ調べてはいるのですが、よく分かりません。
シンボルのハッシュを参照したら、サブルーチンがないのに、参照したことによって
シンボルが追加されてしまうようです。
↑よく理解してないためか、そのように見えます。

ご助言いただければと思います。
334nobodyさん:2006/12/18(月) 23:23:54 ID:???
エラーがない保証がない、でした
335nobodyさん:2006/12/19(火) 00:17:15 ID:???
単純に defined(&subname) じゃダメ?
336nobodyさん:2006/12/19(火) 00:27:12 ID:???
>サブルーチン自体にエラーがない保証がない

どんな設計だ
337nobodyさん:2006/12/19(火) 00:39:23 ID:???
そういえばRailsスレはあるのにCatalystスレはないんだな。
やっぱ使ってる奴いないのか?
338nobodyさん:2006/12/19(火) 00:41:15 ID:???
> 単純に defined(&subname) じゃダメ?

できちゃいました。すみません。そんな簡単だったんですね。
シンボルテーブル参照は、単純にパッケージ修飾の仕方で間違ってたようです。
ありがとうございました。
339nobodyさん:2006/12/19(火) 06:32:32 ID:???
今北産業&流れを見ずにレス

>>316
LWPでhttpsはCrypt::SSLeayが要るんだけど、入ってないからダメって落ちじゃないよね?
340nobodyさん:2006/12/19(火) 09:33:57 ID:???
すごく初歩的な質問ですが、行き詰っていますorz

$OLDには 0-6の数字または文字列が入ります。
数字の時には10〜60代を、文字列の場合はそのまま代入したいのですが、

if ( $OLD == 0 ){ $OLD = "10代"; }
elsif ( $OLD == 1 ){ $OLD = "20代"; }
.
.
.
elsif ( $OLD == 6 ){ $OLD = "60代"; }
else { $OLD = "$OLD"; }

このようにかいているんですが、最後のelseが反応せず、文字列はすべて10代と表示されてしまいます。
なにか書き方が間違っていると思うんですが、わかりませんorz 指摘してください。
341nobodyさん:2006/12/19(火) 10:25:25 ID:???
数値以外が入るなら==じゃだめ。
つ eq、正規表現
342340:2006/12/19(火) 10:34:36 ID:???
Σ(゚Д゚|||)
試したら・・・できました。ありがとうございました! 勉強になりましたorz
343nobodyさん:2006/12/19(火) 10:44:06 ID:???
プログラミング初心者です。

mod_perlは、
はじめの一回コンパイル→メモリ上に常駐
とネットで解説されていたんですが、
perlでもコンパイルしたものを配ったりってできるんでしょうか?
ソースを公開しないで、スクリプトが配布できたら
いいなと思いまして。
344nobodyさん:2006/12/19(火) 11:15:24 ID:???
どこから突っ込んでほしい?
345nobodyさん:2006/12/19(火) 12:09:00 ID:???
Perlで言うコンパイルはその場合意味が違うよ
あと、コンパイルは同じ環境でやらないといかんから配布向きじゃない
346nobodyさん:2006/12/19(火) 12:10:49 ID:???
mod_perlがコンパイルしてmod_perlが常駐させるものでperlスクリプトが常駐できるものではない
(出来るには出来るがkillされるのがオチw)
347nobodyさん:2006/12/19(火) 15:31:43 ID:???
>>345
>>346
なるほどです。ソースは公開しないといけないんですね。

>Perlで言うコンパイルはその場合意味が違うよ
・コンパイルって、コンピュータ用のオブジェクトコードに
することでよかったですよね?

・Perlでおいコンパイルは、機械語に直したオブジェクトコードを
メモリに保存しておいて2回目の起動以降は、ソースにアクセスしないで
メモリのオブジェクトコード読んで実行するということでよかったでしょうか。

・機械語は機械語でもC、Perl、JAVAでできたものは、全く別物なんでしょうか。
こういうのはどうやって勉強すれば。コンパイラの本読むとわかるでしょうか。

なんかネットに書いていることをそのまま質問していて、
ほんとアレなんですが、よろしくお願いします。
348nobodyさん:2006/12/19(火) 15:44:15 ID:???
347です。
いろんなページさまよっているところなんですが。

JAVAは中間コードっていうのみたいですね。
C言語はexeファイルができます。
ちょっと手がかり見つかってきました。
JAVAマシーンが中間コードを読んで実行するみたいに、
mod_perlマシーンが、中間コードみたいなの動かすんでしょうか。
349nobodyさん:2006/12/19(火) 16:07:15 ID:???
つ チラシの裏
350nobodyさん:2006/12/19(火) 16:08:29 ID:???
mixiにでも書いとけ
351nobodyさん:2006/12/19(火) 18:18:58 ID:???
配列とrand関数を組み合わせたいのですが表示できません。
どうしたらよいでしょう?
@nakami = (0, 8, 4, 12, 23, 55);
foreach $aaa(@nakami){
if(rand $aaa){
352nobodyさん:2006/12/19(火) 18:34:27 ID:???
>>351
なにがしたいのでしょう?
353nobodyさん:2006/12/19(火) 18:54:33 ID:???
>347
ラストね
コンパイルの解釈はまぁ OK

Perl でのその解釈は mod_perl の解釈
CGI で動く perl はその都度コンパイルされます
354nobodyさん:2006/12/19(火) 20:41:11 ID:???
つ rand( @nakami );
355nobodyさん:2006/12/19(火) 23:24:08 ID:???
教えていただけないでしょうか。
log.txtを開いてハッシュとしてセットの上、ペアごとにズラズラ並べたいのですが、

open(f,"log.txt");
%file = <f>;
while ( ($key, $val) = each (%file) ) {print "キー $key 値 $val\n";}
close(f);

これだと何も反応してくれません。
間違ってるでしょうか?

log.txtの中身は、
"●●","A組","◎◎","B組","■■","C組",

といった感じです。
356nobodyさん:2006/12/19(火) 23:37:17 ID:???
>>355
ファイルから読み込んだ文字列は、そのままではリストとして扱われません。
文字列をハッシュ変数に代入しても意味がありません。

例えば、以下のような方法で、文字列をリストに変換する必要があります。

・split でカンマ区切りのリストに分解する(ただし二重引用符の除去が必要)
・Text::CSV_XS などのモジュールを利用する(二重引用符も考慮してくれるが少し大げさ)
・正規表現(http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values)を利用する
・eval で評価する(読み込むファイルが外部からの入力を記録している場合は危険)

この場合、正規表現が一番現実的でしょうか。
357355:2006/12/20(水) 00:01:50 ID:???
>>356
ありがとうございます。
%file = <f>; ←こんな式はないんですね。お恥ずかしい限りです。

まだcgiを作っている途中で二重引用符を外す事はわけないですので、
最初の方法か、正規表現かで検討してみます。

わざわざすいません。
358nobodyさん:2006/12/20(水) 00:38:56 ID:???
区切りを改行にすれば%file = <f>;でいけるよ
もちろんキーにも値にも最後に改行がつくからchompとかしなきゃだめだけど
こんな感じで
●●
A組
◎◎
B組
■■
C組
359nobodyさん:2006/12/20(水) 00:50:18 ID:???
my %virtues = map { chomp; $_ } <DATA>;
print "$virtues{ONE}\n";
print "$virtues{TWO}\n";
print "$virtues{THREE}\n";
__DATA__
ONE
Laziness
TWO
Impatience
THREE
Hubris

なるほど。
360nobodyさん:2006/12/20(水) 07:51:48 ID:???
汎用性考えたらこっちだろ?(区切り文字はその時々だけど)

my %virtues = map { chomp; split /,/, } <DATA>;
print "$virtues{ONE}\n";
print "$virtues{TWO}\n";
print "$virtues{THREE}\n";
__DATA__
ONE,Laziness,TWO,Impatience
THREE
Hubris
361nobodyさん:2006/12/20(水) 07:54:31 ID:???
「汎用性」じゃねえな。
「そこまでするなら」に代えてくれ
362nobodyさん:2006/12/20(水) 11:11:45 ID:S+pohGEQ
コーディングのときに検索エンジンにかかりやすくするにはどうしたら良いんですか?
363nobodyさん:2006/12/20(水) 11:33:14 ID:???
SEOでぐぐれ
びっくりするほどスレ違い
364nobodyさん:2006/12/20(水) 12:18:48 ID:???
>>362
とりあえず、ストリクトなHTMLを吐くように書けばいいと思う。
365nobodyさん:2006/12/20(水) 13:09:42 ID:???
>>364
少なくとも、ロボ物は適当で簡素なHTMLの方が拾ってくれたりするよ
<html>
<head>
<title></title>
</head>
<body>

</body>
</html>
こんな感じの
366nobodyさん:2006/12/20(水) 13:20:25 ID:???
それどこのクソエンジンだよw
367nobodyさん:2006/12/20(水) 14:02:06 ID:???
>>365
それストリクトじゃん。
368nobodyさん:2006/12/20(水) 14:35:34 ID:???
DOCTYPE が無いのに strict とか、もう一度勉強し直した方がいいと思うよ
369nobodyさん:2006/12/20(水) 14:54:20 ID:???
HTMLスレでやれ。
370nobodyさん:2006/12/20(水) 16:33:01 ID:???
ストラトスには憧れたな
371355:2006/12/20(水) 17:16:24 ID:???
>>356
>>358
>>359
>>360

サンキューです。無事完成しました。
372nobodyさん:2006/12/20(水) 20:05:38 ID:???
ストラトス・フォー
373nobodyさん:2006/12/21(木) 13:16:34 ID:???
掲示板で禁止ワードが多くなってきたので、禁止ワードだけを別ファイルに
して読み込もうと思ったのですが、

if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); }
foreach(<WORD>){
if ($name eq $_){ $name = "禁止";}
}
close(WORD);

この記述では反応してくれません。(errorはでません)
外部ファイルにする前はできていたのですがなにか書き方が違うのでしょうか・・・?
bad.txtの中身はすべて改行区切りです。
また名前欄に特化した禁止ワードなので、eqで問題ありません。
よろしくお願いします。
374nobodyさん:2006/12/21(木) 13:34:43 ID:???
chompしないと改行がついたまま
375nobodyさん:2006/12/21(木) 13:35:57 ID:???
改行
376nobodyさん:2006/12/21(木) 17:21:37 ID:???
またお世話になります

掲示板の本文中にurlがあったとき自動リンクさせますが、
jpg、png、gifのときは画像を小さく表示させたいです

正規表現で末尾を(jpg|png|gif) として区別しますが、
そうでない場合の表現はどうしたらいいですか?
377nobodyさん:2006/12/21(木) 17:25:31 ID:???
!
378nobodyさん:2006/12/21(木) 17:31:55 ID:???
>>376
他鯖の画像を無断リンクするわけ?
379nobodyさん:2006/12/21(木) 18:29:02 ID:???
普通の画像ならまだしも何か仕込まれてたりしたら見るだけで被害者が続出だな。
まさに阿鼻叫喚の地獄絵図ってやつだ。
380nobodyさん:2006/12/21(木) 19:11:28 ID:???
末尾を!(jpg|png|gif) と (jpg|png|gif) にしてみましたが、
画像でない方のリンクがなされません

ええと、自分のところのアップローダです
既に過去の掲示板投稿がたまっているので、アップローダ
において、リンクしてもらうようにするためです
これなら1発言中に何個画像があっても自由ですし、
組み込みより楽ですので
381nobodyさん:2006/12/21(木) 19:25:43 ID:???
例。
・regex1はかくかくしかじかです。
 \.(jpg|png|gif)$なURL。小さく表示させたいらしい。
・regex2を条件式として、これこれこういうif文を経由して自動リンクになるようにしています。
 regex1でないURL。<a href="$&">$&</a>、<a href="$1$2">$1$2</a>などにしたいんだと思う。

regex[12]をどう書いてるのかの記載があると、「画像でない方のリンクがなされません」ではわからんよ、
という印象を受ける人もぐんと減るんだと思う。
382nobodyさん:2006/12/21(木) 19:32:25 ID:???
>>381
正直余計わからんわw

リンクがされるかどうかは、正規表現にマッチするかどうかの判断でしょ?
まずURLは抜き出せるの?
383nobodyさん:2006/12/21(木) 20:15:23 ID:???
>>365
> 少なくとも、ロボ物は適当で簡素なHTMLの方が拾ってくれたりするよ

「の方が」 はありえない。
384nobodyさん:2006/12/21(木) 22:10:23 ID:v7yMEHCt
お世話になっております。
今perlを用いてCGIで
画像をUPできるようなものを作ろうとしています。
画像をうpする方は
<form method="POST" ENCTYPE="multipart/form-data" action="edit_completion.cgi">
<input type="file" name="TENSOU">

とやっていて受け取る方は
my $cgi = new CGI;
my $image = $cgi->param('TENSOU');
my $file_name="./test.jpg";
my $buffer;
open(OUT, ">$file_name") or die(qq(Can't open "$file_name".));
binmode OUT;
while (read($champ1_image, $buffer, 1024)) {
print OUT $buffer;
}
close OUT;
とやっています。
やってみると
白いページで止まってしまうのですが
お手数だと思いますが
正しいやり方を教えていただきますとありがたいです。

スレ違いでしたら誘導をお願いします。
385nobodyさん:2006/12/21(木) 22:42:34 ID:???
die(qq(Can't open "$file_name".));
386nobodyさん:2006/12/21(木) 22:50:08 ID:???
× while (read($champ1_image, $buffer, 1024)) {
○ while (read($image, $buffer, 1024)) {
387nobodyさん:2006/12/21(木) 23:01:44 ID:???
>>384
use CGI::Carp qw(fatalsToBrowser);
と書いておくと、エラーがブラウザに表示されるようになるよ。参考までに。
388nobodyさん:2006/12/21(木) 23:20:52 ID:???
>>381 >>382

$comment=~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~〜\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)(jpg|gif|png)/<a href=$1.$2$3$4$5><img src=$1.$2$3$4$5 hight=50 absbottom border=1><\/a>/ig;

これは末尾が画像の場合、画像でない場合はリンクだけにしたいんです

if使うと一旦配列に入れて展開しないとだめじゃないですか?
そんなことないですか?

それで、URL末尾(拡張子)が画像とそうでないものを置換演算で並べて
やろうと思ったんです
389nobodyさん:2006/12/22(金) 01:00:50 ID:???
@list = ('test1', 'test2', 'test3',);
%hash = ('aaa' => @list);
$num = $hash{aaa};

これで、$numに3が入ってほしいんですが、test1が入ってしまいます。
%hash = ('aaa' => @list+0);
とすると3が入ります。
+0を付けなくても3を返してほしいんです。
助言をお願いします。
390nobodyさん:2006/12/22(金) 01:05:13 ID:???
scalar(@
391388:2006/12/22(金) 01:29:59 ID:???
一旦、urlを自動リンクした後、
さらに自動リンクした<a href>のタグと(jpg|gif|png)含むものをマッチさせ
その部分だけimg srcで画像表示させることにしました
お騒がせしました
392nobodyさん:2006/12/22(金) 11:06:11 ID:DIJoWwwO
助言お願いします。

grepで@namelistという配列に何個$nameがあるかどうか調べています。

$number=grep(/$name/, @namelist);

@namelistに様々な名前を入れてみたのですが、たまたま$name=キムタクと入れた
時だけ、@namelistにもキムタクがあるのにカウントしてくれません。(ネタじゃありません…)
まだ沢山カウントされない文字列があるのかもしれませんが、なぜ「キムタク」はカウントされなかったのでしょうか?
文字自体に問題があるのでしょうか?さっぱりです。。
393nobodyさん:2006/12/22(金) 11:09:46 ID:DIJoWwwO
あれれ…。「キタムラ」も駄目でした。カタカナはNGかと思ったら、「クサナギ」は
大丈夫でした。どういうことだ…
394nobodyさん:2006/12/22(金) 11:23:58 ID:???
>>392-393
たぶん文字っていうか文字コード
このスレの>>2-3に貼られてるサイトでも読んでこい
395nobodyさん:2006/12/22(金) 11:26:02 ID:DIJoWwwO
>>394
「文字コード」ですか?
「キムタク」も「クサナギ」も文字コードは同じですよ。
ですから文字コードの問題ではないのではないでしょうか。
396nobodyさん:2006/12/22(金) 11:40:31 ID:???
つ ダメ文字

でもキムタクってダメ文字じゃないような。
397nobodyさん:2006/12/22(金) 11:52:49 ID:???
SJISが代表的だが正規表現の中に何の対策もしないで埋め込むと問題がでる
文字を含んだ文字コードというのがあるのよ。

いいから>>2-3をきちんと読め。そういう反応するってことは読んでないだろ。
特にPerlメモ

ttp://www.din.or.jp/~ohzaki/perl.htm

の「日本語を扱う」のあたり。
398nobodyさん:2006/12/22(金) 12:19:49 ID:???
キムタクは「ちょ待てよ!」でマッチするんじゃ?
399nobodyさん:2006/12/22(金) 12:21:45 ID:???
正規表現にもダメ文字みたいなのあるのか。
覚えておこうっと。
400nobodyさん:2006/12/22(金) 12:30:46 ID:???
まずEUCに変換しないとな
401nobodyさん:2006/12/22(金) 13:49:50 ID:???
\Q \E とか。
402nobodyさん:2006/12/22(金) 14:15:14 ID:???
それもshift-jisだと何かがダメだったような。
403nobodyさん:2006/12/22(金) 14:28:59 ID:???
素直にgrep(index($_,'name')>=0, @array)でいいじゃん
404nobodyさん:2006/12/22(金) 14:48:59 ID:6wQis76n
便乗で文字コード変換について質問させてください
「U」という文字をS-JISからEUCに変換しようと思っています。

Encode::from_to( $tmp, "CP932", "EUC-JP"); #Encode.pm
$tmp = jcode($tmp)->euc; #Jcode.pm
jcode::convert(\$tmp, 'euc'); #jcode.pl

正しく変換できるのはjcode.plのみでした。
Encode.pmあるいはJcode.pmで変換する方法はありますか?
405nobodyさん:2006/12/22(金) 17:44:39 ID:???
Encode::EUCJPMSでeucJP-msやCP51932が使えるようになるみたいです。
http://search.cpan.org/~naruse/Encode-EUCJPMS-0.07/EUCJPMS.pm

> 正しく変換できるのはjcode.plのみでした。
$tmp = 'A'; # 0xFA41(CP932)
jcode::convert(\$tmp, 'euc', 'sjis'); # 0x13A2 ?

NEC特殊文字をやっつけてくれたjcode.plもIBM拡張文字を食わされると困る模様。
406nobodyさん:2006/12/22(金) 18:10:36 ID:6wQis76n
>>405
ありがとうございます

やケもダメですね
Perlで全ての日本語の文字コード変換を行うことはできないのでしょうか?
入力される可能性のある文字についてみなさんどのように処理されていますか?
407nobodyさん:2006/12/22(金) 18:27:46 ID:???
日本語コードといっても機種依存文字の部分がバリエーション
けっこうあるし、unicode以前は統一されていた部分ですら
どうunicodeに対応させるかでさらに分裂してしまってる現状
なので個人的にはあきらめているな。

どうしても満足できなければ、自前で好きな変換表を定義してe
nc2xsでperlから使えるようにするのがいいんじゃないか。

いいのができたら公開すると世の中のためにもなる。
408nobodyさん:2006/12/22(金) 19:29:11 ID:???
Cモジュールの作り方がさっぱり分からん
409nobodyさん:2006/12/22(金) 22:04:52 ID:???
perlxstut, perlxs 辺り読めば分かると思うけど。
410nobodyさん:2006/12/23(土) 01:35:39 ID:rkaYYOb9
掲示板への投稿が一定数以上なければ、閲覧することが
できない制限をつけたいのですが、わかりません。
(来訪者の割りに投稿者が少なく、DOMを減らしたいため)
書込みルーチン内に、coookieを使って投稿カウントを保存
し、閲覧時にcoookieを読んで条件分岐すれば良さそうな気が
していますが、具体的にどうしたらよいのかわかりません。

「imgboard」で実現したいのですが。
http://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi

いますが、
411nobodyさん:2006/12/23(土) 01:42:38 ID:rkaYYOb9
すみません。「いますが、」はゴミです。
coookie⇒cookieでした。失礼しました。
412nobodyさん:2006/12/23(土) 02:33:17 ID:???
> 具体的にどうすればよいのかわかりません。

わかってるじゃん。あとは、クッキーを読み書きする方法を調べるだけだろう。
「Perl クッキー」とかで検索すれば、すぐにわかるよね。
413nobodyさん:2006/12/23(土) 04:12:05 ID:???
(´-`).。oO(投稿しないと見れない掲示板にどうやって投稿するのやら…)
414nobodyさん:2006/12/23(土) 04:22:04 ID:???
>>413
ようするに、既にいる常連達とだけ馴れ合いたいってことだろ

パスワード制にすりゃいいのにね
415nobodyさん:2006/12/23(土) 07:57:13 ID:vvP1Ez0I
改造スレいけ
416nobodyさん:2006/12/23(土) 10:26:34 ID:9XJJytw/
LWP::UserAgentを用いてのPOST処理なのですが、multipleタイプのプルダウンメニューの内容全てを送るにはどうすればいいのでしょうか?

おなじnameで複数のvalueをPOSTする方法に悩んでいます。
417nobodyさん:2006/12/23(土) 10:31:34 ID:???
418nobodyさん:2006/12/23(土) 14:34:05 ID:???
PHPのmktimeやdate関数のように Y/m/d H:i:s を変換するスマートな方法はありますか?
Date::Simpleは何か違うような感じだったので


1900/01/01 12:00:00

01/01 12:00
419nobodyさん:2006/12/23(土) 14:36:03 ID:???
Date::Manipあたりは試した?
420nobodyさん:2006/12/23(土) 15:28:46 ID:???
区切り子が分かってるんだから自前で用意すれば?
421nobodyさん:2006/12/23(土) 15:49:44 ID:???
Date::Simpleは使いやすいけど、日にちまでなんだよな。
たくさんモジュール使っても混乱するだけだし。
いまだとDateTimeモジュールがベストプラクティスなんじゃないの。
422nobodyさん:2006/12/23(土) 16:14:47 ID:MDS/ay7M
Catalystにて
Apache2 + mod_perl2

--httpd.conf------
PerlSwitches -I/var/www/Hello/lib
PerlLoadModule Hello
PerlTransHandler Hello
<Location /Hello>
PerlSetEnv Hello_DEBUG 0
SetHandler modperl
PerlResponseHandler Hello
</Location>

の設定をして、アパッチ再起動すると
WWWサーバー内のデータ全てがmod_perl2化しているようになり、
speedyCGIなどのスクリプトの動きがおかしくなるのですが、
どのように解決したらよいでしょうか
423nobodyさん:2006/12/23(土) 16:43:07 ID:???
>>419
検索したけど具体的な使用例とか見つからず分かりませんですた。
でもありがとうございます。今度また調べます。

>>421
ありがとうございます。DateTimeはいい感じですね。
ttp://iandeth.dyndns.org/mt/ian/archives/000619.html

>>420
文字コード変換とかXMLパースとかも全部自前でやってろ(^ω^)
424nobodyさん:2006/12/23(土) 23:10:40 ID:HvJ8lenr
あるログHTMLファイルの一番最初の<b>名前<\b>にマッチングして
$1に放りこんであるものを
そのファイルの最後の<b>名前<\b>にマッチングさせてたいのだが、、、。

425nobodyさん:2006/12/23(土) 23:17:38 ID:HvJ8lenr
for ($i = 0; $i <= $#dir; $i++) {
($ts, $file) = split(/,/, $dir[$i]);
last if $ts eq ' ';
open(R, "$bbspath/$dir/$file");
@resthred = <R>;
close(R);
$resthred[0]=~ /<b>([^\<]*)<\/b>/;
$restitle = $1;
$restitle =~ s/\s+$//;
$resthred[$#resthred-1] =~ /<dt>(\d+)/;
$k = $1; # 投稿記事数
$j = $i + 1; # スレッド表示番号
if ($k ne "1") {$k = "($k)";} else { undef $k; }
$file =~ s/\.html$//;
if ($threadnum > $i) {
print W qq(<br>$j.<a href="$cgiurl$logbbscgi/$dir/${file}/" target="contents"><font size=3>$restitle$k</font></a> );
}
print W2 qq($j.<a href="${file}/">$restitle$k</a> \n);
}
#ソースはこんな感じ。
426nobodyさん:2006/12/23(土) 23:21:27 ID:HvJ8lenr
$resthred[0]=~ /<b>([^\<]*)<\/b>/;

ここらへんのメタキャラクタを^から$に変えるということでもないし。
そもそもこのインデックスナンバーの意味もわからないのだが、、、。
427410-411:2006/12/23(土) 23:40:58 ID:rkaYYOb9
>>412
レスありがとうございます。
考え方としては間違ってないということですね。

>>413
>(´-`).。oO(投稿しないと見れない掲示板にどうやって投稿するのやら…)

投稿していない段階では、新規書込画面しか出ないようにしたいのです。

>>414
>パスワード制にすりゃいいのにね
すでに導入しているのですが、カキコしてくれる人とそうでない人とに
不公平さが出てしまっていて悩んでいるんです。
428nobodyさん:2006/12/23(土) 23:46:08 ID:MDS/ay7M
ここ間違ってない?

$resthred[0]=~ /<b>([^\<]*)<\/b>/;
<b>名前<\b> なら こうじゃないかな?
/<b>(.+)<\/b>/
429nobodyさん:2006/12/23(土) 23:46:51 ID:???
もう少しデータの持ち方を工夫すると楽になると思うよ。
430nobodyさん:2006/12/24(日) 00:25:34 ID:AWC9vzHT
<html><head><title>fdsfdfd </title></head>
<b>改編fdsfdfd </b></font>投稿者:<font color="forestgreen"><b>太郎 </b>
<br><hr><a name="bottom"></a><a href="index.html">掲示板に戻る</a> <a href="

まあ要するに最初の<b>改編fdsfdfd</b>になってるものを
最後の<b>太郎 </b>がひっかかるようなマッチングをしたいだけなんですが
現状はこのメタキャラクタで最初の<b>~</b>で
きちんとひっかかる。
431nobodyさん:2006/12/24(日) 00:47:39 ID:???
日本語でおk
432nobodyさん:2006/12/24(日) 00:57:31 ID:???
そんな簡単なマッチも書けないやつが
スクリプトで2chに負荷かけそうで心配
433nobodyさん:2006/12/24(日) 01:10:15 ID:???
>>430
それちょっと前にも話題にでたけど、否定先読み使って
$regex(?!.*$regex)
で $regex にマッチする一番最後の部分が得られる。

$_ = <<EOT;
<html><head><title>fdsfdfd </title></head>
<b>改編fdsfdfd </b></font>投稿者:<font color="forestgreen"><b>太郎 </b>
<br><hr><a name="bottom"></a><a href="index.html">掲示板に戻る</a> <a href="
EOT

my $regex = qr{<b>([^<>]*)</b>};
print "$1\n" if m{$regex(?!.*$regex)};
434nobodyさん:2006/12/24(日) 01:12:35 ID:???
って書いてから思ったけど、今回のケースなら別に否定先読み使わなくても
m{<font color="forestgreen"><b>([^<>]*)</b>}
でマッチできるね(´・ω・)
435nobodyさん:2006/12/24(日) 07:03:20 ID:???
質問です

2項分布の計算をperlでやりたいんですが、一定の数値以上になると、階乗のところで変数の容量オーバー(? #INFとの表示)でおかしくなってしまいます

・変数の扱える桁数を大幅に増やす方法はありませんか?
・ExcelのBINOMDIST関数的なライブラリ(?)は無いのでしょうか

スレ違いだったらごめんなさい。よろしくお願いします
436nobodyさん:2006/12/24(日) 07:07:05 ID:???
>>435
bigintプラグマ(整数)
bignumプラグマ(実数)
実体はMath::BigIntやMath::BigFloat
他に分数で扱うMath::BigRatもある。
437nobodyさん:2006/12/24(日) 08:00:55 ID:???
>>436
ありがとうございます!
438nobodyさん:2006/12/24(日) 12:01:21 ID:AWC9vzHT
>>433-434
お答えくださってありがとうございます。
しかしなかなかうまくいかないので
プロにおまかせすることも検討してます。
やはり正当な知識には正当な料金というものが発生するものという
考えが正しいのかと。
それでは。
439nobodyさん:2006/12/24(日) 12:57:49 ID:???
>>438
料金云々の話は確かに間違いではないけど、何より>>424>>430の説明(≒仕様)がわかりにくいんです。
プロに頼むにしても仕様があやふやだったり後出しが続いたりすると「なかなか」なのは同じですよ。
「また仕変ですか」と呆れられたり値上がりしたりするだけですけど。

行末にある<b>太郎 </b>の「太郎 」が$1として使えるだけでいいんだったら
$ を書き足すだけでもいいのかもしれない。>>434が書いたものでうまくいかない理由は不明。
(実はcolor="forestgreen"じゃない場合があるとか、そんな問題のような気がする)

$resthred[0]=~ m|<b>([^<>]*)</b>$|; # スラッシュをエスケープするのが面倒です版
$resthred[0]=~ /<b>([^\<]*)<\/b>$/; # 元ソース使い回しました版

>>430の「最後の」が行末でも何でもない場合は、プロにお金を積む方向で。
440nobodyさん:2006/12/24(日) 14:06:39 ID:AWC9vzHT
度々お答えくださりありがとうございます。
やはりなかなかうまくいきません。
「最後の」というのは行末ということではなく
加工前のログにたくさんある<b>名前</b>のなかで最後の<b>名前</b>
=最新レスポンス者の名前をひっかけたいということです。
まあ、最初からそのログを改行して区分けするというやりかたも
ありだとは思いますが。
いろいろと模索中であります。
金云々にしてはすでに三十万近くかけて作らせてるものです。
私は多少のPerl/CGI知識を持っているのですが
運用に力をいれたいほうなので外注に頼ってるわけであります。

441nobodyさん:2006/12/24(日) 14:36:15 ID:???
>>440
こんなこと言うのもなんだが、
「運用に力を入れたいから知識はあるけど外注」ってレベルじゃないだろ。
その程度なら素直に信頼できる実績があるとこに外注がいい。
442nobodyさん:2006/12/24(日) 14:55:58 ID:AWC9vzHT
確かにその$resthred[0]=~ /<b>([^\<]*)<\/b>$/; で
おかしくはないと思うんですが
まあ、すべてのソースをみてのことじゃないからわかりませんよね。
よく元ソースを解読してから出直します。
結果としてそのファイルのあるフォルダ名が$restitleにはいってしまうので
別の問題にも思われます。
ここまで考えて改造費出すのも個人的に馬鹿馬鹿しいので
自分なりに実験してみますわ。
御意見ありがとうございました。
443nobodyさん:2006/12/24(日) 14:58:03 ID:AWC9vzHT
>>441
うるせえよ。
てめえに聞いてねえんだよ。
ガタガタ口はさむなクソが。
じゃあな。
444nobodyさん:2006/12/24(日) 15:04:54 ID:???
頭が悪いのにプライドが高いと大変だな。
哀れだがなにもしてやれん…
445nobodyさん:2006/12/24(日) 15:14:21 ID:???
441が回答してくれた人達かもしれないのにな
446nobodyさん:2006/12/24(日) 16:56:38 ID:???
30万って、二週分にも満たないハシタガネで何イキがっているんだろう...
447nobodyさん:2006/12/24(日) 17:10:57 ID:AWC9vzHT
結局、外注にしましたわ。
ただより高いものはない、なんて言うしな。
プログラミングは誰にこだわる理由はないし、
結果のでない親切より結果のでるお金だわな。
まあ、それはそれで駆け引きの技術だが。
てめえらもこんな腐れ掲示板で悪態奉仕活動してねえで
技術で金むしりとることに専念したほうがよくねえか?
俺が最初に頼んだ職人もそうだった。
あんまり調子こくんで他の外注にするつもりだが。
競争にさらされねえとそこらへんはわかんねえんだよな。
448nobodyさん:2006/12/24(日) 17:12:56 ID:???
態度の豹変ぶりに笑った
449nobodyさん:2006/12/24(日) 17:14:29 ID:AWC9vzHT
でもあれだね。
その職人もこういう掲示板とかで聞いたり他のソースを拾ったりして
やっつけ仕事とかしてやがんの。
おまえらそういう連中にも利用されてるんだよ。
450nobodyさん:2006/12/24(日) 17:21:57 ID:AWC9vzHT
だいたいここで張りついて親切に答えてる連中はプロじゃねえだろ。
そんで聞いてる連中が要領のいい継ぎはぎ職人のプロだったら皮肉で笑えるけどな(w
451nobodyさん:2006/12/24(日) 17:24:12 ID:???
>>449
その解釈は正確にはそれはちょっと違います。他ならぬ貴方からの依頼だからこそ
出来合いのソースを拾ってきてやっつけ仕事で片付けているんです。
つまり貴方はその程度の顧客です^^
452nobodyさん:2006/12/24(日) 17:28:48 ID:???
そんなエサに俺様がクマー
453nobodyさん:2006/12/24(日) 17:29:35 ID:AWC9vzHT
いやそれは俺がわざわざここから参考にしろってリンク張ってあげたんだよ。
フリーソフトの作者さんのサイトでねえ。
安い仕事だと思ったから。そこらへんまで譲歩したのだ。
無償のオープンソースを利用してるのはそういった要領のいいやつだ。
俺もそこらへんは共通の金銭の価値観なのでな。
454nobodyさん:2006/12/24(日) 17:35:09 ID:AWC9vzHT
フリーで作ってる連中に著作権とかぐだぐだ言われるとうるせえから
変数の名前だけ変えてフルスクラッチすればとか言ってやってな。
親切だろ。
まあ、というのも俺も金儲け目的のサイトをつくろうと思ってるから
投資は必要だしな。
455nobodyさん:2006/12/24(日) 17:37:16 ID:???
> 変数の名前だけ変えてフルスクラッチすれば
> 変数の名前だけ変えてフルスクラッチすれば
> 変数の名前だけ変えてフルスクラッチすれば

(゚Д゚)…!?
456nobodyさん:2006/12/24(日) 17:43:58 ID:???
KE○Tでも紹介したんですか?
457nobodyさん:2006/12/24(日) 17:45:50 ID:AWC9vzHT
聞いてる連中がどんな人間かわからん。
答えてる人間がどういう人間だかわからん。
ただよく無料で答えるなあとは思うわなあ。
458nobodyさん:2006/12/24(日) 17:50:31 ID:???
> いやそれは俺がわざわざここから参考にしろってリンク張ってあげたんだよ。
> フリーソフトの作者さんのサイトでねえ。
> 安い仕事だと思ったから。そこらへんまで譲歩したのだ。



> その職人もこういう掲示板とかで聞いたり他のソースを拾ったりして
> やっつけ仕事とかしてやがんの。



> 俺が最初に頼んだ職人もそうだった。
> あんまり調子こくんで他の外注にするつもりだが。

凄い釣りだぜ…。
459nobodyさん:2006/12/24(日) 17:51:40 ID:AWC9vzHT
>>456

いろいろ。
俺はねえ金を儲けたいのね。
ほんと正直な気持ち。
だから金使うのも筋だと思うわけ。
たとえ少額でも1円と無料には大きな開きがある。
君等もこんな腐れ掲示板はさっさと放棄して
私がこんどつくる掲示板を利用したほうがいいだろう。

460nobodyさん:2006/12/24(日) 17:55:19 ID:???
>>459
早く作れ
461nobodyさん:2006/12/24(日) 17:55:54 ID:AWC9vzHT
つまりなんかしら利益の還元があるCGIだねえ。
スロットマシーンのプログラ厶のようなものだ。
462nobodyさん:2006/12/24(日) 17:59:18 ID:???
主張が右往左往していて何が言いたいのか良く分からんな。
誰か3行くらいでまとめてくれない?
463nobodyさん:2006/12/24(日) 18:00:29 ID:AWC9vzHT
>>460

どうも俺はナマケモノでねえ。
先伸ばし、先伸ばしで五年はたつ。
しかしシステムは確立したよ。

464nobodyさん:2006/12/24(日) 18:01:10 ID:???
>>462
脳内
設定
爆発
465nobodyさん:2006/12/24(日) 18:06:43 ID:???
>>464
うはwwおk把握www

何か1ch.tvを思い出すなあ。
466nobodyさん:2006/12/24(日) 18:08:53 ID:AWC9vzHT

以前、このスレッドであるメタキャラクタを
聞いたときはたまたまいい回答が帰ってきて
もうけものだったのだが
やはり無料には限界があるようだな。
無料の限界=2chの限界=匿名の君等の限界だのう。
467nobodyさん:2006/12/24(日) 18:10:52 ID:AWC9vzHT
1chってあれでしょ。
利用者から金とるってやつだろ。
あんなものダメに決まってるじゃあないか。
468nobodyさん:2006/12/24(日) 18:13:51 ID:???
正確には『お前の俺らから情報を引き出す力の限界』だけどな。
469nobodyさん:2006/12/24(日) 18:14:43 ID:AWC9vzHT
なんだか
Perlコーディングスレなのに私の妄想のはけぐちスレにして
なにか申し訳なくってきたねえ。
まあそれも2chだからしょうがないのう。
すっきりするまでつきあってほしい。
470nobodyさん:2006/12/24(日) 18:15:46 ID:???
>>430 でも >>466 でもそうだけど、パターンとメタキャラクタの区別がつかないの?
471nobodyさん:2006/12/24(日) 18:17:28 ID:AWC9vzHT
情報って、、、。
なんかいい金になる情報なんかあるの?。
2chで金になる情報なんかあったためしがない。
472nobodyさん:2006/12/24(日) 18:29:11 ID:AWC9vzHT
>>470

つうか今それは問い合わせ中なのでまた今度な。
まあ、そのときは自己解決しましただろうけど。
求めるととこはプラスの結果だけ。
そういうプラスの結果を出すシステムを作りたかったのだ。
なにか答える。なにか結果を出す。なにか教えてくれる。
俺は金を請求するし金は払う。
それでおしまいだな。
473nobodyさん:2006/12/24(日) 18:30:56 ID:AWC9vzHT
まあ、質問には金が伴うほうを選ぶよ。
失礼しました。
474nobodyさん:2006/12/24(日) 18:30:59 ID:???
>>471
それは感性の違い。
感性の無い奴には泥まみれの宝石の原石は見つけられない。








と、釣られてみるテスツ
475 ◆TWARamEjuA :2006/12/24(日) 18:35:02 ID:??? BE:2940293-BRZ(6677)
(´-`).。oO(バブル脳の戯れ言か(嬉嬉嬉))
476nobodyさん:2006/12/24(日) 18:38:57 ID:???
>>472>>470 に対するレスとしては見当外れすぎてワロタ
477nobodyさん:2006/12/24(日) 18:41:03 ID:???
みんな暇なんだなと安心するクリスマスイブであった
478nobodyさん:2006/12/24(日) 18:47:14 ID:???
じゃあ質問させてくれ
文字列fooのあとに、bar以外の文字列が来て、しかも最後までにbazが現れないという
条件にマッチする正規表現が書きたくて、下のようなのを書いてみたんだけど。

/foo(?:(?:(?!bar)).(?<!baz))+$/

さすがにアレなんで、ちょっとどうにかならないものかなと。複数のパターンに分割するのはなしで。
479nobodyさん:2006/12/24(日) 19:01:58 ID:???
m{foo(?!bar)(?!.*baz.*$)}
480nobodyさん:2006/12/24(日) 19:06:21 ID:???
俺は面白い質問があれば答える。ただそれだけ。面白いなら宿題でも金儲けでもなんでもいい。ぐだぐだ言ってないでさっさと次の質問しろよ
481nobodyさん:2006/12/24(日) 19:08:59 ID:???
>>478
>>479 で正解が出ているけれど、実際問題、可能であれば分割した方が効率と可読性の両面から好ましい場合が多い気がするよ。
482JAPU ◆lVJAPUTeX. :2006/12/24(日) 20:55:14 ID:???
s{(https?://[A-Za-z0-9./_?=-]+)}{
my $x = $1;
$x =~ /\.(?:gif|png|jpg)$/? qq{<img src="$x" alt="">}: qq{<a href="$x">$x</a>}
}eg;'
正規表現部分は適当に置き換えて。


>>422
Location の中に全部入れれば?
ちなみに、mod_perlは必要な部分だけ分離 (別サーバにするかApache2個立ち上げるか) するのがお勧め。
483nobodyさん:2006/12/24(日) 22:15:47 ID:???
乗り遅れたが後悔はしない
484nobodyさん:2006/12/24(日) 22:28:56 ID:???
俺も乗り遅れたが後悔はしていない
ただ1つ書くなら・・・俺はこの板でスキルアップさせてもらってる
485373:2006/12/24(日) 23:22:02 ID:???
>>374 遅くレスすいません以下のようにしたんですが

if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); }
foreach(<WORD>){
chomp;
if ($name eq $_){ $name = "禁止";}
}
close(WORD);

これであってますか・・? と、いうか禁止ワードに反応なしなので
未だにできてません(´Д⊂)
486nobodyさん:2006/12/24(日) 23:40:55 ID:5VuL7TZS
>>485
$name に何が入ってるのかわからんけどさ
$name =~ /$_/ig;
にしたら?
iオプションは必要だけどgオプションが必要かどうかは自分で決めてね
487nobodyさん:2006/12/24(日) 23:44:25 ID:5VuL7TZS
それでも引っかからなければ文字コード
両方コード揃えてひっかければいい
これでダメなら他が悪い

use Jcode;
$name = jcode->($name)->euc;

if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); }
foreach(<WORD>){
chomp;
$temp = jcode->($_)->euc;
if ($name eq $temp){ $name = "禁止";}
}
close(WORD);
488nobodyさん:2006/12/25(月) 02:20:59 ID:WCngGP1U
$fooにfooという文字列、$hogeにhogeという文字列が入っているとして、
$barにはfooを含む文字列が入っているとすると、

$bar =~ s/$foo/$hoge/;

としても置き換えはされないのですが、

$bar =~ s/foo/$hoge/;

としたら置き換えがされるのは何故でしょうか?
$fooが評価されていないということは分かったのですが、何故かが分かりません。
489nobodyさん:2006/12/25(月) 02:30:55 ID:???
>>488
ん?

my $bar = 'foo!foo!foo!'; my $baz = $bar;
my $foo = 'foo'; my $hoge = 'hoge';

$bar =~ s/$foo/$hoge/g;
$baz =~ s/foo/$hoge/g;
print $bar, "\n", $baz;
--
hoge!hoge!hoge!
hoge!hoge!hoge!
490nobodyさん:2006/12/25(月) 02:35:21 ID:WCngGP1U
>>489
なに・・・!
なぜでしょう・・・(´・ω・`)

実際のプログラム中ではオブジェクトとして扱っているのは関係あるのでしょうか?
($fooは実際は$self->{foo}->{bar}としている)

$bar =~ s/$self->{foo}->{bar}/$self->{foo}->{hoge}/;
491JAPU ◆lVJAPUTeX. :2006/12/25(月) 03:01:53 ID:???
>>486
g は全く要らない。
i は必要とは言えない。

>>488
実際には foo は日本語で、しかも Shift_JIS 使っているなら、
$bar =~ s/\Q$foo/$hoge/;
としてみては?
492nobodyさん:2006/12/25(月) 03:09:41 ID:WCngGP1U
>>491
日本語じゃなく、文字コードを指定していなかったんですけど、\Qを挿入したら出来ました・・・

\Q : \E までのパターン指定メタ文字の意味を打ち消す

(´・ω・`)ナゼ?
493nobodyさん:2006/12/25(月) 03:16:49 ID:WCngGP1U
$bar =~ s/$self->{foo}->{bar}/$self->{foo}->{hoge}/;において、$self->{foo}->{bar}にパターン指定メタ文字が含まれていたのでしょうか・・・

あ、ご解答下さったみなさん、ありがとうございました!
494nobodyさん:2006/12/25(月) 05:19:01 ID:???
s///e;
495nobodyさん:2006/12/25(月) 06:46:37 ID:85L6NXNb
>>491

>g は全く要らない。
>i は必要とは言えない。
gは全くいらなかったね置換するわけじゃないしね
iは日本語と決まってるならいらないだろうけどsexとかだったらいるんじゃねえ?
496nobodyさん:2006/12/25(月) 07:23:16 ID:???
sex!sex!sex!
497nobodyさん:2006/12/25(月) 08:45:43 ID:???
バカは回答すんなよ
498nobodyさん:2006/12/25(月) 13:28:03 ID:bvP5u9Gv
何故か「ー」の置換が出来ません。
他の日本語や、逆(〜をーにする)は出来ます。何故なんでしょうか?

print "content-type: text/html\n\n";

$str = "ボール";
$out = "ー";
$in = "〜";

$str =~ s/$out/$in/;
print $str;
499nobodyさん:2006/12/25(月) 13:52:39 ID:ClYkzmks
use Foo;
use ...;
use ...;

と、複数のpmファイルをuseしたのですが、先頭行のuseだけにエラーが出ます。

Can't locate Foo.pm in @INC (@INC ...

ちゃんとFoo.pmは存在するし、他の行のuseにはエラーが出ないのですが・・・
このエラー文は、モジュールがインストールされていないという意味のほかに、なにか意味はあるのですか?
500499:2006/12/25(月) 13:58:43 ID:ClYkzmks
何度もすみません。

use Foo;
use Hoge;
use ...;
use ...;

だとFoo.pmに関して、

use Hoge;
use Foo;
use ...;
use ...;

だとHoge.pmに関してしてエラーが出ていたようです。
@INCの検索パスにそれらのファイルが含まれていないということでしょうが、ちゃんとそのディレクトリに置いてあるんです\(^o^)/オワタ
501nobodyさん:2006/12/25(月) 14:26:49 ID:???
>>498
つEUC
502nobodyさん:2006/12/25(月) 14:29:15 ID:???
use lib しなけりゃエラーが出て当然だと思いますが・・・
503499:2006/12/25(月) 14:29:36 ID:ClYkzmks
>>502
use libは宣言しています。
504499:2006/12/25(月) 14:36:15 ID:ClYkzmks
問題のファイルは以下のものです。
http://www.uploda.org/uporg630190.zip.html

(pass : 2ch)

use lib qw(./lib);
use Common::Cookie;

として使用しています。
なにかファイルに問題はありますか?
505nobodyさん:2006/12/25(月) 14:48:11 ID:???
/lib/Common/Cookie.pm にしてますか?
506499:2006/12/25(月) 14:51:36 ID:ClYkzmks
>>505
はい、呼び出し側との相対パスは./lib/Common/Cookie.pmです。
507nobodyさん:2006/12/25(月) 15:10:41 ID:???
>>498
\Q \E
508nobodyさん:2006/12/25(月) 19:38:47 ID:ClYkzmks
\r\n、\r、\nは<BR>に変換するけど、<BR>はどの改行コードに戻せばいいの?
対象のOSによって変わると思うんだけど・・・
509nobodyさん:2006/12/25(月) 19:52:10 ID:???
\x0d\x0a|\x0d|\x0a
お好きなのをどうぞ
510nobodyさん:2006/12/25(月) 19:56:04 ID:???
その「お好きなの」をどれにするかで迷ってんじゃね?
511nobodyさん:2006/12/25(月) 19:57:38 ID:ClYkzmks
はい。
プラットフォームによって改行コードを勝手に決めてくれたりは出来ないんですか?
512JAPU@坂井恋夏 ◆lVJAPUTeX. :2006/12/25(月) 20:23:02 ID:???
>>492
記号類はメタ文字 (特殊文字) になるものがあるので、よく分からなければ \Q$var\E しておくのが良いです。Shift_JISの場合、漢字の一部にメタ文字が含まれる可能性があるので、思わぬところでエラーとなります。

>>495
要件に「大文字小文字を区別するかどうか」が含まれていないため、必要に応じて i 修飾子を付けてください、という意味です。

>>498
文字コードはShift_JISを使っていますね。「ー」の2文字目は「[」であるため、バイト単位で処理する場合にはそれがメタ文字として見なされます。
ですから、以下のような方法で回避する必要があります。

1. >>501 EUC-JPを利用する。
2. >>507 \Q$out\E とする。
3. Jperlを利用する。(今となってはお勧めできない)
4. 入出力をきちんとハンドリングして、内部では常にutf-8フラグつきの文字列として扱う。(多少面倒だが漢字も1文字単位で処理できるのでお勧め。「Perl utf8」でググれば参考サイトは沢山出てきます。)
5. 先頭で use encoding "Shift_JIS"; する。(あまりお勧めできない)
他にあったっけ?

# Shift_JISでは /セーラープルート/ がエラーになるので悲しい。
513JAPU ◆lVJAPUTeX. :2006/12/25(月) 20:23:36 ID:???
>>506
ライブラリの位置を指定する (-Iオプションや use lib) 際、相対パスの基準位置はカレントディレクトリです。また、use でエラーになった場合にはそれ以降の use は実行されずモジュールが存在しない場合でもエラーが出ません。
スクリプトの位置を基準点とした相対ディレクトリで指定したい場合には以下のように FindBin を利用します。

use FindBin;
use lib "$FindBin::Bin/lib";

>>508
Unix: LF (\r\n)
DOS/Windows: CRLF (\r\n)
Mac: 昔はCR (\r) だったけど今どうなの?
意識して変換するのであれば、CRLFにしておくのが無難だとは思う。Perl v5.8では、以下のようにしてPerlIO階層で変換してくれるので便利。(ファイルに出力するのであれば open 時に指定することも可能。)
binmode STDOUT, ":crlf"
514nobodyさん:2006/12/25(月) 22:37:26 ID:ClYkzmks
OOPにおいて、メソッドの呼び出しには引数の括弧は省略しない方が良いのですか?
515nobodyさん:2006/12/26(火) 05:42:28 ID:???
>>508
\nでOSの改行コードになる。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify

>>513
\rと\nの解釈が間違ってないか?
516498:2006/12/26(火) 08:40:27 ID:???
なるほど、ご丁寧に教えてくださってありがとうございます。
517nobodyさん:2006/12/26(火) 16:19:37 ID:???
>>508>>515は同じ事を書いているように見えるのだが
518nobodyさん:2006/12/26(火) 18:42:02 ID:???
設定:自動登録型リンク集スクリプト

管理パスを確認

パスがあってたら登録サイト一覧を表示

削除したいサイト選択後に削除←この時の質問なんだけど


削除したいサイト選択後のスクリプトの呼び出し方がわからない

削除したいサイトをチェックボックスで選択後、インプットタグでスクリプトを呼び出して、
サイト削除のサブルーチンを呼び出すって流れなんだけど、

引数やhiddenで呼び出す書き方だと外部からも直接呼び出せてしまうわけで、
管理画面からのみ呼び出せるようにするにはどうしたらいいの?


519nobodyさん:2006/12/26(火) 18:46:11 ID:PubWBr4/
cookieに管理権限渡しておいてcookie checkでOKなら削除、NGならエラーってすれば良いと思うよ。

あとスレ違い
520nobodyさん:2006/12/26(火) 18:52:44 ID:???
>>518
質問が変に具体的すぎてよくわからんが
Session管理するか、それに近いものを実装する
521JAPU ◆lVJAPUTeX. :2006/12/26(火) 20:08:35 ID:???
>>515
古代のMacPerlではohzakiの記載も正しいですが、最近のPerlでは\n = NL(LF), \r = CR のはずですが…
今時そこまで古いバージョンに気を使う必要は無いでしょう。
そもそも、\n と \r の意味が逆転しているのも独自仕様ですし。

>>518
セッション管理が面倒なら、削除する際にも再度パスワードを入力させてチェック。
この手法だと、CSRFを回避することができるおまけ付き。
522nobodyさん:2006/12/26(火) 20:15:42 ID:???
>>521
ん?よく分からないんだが、最新のActivePerlとかMacPerlでは挙動が変わったってこと?
よその環境用には書かないからマジでわからん。
523nobodyさん:2006/12/26(火) 20:17:46 ID:???
WinのActivePerlは\n = CRLF
524518:2006/12/26(火) 20:43:26 ID:ISbRNGDd
>>519-521
ありがとうございました
解決しました
525JAPU@坂井恋夏 ◆lVJAPUTeX. :2006/12/26(火) 20:51:33 ID:???
Perlでは特に指定しない場合はbinmodeではありません。このため、入出力時にはそのOSに応じた改行コードと \n が相互に変換されます。したがって、何もしない場合にはPerl内部で扱う改行コードは常に \n であるわけです。

binmode はこの改行コード変換を抑制する関数です。(最近ではそれに加えてPerlIO層の変換ルールを指定する機能も持たされました。)

この変換があるため、Windows環境ではbinmodeを指定せずバイナリ (画像データなど) を出力する際に正しいデータが出力できないという罠に陥ります

# MacPerl の場合、\r と \n の役割を入れ替えることで、Unix 用に書かれたスクリプトが (binmodeせず) そのまま動作することを期待していたのでしょう。(多分)

ActivePerl でも、\n 自体は LF となります。以下が実行例です。
C:\>perl -e "$x = qq[\n]; print unpack q[H*], $x"
0a

また、binmodeの有無によって改行コードの変換がされる・されないことは以下の通り実行したら分かります。
C:\tmp>perl -e "open FH, q[> sakura.txt] or die; print FH qq[\n]"
C:\tmp>perl -e "open FH, q[> tomoyo.txt] or die; binmode FH; print FH qq[\n]"

MacPerl は今でもあるかは知りません。
「古代のMacPerlでは」→「少なくともある時点でのMacPerlでは」に訂正します。
526nobodyさん:2006/12/26(火) 21:15:11 ID:???
( ^ω^)……
527nobodyさん:2006/12/26(火) 21:42:36 ID:???
改行コードは Perl の I/O ルーチンが実行環境に合わせて勝手に変換する
そうさせない方法があったはず
528nobodyさん:2006/12/26(火) 21:51:44 ID:???
OS別の動作考えるぐらいなら
s/chomp/>>509/
にしとけ
529nobodyさん:2006/12/26(火) 23:49:25 ID:???
binmodeってwindowsでしか使われてないと思っていた俺ザンギ
530nobodyさん:2006/12/27(水) 11:38:17 ID:???
>>529
ふざけるな




俺ザンギ
531nobodyさん:2006/12/27(水) 15:46:35 ID:???
最近binmodeつかってないなぁ。open my $fh, '<:raw', $fileとかやるから。
532nobodyさん:2006/12/27(水) 16:52:37 ID:Dit2F/dP
$foo{hoge}と$foo->{hoge}ってどう違うんですか?
533nobodyさん:2006/12/27(水) 17:25:34 ID:???
@fooに\%hoge、\%barなどのリファレンスが格納されている場合、個々の値にアクセスする方法はどうすれば良いですか?
534533:2006/12/27(水) 17:57:11 ID:???
テストスクリプトとして、以下のようなものを作ってみたんですが・・・個々の値にアクセスできません><;

my $aaa = {
    a => 'あ',
    b => 'い',
    c => 'う'
};

my $bbb = {
    a => 'え',
    b => 'お',
    c => 'か'
};

my $ccc = {
    a => 'き',
    b => 'く',
    c => 'け'
};

my @aaa = (\%aaa, \%bbb, \%ccc);

foreach my $a (@aaa) {
    foreach my $b (keys(%$a)) {
        print %$a->{$b};
    }
}
535nobodyさん:2006/12/27(水) 17:58:45 ID:???
>>532
$foo{hoge}:
%fooというハッシュのキーhogeに対応する値

$foo->{hoge}:
$fooに格納されたハッシュリファレンスで示されるハッシュの
キーhogeに対応する値

536nobodyさん:2006/12/27(水) 18:03:24 ID:???
>>532
$foo{hoge} ハッシュの値
$foo->{hoge} ハッシュリファレンスの値(デリファレンス)

>>533
$foo[0]->[0]とか$foo[1]->{hoge}とか
537nobodyさん:2006/12/27(水) 18:12:18 ID:???
>>534
my %aaa = (
  a => 'あ',
  b => 'い',
  b => 'う',
);
538nobodyさん:2006/12/27(水) 18:16:16 ID:???
>>535-536
ご回答ありがとうございますm(_ _)m
ようやく両者の違いがわかりました!

>>537
おお〜出来ました!ありがとうございます!

$aaa = {
};



%aaa = (
);

の違いについて分かるサイトはございますか?
前者が名前の無いハッシュなんとかかんとかというのは分かったのですが・・・
539nobodyさん:2006/12/27(水) 18:43:49 ID:???
さっきから質問ばかりで申し訳ないです。。。
ハッシュをforeachやwhileでまわすと、例えば>>534の例で言えばc→a→bのように、返される値の順序がバラバラになるんです。
この理由は分かった(というか元々バラバラになるようになっている)のですが、これは番号を振ってsortしなくてはいけないのですか?
540nobodyさん:2006/12/27(水) 19:01:43 ID:???
できた〜
いちいち番号を振らなくてもsortで出来るんですねヽ(・∀・)ノ
541nobodyさん:2006/12/27(水) 19:08:24 ID:???
解決したみたいだけど、ハッシュでは順番は保存されません。実装上の都合です。
理由は「ハッシュ」という名前に関係してるんだけど、
詳しく知りたければ「ハッシュテーブル」を検索してみてね。
542nobodyさん:2006/12/27(水) 19:15:48 ID:???
>>538
%aaa = (
);
なら
$fhoge}

ttp://www.rfs.jp/sb/perl/02/10.html
ここなんかどうだろうか
543nobodyさん:2006/12/27(水) 19:17:09 ID:???
うおー途中というかわけわかんないところで送信してもうた

%aaa = ();
なら
$aaa{hoge}

$aaa={};
なら
$aaa->{hoge}
544JAPU@坂井恋夏 ◆lVJAPUTeX. :2006/12/27(水) 20:12:52 ID:???
ハッシュの順番を保持したい場合、Tie::IxHash とか使うと幸せになれるかもしれません。
545nobodyさん:2006/12/27(水) 20:17:56 ID:???
リファレンスがわからんのにモジュールは酷だろw
546nobodyさん:2006/12/28(木) 00:05:37 ID:???
スクリプトで定義した文字列を配列に入れる処理をサブルーチンの呼び出しの度にやっていたんだけど、
グローバル変数 (中括弧で囲われていない部分で my 宣言) にして 1回書き込むだけにしたら、
スクリプト全体の実行速度が 10倍以上になった。

my @dasabase = (
  ['aa', 'ab', 'ac', 'ad');
  ['ba', 'bb', 'bc', 'bd');
  ['ca', 'cb', 'cc', 'dd');
  ['da', 'db', 'dc', 'dd');
);

みたいな 5KB 程度のデータを多次元配列にいれてるだけなんだけど、(サブルーチンの呼び出し回数は 500回ぐらい)
Perl の配列処理が遅いのか、5KBのデータが重いのかは知らないけど、今時のハイスペックなマシンでも、ただ短いデータを代入するだけの処理で
リソース食いつぶしたりするもんなんだね。
547nobodyさん:2006/12/28(木) 00:39:59 ID:???
掲示板を作成しているのですが、とある事情で、ログファイルを完全に公開したいと考えています。

記事修正用のパスワードはユーザ任せにするわけですが、crypt 関数でハッシュ化したものを記録すると
ログに記載されたパスワードのハッシュからパスワードクラックされる危険はどの程度あるのでしょうか?

(パスワードは6文字の英数字の場合)

また、crypt よりも安全な一方向関数はありますでしょうか?

よろしくお願いします。
548nobodyさん:2006/12/28(木) 00:55:31 ID:???
>>547
今時のPCだとcryptで6文字とかそらもうあっさり解析される。
とりあえずお手軽なところではMD5あたりだと思うが、
そもそもパスワードのログだけ別ファイルにすれば良くね?
549nobodyさん:2006/12/28(木) 00:56:23 ID:???
ログファイルを第三者に完全公開する「とある事情」って何だ
それによってアウローチが変わると思われ
550nobodyさん:2006/12/28(木) 01:08:04 ID:???
saltを $1$........$ みたいな形で与えると、別の形式でcryptしてくれたりするみたいだね。
551nobodyさん:2006/12/28(木) 02:53:29 ID:???
ハッシュ化したものを生でログに置くからすぐばれる。
XORなどのビット演算で数回かき回したものを置けば、元のパスワードは判別不能になる。
もちろん、かき回しロジックを公開しては意味がない。
552nobodyさん:2006/12/28(木) 09:03:40 ID:???
アルゴリズムを隠すことによる秘密はよくないよ。
553547:2006/12/28(木) 09:53:44 ID:???
>>548-549
回答ありがとうございます。

操作性とスクリプトの簡略化のために、トリップキーと削除・編集パスワードを同じものにしたいので、
必然的にパスワードを一方向関数で変換した値は公開されちゃうんです。(トリップとして)

tripper のようなトリップ解析ツールでも6文字なら1日以内に解読できちゃうので、やはり危険ですよね。

>>550
なるほど
http://www.tohoho-web.com/wwwperl2.htm#crypt
そうすればMD5が使えるみたいですね

>>551-552
自分のサイトだけで使ってるならかき混ぜでもばれなさげですね。。。
まぁ基本的に隠蔽によるセキュリティはよくないですが。


よく考えてみると、トリップとして公開するデータをパスワードの一方向関数変換結果の一部にしちゃえば
解読が困難になりそうですね。

ありがとうございました。
554nobodyさん:2006/12/28(木) 13:58:02 ID:hVZzWyfv
いろいろなソースを見て勉強しているんだけど、コンストラクタで

my $self = {};
my $self = [];

この2通りの記述を見ました。
{}と[]の違いってなにかあるんですか?

あと、それらに空要素を入れる場合、=0や=''ではなく={}や=[]とする理由も加えてご教示願います。。。m(_ _)m
555nobodyさん:2006/12/28(木) 14:02:16 ID:???
$aaa={}; # ハッシュリファレンス
$aaa=[]; # 配列リファレンス
@aaa=(); # 配列
$aaa=''; # スカラー
556nobodyさん:2006/12/28(木) 14:04:14 ID:???
>>538,554
オマイラとりあえずperlreftut嫁
ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlreftut.html
その質問の答えは全てリファレンスとは何かと言うことを理解することによって得られるから。
557nobodyさん:2006/12/28(木) 14:16:08 ID:hVZzWyfv
>>555-556
ありがとうございます!
参考サイトは10回ブックマークに登録しました。
558nobodyさん:2006/12/28(木) 14:27:15 ID:???
>>557
ちなみにそのサイト、テンプレ>>2にある
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/
だからね。
今回は入門としてとりあえずチュートリアル(perlreftut=perl-reference-tutorial)を紹介したけれど、
ちゃんと理解するためにはperldata、perlref、perllolあたりも読んでおいてほしいところだ。
559nobodyさん:2006/12/28(木) 20:22:01 ID:???
現在、Shift-JIS(CP932)しか読み込めない
windows上で動作するアプリケーションで使用するテキストを出力するCGIを作っています。
(スクリプトのエンコードはEUCJP)。
現時点では次のような処理をしています。

    投稿ページをEUCのHTMLで出力
           ↓
  投稿ページからPOSTされた文字列を加工して
  Shift-JIS(CP932)に変換してテキストファイルに保存
  (変換にはJcode::CP932モジュールを使用)
           ↓
テキストファイル(CP932)を読み込んでEUCに変換して整形してHTMLに出力
(変換にはJcode::CP932モジュールを使用)

自宅鯖で使う分には良いのですが、Jcode::CP932モジュールは殆どの鯖に入ってないので、
レンタルサーバで使うにはモジュールの追加を依頼する必要があります。

そこで質問です。
1、バージョン5.8のperlの標準的なモジュールのみでEUC-JPとCP932の相互変換は出来ますか。
  もし出来るなら方法を教えてください。
2、Encode.pmでCP932とEUCJPの相互変換は出来るのか、出来るなら方法を教えてください。
3、スクリプトをUTF-8で記述して、use utf8を使用してCP932とUTF-8を
  相互変換したほうが良いのでしょうか。
  その際、CP932とUTF-8を相互変換は標準的なモジュールのみで可能でしょうか。
560nobodyさん:2006/12/28(木) 20:34:13 ID:???
Jcodeはパス通せば置くだけでしょ
561nobodyさん:2006/12/28(木) 20:41:34 ID:???
>>559
Jcode-CP932っての探して見てみたが>>560の言うとおりインストールしてもらう必要は無い。
libディレクトリ以下適当にコピーしてuse libなりなんなりすれば動く。

1.
極端な話自分で変換テーブルを用意すれば変換できるわけだけれど、
CP932との変換機能が用意されているかと言えばNO。
2.
可能。非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3.
私はそっちのほうが好きではあるが別にその必要は無い。
変換については1,2のとおり。
562nobodyさん:2006/12/28(木) 20:52:26 ID:???
Windows Vistaのお陰でUnicode関係の変換がさらに面倒になるね
563nobodyさん:2006/12/28(木) 22:47:30 ID:/nHSB5ow
かなり初歩的なことかもしれませんが・・

CGIでパラメータを受け取る時に、ハッシュテーブルに入る変数の数が
不定の場合に、ループ処理を使って、うまく値を取り出すにはどうしたら
良いでしょうか。
パラメータ↓
aaa=テキストa&bb1=テキストb1&bb2=テキストb2&..bbx=テキストbx&ccc=テキストc
bb1〜bbxまでの値を取得したい・・。

良い方法がありましたら、ご教授よろしくお願い致します。
564563:2006/12/28(木) 22:54:40 ID:???
え、っと自己レスです
>>563 わざわざハッシュにしなくても、bb1〜bbxだけ普通の配列に入れたらイイ?

良案お待ちしておりますー。
565nobodyさん:2006/12/28(木) 23:18:32 ID:???
>>563
<form name="bb[]" value="テキストb1" />
<form name="bb[]" value="テキストb2" />
<form name="bb[]" value="テキストbx" />
みたいにしておいて、パラメータ解釈時に/(.*)\Q[]\E$/な要素を
push @{$params{$1}}, $value;
するのが常套手段ではないかと。
566nobodyさん:2006/12/28(木) 23:20:10 ID:???
うわぁ、HTMLミスってるorz
s/form/input type="text or hidden"/g
567 ◆TWARamEjuA :2006/12/29(金) 00:36:46 ID:??? BE:1960092-BRZ(6677)
for my $bb_keys (grep /^bb./, keys %hash) {
:
:
}
とか?
568nobodyさん:2006/12/29(金) 01:12:17 ID:???
>>561
おれ、

use Encode qw(from_to);
from_to($hoge, 'cp932', 'euc-jp');
from_to($hoge, 'euc-jp', 'cp932');

で変換して使ってるけど、非標準モジュール入れた記憶ないなあ。
569561:2006/12/29(金) 01:31:54 ID:???
>>568
あーごめんなさい。>>561は撤回…完全に記憶違いです…
CP932との変換テーブルはデフォルトで入ってるのか。

無いのはMicrosoft仕様のEUCJP-msね。
丸囲み文字とかローマ数字とかそういうやつがEUCJPに変換できないのか…

1. EUC-JPとの変換はできるが一部CP932が拡張している一部の文字について変換できない。
2. 可能。完全に変換するためには非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3. 標準モジュールのみで可能。
で合ってるかな…まあなんにしろ一度派手に記憶違いしてた人の回答なんて
信用できませんので誰か詳しい人お願いしますillorz
570nobodyさん:2006/12/29(金) 01:40:21 ID:???
>>560,561
パスを通せば動くんですか。。。
use libの使い方が良くわからなかったので、検索しました。
結構使えそうですね。ただ、コンパイルの必要なモジュールには使えないかも。
use utf8にも挑戦してみます。
use utf8を知る前に投稿を受け取る部分を作ったので
文中で正規表現で2バイト文字を使うために\nxx\nxxで文字を記しているので
面倒になるかもしれませんが。

>>568
Encodeでも可能なんですかね。ちょっとやってみます。

>>569
Jcode::CP932では上のほう(>>404)で話が出ていたAケもOUも上手に変換できていたので
もしかしたらいけるかもしれません。ちょっとやってみます。

#文字コード変換は鬼門ですね。
571nobodyさん:2006/12/29(金) 02:16:03 ID:???
結果です。

まず、use Encode qw(from_to);での結果。
from_to($huga, 'cp932', 'eucjpms');
ダメでした。
AケOUと続けて記入したデータが??????に化けました。

次にEncode::EUCJPMSを読み込ませた上で
↓のように記述してみました。
from_to($huga, 'cp932', 'eucjpms');
これもダメでした。Aケが全角空白に変換され   OUと出力されてしまいました。

3、のuse utf8は時間が掛かるので明日にでも全改修してやってみます。
572nobodyさん:2006/12/29(金) 02:29:36 ID:???
>>571
eucjpmsじゃなくてcp51932だとどうだろ
ttp://msyk.at.webry.info/200511/article_2.html
ttp://legacy-encoding.sourceforge.jp/wiki/index.php?cp51932

こちらで確認したところそれらの文字は全部通った。
573nobodyさん:2006/12/29(金) 02:35:41 ID:???
失礼。全角空白ではなく FD FF FD FF FD FF という良くわからない文字列でした

>>572
from_to($ds, 'cp932', 'cp51932');
OKでした。でも、このcp51932ってエンコードって5系perlには標準で入ってましたっけ。
EUCJPMSはロードしなくても出来たので、最新版のEncodeでは標準のようですが。
574nobodyさん:2006/12/29(金) 02:43:29 ID:???
>>573
ありゃ?
ttp://search.cpan.org/~naruse/Encode-EUCJPMS-0.07/EUCJPMS.pm
に書いてあるからEncode::EUCJPMSが提供しているものだと思ったんだけど。
そして当方ではロードしないとUnknown encodingとエラー起こしてる…
>perl -MEncode -e "print $Encode::VERSION"
2.18
575nobodyさん:2006/12/29(金) 03:05:50 ID:???
>>574
私の使ったEncode::EUCJPMSをロードしないと言うのは
use Encode::EUCJPMS
と、記述しないと言うことですが。。。

って、use Jcode::CP932を書いたままでした。
Jcode::CP932内でEncode::EUCJPMSを呼んでるので動いたのでしょう。

となると、標準モジュールのみでやるにはやはりuse utf8プラグマをつけないとダメってことですかね。
それでも動くかどうかは判らないですが。
576nobodyさん:2006/12/29(金) 04:26:07 ID:???
超低レベルな質問かもしれませんが、お願いします。

現時点でhtmlで簡単なサイトぐらいなら作れる、人並みの脳みそを持った人が、
仕事の合間を縫ってそれなりに勉強して、Perlを使ったCGI(初歩的な掲示板など)
をゼロから作れるようになるには何ヶ月ぐらいかかりますか?

個人的な感覚で構いませんので、どう思うか教えて下さい。
577nobodyさん:2006/12/29(金) 05:57:46 ID:???
>>576
3日間
578577:2006/12/29(金) 05:58:43 ID:???
あ、プログラミングの経験が普通の高校で習った程度しかないなら、1ヶ月間ぐらいで。
579nobodyさん:2006/12/29(金) 10:17:46 ID:???
条件が曖昧過ぎるからなんとも言えないけど
やっぱ1ヶ月ぐらいかなー
580nobodyさん:2006/12/29(金) 10:48:29 ID:???
最初のプログラミング言語としてperlを選択するのは止めなさい。
一生perlしか使わないつもりなら止めないけど。
581563:2006/12/29(金) 10:51:17 ID:???
>>565,>>567
ありがとうございます。実はPerlは今週はじめたばかりで、
そんな風に出来るんだ〜・・などと感心してました。

で、この結局こんな感じで進めました。

if($key =~ /^bb\d$/){ push @bb_vals, $val; } #キーが"bb[0-9]"の処理
elsif($key =~ /^dd\d$/){ push @dd_vals, $val; } #キーが"dd[0-9]"の処理
else{ ハッシュテーブル作成 }

@入力フォームに、ラジオボタンが数種類 × 数グループあったので、
nameを同じにすると ややこしい感じに
Aフォームの順番も重要だったので、順不同なkeysは今回は使いにくそう
な感じでした。
これからまた、お世話になるかもしれません。よろしくお願いします。

>>576
プログラムかUNIX系の知識があれば、一週間もあれば。
それ以外であれば、やっぱりひと月でしょうねー。
582nobodyさん:2006/12/29(金) 12:44:22 ID:???
何を習得するにも、>>580みたいな意見には惑わされないように。
583nobodyさん:2006/12/29(金) 13:41:38 ID:???
俺も580と同意見だな。
やるならCから入った方がいい・・・と、Cから入った俺がry
584nobodyさん:2006/12/29(金) 14:10:55 ID:???
580=583 スレ違いカエレ
585nobodyさん:2006/12/29(金) 19:17:04 ID:???
>576
1ヶ月あれば形になると思う。あとHaskellやろう。
586nobodyさん:2006/12/29(金) 19:30:36 ID:???
>>576
週末全部充てれば一ヶ月もあれば習得できるかもしれないが、
BBS一個作るとなると+2ヶ月はかかると思われ
587nobodyさん:2006/12/29(金) 19:32:26 ID:???
というかググる力というか、検索力があればけっこう短期間で形にはなる
588576:2006/12/29(金) 19:38:01 ID:???
>>577-579,580-583,585
回答ありがとうございます。

現状私は、htmltとcssとJavascriptが
本当に「できる」と言っていいのかすらわからない程度にできます。
それ以外は一切できません。Perlを使ったフリーCGIのソースをいじくり回す程度です。
仕事でWebデザインぽいことをやってますが、デザインだけではどうにもこうにもアレなので、
CGIを習得しようと思い、CGIと言えばPerlだろという考えで書き込みました。
純粋にプログラミングというより、あくまでもCGIを作るための言語を学びたいので、
WebProg板に来た次第です。

仕事が忙しいので、自習は週4日、1時間程度で考えています。
みなさんを信じてまずは1ヶ月がんばります。
そこで、>>1-10あたりにあるサイト以外で、オススメのサイト、
書籍、「その前にまずこれをやれ」的なことなどありましたら教えて下さい。
589nobodyさん:2006/12/29(金) 19:41:15 ID:???
>>584
図星を突かれた使えないperlerがなんかほざいてるな。
590nobodyさん:2006/12/29(金) 19:49:27 ID:???
>>588
とりあえず、KENTは参考にしてはいけない。それだけは言える。
591nobodyさん:2006/12/29(金) 20:21:54 ID:???
>>589>>584で図星突かれたらしいw
592nobodyさん:2006/12/29(金) 20:23:21 ID:???
>>590
追加で、結城浩も宗教色を強めてきてきもいので参考にしないほうがいい。
593nobodyさん:2006/12/29(金) 21:10:19 ID:???
>>588
>「その前にまずこれをやれ」的なことなどありましたら教えて下さい。

こんなとこで回答期待してないでさっさと着手しろ。
そういうやつに限って始めるまでが長くて結局何も出来ない。
594576:2006/12/29(金) 22:08:25 ID:???
>>593
うるせーバーカ!!
595nobodyさん:2006/12/29(金) 22:38:09 ID:???
>592
じゃあ逆にお勧めのPerlishって誰?
596nobodyさん:2006/12/29(金) 23:05:21 ID:???
>>595
お勧めの人を作らないことがお勧め。
特にPerlの場合は、いろんな書き方があるから、いろんなコードを読んでおいたほうがいい。

このスレを見るのがためになると思う。
答える側になっても、ここではまだまだ新しい発見があるし。
597nobodyさん:2006/12/29(金) 23:43:55 ID:???
        lヽ ノ l        l l l ヽ   ヽ
  )'ーーノ(  | |  | 、      / l| l ハヽ  |ー‐''"l
 /  P  | | |/| ハ  / / ,/ /|ノ /l / l l l| l P ヽ
 l   ・  i´ | ヽ、| |r|| | //--‐'"   `'メ、_lノ| / ・  /
 |  B  l  トー-トヽ| |ノ ''"´`   rー-/// |  B |
 |  ・   |/     | l ||、 ''"""  j ""''/ | |ヽl ・ |
 |  P   |       | l | ヽ,   ―   / | | l  P  |
 |   !!  |     / | | |   ` ー-‐ ' ´|| ,ノ| | |  !! |
ノー‐---、,|    / │l、l         |レ' ,ノノ ノハ、_ノヽ
 /        / ノ⌒ヾ、  ヽ    ノハ,      |
,/      ,イーf'´ /´  \ | ,/´ |ヽl      |
     /-ト、| ┼―- 、_ヽメr' , -=l''"ハ    |  l
   ,/   | ヽ  \  _,ノーf' ´  ノノ  ヽ   | |
、_    _ ‐''l  `ー‐―''" ⌒'ー--‐'´`ヽ、_   _,ノ ノ
   ̄ ̄   |           / 
598nobodyさん:2006/12/30(土) 00:06:42 ID:???
PBPはDamian Conwayか。参考になるきれいなコードだった。
599nobodyさん:2006/12/30(土) 10:22:00 ID:2X8njGUn
>特にPerlの場合は、いろんな書き方があるから、いろんなコードを読んでおいたほうがいい
kent(と、その属性のクローン)だけは外す事を明記するのを忘れている
俺は、それで散々な目にあったから
いゃ、俺だけではないが
600nobodyさん:2006/12/30(土) 11:24:16 ID:???
Perlでコンソール上で動作するプログラムを構築したとき、
画面などのデザインを変更するプロパティみたいなのってありますか?
教えてください。
スレ違いなのは承知の上です。
601nobodyさん:2006/12/30(土) 11:37:08 ID:???
>>600 無い。
602nobodyさん:2006/12/30(土) 12:32:16 ID:???
rawモード用のモジュールみたいなのはCPANにあったと思う。
603nobodyさん:2006/12/30(土) 14:47:43 ID:???
標準モジュールにTerm::Capがあるな
604nobodyさん:2006/12/30(土) 16:37:11 ID:???
>>600
>スレ違いなのは承知の上です。

板違いだったりする。
http://pc10.2ch.net/test/read.cgi/tech/1166708139/
605nobodyさん:2006/12/31(日) 02:44:28 ID:oF4MMStz
あるハッシュ%hashが、

%hash = (
a => 変数,
b => 配列のリファレンス,
c => 変数,
d => 配列のリファレンス,
e => 配列のリファレンス,
...
);

であるとき、ループで%hashのvalueだけを評価して、もし配列のリファレンスであればその配列を展開する・・・という処理はどうすれば良いでしょうか。
606nobodyさん:2006/12/31(日) 02:48:12 ID:oF4MMStz
事故解決しました。。。

while (ref(values(%hash)) eq 'ARRAY') {
...
}

という処理を使うことにします。
・・・間違ってるのかな?
607nobodyさん:2006/12/31(日) 04:17:23 ID:oF4MMStz
やはり上手く行きませんでしたonz

%hash = (
a => 'あああ',
b => [
  { c => 'いいい' },
  { d => [
    { e => 'ううう' }
  ] }
);

このようにハッシュのvalueに幾度(無限に)も配列のリファレンスがネストしてあるとき、どのようにすれば下層部のハッシュ(上記の場合e => 'ううう')が取り出せるのでしょうか?
608nobodyさん:2006/12/31(日) 10:20:33 ID:???
>>607
再帰処理
609nobodyさん:2006/12/31(日) 10:33:33 ID:oF4MMStz
>>608
試してはみたんですが、出来ませんでした。。。
端折ると↓のようにしてみたんですが

sub aaa {
  foreach () {
    if (ref()) {
      &aaa();
    } else {
      普通のしょり
    }
  }
}
610nobodyさん:2006/12/31(日) 14:29:56 ID:???
引数
611nobodyさん:2006/12/31(日) 17:01:53 ID:???
くだらない質問で申し訳ありません。

【書き方1】

function check() {
  if ($x == 2) {
    print "Xは2です。";
  } elsif ($x == 5) {
    print "Xは5です。";
  } else {
    print "Xは2でも5でもありません。";
  }
}

【書き方2】

function check()
{
  if ($x == 2)
  {
    print "Xは2です。";
  }
  elsif ($x == 5)
  {
    print "Xは5です。";
  }
  else
  {
    print "Xは2でも5でもありません。";
  }
}
612611:2006/12/31(日) 17:05:01 ID:???
みなさんは上記の 【書き方1】 と 【書き方2】 のどちらが好きですか?
自分は 【書き方2】 で理由は、

・開始括弧と終了括弧が揃っている。
・開始括弧の行が空く (括弧だけの行ができる) ので見やすい。【書き方1】 だと空行入れるべきか入れないべきかで毎回迷ってやりにくい。
・elsif の行がスマートになる。

です。

皆さんのお好み、または標準のコーディングルールがあれば教えて下さい。
あと、自分はインデントはタブで、タブは半角スペース4つ分にしていて、文のあとにコメントを入れる場合にはタブ1つあけることにしていますが、
こちらについても教えていただけたら幸いです。

613nobodyさん:2006/12/31(日) 17:51:26 ID:???
>>611
ベストプラクティスでは、「重要なのは、首尾一貫したスタイルを1つ採用することである。」としたうえで
レイアウトガイドラインの「提案」として、K&Rスタイルを採用しているね。つまり

if ($x == 2) {
    print "Xは2です。";
}
elsif ($x == 5) {
    print "Xは5です。";
}
else {
    print "Xは2でも5でもありません。";
}

こう。んで、タブを使わず半角スペース4つを1インデントとしている。
個人的にも、特にこだわりはないので、このベストプラクティスを標準としてるなぁ。
ただ、チーム開発の時はチームのコーディングルールに合わせるけど。
でも、Perl は TMTOWTDI がモットーなんだし、好きな書き方で良いと思う。
614611:2006/12/31(日) 17:55:49 ID:???
>>613
なるほど
回答していただきありがとうございました

標準的なコーディングルールを使ったほうが他の人と共有する場合や配布する場合には便利ですね。

> タブを使わず半角スペース4つを1インデントとしている。

これに関しては、自分が使っている 「phpエディタ」 も 「TeraPad」 も Tabキーで半角スペースを4つ入れる機能がないので
不便でしょうがないです(´・ω・`)
615nobodyさん:2006/12/31(日) 17:58:21 ID:???
半角4つにすると、インデント消す時バックスペース4回も押すのマンドクセ
616nobodyさん:2006/12/31(日) 18:00:26 ID:???
最近のエディタならたいがいバックスペースでアンインデントできるようになるでしょう
617nobodyさん:2006/12/31(日) 18:08:53 ID:???
こん↓な時タブを使われると、環境によってずれるから嫌な気分になる。

abcd = 1 + 2 + 3 +
     4 + 5;
618nobodyさん:2006/12/31(日) 18:40:04 ID:???
こんな感じかな。
use strict;
use Data::Dumper;

my %hash = (
a => 'あああ',
b => [
{ c => 'いいい' },
{ d => [ { e => 'ううう' } ]}
]
);


parse(\%hash);

sub parse {
my $tmp = shift;
#print Dumper $tmp;
if (ref $tmp eq 'ARRAY') {
foreach (@$tmp) {
parse($_);
}
} elsif (ref $tmp eq 'HASH') {
foreach (keys %$tmp) {
parse($tmp->{$_});
}
} else {
print "$tmp\n";
}
}
619nobodyさん:2006/12/31(日) 21:54:59 ID:???
@a = qw{ a b c d e };
@b = qw{ 1 2 3 4 5 6 };

@array = \(@a, @b);

こんな風になっている場合、@arrayから@aの要素数にアクセスするにはどう書けばよいでしょうか。
620nobodyさん:2006/12/31(日) 22:31:17 ID:???
scalar @{$array[0]}
621619:2006/12/31(日) 22:45:49 ID:???
>>620
ありがとうございます。
今年終わる前におしえてもらえてよかった・・・(T_T)ノ
よいお年を。
622nobodyさん:2007/01/01(月) 20:57:03 ID:QvA3S+in
あけましておめでとうございます。新年初の質問です。どうぞよろしくお願いします。
#####書き換え前#####
# メッセージ内で使用を禁止する言葉の処理
if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{@ngword = split(/\s+/,$ngw);
foreach $ngw (@ngword){
if ($FORM{'value'} =~ /\Q$ngw\E/i){
&error('メッセージ内に使用禁止ワードが含まれています。');}}}
#####ここまで#####
☆備考☆
$ngw = 'テスト test TEST';
これをファイルを読み込み形式にしたいと思い↓のようにしました。
#####書き換え後#####
if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{if ( !open(NGW, "$spamdata") ){
&error('0');}
@xx = <NGW>;
foreach $ngw (@xx){
@ngword = split(/,+/,$ngw);
foreach $ngw (@ngword){
if ($FORM{'value'} =~ /\Q$ngw\E/i){
&error('メッセージ内に使用禁止ワードが含まれています。');}}}close(NGW);}
#####ここまで#####
☆備考☆
$spamdata = 'spamdata.cgi';
※質問
そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、
表記としておかしくないか疑問に思いました。
なにぶんPerlの知識も経験も乏しいもので、チェックをお願いします。
より適切な表記の仕方があったらご指摘も戴けるとうれしいです。
備考
spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。
623nobodyさん:2007/01/01(月) 21:04:13 ID:???
では新年初のスルーで
624nobodyさん:2007/01/01(月) 23:37:36 ID:???
>>622
>そこで、foreach $ngw (@xx){}とforeach $ngw (@ngword){}が重複しているようで、
>表記としておかしくないか疑問に思いました。

そりゃどう考えてもおかしい。perlに限らずプログラミング一般論として。

>spam対策のために禁止語句をCGIファイルから読み込みたいと思い書き換えました。

CGIの意味知ってる?
そこは単にテキストファイルでしょ。なんで、そんなファイルの拡張子に".cgi"付けるの。
新年早々猪突突進か
625nobodyさん:2007/01/01(月) 23:59:59 ID:???
ファイルの拡張子なんか何だって良い。
626nobodyさん:2007/01/02(火) 00:10:37 ID:???
http server が拡張子に影響されないなら良いが、".cgi" だと影響受けるだろ。
627nobodyさん:2007/01/02(火) 00:17:55 ID:???
拡張子cgiは、htaccessを使わず(使えない場合も)、ファイルの中身を見せない簡単な方法だね。
目くじら立てることでもない。
628nobodyさん:2007/01/02(火) 00:29:14 ID:???
>>627にも一理あるが、>>622がそこらへん理解してれば良いが。
こぢんまりしたサイトでは目くじら立てなくてもいいかも知れないが、
職業プログラマが製品レベルではやらないことだな。
629nobodyさん:2007/01/02(火) 00:46:17 ID:???
俺は他人のデータを扱うときはHTTPから見えないところに置くけど、
自分だけのデータならランダムで32文字でつけたディレクトリにデータファイル入れたりしてる
630nobodyさん:2007/01/02(火) 01:29:17 ID:???
>>622
とりあえず、2つのforeach文をそれぞれ同じ変数$ngwに入れてるみたいだから、それを別々にしてみよう。
一つ目を$ngw1、二つ目を$ngw2とか。
で、
if ($FORM{'value'} =~ /\Q$ngw\E/i){

if ($FORM{'value'} =~ /\Q$ngw2\E/i){
にしてみると大丈夫だと思うよ。
631nobodyさん:2007/01/02(火) 02:15:39 ID:???
ライブラリファイルを読み込もうとしたのですが
『次のファイルを開こうとしています。』となって表示されません。
ライブラリファイルの拡張子は.plなのですが、保存したファイルは普通にダブルクリックで開けてしまいます。
.pl拡張子は何か特別な設定が必要なのでしょうか?
632nobodyさん:2007/01/02(火) 02:24:31 ID:???
> ライブラリファイルを読み込もうとしたのですが
どう読み込もうとしたのか。requireとかopenとか…ダブルクリックとか。

> 『次のファイルを開こうとしています。』となって表示されません。
これは自作メッセージ?STDOUTかSTDERRに出てるのか、UAの画面に表示されるのか。
CLIのお手軽アプリを作ったときに、こういうメッセージをprintしてファイルの中身をSTDOUTに吐く前に
無限ループにはめて先に進まなくなったことは何度もある。

# open(FH, '<', "hoge.dat"); flock(FH, 2); @buffer = <FH>; close(FH);
# while (@buffer) { print 'while でなく foreach と書いたつもりの酔っ払い', "\n"; }

質問がWebProg関係なのかどうかも含めて、ちょっとよくわかんない。
.plだからとくにどうこう、ってのはないです。
633631:2007/01/02(火) 02:43:47 ID:???
>>632
すいません自己解決しました
634622@解決済み:2007/01/02(火) 09:03:38 ID:5ekfui+1
>>624
>>630
ありがとうござます。↓昨日また少し考えてこんな感じになりました。

if (crypt($FORM{'spwd'},substr($password,$salt,2)) ne $password)
{if ( !open(NGW, "<$spamdata") )
{
&error('0');
}
flock(NGW, 1);
@xx = <NGW>;
close(NGW);
foreach $ngw (@xx){
@ngword = split(/,+/,$ngw);
foreach $ngwbb (@ngword)
{
if ($FORM{'value'} =~ /\Q$ngwbb\E/i)
{
&error('メッセージ内に使用禁止ワードが含まれています。');
}
}
}
}

ご協力ありがとうございました。
635nobodyさん:2007/01/02(火) 17:42:57 ID:???
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか?
WINDOWS鯖の場合だと
if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
636nobodyさん:2007/01/02(火) 19:27:19 ID:???
おいコラはやく答えろや 人間電卓どもが!!!
637nobodyさん:2007/01/02(火) 19:31:28 ID:???
電卓すらも使えない人間がここに一人ry
638nobodyさん:2007/01/02(火) 20:42:50 ID:???
パソコンよりレジや電卓のほうが難しいと思う
639nobodyさん:2007/01/02(火) 21:13:35 ID:???
いや、計算尺の方が…
640nobodyさん:2007/01/03(水) 11:08:33 ID:???
641nobodyさん:2007/01/03(水) 22:13:23 ID:???
ふと疑問に思ったのですが、perlの最大計算桁数って何桁
なのでしょうか?

そういえば1年前に5000兆まで計算させるシステムを作った
のを思い出したのですが、その頃は最大計算桁数のことを
考えていなかったような気がするので質問させていただいた
次第です。

ご教示いただけますと幸いです。
642nobodyさん:2007/01/03(水) 22:24:17 ID:???
use bigint すれば(PCのリソース内で)無限桁ですよ。
643nobodyさん:2007/01/04(木) 00:30:50 ID:???
>>642
ご教示有難うございます。
ちょっと昔のソースを改変するのにもある程度理由を
つけなければいけないので、デフォルトで何桁まで
問題ないかもしご存知でしたら教えていただけますと
幸いです。

質問続きですみません。
644nobodyさん:2007/01/04(木) 12:00:06 ID:???
C言語のlong相当、たぶん
645nobodyさん:2007/01/04(木) 16:29:54 ID:???
Perlが組み込み型で扱う数値にはIV、UV、NVの3つがある。
IVはポインタが格納できることが保証される符号あり整数型、
UVはIVと同様の符号なし整数型。
そしてNVは倍精度浮動小数点型となっている。

えーとだからその処理系における不動小数点型の表現がIEEE 754だと仮定すれば、
倍精度浮動小数点型の仮数部は52bitで、
32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。

かな。前に齧り読んだことと、ドキュメントの関連してそうな部分を
掻い摘んで読んだのを組み合わせただけなのであってるかどうかはわからん。
See also: perlguts
646nobodyさん:2007/01/04(木) 16:40:19 ID:???
>>645
訂正
> 32bitマシンの場合は(恐らく)UVのほうが表現できる範囲が大きい(52bit - 15~16桁)。
> 64bitマシンの場合はIV/NVのほうが表現できる範囲が大きい(64bit - 18~20桁)。
ここ思いっきりUVとNVが逆になってる( ´д`;) 読み替え宜しく
647nobodyさん:2007/01/04(木) 18:37:22 ID:???
1ずつ足して確かめるのオススメ
648nobodyさん:2007/01/05(金) 04:06:51 ID:CAClPvdI
XML::Parserモジュールがどうしてもインストールできません。
最新のexpatもいれたのですが。。
649nobodyさん:2007/01/05(金) 07:21:32 ID:???
that's too bad.
650nobodyさん:2007/01/05(金) 12:28:06 ID:???
まったくの初心者ですみません。
ブラウザーからの入力に応じてcgiファイルを書き換えるcgiを作ってみたいのですが。

書き換える側のCGIのソースと書きこまれる側のソースが混ざってしまって
バグがおきてしまいました。
書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション
が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、
書き込まれる側のダブルクオーテーションが存在してしまうようです。
他にも変数を文字列として書き出せず変数の中身、つまり何も無いスカが書き出されます。
どうすれば良いでしょうか?
651nobodyさん:2007/01/05(金) 12:36:48 ID:???
>>650
煽りではなく今の君には無理ってことかと。
そんなことする意味もないし。
652nobodyさん:2007/01/05(金) 13:19:34 ID:???
>648
それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる?
653650:2007/01/05(金) 13:24:38 ID:???
perlを入門サイトなどで勉強中でして、ファイルを制御するのを今習っています。
とりあえずCGIからいろんなファイルに書き込むプログラムを色々と書いてみているのですが。
テキストやHTMLは上手く書き込めたのですがCGIのファイルは上手くいきませんでした。
CGIファイルへの書き込みは習っても意味が無いのでしょうか?
654nobodyさん:2007/01/05(金) 14:31:51 ID:???
>>653
勉強するだけならいいけど実際に共有鯖等では実行しないで欲しいね。
リスクが高いです。他のユーザーに迷惑かける可能性大。
655nobodyさん:2007/01/05(金) 14:39:32 ID:???
ヒント:パーミッション
656nobodyさん:2007/01/05(金) 17:52:53 ID:???
他のユーザに迷惑かけないようにする仕組みはサーバー提供者が負うべき。
ユーザは許可されている事はなんでもやってよい。
657nobodyさん:2007/01/05(金) 19:09:54 ID:???
他人に迷惑をかける行為は許可なんてされてませんよ?
実行可能=やってよいとか考えているわけではありませんよね^^;
658nobodyさん:2007/01/05(金) 19:19:39 ID:???
人を殺してはいけないなんていう法律は無いから、人を殺してもよい
659nobodyさん:2007/01/05(金) 20:31:05 ID:5w1bms+v
>> >648
>> それだけじゃ何もわからん。OSは?Perlのバージョンは?Cコンパイラは持ってる?
OSはFedoraCore6
PerlVersionは v5.8.8 built for i386-linux-thread-multi
Cコンパイラはあります。gcc -v で確認しました。
どうもexpat関係でエラーになっています。最新のexpatはいれたのですが。
660nobodyさん:2007/01/05(金) 23:49:44 ID:???
>>653 の問題はパーミッションではなくて、クォートの問題じゃないのか?

'$' の前に¥でescapeしたり、ということで解決するんじゃないか。

それ以前にcgiがcgi を書き換えるという発想はどうなのよ。
動的にプログラムを生成する必要性はそうないんじゃないか。
661nobodyさん:2007/01/06(土) 01:22:14 ID:???
>書き込まれる側のソースにシングルクオーテーション、ダブルクオーテーション
>が含まれていて書き換える側のダブルクオーテーションで囲まれた間の部分に、
>書き込まれる側のダブルクオーテーションが存在してしまうようです。
>他にも変数を文字列として書き出せず・・・

自分でわかってんじゃん
662nobodyさん:2007/01/06(土) 14:46:16 ID:???
コンパイルの必要なモジュールをuse libで使うにはどうすればよいのでしょうか。
663nobodyさん:2007/01/06(土) 14:55:31 ID:???
自己解決しました。
そのままで良いんですね。。。
664nobodyさん:2007/01/06(土) 16:32:45 ID:???
CGI動的生成プログラムを"作る必要がある"プロジェクトに関わる者なら質問しないレベルだろう

つまり>>650は何か間違った設計をしてるんだろうと思う。
てか掲示板のログファイルの拡張子を .cgi にしたいだけとかでは
665nobodyさん:2007/01/06(土) 19:32:53 ID:???
超低レベルな質問お許し下さい。
PerlによるCGIの参考書を買ってゼロから勉強中ですが、
下記のプログラム(参考書を丸写し)が動作しません。エラーコードは500です。
原因は何でしょうか?
・Perlのパスはレンタルサバのサイトで確認
・ファイル名はindex.cgi
・OSはWinで、メモ帳で編集しFFFTPでUL
・パーミッションは755

#!/usr/bin/perl

print <<_EOF;
Content-type: text/html

<html>
<head><title>test</titel></head>
<body>
test
</body>
</html>
_EOF
666nobodyさん:2007/01/06(土) 19:54:15 ID:???
>>665
500エラーじゃ何も判らんし、そもそもレン鯖使って勉強するなといいたいが。

・FTPの時にASCIIモードで送って無い
・パーミッションがレン鯖指定のものと違う
・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)

とかそんなあたりか。ソースそのものは問題ない。
タグでtitleの打ち間違いがあるくらいか。
667nobodyさん:2007/01/06(土) 20:03:54 ID:???
メモ帳だと最終行末改行がないとか
668nobodyさん:2007/01/06(土) 20:07:39 ID:???
もう出てるけど、
・バイナリモードで転送した
・ヒアドキュメント終端文字列でファイルが終わってる(改行がない)
辺りが有力っぽい。
669nobodyさん:2007/01/06(土) 20:23:33 ID:lBOtCkKI
掲示板の改造で、半角カタカナが本文に含まれる場合
エラーメッセージを出すようにしたいと思っています。

投稿されたメッセージ$messageに
半角カタカナが含まれているかどうかを判定する、というのは
どう書けばよいでしょうか?

全角文字があるかどうかを判定ならググって出てきましたが・・・。
670nobodyさん:2007/01/06(土) 20:23:42 ID:???
>>666
回答ありがとうございます。
>・FTPの時にASCIIモードで送って無い
FFFTPの環境設定に転送設定という箇所があったので、
「常にアスキー」に設定し、ULしなおしました。

>・パーミッションがレン鯖指定のものと違う
確認したところ、実行ファイルは700が推奨されていたのでそうしました。
705も試しました。

>・そもそもindex.cgiが使えないようになっている(別名でテストしてみ)
確認したところindexで問題ないようですが、test.cgiに変更しました。

ですが、動作しませんでした。
671665:2007/01/06(土) 20:31:56 ID:???
>>666-668
最後に一回改行を入れてからULしたら動作確認できました!
回答ありがとうございました!
672669:2007/01/06(土) 21:04:52 ID:???
もっと探したらみつかりました。ごめんでした。

・・・が、さらに質問です。
名前とタイトルに含まれる半角カタカナは全角に変換でいい。
そこでログに書き込むサブルーチンregistに、
&jcode'h2z_sjis(*name);#$nameの半角を全角に
&jcode'h2z_sjis(*subject);#$subjectの半角を全角に
と書いたのですが、名前のほうが変換されません。
673nobodyさん:2007/01/06(土) 22:19:16 ID:???
それだけで全てをわかってくれるエスパーさんが来るといいね
674nobodyさん:2007/01/06(土) 22:29:08 ID:???
30字くらいのパスワードを暗号化したいのですが、
モジュールのインストールなしに出来る方法はどんな方法があるのでしょう。
今はuse libとuse Crypt::CBCとBlowfish_PPでやっているのですが、どうしても遅いので
もう少し早くできると良いのですが。

>>662でlinux上で単純にコンパイルしてそのままautoディレクトリをコピーしてやれば良いのかと思って
コピーしてみましたが
Blowfish.so: undefined symbol: Perl_Gthr_key_ptr
こんな感じのエラーが出てしまいました。
Blowfish_PPとBlowfishでは速度が違いすぎるので、出来ればBlowfishの方を使いたいのですが、
どうすれば使えるのでしょうか。
675nobodyさん:2007/01/06(土) 22:59:26 ID:???
ちょ、パスワードをなんのために暗号化するのさ
676nobodyさん:2007/01/06(土) 23:03:37 ID:???
xor暗号最強
677nobodyさん:2007/01/06(土) 23:21:18 ID:???
>>672
同じ文字列入れてnameの方だけ変換ないってんなら
おまいが間違ってるとしか言えん。

>>674
モジュール無しで、ということだけならopensslに投げるという手もある。
モジュールのほうが速いと思うけど。
678nobodyさん:2007/01/06(土) 23:44:23 ID:???
>>675
マジレスして欲しいのかな?
679nobodyさん:2007/01/07(日) 00:26:44 ID:???
>>674
手順はそれで間違ってないと思うのだけれど
・make testは通ったのか
・perlのバージョン
680nobodyさん:2007/01/07(日) 00:28:09 ID:???
>>675
拡張子をcgiにすればファイルの中身を見られることもないのですが、まあ気休め程度に。
>>677
すみません。解決しました。
サーバーとローカルのperlのバージョンが違ったためにモジュールのバイナリを使用できていなかったようです。
サーバーとローカルのperlのバージョンをそろえてコンパイルしなおしたらそのままコピーでuse libしたら
出来ました。
681nobodyさん:2007/01/07(日) 00:28:21 ID:???
>>645
レス遅れましたが、本当に有難うございました。
検証もしてみましたので検証報告も兼ねさせていただきます。

結論から申し上げますと、16桁目の4以上、つまりは4000兆
くらいから計算が狂ってきました。
これは645さんのおっしゃる32ビットマシンの性能ということ
に当てはまったのではないかと思いました。

ご丁寧に有難うございました。
682nobodyさん:2007/01/07(日) 00:29:35 ID:???
>>679
どうもです。
まさにバージョンでした。
683nobodyさん:2007/01/07(日) 19:30:50 ID:???
毎度お世話になっております。

Mac OS X PantherのTerminal上にて運用する予定のPerlスクリプトをMac OS X Tigerにて作っています。
指定されたディレクトリの中にある1万個程度のテキストを片っ端からチェックして、
ある特定の文字列があったら別の文字列に置き換えて保存するという処理なのですが、
一部ファイル名の最後の文字がスペースのものがあった場合に
それらの展開に失敗する(最後のスペースが無いものとしてファイルを開こうとする)ようです。

ファイル名の最後のスペースを認識させるにはどのような方法があるのかご教示頂けますと幸いです。
よろしくお願いいたします。
684nobodyさん:2007/01/07(日) 20:02:05 ID:???
>>683
>>1
> 2: それでこんな風にやってみたが・・・
685nobodyさん:2007/01/07(日) 20:02:08 ID:???
3引数openで開けばいいんでないの
686 ◆TWARamEjuA :2007/01/07(日) 20:11:46 ID:??? BE:5227586-BRZ(6700)
何となく板違いの伊予柑♪

panther も tiger も5.8.xなのでバージョンの違いとか、OSの違いによるもんじゃないと思うそ。
687nobodyさん:2007/01/07(日) 20:15:21 ID:???
Tiger(perl v5.8.6)で試してみたけど、3引数openなら大丈夫だった。
688nobodyさん:2007/01/07(日) 20:27:45 ID:???
2引数openはファイル名の前後にあるスペースを削っちゃうのよね
案外知られてないのかな
689nobodyさん:2007/01/07(日) 20:47:03 ID:???
>>684
とりあえずやってみたのがファイルのパスを' 'でくくるとか
" "でくくって\を付けるとかくらいなもので…

>>685
デキタ━━━━━━(゚∀゚)━━━━━━!!!!

何でなのか理屈がよく分かりませんができたっぽいです。
迅速なお答え、本当にありがとうございました!
690683:2007/01/07(日) 20:52:01 ID:???
>>686
ご察しの通りPerlの仕様だったようです。
これでPantherのPerlが5.6だったりしたら路頭に迷うところでした。

>>687
検証して頂きありがとうございます。
おかげさまで何とかなりそうです(*´∀`)

>>688
Perlは一応それなりに馴染んでいたつもりだったのですが
今回の件には完全にやられました。もっと精進します。
691nobodyさん:2007/01/07(日) 21:22:42 ID:???
マック欲しい…
692nobodyさん:2007/01/08(月) 05:15:48 ID:???
先着で500名までマックだって。急げば間に合うんじゃないか?
ttp://www.mcdonalds.co.jp/mcgriddles/index.html
693nobodyさん:2007/01/09(火) 00:38:49 ID:???
PerlCGI制掲示板の改造で、半角カタカナを全角カタカナに変換するには
どう書けばいいでしょうか。
jcode.plではなく普通に置換で行いたいと思うのですが。
ここの正規表現みていたら訳が分からなくなってきた・・・。
ttp://sieg.xeong.com/archives/2005/06/perl.html
694nobodyさん:2007/01/09(火) 00:48:18 ID:???
>>693
それ・・・問題おきまくりだよ
695nobodyさん:2007/01/09(火) 01:08:35 ID:???
jcodeg.pl使うと半角カナを化けずに使えるけど、これって問題ある?
696nobodyさん:2007/01/09(火) 01:11:19 ID:???
unicodeなりeucで書いておけばとりあえず半角だのなんだの気にしなくてもかまわんでしょ
697693:2007/01/09(火) 02:24:52 ID:???
ん〜サイト全体(CGI以外)がS_JIS。
EUCはブラウザのミスによる文字化けがあるから嫌なんです(タブブラウザにしなくていいからこっちを先に治せM$)。
CHARSET設定していながら何かの拍子に化ける→エンコードし直しうざい

それに半角カタカナを使えるようにしたいのではないので。
・・・大体、半角カタカナを使って書く言葉って、あまりいい意味の言葉じゃないですよね。
698697:2007/01/09(火) 02:37:18 ID:???
しかし問題ありなんですね・・・>>694
tr使ってもダメだと書いてあるページを見つけました・・・

もともとのスクリプトではフォームデコードに
&jcode'h2z(\$value);
があって、投稿した半角カタカナは全て全角に変換されるんですが
これだと「・・・」まで変換されて(個人的に)変な感じがする。
しかもこれはカタカナではない記号ですしね。
で、他に方法はないかと思ったのですが。
半角→全角は諦めるしかないみたいですね。
レスありがとうございました。
699nobodyさん:2007/01/09(火) 02:47:31 ID:???
サイト全体がSJISだからCGIもそれにあわせるとか、まったく意味の無い統一の仕方なのだが・・・
どうしてもあわせたいならHTMLをunicodeにしちゃえよ
700nobodyさん:2007/01/09(火) 03:06:27 ID:???
use utf8をやればtrでも行ける。
後は濁点付きを適当に置き換えれば。
701nobodyさん:2007/01/09(火) 03:14:56 ID:???
>>699
SJISだから合わせるとかなんとかってのは無視してくださいな。
そんなことどうでもいい。

とにかく半角カタカナを使ってもらいたくないというのと
半角カタカナを2ちゃん以外の場所で見たくないってだけ。

半角カタカナがあればエラーってのもやってみたし
半角カタカナを全角変換もやってみたけど
カタカナじゃないやつまで処理してしまうというのが・・・ってだけの問題。
702nobodyさん:2007/01/09(火) 04:25:59 ID:???
そんなに半角カナを嫌わんでもw

ナンテイウカ タンナル アレルギー ニ シカ ミエナイ カンシ ゙ダナ
703nobodyさん:2007/01/09(火) 06:21:11 ID:???
正しいパスワードを入力したはずなのにエラー(´・ω・`)
何処か一文字間違ってるんだろうけど何処が間違ってるか分からない、といったユーザの不満を解消すべく
ショッピングカートの改良しようと思っています

パスワードのMD5ハッシュをDBに保存するロジックを平文での保存にすることは簡単にできたので、
あとは何処がが間違っているかをユーザに教えるロジックを作ればいいんですが、どうするのがユーザビリティ的に好ましいでしょうか?

正しいパスワードとユーザ入力のパスワードが同じ文字数の場合には、

正しいパスワード "hoge2CH" の時、ユーザが "hoge2ch" と入力したら、
「パスワードの6文字目・7文字目が間違っています。」 と返す、のように簡単にいくんですが、

正しいパスワードが "hoge2CH" の時、ユーザが "hoge2C" と入力した場合に、
貴方がユーザだとしたらどういうエラーが返って来て欲しいかを教えて下さい。


704nobodyさん:2007/01/09(火) 06:34:19 ID:???
>>703はそんなことをしたら恐ろしく少ない回数の試行で
パスワードが特定できるということを解っているのだろうか…
705nobodyさん:2007/01/09(火) 07:11:16 ID:???
>>704
間違いが一定文字数以下の時だけヒントを出すようにすりゃ大丈夫じゃね?
706nobodyさん:2007/01/09(火) 09:15:15 ID:???
>>703
危険なのでヤメレ
>>705
クマー
707nobodyさん:2007/01/09(火) 11:49:21 ID:???
>>703
> 貴方がユーザだとしたらどういうエラーが返って来て欲しいか

正しいパスワードそのものを表示して欲しいな。
708nobodyさん:2007/01/09(火) 12:40:14 ID:???
パスワードがわからない時は該当IDのメールアドレスに
パスワード送信できるようにすれば
709nobodyさん:2007/01/09(火) 13:09:11 ID:???
>>702
>>697
>・・・大体、半角カタカナを使って書く言葉って、あまりいい意味の言葉じゃないですよね。

はい、いい意味じゃない言葉。
m9(^Д^)プギャー ( ´_ゝ`)フーン ( ゚д゚)、ペッ( ゚Д゚)ヴォケ!!
('A`)マンドクセ ( ´,_ゝ`)プッ
顔文字だけでこれだけありますね。
顔文字だけならДゝあたりをNGにすればいいですが、顔文字なしで
使う場合もある。
NGワードに半角カタカナを指定すると誤爆しまくるのでダメ。
#ギあたりでひっかかる
710nobodyさん:2007/01/09(火) 13:12:47 ID:???
ところでjcode.plのマニュアルってなんで英語なんだ。
日本人だよね?作ったのって。

;#$jcode'h2zf{'xxx'}
;#These are pointer to the corresponding function just
;#as $jcode'convf.

これなんかどういう意味?どういう使い方するわけ?
訳はできても使い道がわからないんだが。
711nobodyさん:2007/01/09(火) 13:20:54 ID:???
見たまんまだし、日本語マニュアルあるし、今時jcode.plを使うのもどうかと
712nobodyさん:2007/01/09(火) 15:28:47 ID:???
>>711
まだまだJcodeが使えなかったり、Perlのバージョンが古いままの鯖はたくさんある。
713nobodyさん:2007/01/09(火) 16:27:08 ID:???
ttp://www.itmedia.co.jp/help/tips/linux/l0149.html
ここの内容をコマンドライン上ではなく、
perlスクリプト内でしたいのですが、
どうやってやればよいでしょうか?
ご教授お願いします。

PHPは結構かじりましたが、perlは全く0です。
正規表現もそれほど自信がないです・・・・ orz
714nobodyさん:2007/01/09(火) 16:39:09 ID:???
>>713
-i相当のことをやるのはめんどくさいので、system使えばいいんじゃない?
715nobodyさん:2007/01/09(火) 17:01:19 ID:???
>>713
単に「perlスクリプト内でしたいの」であれば1行毎に
$var =~ s/¥r¥n/¥n/;
をすれば良いのだが、>>714が読み取ったように、
「ファイルの読み書きやらデータのIOをどう処理したら良いか」
ということを聞きたいのか?
716nobodyさん:2007/01/09(火) 17:07:56 ID:???
>>713
要はWindowsの改行コードをUNIXのものに変えたいということじゃないの?
$textに問題の文字列が入っているとしよう。
$text =~ s/\r\n/\n/g; # Perl
これで$text内の全ての\r\nが\nに変換される。
これはPHPでいう以下のいずれかの構文と同じ処理になる。
$text = preg_replace("/\r\n/", "\n", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace("\r\n", "\n", $text); // PHP: PHPではこっちがより推奨される

問題がWindowsとUNIXだけなのであれば、単純に\rを排除するだけでも良い。
$text =~ s/\r//g; # Perl
これはPHPでいう以下のいずれかと同じ処理。
$text = preg_replace("/\r/", "", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace("\r", "", $text); // PHP: PHPではこっちがより推奨される

が、これにMacが絡むと改行コードは\rだけだったりすることもありうるわけで、
単純に\rを排除していてはMacでは改行が全て消えて無くなってしまう。
より汎用性を求めるなら以下のようにすべきだろうね。
$text =~ s/\r\n/\n/g; # Perl1: Win -> UNIX
$text =~ s/\r/\n/g; # Perl2: Mac -> UNIX
これはPHPでいう(以下略
$text = preg_replace(array("/\r\n/", "/\r/"), "\n", $text); // PHP: 意味合いとしてはこっちがより正確だが
$text = str_replace(array("\r\n", "\r"), "\n", $text); // PHP: PHPではこっちがより推奨される
もしくは
$text =~ s/\r\n|\r/\n/g; # Perl: 上の1と2をまとめたもの
これはP(ry
$text = preg_replace("/\r\n|\r/", "\n", $text); // PHP: 配列を使わない場合
717nobodyさん:2007/01/09(火) 17:12:28 ID:???
>>713
以下を hoge.pl で保存
=======
#!/usr/bin/env perl -i.old -p
s/\r\n/\n/ ;
=======
$ perl hoge.pl hoge
じゃダメか?w
しかしソース元の -npe ってなんだかなあ
=====
#!/usr/bin/env perl
for my $name ( @ARGV ){
open IN, $name or die ;
my $data = do { local $/ ; <IN> } ;
close IN ;
rename $name , $name . '.old' ;
$data =〜 s/\r\n/\n/g ;
open OUT, '>' . $name ;
print OUT $data ;
close OUT ;
}
=====
718nobodyさん:2007/01/09(火) 17:13:48 ID:???
しまった、サファリでカキコしてしもうた。全角バックスラッシュは
単なるバックスラッシュに脳内置換よろ
719nobodyさん:2007/01/09(火) 17:21:51 ID:???
>>714-715
レスありがとうございます。

perlのスクリプトをちょっと改造したい
(ある変数内のデータから^Mを削除したい)のですが、
systemとかを使うと、ほかの部分も弄る必要性が出てきそうで、
現時点の自分のperl能力からはできれば避けたいと考えてます。

PHPなら下みたいな感じでよい気がするのですが、
同じことをperlではどうすればいいでしょうか。
perlは変数宣言とかが厳しいと聞いたことがありますが、
ほかはphpと似たようなものでしょうか?

$file_array = file( $file_path );
for($i=0; $i<count($file_array); $i++){
$file_array[$i] =~ s/\r\n/\n/;
}
$file_data = implode("\n", $file_array);
720nobodyさん:2007/01/09(火) 17:31:31 ID:???
そのプログラム、ある変数から\rを削除してるだけには見えないのだが。

$file_pathに格納されたパスにあるファイルを開いて読み出し、
各行の\rを削り、さらに各行をさらにもうひとつの\nをはさんで
つなげているような。

そもそもPHPとかperl以前に、自分が何をやりたいのか、何をやろうと
しているのかを的確に理解して説明する能力を身につけるべきな気が
するぞ。
721nobodyさん:2007/01/09(火) 17:33:08 ID:???
>>720
713 見てからレスれよ
722nobodyさん:2007/01/09(火) 17:38:59 ID:???
>>718
rep2マジお勧め。

>>719
その構文だと各行の間が"2つの"\nで連結されてしまうけどそれでいいのかな?

open(FILE, $file_path);
@file_array = <FILE>;
close(FILE);
for (my $i = 0; $i < @file_array; $i ++) {
$file_array[$i] =~ s/\r\n/\n/;
}
$file_data = join("\n", @file_array);

>>721
おまいも>>719見てからレスれw
723nobodyさん:2007/01/09(火) 17:49:05 ID:???
ただいまより、語尾にレスれとつけるスレとなりました。
ネスレじゃありませんよレスれ
724nobodyさん:2007/01/09(火) 17:51:22 ID:???
半角カナはマルチなんだな。
スルーで。
725nobodyさん:2007/01/09(火) 18:12:19 ID:???
くっそー移転してるの気づかなかった
726nobodyさん:2007/01/09(火) 18:27:32 ID:???
>>712
軽く確認してみただけけれども、ファイルコピーだけで5.005でもJcode動いてるような。
5.005よりも古い鯖って見たこと無いのだけれどそんなにあるんですか?
727nobodyさん:2007/01/09(火) 18:51:04 ID:???
aaacafeは5.005
http://fh.aaacafe.ne.jp/cgiperl.html

iswebは5.6
http://help.www.infoseek.co.jp/isweb/?id=20601

Jcode.pmは度忘れしたけど、CGI.pmも入ってないとこがあったはず。
上の2つは古きよきなんとやら。
すでに引越ししてるだろうけど。
728nobodyさん:2007/01/09(火) 18:51:43 ID:???
直リンしてもた、吊ってくる
729650:2007/01/09(火) 20:30:53 ID:???
>>654
アドバイスありがとうございます。
>>660
やはりそれが原因でしたエスケープで解消しました。
>>664
CGIでCGIファイルを書き出す必要性が頭悪すぎてよくわかりませんorz...
ですがいずれそういう必要性が無いとも限らないので作ってみようと・・・

たとえばホームページを春には桜吹雪の演出、夏は魚が泳ぎ、秋には紅葉が降り、
冬には雪が降るような演出をするとします。
このページそのものがHTMLでは作れそうに無いのでHTMLではなくCGIの
ファイルだとします。
そのページを季節に合わせるためFTPを使わずに更新するには更新用のCGIの
ページからCGIのファイルを更新すれば出来るみたいなー感じでいいのかなと。
でも、もっと簡単な方法がありそうですね。
730nobodyさん:2007/01/09(火) 20:49:40 ID:???
>>729
もしかしてJavaScriptとCGIの違い分かってないのでは?
731nobodyさん:2007/01/09(火) 22:47:00 ID:???
むかし、覚えた手の頃だったか。
処理速度あっぷのためにif分などの分岐をなくそうとcgiからcgiを書き出してたなぁ・・・。
今ならテンプレートを読み替えるだけで済むなぁ。
732nobodyさん:2007/01/09(火) 23:05:36 ID:???
>>650の人は難しく考えすぎというか、なんというか。

当然、各季節用の js なり背景なりを用意しておいて、CGIの中に書かれた
CSS部分を書き換えて背景変えたり、script type="text/javascript" src="ここ" を書き換えて
呼び出す js を変えたり…という動作をするCGIは作れる。
CGIからHTMLを書き換えたり、別のCGIを書き換えたり、いろいろできることはできる。
やることは「テキストファイルを読んで内容を変更して書き出す」だけですから。

適当に「設定ファイル」を作ってそれを差し替えるだけで済むようにすればCGIを組むより楽ですよ。
「季節が変わる毎」程度だったら、もっとも簡単かもしれないのがローカルで書き換えてFTP(ry

でも、勉強のためにローカル環境でこういうのを作って遊んでみたくなったんだったら、
是非遊んでみるべきだと思う。
733nobodyさん:2007/01/09(火) 23:13:11 ID:???
てか季節によってわけたいだけなら、JavaScriptだけでいいじゃん
734nobodyさん:2007/01/09(火) 23:32:53 ID:???
>>729
>CGIでCGIファイルを書き出す必要性が頭悪すぎてよくわかりません

それはこちらのセリフなのだがw

第三者にやれと言われてやってるなら仕方ないが、自分で思い付いてやってるとしたら、
他にもっと勉強した方が良いと思うぞ。
リファレンスとかオブジェクト指向とかな。
735nobodyさん:2007/01/10(水) 01:36:37 ID:???
>>729
cgiも所詮はただのファイルなのでパーミッションだけ注意すれば普通に作れる。
736nobodyさん:2007/01/10(水) 02:02:13 ID:???
>>726
tuf8に変換する、utf8から変換するのが必要な場合は
ソースをちょっと書き換えないとだめよん。
737nobodyさん:2007/01/10(水) 02:08:30 ID:???
>>735
物理的にファイルを生成するという意味ではそのとおり。

論理的なプログラグを生成する難易度はまた別だけどな。
738nobodyさん:2007/01/10(水) 10:52:10 ID:???
HTML表示プログラムで分岐すればいいだけでは?
あるいは設定ファイルのようなものを外部で持っておいて
その設定ファイルを書き換えるとか。
739nobodyさん:2007/01/10(水) 15:22:36 ID:???
>>727
モジュールがまったくない鯖があったはず
ぷららだったっけ?nifty?忘れた
740nobodyさん:2007/01/10(水) 16:08:45 ID:???
便利なものは上手く使うとして、
仕組みを学び知ることは大事だよね
741nobodyさん:2007/01/11(木) 02:30:38 ID:???
>>739
Niftyは確かに strict.pm も入れてないほどきれいさっぱりモジュールがない。
742nobodyさん:2007/01/11(木) 05:11:48 ID:???
最近Perl/CGIを始めた者ですが、お聞きたいことがあります。

ifを使って、特定の条件を満たさないと隠しページへ行けない様にしたい
のですが、どういう関数を使えば良いかさっぱりわかりません。例えば、
あるページ上でテキストボックスに1と入力したら隠しページへ移動する
といった感じにしたいのですが、Basic認証のプログラムなどを参考にし
てみましたが、意味がわからず挫折しました。

隠しページはcgiファイルにして、直接URLを打ち込んでも閲覧できないよ
うにし、特定の条件をクリアした場合のみ閲覧できるようにしたいのです。
もちろんパーミッションは644にします。url_jump_toで最初試したのです
が、案の定駄目でした。

どなたか、条件をクリアしたらcgiファイル(パーミッション644)を閲覧
できる方法をよろしければ教えてください。房ですみません。
743nobodyさん:2007/01/11(木) 07:13:27 ID:???
拡張子が.plのスプリクトの動かし方を教えてください!!!
ActivePerlをインストールしたのですが、そこからどすればいいのか分かりません・・
.plファイルをダブルクリックしてもコマンドラインが一瞬でて消えるだけです・・
どなたか教えてください!!!
744nobodyさん:2007/01/11(木) 07:52:48 ID:???
プログラムが終了すればプロセスも終了する
DOS窓を開いて
> perl /path/to/hoge.pl
みたいに実行させたり hoge.pl が終了する部分に `pause` を書くとか。。
745nobodyさん:2007/01/11(木) 07:57:07 ID:???
コマンドプロンプトの設定で閉じないようにできなかったっけ?
746nobodyさん:2007/01/11(木) 10:36:19 ID:???
>>742
644は実行権限が無いから、プログラムとしては動かない
とはいえ拡張子がcgiだとhttp経由ではプログラムとしてしか見れないようになってるはず
つまり644で閲覧は現実的じゃない(できないことは無いだろうけど)

それよりもif文で分岐して2つのファイルのどちらかを読み込んで表示すればいいんじゃね?
747nobodyさん:2007/01/11(木) 12:13:26 ID:???
PPM3 なんですが、Time::HiRes が search で見つからない orz
以前は PPM 経由でインストールできてたのにこんなことってあるんですね・・・
748nobodyさん:2007/01/11(木) 13:04:09 ID:???
VC Express Edition じゃコンパイルでエラー … windows.h がパッケージに含まれてないとか .net つかえねぇ orz
749nobodyさん:2007/01/11(木) 13:04:29 ID:???
>>747
あったとしても最新バージョンでないことも多いからね
750nobodyさん:2007/01/11(木) 13:13:49 ID:???
751nobodyさん:2007/01/11(木) 13:14:15 ID:???
>>747
リポジトリを追加
752nobodyさん:2007/01/11(木) 13:20:57 ID:???
>>747
ppm3はモジュール名じゃなくてディストリ名で検索しないといけなかったような
つまりTime-HiResで
753nobodyさん:2007/01/11(木) 13:28:22 ID:???
いつからかは知らんが少なくともperl-5.8.8ではTime::HiResは本体と一緒に
配布されてるので、いちいち別にとってきてインスコする必要はなくなった。
754nobodyさん:2007/01/11(木) 13:29:22 ID:???
>750
ありあと・・・でも >751 さんの方法で見つかった m(_ _)m
755nobodyさん:2007/01/11(木) 14:23:06 ID:???
>>746
ありがとうございます。
ファイルを読み込ますのですか...
requireを使用するんですかね?
756nobodyさん:2007/01/11(木) 14:54:00 ID:???
>>755
いや、openとprintとcloseを使う。
必用であればforeachも使う。
757nobodyさん:2007/01/11(木) 14:56:34 ID:???
まぁrequireでもいいけどね
758nobodyさん:2007/01/11(木) 15:08:39 ID:???
foreachよりもwhileだね。
759nobodyさん:2007/01/11(木) 15:23:52 ID:???
>>756-758
ありがとうございます!
ちょっと試してみますね。
760nobodyさん:2007/01/11(木) 15:27:03 ID:???
759です。
少し疑問があるのですが、これってURLを直接打ち込まれたら
第三者に覗かれる恐れがありますよね?
761nobodyさん:2007/01/11(木) 15:28:49 ID:???
なんのURL?
762nobodyさん:2007/01/11(木) 15:30:33 ID:???
データファイルの URL じゃない?
データファイルは HTTP で見れる範囲より外に置くか、ランダムな文字列で生成された16文字ほどのディレクトリに置けばいい
でなきゃ DB にぶち込むとか・・・
763nobodyさん:2007/01/11(木) 15:32:42 ID:???
それこそ拡張子cgiで644にして置いておけば?
764nobodyさん:2007/01/11(木) 15:36:39 ID:???
>>761
説明不足でした。条件を満たしたら隠しページのファイルを読み取るよう
にしたかったのですが、隠したいページのURLを直接入力されたら終わり
だなあと思いまして。

>>762
HTTPで見れる範囲外ですか...なるほど。ちょっと調べてみます。
ランダムなディレクトリはrand関数でなんとかなりそうですが、
僕の知識ではまだまだできそうにありませんorz

>>763
cgiを644にするとファイルが読み取れなくなってしまうので
どうしたもんかと途方にくれています。

みなさんありがとうございます。
765nobodyさん:2007/01/11(木) 15:40:13 ID:???
>>764
644のcgiファイルをopenで読み込んでみ
まぁまず本の一冊でも読み込んでみ
766nobodyさん:2007/01/11(木) 15:54:09 ID:???
>>764
>隠したいページのURLを直接入力
よくわからんけど・・・
つ basic認証
767nobodyさん:2007/01/11(木) 15:57:25 ID:???
http鯖とかcgiのしくみをてんで理解してなさそうだから
ここでちょこちょこやりとりするだけじゃ面倒みきれない
ような気がする
768nobodyさん:2007/01/11(木) 16:03:19 ID:???
764です。
openで読み込みましたが、やはりうまくいきませんでした。
急遽、CGIとPerlでシステムを作るよう頼まれたのですが
おっしゃる通り、まだまだ無知なことも多いので1週間くらい
死ぬ気で勉強してみます。
色々聞けてよかったです。ありがとうございました。
769nobodyさん:2007/01/11(木) 16:03:57 ID:???
なので、一旦出直しますノシ
770nobodyさん:2007/01/11(木) 19:01:52 ID:???
>CGIとPerlでシステムを作る

はぁ・・・
771nobodyさん:2007/01/11(木) 19:48:29 ID:???
>>770
まあ初心者はPerl/CGIをよくわかってないからな,
偉そうに言ってる俺もいまいちよくわかってないけど.
ここは初心者スレだけど,やっぱりできる人間が多いの?
772nobodyさん:2007/01/11(木) 20:31:25 ID:apL14Vu+
なんか噛み合ってなさそw
742がふぁびょりすぎて噛みあってないんだと思うぞw
Basic認証は、利用できるように設定がなっているなら
.htaccess
.passwd
の2ファイル作って
.htaccessを認証させたいディレクトリに置き、.passwdのある場所を指定する。
.passwdを適切な場所におく。レンサバだと.passwdを置く領域確保されてないっしょ?
/home/[account]/ とか用意してくれている鯖ならいいんだけどね
773nobodyさん:2007/01/11(木) 20:40:24 ID:???
.htaccessへのアクセスが拒否されるサーバ(Apacheのデフォルト)は、
たいてい.ht*のファイルすべてがアクセスを拒否されるから、.passwdも
.htpasswdにしておいた方が安心だな。
774nobodyさん:2007/01/11(木) 23:45:41 ID:???
すまん,
770は何がおかしいのかわからんのだが.
CGIとPerlって部分か?
775nobodyさん:2007/01/11(木) 23:51:59 ID:???
それ俺も気になった
776nobodyさん:2007/01/11(木) 23:56:09 ID:???
>774
770は言葉の意味と用途が違うと言いたいんだろうけど、
ここは初心者質問スレだからな。
「断熱とベニヤ板で家を作る」と言ってる感じか?

そんなの、「ベニヤ板で断熱しつつ家を作る」と
置換・理解できない770がDQNなだけ。ほっとけ。
777nobodyさん:2007/01/12(金) 01:19:27 ID:???
問題は特にないけど
CGIの中身をPerlで書きますよって意味なら問題ない。
>CGIとPerlでシステムを作る
って書き方だと
CGIからシステムコールでplなファイルを叩くイメージっぽい気もするかも
でも770の突っ込み自体おかしい。そこは素通りしとけw
778nobodyさん:2007/01/12(金) 04:21:38 ID:???
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。
779nobodyさん:2007/01/12(金) 10:37:26 ID:???
上と下との違いがわからんのだが。
780nobodyさん:2007/01/12(金) 11:03:38 ID:???
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5

とリンクに書いたのなら%A5などのURIエンコードされた部分が
デコードされてくるのは当たり前だろう。

http://www.xxx.com/index.php?%A5%AC%A5

というURIをuriという名前のパラメタで渡したいのなら本来は、

xxx.cgi?url=http://www.xxx.com/index.php?%25A5%25AC%25A5

とすべきなのでは?

781nobodyさん:2007/01/12(金) 11:13:04 ID:???
じゃなきゃ表示時にもう一回urlエンコードすりゃいいだけの話
782nobodyさん:2007/01/12(金) 11:20:56 ID:???
今回の例はたまたまどっちでもいいが、渡したいURIが

http://www.example.com/hoge.cgi?a=xxx&b=yyy

みたいなものもありうるとするならば、渡す前の方で
適切にエンコードしておかないとだめですな。
783nobodyさん:2007/01/12(金) 13:48:13 ID:???
みなさんレスありがとうございます。
なるほど…最初のリンクを生成する時点で%を%25にエンコードしておく必要があるんですね。

>じゃなきゃ表示時にもう一回urlエンコードすりゃいいだけの話

>http://www.example.com/hoge.cgi?a=xxx&b=yyy
>みたいなものもありうるとするならば、渡す前の方で適切にエンコードしておかないとだめですな。

urlパラメータに入るURLは、一般的なURLか前述したような文字コードを含んだURLが大半を占めるのですが、
ユーザー投稿式なので、何が来るかわからないという点を考えると、
最初のリンク生成の時点で適切なURLエンコードをしておいた方がいいようですね。

教えていただいた事を踏まえて、最初のリンク生成時に%を%25にエンコードする様スクリプトを組んだ所上手く動きました。
皆さんありがとうございます。
しかし、この方法だとhoge.cgi?a=xxx&b=yyyのようなものが来た時にダメとの事なので、
もう少し適切に処理させたいと思うのですが、またまた上手くいきません。
というか、どういう風に処理したらいいか分からないという感じです。

$elem =~ s/(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)/<a href=\"$script?url=$1\">LINKはこちら<\/a>/go;
$elem =~ s/\%/\%25/go;

1行目は日本語混じりの文章($elem)の中にURLが張られた場合、それを「LINKはこちら」というリンクに置換させています。
そして、2行目で%→%25にしているわけですが、これだと当然問題が。

・本文中の文章の中にURL以外の%があっても置換してしまう。
・&などが来るとダメ?

「%だけじゃなくてちゃんと全部エンコードすればいいじゃないか」 とは思うのですが、
本文中から(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)にマッチする文字列だけをエンコードさせる方法がわかりません。
どのようにしたらいいでしょうか?
本文中にはURLが複数箇所張られる可能性も考慮したいです。
度々の質問失礼しますが、ご教授の程よろしくお願いします。
784nobodyさん:2007/01/12(金) 13:56:34 ID:aFkw6ayO
ヒアドキュメントの書き方で質問です。
ヒアドキュメントを使わない時に以下のように書けるコードは
どのように書けばいいでしょうか。

print NEW "mydoc = \"@document\";\n";

これでは出力されるファイルの方には@documentという文字が出る。"をエスケープでも同様
print <<"EOM";
mydoc = "@document";
EOM

これではmydoc = "@documentの中身";という形にならない。
print <<"EOM";
mydoc = @document;
EOM
785nobodyさん:2007/01/12(金) 13:58:42 ID:???
>>783
use URI::Escape;

$本文 =~ s/(その正規表現)/uri_escape($1)/ge;

てな感じでいいはず
786nobodyさん:2007/01/12(金) 14:06:42 ID:???
>>784
前者の書き方でいいはずだが。試すときになんか勘違いしてない?

% cat a.pl
@document = qw(unko chinko);

print "mydoc = \"@document\";\n";

print <<"EOM";
mydoc = "@document";
EOM

% perl a.pl
mydoc = "unko chinko";
mydoc = "unko chinko";
787nobodyさん:2007/01/12(金) 14:13:10 ID:???
分からなければ連結すりゃいいんじゃ

'mydoc = "' .@document. '";' ."\n";
788784:2007/01/12(金) 14:26:05 ID:???
>>786
まさに勘違いしていたようです(滝汗)
前者であってました。すみません。ありがとうございます。

>>787
さんくすです。
789nobodyさん:2007/01/12(金) 15:27:30 ID:???
>>785
おぉおおお! できました!
ありがとうございます!
こんな一行で出来る事だったんですね。

これで目的のスクリプトが組みあがりそうです。
2度の長文質問に答えてくださった方々、本当にありがとうございました。
790nobodyさん:2007/01/13(土) 00:05:27 ID:???
744さんの書いている事がよく分かりません・・
拡張子が.plのスプリクトの動かし方を教えてください!!!
ActivePerlをインストールしたのですが、そこからどすればいいのか分かりません・・
.plファイルをダブルクリックしてもコマンドラインが一瞬でて消えるだけです・・
通常のアプリのように直感的に扱いたいです。コマンドライン?から起動とかじゃなくて

あと一つ質問です。
拡張子が.plのファイルの拡張子を無理やり.cgiに変更した場合、cgiとして正しく動作しますか? サーバーレンタルしたらそこで使えますか?

perlに詳しい方、厨房にも分かるように教えてください!!!
どうかお願いいたします。
791790:2007/01/13(土) 00:13:42 ID:???
ちょっと間違って書いた所がありました。
ActivePerl-5.8.8.819をインストールしてから.plをクリックしたら、
D:Perl\bin\perl.exeとなってコマンドラインがでてきました。
コマンドラインは消えませんが、ここからどうすればいいのか・・・・
助けてください
792nobodyさん:2007/01/13(土) 00:17:33 ID:???
それで正常に動いています。プログラムの使い方は作者に聞くなり、説明書を読むなりしましょう。
ここは「プログラムを作る人」の為の板でありスレッドです。使う側の質問は板違いです。
793nobodyさん:2007/01/13(土) 00:20:49 ID:???
UNIXでperl動かすのとwinで動かすのはどんな違いがあるんですかね?
UNIX鯖レンタルしてそこで動かそうと思うですが、何をインストールすればよいのでしょうか?
794nobodyさん:2007/01/13(土) 00:31:51 ID:???
>>791
本屋さんで立ち読みでもいいから、入門書のアタマをちょっと読んだ方がいいよ。
795nobodyさん:2007/01/13(土) 21:51:44 ID:wEKIwJY9
キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?
796 ◆TWARamEjuA :2007/01/13(土) 21:57:49 ID:??? BE:436122-BRZ(6701)
>>795
WebProg板って事なので、CGI経由になるのかしら?
それならJavaScriptを使った方がよさげの悪寒♪
797795:2007/01/13(土) 22:06:58 ID:???
>>796
いえ、シェル上でのperlスクリプトです。
798795:2007/01/13(土) 22:08:17 ID:???
すいません、プログラム板の方がふさわしそうなので、
そっちへ移動します。
799nobodyさん:2007/01/14(日) 22:03:27 ID:7dLarnkv
OUTER: foreach my $tmp (@tmp_data){
  foreach my $key (keys %target){
    my $value= $target{$key};
    if($key == 1){ next OUTER }
    else{ next OUTER; }
  }
}


上記と下記は同じ流れ方をすると思っていたのですが、下記のwhileの場合、
どうも%targetを最上層のforeachから再度読み出すとハッシュのはじめから
よんでいないような挙動を見せます。
こちら何かアドバイス等ございます際にはいただけますと幸いです。


OUTER: foreach my $tmp (@tmp_data){
  # my %target = %common::target; を入れて初期化すると上記同様の流れになる
  while(my ($key, $value) = each(%target)){
    if($key == 1){ next OUTER }
    else{ next OUTER; }
  }
}
800nobodyさん:2007/01/14(日) 22:11:17 ID:???
each の場合は、イテレータのポインタがリセットされないって事では
801nobodyさん:2007/01/14(日) 22:17:51 ID:???
>>800
早速のご返答有難うございます。

そうだとは思うのですが、これに関する説明がググってもどうも
出てこなかったため、質問させていただきました。

ちなみに、PHPの場合では以下がございました。
おそらくこういうことかとは思いますが。。
ttp://asakura.g.hatena.ne.jp/asakura-t/20051116/1132113906
802nobodyさん:2007/01/14(日) 22:27:08 ID:???
perldoc -f each
したら書いてあったけど。ググるだけじゃなくて、マニュアルも読もう

There is a single iterator
for each hash, shared by all "each", "keys", and "values" func tion calls
in the program; it can be reset by reading all the
elements from the hash, or by evaluating "keys HASH" or "values HASH".
803nobodyさん:2007/01/15(月) 05:27:53 ID:???
既存のコードを改造しようとコードを見たら、
$::FLAG{'cache'}
というのがあったんですけど、
この時の「$」はいったいなんでしょうか?
804nobodyさん:2007/01/15(月) 08:15:52 ID:???
スカラー
805nobodyさん:2007/01/15(月) 13:31:24 ID:???
最近なんか初心者質問スレっぽくない感じがする
俺的には高度な話題が多くなったなぁ、みんな凄いわ
806nobodyさん:2007/01/15(月) 20:35:55 ID:???
>>809
:: はパッケージを指定する為の演算子です。
$Pkg::var のように書くと Pkg パッケージのパッケージ変数 $var を参照できるのですが
パッケージ名を省略すると、デフォルトのパッケージである「main」を指定した事になります。


our $hoge = "In main"; # ← main パッケージの $hoge

package Sandbox;
our $hoge = "In sandbox"; # ← Sandbox パッケージの $hoge

print $hoge, "\n";
print $::hoge, "\n";
print $Sandbox::hoge, "\n";
print $main::hoge, "\n";
807nobodyさん:2007/01/16(火) 10:45:24 ID:Vliwd/jI
モジュールを探しています。
秒数を日付にするのはありますが、
秒数が何時間とか、何日分に当たるのかとかいった変換を行うものはありますか?
3600S→1Hのようなかんじで。
808nobodyさん:2007/01/16(火) 10:47:49 ID:???
/ という演算子が用意されています。
809nobodyさん:2007/01/16(火) 10:58:59 ID:Vliwd/jI
>>808
そういうことでなく。

あと、時間や分、秒ごちゃ混ぜで計算できるものあれば。
77H - 4M = 76H56M みたいなの。
秒に戻さず、直感的に計算できればいいです。日付の計算はDate:Simpleにあるんですよね・・・。
810nobodyさん:2007/01/16(火) 11:19:26 ID:???
use DateTime::Duration;

$t1 = DateTime::Duration->new(hours=>77);
$t2 = DateTime::Duration->new(minutes=>4);

$t3 = $t1 - $t2;

printf "%dH%dM\n", $t3->in_units(qw(hours minutes));
811nobodyさん:2007/01/16(火) 11:25:29 ID:???
なんでもあるんだな・・・
812nobodyさん:2007/01/16(火) 11:38:08 ID:???
>>811
なるほど。
でも、あらかじめ分解しておかないとダメなんですね。

モジュール探すときって、英語が出来ない自分が恨めしい・・・orz
813nobodyさん:2007/01/16(火) 11:44:11 ID:???
中では全部、秒で計算しているのかな?
814nobodyさん:2007/01/16(火) 11:51:34 ID:???
DateTime-Format-Durationってのもありますね。
815nobodyさん:2007/01/16(火) 14:34:37 ID:???
ファイルハンドルって局地的に使う事は出来ないのでしょうか。
全体で一意な文字列になるの?
816nobodyさん:2007/01/16(火) 14:51:23 ID:???
「局地的」という言い方がなんだかわからないが、

a) 無名ファイルハンドルを使う
a-1) IO::Handle->newで作る
a-2) my $fh; open $fh, 〜 で作る

b) 型グロブをlocalで局所化する local *FH; open FH, 〜
817nobodyさん:2007/01/16(火) 15:05:14 ID:???
open my $fh, ">$file";
楽でいい。
818nobodyさん:2007/01/16(火) 15:23:34 ID:???
>>817
open my $fh, ">", $file or die $!で済ませられる程度の簡単なプログラムなら
いいんだけど、

unless (open my $fh, ">", $file) {
エラー処理
}
通常の処理

みたいに書こうとすると$fhのスコープがif文の中だけなのでだめなんだよな。

819nobodyさん:2007/01/16(火) 15:50:18 ID:???
>>818
エラー処理がそんなに長くなければだが、こんなんでどうよ。
ただしインデントには気をつけないと読みづらくなること請け合い。
open my $fh, ">", $file
  or do {
    エラー処理
  };
通常の処理
820nobodyさん:2007/01/16(火) 16:06:17 ID:???
>>816-819

dクス。
ラクダ本見たらこんな感じの記述があったから、
変数に何らかの文字列を設定しなきゃいけないのかと思ってた。

foreach $file (@ARGV){
process( $file, 'fh00' );
}

※process内
open( $input, $filename );
821nobodyさん:2007/01/16(火) 16:48:11 ID:???
open my $fh, ">", $file
or do {
エラー処理
};
通常の処理

open my $fh, ">", $file
or do {
エラー処理
};
通常の処理

連続で使うと二重宣言の警告出るがな
822nobodyさん:2007/01/16(火) 17:17:37 ID:???
>>821
そもそもそれは役目が終わったはずの$fhのスコープを閉じてないところに問題があると思う。
(ただの変数ならともかく、中身がファイルポインタと言う最初と最後がはっきりしているものだから。)
状況にもよるが俺は、ファイルの処理部分をラベル付きブロックに押し込むと
ファイルへのアクセスのスコープが一目で明白になるからしばしばこうやってる。
WRITE_HOGE: {
  open my $fh, ">", $file;
  通常の処理
}
WRITE_FUGA: {
  open my $fh, ">", $file;
  通常の処理
}
823nobodyさん:2007/01/16(火) 18:05:33 ID:???
これ↓何の役割をしているんですか?

WRITE_HOGE:
824nobodyさん:2007/01/16(火) 18:11:29 ID:???
>ファイルの処理部分をラベル付きブロックに押し込むと
825nobodyさん:2007/01/16(火) 18:11:50 ID:???
>>823
>>822のコードでは何もして無い。こんな効果が
WRITE_HOGE: {
  open my $fh, ">", $file
    or do {
      last WRITE_HOGE; # とかやると
    };
  通常の処理
} # エラー時にここまでジャンプする
あるけれど、822ではブロック自体に名前をつけて解りやすくするという意味でつけた。
826nobodyさん:2007/01/16(火) 18:21:52 ID:???
わざわざ

> ファイルの処理部分をラベル付きブロックに押し込むと

と書いてあるのに何故ググりもせずに聞くのだ?
827nobodyさん:2007/01/16(火) 18:34:16 ID:???
初心者スレだからいいんでねぃか
828nobodyさん:2007/01/16(火) 18:37:29 ID:???
ググるのも難しいしなw
perl ラベル でググるといい
829nobodyさん:2007/01/16(火) 19:50:01 ID:???
結局、上達するにはまず検索術を身につけろって事になるんだよな・・・
830nobodyさん:2007/01/16(火) 20:29:44 ID:???
>>825
なるほどブロックの最初に戻るんじゃなくて、最後に飛ぶのか。
サンクス。
831 ◆TWARamEjuA :2007/01/16(火) 20:38:16 ID:??? BE:2178454-BRZ(6701)
(´-`).。oO(そもそもの構造がへんなのかも。do なんて使うこと無いよなぁ。。。)
832 ◆TWARamEjuA :2007/01/16(火) 20:39:31 ID:??? BE:653832-BRZ(6701)
>>831
s#do#doとかラベル#
833nobodyさん:2007/01/17(水) 01:42:58 ID:???
このケースだと do やラベルを使わずサブルーチン呼ぶ方が
より自然な気がすっけどね。
my $code = sub { die : } # エラーしょり
{ # 空ブロック宣言
open my $fh, "hoge" or $code->() ;
close $fh ;
}
834nobodyさん:2007/01/17(水) 03:08:12 ID:???
二つの文字列で共通箇所だけ抜き出すスクリプトあったら教えてください。

たとえば、aiueoとkaiukekoならaiの部分、abcdeとadeabなら「de」と「ab」です。
でも、連続した文字でない場合は抜き出さなくていいです。二文字以上。
上の例だとa,i,u,e,oの文字、a,b,c,d,eの文字が使われているからといって抜き出さない、といった感じです。
835834:2007/01/17(水) 03:09:07 ID:???
間違いました。
>たとえば、aiueoとkaiukekoならaiの部分、
重なってる部分は「aiu」です。
836nobodyさん:2007/01/17(水) 07:17:18 ID:???
>>835
一箇所しか重ならないの?
たとえば hogefugahoge v.s. fugahogefuga みたく複数の場合とか考慮せんでえーの?
837834:2007/01/17(水) 07:21:58 ID:???
>>836
hogeが二回とか同じものが複数は別扱いでいいです。
まとめたいときは配列にでもして重複削除処理を加えると思うので。
838837:2007/01/17(水) 07:26:27 ID:???
いってること自分でもよくわからないので言い直します。

hogefugahoge v.s. fugahogefugaなら
fugahogeというデータが抜き出せたらいいです。
fuge、hogeでもいいです。fugahoge,fuge,hogeでも。
そのあたりは作り手にお任せします。
一番理想的なのは、コノ例なら最初のfugahogeだけですね。後は同じことですから。
839837:2007/01/17(水) 07:30:03 ID:???
訂正

[hogefuga]hoge v.s. fuga[hogefuga]なら
[]の部分が重なっているのでhogefugaです。
他、fugeと書いている部分はfugaです。
840837:2007/01/17(水) 07:40:16 ID:???
すみません。まだちゃんと理解してなかった・・・

hogefugahoge v.s. fugahogefugaの例の場合、
hoge[fugahoge] v.s. [fugahoge]fugaもあるんですね・・・。
重なってる箇所がある場合は長いほう優先にしてください。
同じ長さの場合はどちらか一方で構いません。
説明足りなかったですが、これらの条件と合わせて
二つの文字列で何文字共通箇所があるか?データも欲しいです。
841806:2007/01/17(水) 07:48:33 ID:???
>>809
わかりました、どうもありがとう。
842nobodyさん:2007/01/17(水) 09:39:21 ID:???
>>837
最長だけでよければCPANに

String::LCSS - Find The Longest Common Substring of Two Strings.

というのがある。
843nobodyさん:2007/01/17(水) 10:18:37 ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
844nobodyさん:2007/01/17(水) 10:53:47 ID:???
4: だから教えろカスども
845nobodyさん:2007/01/17(水) 10:59:11 ID:???
5: カスだから無理
846nobodyさん:2007/01/17(水) 12:13:51 ID:???
my $one = 'hogefugahoge' ;
my $two = 'fugahogefuga' ;
my %ones
  = map { $_, 1
  } map {
    unpack +( join '', map "\@${_}A*", 0.. ( length $_ ) - 1 ), $_ ;
  } unpack +( join '', map "A${_}X${_}", 1.. length $one ), $one ;
これで全組合せが出るのであとはお好きなように。。。
例えば以下みたく。絞り込むのは自分でやっとくれ。

my @ans ;
for my $str ( sort { length $b <=> length $a } keys %ones ){
  my @two_ind ;
  my @one_ind ;
push @two_ind, pos $two while $two =~ /($str)/g ;
  push @one_ind, pos $one while $one =~ /($str)/g ;
  push @ans, { str => $str, one => \@one_ind, two =>\@two_ind } if @two_ind ;
}

847nobodyさん:2007/01/17(水) 12:17:45 ID:???
空気嫁
848nobodyさん:2007/01/17(水) 12:28:57 ID:???
ネタレス三つで空気よめって何よ?w

>>842
これのソースは一応参考にはなるな
849nobodyさん:2007/01/17(水) 12:41:34 ID:???
ほんと空気読めないんだな
850836=846:2007/01/17(水) 12:49:39 ID:???
すまん。質問スレで質問に答えるのは厳禁なんだな。
851nobodyさん:2007/01/17(水) 12:52:13 ID:???
ああ、テンプレ通りじゃねえってことか orz...
吊ってくるわ
852nobodyさん:2007/01/18(木) 00:58:49 ID:???
答えられない低脳君が答えてる奴に文句言うって素敵な空間ですね
853nobodyさん:2007/01/18(木) 01:00:06 ID:???
>>851
いや、お前は悪くないよ。
854nobodyさん:2007/01/18(木) 01:08:56 ID:???
答えられる奴が答えたらいいので、答えて文句いってるのは一番のカス。
どこにでもいるのでスルーするのがよろしい。ゴキブリホイホイより
855nobodyさん:2007/01/18(木) 01:33:40 ID:???
>>854
そんなこと言うなよ。
お前がゴキブリホイホイなら俺はホウ酸ダンゴだ。
856nobodyさん:2007/01/18(木) 10:26:29 ID:???
ここは定期的に荒しが沸くのでスルーお勧め
でもテンプレすら読まないのは問題あるな
どっちにしてもスルーでおk
857みろん:2007/01/18(木) 14:03:23 ID:2GOHrU8+
どなたか教えてください。
今、perlで掲示板を作っています。そこでリロードによる二重投稿を
防ぎたいのですが、私はlocationをつかってみようと思ってます。
しかし、うまくいきません。どこに記述すれば、送信後自分のページを
再読み込みしてくれるのでしょうか。
858nobodyさん:2007/01/18(木) 14:27:04 ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
859nobodyさん:2007/01/18(木) 16:39:22 ID:???
現在、CGIにてファイルをダウンロードさせています。

ファイルをOpenし、ContentType等を設定して、
バイナリを出力させダウンロードさせる仕組みです。

しかし、ファイルが存在しなかったり、Openに失敗した場合の処理が、
ファイル名にエラー情報を書いてファイルサイズ0のものをダウンロード
させるくらいしか出来ていません。

ファイルのダウンロードに失敗しましたというダイアログを出すためには、
404 not foundを返せばいいのでしょうか?
860nobodyさん:2007/01/18(木) 16:45:25 ID:???
CGIなら「失敗しました」ってブラウザに表示すりゃいいんじゃね?
861nobodyさん:2007/01/18(木) 17:12:53 ID:???
404がえし、やってみたら出来ました。
862nobodyさん:2007/01/18(木) 21:28:56 ID:???
>>857
location というのがヘッダーの Location フィールドのことなら、書き込んだ後に表示するページで
Location: ジャンプ先URL
をレスポンスヘッダーに追加して、適切なステータスコード(302、303など)を返します。
URLの最後に ? を付けると、ほとんどのブラウザで二重投稿を防止できるみたいです。
詳しいやり方は、使ってるライブラリによって異なるので、自分で調べてみてください。

location が JavaScript の window.location の事でも、基本的に同じですが、板違いです。
863nobodyさん:2007/01/20(土) 14:34:54 ID:67i3ErOc
配列の中に重複しないようにURLをいれる処理なんですけど
重複してしまいます。

@http_url = $text =~ /($set{'http_url_regex'})/g;
foreach my $url (@http_url) {
if (!grep(/^$url$/i, @link)) {
print "link : $url\n";
push(@link, $url);
}
}
なぜなのでしょうか?
864nobodyさん:2007/01/20(土) 16:57:02 ID:x00E/Fj7
<form enctype="multipart/form-data" action="....cgi">
<input type="text" name="title" size="40"><br>
<input type="file" name="File" size="32"><br>
<input type="submit" name="send" value="送信"><br>
</form>

上のプログラムのように、テキストタイプのデータと画像などのデータを送信するプログラムを作りたいんですが
最初のフォームのテキストデータがちゃんと受け渡せません
multipart/form-dataで送信した際には、cgi側でどのような操作を行えばURLエンコードで送信した場合と同じようにテキストデータを扱えるんでしょうか?
865nobodyさん:2007/01/20(土) 17:15:45 ID:???
2chの掲示板のソースコードはどこかで手に入りますか?
866nobodyさん:2007/01/20(土) 19:47:35 ID:???
>>863
ハッシュを使うと楽にできるよ。
867 ◆TWARamEjuA :2007/01/20(土) 19:50:03 ID:??? BE:4574467-BRZ(6701)
>>863
何故っと云われてもわかんないけれどもおそらく恐ろしく効率が悪いみたいです♪

@http_url = $text =~ /($set{'http_url_regex'})/g; # $textからURIらしきものを取り出す。
# @link に追記。(ブロックにしておきますね)
{
 my %link_hash = map +($_, 1), @link; # URIをキーにしたハシュを作る。
 for my $collect_uri (@http_url){
  defined $link_hash{$collect_uri} and next; # キーが存在すれば次。
  push @link, $collect_uri; # キー(URI)が無かったので追記♪
 }
}

これでどうかしら?
@linkにスタックされた順番を考えずに済むのなら他の方法もあるけれども♪
あと、@linkの要素総てに改行が含まれているなら刈り取っておかなきゃです。
868nobodyさん:2007/01/20(土) 20:46:48 ID:???
>>865
板違い
869nobodyさん:2007/01/21(日) 04:45:54 ID:???
>>864
Googleで"multipart/form-data perl"で検索してみるといいぞ。
検索結果をトップから10件分読めば大体分かる。
870nobodyさん:2007/01/21(日) 09:24:25 ID:prBhWU2Q
>>869
検索して、何となくはわかったんですが、深く理解はできませんでした
けどstdio.plというライブラリを見つけました
stdio.plと一緒にダウンロードしたサンプルプログラムのgetMultipartFormDataを使えば何とかなりそうです
返信ありがとうございましたm(_ _)m
871nobodyさん:2007/01/21(日) 12:46:00 ID:???
>>870
可能なら CGI.pm を…。
872nobodyさん:2007/01/21(日) 12:54:47 ID:???
会員制のサイトで
ID パス 入力で
個人ごとのデータを管理するオープンソースってありますか?
873nobodyさん:2007/01/21(日) 14:19:50 ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
874nobodyさん:2007/01/21(日) 14:21:10 ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
875nobodyさん:2007/01/21(日) 14:29:45 ID:???
オープンソースって言いたいだけちゃうんかと。

まあエスパーな俺が無理矢理読み取って答えると、いくらでもあるからよく探せ。
876nobodyさん:2007/01/21(日) 14:35:48 ID:???
エスパー居すぎワロス
877nobodyさん:2007/01/21(日) 16:27:20 ID:???
>873 伊東さんです。
>874 魔美さんです。
>875 ユンゲラーです。
878nobodyさん:2007/01/21(日) 17:55:44 ID:???
世界のエスパーが集うスレと聞いて飛んで来ました
879nobodyさん:2007/01/21(日) 18:22:18 ID:???
来てます!
880nobodyさん:2007/01/21(日) 19:41:27 ID:???
とうとうナポレオンズの時代が来たようです
881nobodyさん:2007/01/23(火) 10:33:18 ID:gVOiAeSh
--------------------------------------------------------
sub mail_okuru{
my($aitemail) = $_[0];

$_[2] = &adebo($_[2]);

$mail = "To: $aitemail\n";
$mail .="From: \日\本\語\名\前 <$mail_add>\n";
$mail .="Subject: $_[1]\n";
$mail .="Content-Transfer-Encoding: 7bit\n";
$mail .="Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n";
$mail .=$_[2];


&jcode::convert(*mail,'jis');

open(MAIL,"|$sendmail -i -t -f $aitemail");
print MAIL $mail;
close(MAIL);
}
------------------------------------------------------------
自動返信メールのアドレスの【日本語名前】のところがどうして文字化けしてしまいます
文字化けしないようにしたのですがどうすればよろしいでしょうか?
お願いします
882nobodyさん:2007/01/23(火) 10:40:39 ID:???
文字化けの原因は何だと思う?
883nobodyさん:2007/01/23(火) 10:52:08 ID:???
これは普通に検索すれば解決するだしょ
base64でぐぐれよ
884nobodyさん:2007/01/23(火) 12:00:56 ID:???
そーゆー問題か?
885nobodyさん:2007/01/23(火) 17:43:26 ID:???
From行が・・・
これは気づくまで放置か?
886nobodyさん:2007/01/23(火) 20:24:43 ID:???
釣りとみた
887nobodyさん:2007/01/23(火) 22:16:41 ID:???
てことは俺は釣れたわけかorz
888nobodyさん:2007/01/23(火) 22:57:35 ID:???
mimew.pl入れたら上手く行ったよ
889nobodyさん:2007/01/24(水) 01:37:38 ID:???
教えて下さい
flockをローカルテスト鯖で使いたいのですが
Windowsで対応しているのはどのバージョンからでしょうか。
890nobodyさん:2007/01/24(水) 02:39:08 ID:???
NT系なら使えるはず。
891nobodyさん:2007/01/24(水) 04:30:09 ID:???
xpは動くでしょうか?
892nobodyさん:2007/01/24(水) 05:42:11 ID:???
893nobodyさん:2007/01/24(水) 06:44:06 ID:???
え、flock って Unix 専用じゃなかったの?
NT系で使えるってのは初耳だ
894nobodyさん:2007/01/24(水) 07:03:26 ID:???
ソースを見るとwin32/win32.cにwin32_flockというのがあって、非NTのときはcroak、
それ以外ならモードにあわせてLockFileEx/UnlockFileExを呼んでるな
895nobodyさん:2007/01/24(水) 10:50:28 ID:???
print "content-type: text/html\n";
print "Set-Cookie: test=test; domain=test.co.jp; expires=$expiredate;\n";
print "\n";

Set-Cookieでdomainを他のサーバーで指定するとcookieが発行されないのですが、
これは何が原因か教えて頂けますか。

domainの値を自サーバーもしくは、domain自体を記述しなければちゃんと発行されます。
896nobodyさん:2007/01/24(水) 11:09:52 ID:???
他のドメインのクッキーを勝手に食わされるとセキュリティ上問題あるので
クライアントはそういうのは拒否することになっている。詳しくは
RFC2965(HTTP State Management Mechanism)の3.3.2(Rejecting Cookies)参照

たぶんこれにひっかかったんじゃないか。
897nobodyさん:2007/01/24(水) 12:18:29 ID:???
仕様ですな。
898895:2007/01/24(水) 13:08:20 ID:???
仕様なんですか。ありがとうございます。
そうしたらdomainを入力する項目ってほとんど必要性がないような…(´・ω・)
899nobodyさん:2007/01/24(水) 13:16:44 ID:???
example.comで発行するとhoge.example.comやfoo.example.comにも影響する
そこで有効範囲を指定してhoge.example.comのみに発行させることができる
900nobodyさん:2007/01/24(水) 13:19:21 ID:???
>>898
example.comでクッキー発行すればauction.example.comでもshopping.example.comでも同じクッキーが使える
auction.example.com(ドメイン省略時の例として)で発行すればそこでしか使えない
901nobodyさん:2007/01/24(水) 14:33:19 ID:???
外部のサイトの
http://〜/***.cgi?no=***
というようなページ(のソース)を読み込むことって出来ますか?
902895:2007/01/24(水) 14:35:35 ID:???
なるほど、ありがとうございました(´・ω・)
903895:2007/01/24(水) 14:39:06 ID:???
外部のソースですが、
use LWP::UserAgent;
use HTTP::Request::Common qw(GET);
my $ua = LWP::UserAgent->new;

my $url = "http://〜/***.cgi?no=***";
my $request = GET($url);
my $res = $ua->request($request);

if ($res->is_success){
$content = $res->content;
}

といったような形で読めますよ(´・ω・)
904nobodyさん:2007/01/24(水) 15:37:30 ID:???
>>903
ありがとうございました。勉強してみます。
905nobodyさん:2007/01/24(水) 15:53:30 ID:???
サーバ上でdata.txt(SJIS)をUTF-8に変更の上、
data1.txtとして別名で保存したいのですが
どのようにすればいいでしょうか?

ちなみにperlは設置ができる程度です。
親切な方よろしくご指導ください。
Perl バージョン 5.008004 です。
906nobodyさん:2007/01/24(水) 16:03:41 ID:???
読み込み→変換→別ファイルに保存
907nobodyさん:2007/01/24(水) 16:25:47 ID:2EUwcZjV
ログなどにデータを保持する場合、配列の区切り文字としてはどんなものを使うのが一般的なんでしょうか?
できるだけ短くてユニークなものが理想的だと思いますが
「普通はこれ使うだろ」といったような暗黙の標準区切り文字みたいなものはありますか?
それとも、コードの中で一時的にユニークな区切り文字に置き換えて処理し、
データに書き込むときは汎用性の高い区切り文字(カンマ等)で統一する、
といった方法の方が一般的なんでしょうか?
「自分はこうしている」という意見でも良いのでよろしくお願いします。
908nobodyさん:2007/01/24(水) 16:28:30 ID:???
>906
読み込みと保存はなんとなくこんな感じでしょうか。
変換がよくわかりません
open IN, "data.txt";
$data = <IN>;
close IN;
open OUT, ">data1.txt";
print OUT $data;
close OUT;
909nobodyさん:2007/01/24(水) 16:32:21 ID:???
LWP::UserAgentで外部サイトを取得する場合、
指定したURLが転送される場合303 See Otherが出て取得できない。

どうすれば転送後のサイトを取得できますか?
910nobodyさん:2007/01/24(水) 16:50:31 ID:???
>>907
データの中に区切り文字を含まないように工夫すればなんでもいいんじゃね?

>>908
本を一冊読むことをおすすめする。
ここで全部を教えるのは難しい

>>909
"LWP リダイレクト"でぐぐった?
911909:2007/01/24(水) 17:49:56 ID:???
>>910
ありがとう
912nobodyさん:2007/01/24(水) 18:43:46 ID:???
>>907
CSVやTSVを使ったり、SQLiteやPgSQLを使ったり。
913nobodyさん:2007/01/24(水) 20:41:48 ID:???
自サイトにあるフォームメールにスパムが来るようになりました。
そこで半角のみの投稿は不可にしようと思ったのですが
正規表現だと

$char_check = $form{"message"};
if($char_check =~ /^[^0-9a-zA-Z]$/ ){
 送信
} else {
 エラー処理
}

こんな感じでやってみたのですがうまく動きません。
正しい動作をさせるにはどのように書き直せばいいでしょうか?
914nobodyさん:2007/01/24(水) 21:25:03 ID:???
if ($char_check =~ /[^ -~¥r¥n]//) {
 送信
}
915nobodyさん:2007/01/25(木) 05:34:19 ID:???
!~ /^[a-zA-Z0-9]+$/
あとURLに使われる文字とか。
916nobodyさん:2007/01/25(木) 16:38:50 ID:???
Perlでケータイ電話からのアクセスかどうかを判別したいと考えています。

UserAgentは簡単に偽装できるので、IPアドレスベースの識別をしたいのですが、
アクセス者のIPアドレスがサブネットマスク形式のアドレスで指定した条件に一致しているかどうかを
確認するモジュールはないでしょうか?

つまり、

my $ipType = &IP_Check('127.0.0.1', '127.0.0.0/24');

if ($ipType) {
 print 'ループバックアドレスです。' . "\n";
}

みたいなことができる関数が欲しいです。

よろしくお願いします。
917nobodyさん:2007/01/25(木) 18:21:17 ID:???
>>914,915
ありがとうございます。
918nobodyさん:2007/01/25(木) 18:26:22 ID:???
>>916
とりあえずCPANでsubnetで検索してみた?
その目的からするとTie::NetAddr::IPがこんな感じで使えてよさそうに見える。試してないが。

tie my $carriersSubnet, 'Tie::NetAddr::IP';
$carriersSubnet{"10.0.10.0/24"} = "CarrierA";
$carriersSubnet{"10.3.20.0/24"} = "CarrierA";
$carriersSubnet{"10.10.2.0/24"} = "CarrierB";

my $carrier = $carriersSubnet{$ipaddr};
919nobodyさん:2007/01/25(木) 18:34:43 ID:???
>>916
Net::CIDR
920nobodyさん:2007/01/25(木) 22:54:12 ID:???
>>889
winじゃないけど
Mac OSX もunixなので可
921nobodyさん:2007/01/26(金) 07:14:03 ID:??? BE:198705029-BRZ(9100)
Net::CIDR::MobileJP
922nobodyさん:2007/01/26(金) 10:57:39 ID:???
Perlで簡単な占いみたいなのを作りたいのですが、どうしてもならないところがあるので
質問させていただきます。

質問を提示してその下にラジオボタンで選択肢を作ります。
で、質問に答えたら次の質問と続いていくわけなんですが。
その選んだ答えを1.と答えたのがが3個 2.と答えたのが4個と最後に合計を出したいの
ですが、合計を出そうとするところができません。

そういう簡単なサンプルとかを提示していただきませんでしょうか?
923nobodyさん:2007/01/26(金) 12:05:11 ID:???
>>1を100回読んでこい
924nobodyさん:2007/01/26(金) 12:38:54 ID:???
>>922

if ($x eq $a){

   $one++;

} eisif ($a eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
925924:2007/01/26(金) 12:43:20 ID:???
間違えた
if ($x eq $a){

   $one++;

} eisif ($x eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
926924:2007/01/26(金) 13:01:23 ID:???
あ、また間違えた
if ($x eq $a){

   $one++;

} elsif ($a eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
927924:2007/01/26(金) 13:02:48 ID:???
これでいいや
928924:2007/01/26(金) 13:08:50 ID:???
ああまただ
これが正解だ

if ($x eq $a){

   $one++;

} elsif ($x eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
929nobodyさん:2007/01/26(金) 13:20:33 ID:???
連投するならせめて空行を抜けヴォケ
930nobodyさん:2007/01/26(金) 16:52:05 ID:???
なんかわろた
931nobodyさん:2007/01/26(金) 20:04:25 ID:???
変数しかないのにダブルクオートで囲むのは気持ち悪い。
あとprintf覚えようね。
932nobodyさん:2007/01/26(金) 21:03:20 ID:???
>>922 の文章は、複数の質問が1つのページにあるのか、
それとも1つの質問が書かれた複数のページがあるのか、はっきりしない。

前者なら、全ての質問について、選択肢をキーとしたハッシュでも作って集計すればいい。
後者なら、hidden フィールドでも使って、前ページまでの集計結果を覚えておけばいい。
933nobodyさん:2007/01/27(土) 10:46:19 ID:F/NZnu0B
perlでBBS作ろうと思っているのですが、
お薦めのBBS向けのフレームワークとかご存じでしたら教えてもらえませんか?
934nobodyさん:2007/01/27(土) 11:18:07 ID:???
CGI.pmとテンプレート系モジュールがあれば十分じゃない?
935nobodyさん:2007/01/27(土) 11:29:54 ID:???
printfなんか使ったことが無い俺は勝ち組?
今度使ってみるかなぁ。
つっても、%ndぐらいしか使わなそうだけど。
936nobodyさん:2007/01/27(土) 11:34:36 ID:???
オレもデバッグのとき見やすくするときぐらいしかprintfって使うことないよ
937nobodyさん:2007/01/27(土) 11:39:50 ID:???
sprintfなら使う
938nobodyさん:2007/01/27(土) 13:38:26 ID:???
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
なんて書くくらいなら
printf("1は%d、2は%d、3は%d", $one, $two, $three);
の方が見やすいと思う。もしクォートの対応間違えてSyntax Errorになったら
探すのめんどいから。あとは、
printf("1は%d、2は%d、3は%d", @total{qw(one two three)});
のように書けるとき便利。
939nobodyさん:2007/01/27(土) 16:26:34 ID:???
C言語から入ったような人だと、どの言語でもprintf系を使いたくなるらしいからなあ。
いや俺の話だけど。
940nobodyさん:2007/01/27(土) 16:31:24 ID:???
print "1は$one、2は$two、3は$three";
941nobodyさん:2007/01/27(土) 17:46:05 ID:???
>>938
>>940を見習え。
942 ◆TWARamEjuA :2007/01/27(土) 18:21:50 ID:??? BE:4900695-BRZ(6761)
${one}
って書いた方が無難かもかも。。
943nobodyさん:2007/01/28(日) 07:39:42 ID:???
>>941
>>940 の方が意図しない挙動が起こらないからいいだろ。
0100 をプリントしたい場合
perl -e 'printf "%d", 0100 '
perl -e 'printf "%d", "0100" '
perl -e 'printf "%s", "0100" '
perl -e 'printf "%s", 0100 '
perl -e 'print "0100"'

まあ、printf "%04d", "100" 使えって云うんだろうけど。
944nobodyさん:2007/01/28(日) 08:28:12 ID:???
>>924>>938は0100をプリントしたいんじゃなくて100をプリントしたいのは明らか。
だから>>940でOK。
945nobodyさん:2007/01/28(日) 23:19:16 ID:???
CGI::Upload.pmを使ってるんですが
ファイルを保存する方法がわかりません。
どうすればいいんでしょうか?
946nobodyさん:2007/01/28(日) 23:26:29 ID:???
CPANのマニュアル見てください
947nobodyさん:2007/01/28(日) 23:35:50 ID:???
マニュアルには保存のことまで書いてないです
948nobodyさん:2007/01/29(月) 01:45:42 ID:???
書いてあります。ちゃんと見てください。
949nobodyさん:2007/01/29(月) 17:40:11 ID:???
for(1..4){
if($pObj->ping($host, $timeout)){
print "$host is running.\n";
} else {
print "$host is not running.\n";
}

PINGが4回送信成功したらall complete
四回とも失敗したときにnot reaction
としたいのですがどこに制御文足せば良いのか教えてください。
950nobodyさん:2007/01/29(月) 18:37:35 ID:???
失敗したときのカウント数えれば?
951nobodyさん:2007/01/29(月) 18:45:09 ID:???
成功したときのカウント数えれば?
952nobodyさん:2007/01/29(月) 19:25:53 ID:???
いっそ成功なら 1失敗なら-1
4か-4かで判断汁
953nobodyさん:2007/01/29(月) 21:11:48 ID:???
>952の方法そのままだと、
「3回目の試行で全成功」と「4回試行して1度失敗」の区別が付かないような。

まあ、目的次第か。
954nobodyさん:2007/01/30(火) 01:25:19 ID:???
書かれてる要件では「lostなし」「全lost」のどっちかがわかればよさそうだから
その辺の区別はできなくてもいいんでない?

「どうカウントして条件分岐させればスマートか?」という質問じゃなくて
「どこに制御文を足せばいいのか?」なだけに、
みんなが書いた回答では片づかないような気配を感じる。
955949:2007/01/30(火) 11:19:12 ID:???
>>954
そうですね
自分としては9同じような意味で書いたつもりだったのですが
書き方的に悪かったのかもしれません。
956nobodyさん:2007/01/30(火) 15:45:46 ID:???
サーバーがC++ winsockでクライアントがPerlなのですが、
クライアント側でソケットをcloseすると、なぜかFD_CLOSE
が2回届いてしまいます。

特に支障はないのですが、これって正常なんでしょうか?
957nobodyさん:2007/01/30(火) 16:05:16 ID:???
ソースを見直しなされ
958nobodyさん:2007/01/30(火) 22:21:54 ID:???
>>948
見てるものが違うのかやっぱり書いてなかったけど
ソースを見て、ぐぐってわかりました。
959nobodyさん:2007/01/30(火) 22:24:11 ID:???
ヒント:バッファリング
960nobodyさん:2007/02/01(木) 18:34:00 ID:uO0f4S6q
クッキー読み書きのサンプル探してます。
どこかにないですか?
961nobodyさん:2007/02/01(木) 18:42:55 ID:???
>>960
けんと
962nobodyさん:2007/02/02(金) 20:55:17 ID:???
@log = ('AAA,100,aaa','BBB,200,bbb','CCC,300,ccc');
@data = ('bbb','ccc');
$num = @log;

for($i=0; $i<$num; $i++){
 ($name, $price, $text) = split(/,/, $log[$i]);
 foreach(@data){
  if($text eq $_){
   $name = 'MATCH';
   last;
  }
 }
 push(@newlog, "$name,$price,$text)";
}

このような処理をしたいのですが、
とても効率が悪そうで悩んでます。
調べてみると、grepが利用できないかと思ったのですが、
うまくまとめられません。。どなたかよい智恵を貸して下さい!
963nobodyさん:2007/02/02(金) 20:58:50 ID:???
すみません。
>push(@newlog, "$name,$price,$text)";

push(@newlog, "$name,$price,$text");
です・・
964nobodyさん:2007/02/02(金) 22:52:58 ID:???
>>962-963
# usage> perl this_script 2 bbb ccc
my($pos, @word) = @ARGV;
my $regex = join '|', map quotemeta, @word;
$regex = qr/(?:$regex)/;
my @matched;
(split /[,\n]/, $_, $pos + 1)[$pos] =~ /^$regex$/ && push @matched, $_ for <DATA>;
print @matched;
__END__
AAA,100,aaa
BBB,200,bbb
CCC,300,ccc
DDD,400,ddd
965nobodyさん:2007/02/03(土) 00:12:45 ID:???
>>964
感謝です!応用してやってみます。
ありがとうございました。
966nobodyさん:2007/02/05(月) 20:49:02 ID:???
$text = 'abc';

$s1 = \$text;
$s2 = \'abc';
$s3 = \('abc');
$s4 = \('abc', 'def');
$s5 = \($text = 'def');

$s1〜$s5は全部スカラーのリファレンスになったのですが
$s4とかが配列にならないのは何故なんでしょうか?
夜も眠れません(>_<)
967nobodyさん:2007/02/05(月) 21:05:53 ID:???
>>966
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html#Making_References

> 列挙リストに対するリファレンスを取るということは、ブラケットを使うことと
> 同じではないということに注意してください。これはリファレンスのリストを
> 生成することと同じなのです!
>
>  @list = (\$a, \@b, \%c);
>  @list = \($a, @b, %c); # 同じこと!
>
> 特殊な場合として、\(@foo)は@fooの内容へのリファレンスのリストを返し、
> @foo自身へのリファレンスは返しません。これは%fooと似ていますが、
> キーのリファレンスがコピーに対するものである点が異なります(これは
> キーがfull-fledgdスカラーではなく単なる文字列であるためです)
968nobodyさん:2007/02/07(水) 20:39:01 ID:???
>>967
勉強になりました
969nobodyさん:2007/02/08(木) 15:49:20 ID:???
$i=1;のときに
print "$iueo";の出力結果を1ueo
と表示するために$iを何かで囲めば良かったと記憶しているんですが度忘れしてしまいました。
すみませんが教えて下さい。調べるキーワードでも結構です。
970nobodyさん:2007/02/08(木) 15:52:51 ID:???
${i}ueo
971nobodyさん:2007/02/08(木) 15:57:13 ID:???
>>970
即レス感謝!
ありがとう!!
972nobodyさん:2007/02/08(木) 16:53:49 ID:???
LWPでhttpsのページを取り込みたいがうまくいかない。
ぐぐって見つけたページ
ttp://blog.livedoor.jp/hakin/archives/50690272.html
によるとCrypt::SSLeayが必要だそうで、
そのページどおりにppmでインストールしようとしたんですが
Crypt::SSLeay自体が無いようでインストールできません。
環境はWin2000+Activeperl 5.8.8.817 です。

何か手段はありませんか?
973nobodyさん:2007/02/08(木) 17:09:57 ID:MLG2+XR4
ActivePerl5.8.8にてNet::Pingを利用した鯖死活監視CGIをコーディング予定です。
必須事項として、レスポンスmin/maxから算出したアベレージが必要です。
コマンドプロンプトからの実施時のようにレスポンスを採りたいのですが、Net::Pingにはこのよいな実装がないのでしょうか?
かなり検索はしたのですが、レスポンスタイムの取り方を解説している場所がありませんでした
何か良い方法が有ればご教授下さい。
974脱帽:2007/02/08(木) 17:29:34 ID:???
お久しぶり。

>>972
うちは
 ppm install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
でインストール出来たけど。

>>973
hiresメソッドは使ってみた?
975nobodyさん:2007/02/08(木) 17:35:33 ID:???
Net::PingのマニュアルのSYNOPSISのところにある

# High precision syntax (requires Time::HiRes)
$p = Net::Ping->new();
$p->hires();
($ret, $duration, $ip) = $p->ping($host, 5.5);
printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n", 1000 * $duration)
if $ret;
$p->close();

が応答時間をとる例そのものずばりじゃないか。何回かやって平均/max/minとる
ところは自分で書いてください。そのくらいはできるだろ。
976nobodyさん:2007/02/08(木) 18:43:10 ID:MLG2+XR4
>>974-975
ありがとうございますm(__)m
>>975さんの方法で無事解決しました。
勉強不足ですね、申し訳ない。
977あっこ:2007/02/08(木) 19:23:45 ID:LIdpjyEo
http://docomo-camera-ne.jp/zeidoroom/20070208192133.jpg
ソース教えてもらえませんか?
978nobodyさん:2007/02/08(木) 19:37:58 ID:???
とりあえずおっぱいうp
979nobodyさん:2007/02/08(木) 19:45:50 ID:???
>>977
&kouyaku()の中身が知りたいという事か?

1から$num1と$num2の小さい方までをforで回して
$num1と$num2が両方割り切れるようならその値をリストに追加、
最後にリストをまとめて返すというだけの処理。

この程度のソースが書けないのは素人どころのレベルじゃねーぞ。
とりあえず>>1を100万回読み直して自作のソースを晒せ。
980nobodyさん:2007/02/08(木) 20:43:36 ID:???
違うよ。

1.両方の数字を因数分解
2.両方に共通する因数を抜き出す
3.それらの組合せの全て出す
4.各組合せの乗算を算出
5.重複した値を除いて、「1」とそれらの値を画面出力
981nobodyさん:2007/02/08(木) 21:16:53 ID:???
intとハッシュでおk
30秒で出来た
982nobodyさん:2007/02/08(木) 21:39:49 ID:???
こんな時こそデータベースだろッ!
983972:2007/02/09(金) 12:39:36 ID:???
>>974
出来ました!
あ(・∀・)り(・∀・)が(・∀・)と(・∀・)う!
984nobodyさん:2007/02/09(金) 16:40:43 ID:bT11nyvb
ハッシュ配列においてpushという命令使用できないのでしょうか?
985nobodyさん:2007/02/09(金) 16:53:16 ID:???
>>984
できない……が、同じ事を考えた人は居る。
ttp://blog.livedoor.jp/tetryl/archives/6741666.html
986nobodyさん:2007/02/09(金) 21:07:51 ID:???
オブジェクトへ配列のリファレンスを渡すと、何故かリファレンスではなく
展開されたデータが渡ってしまうのですがなぜでしょうか?

@a = qw(a b c d);

$obj->hoge(\@a);

sub hoge{
my $self = shift;
my $ref_array = shift;
print $ref_array;
}

こうするとなぜか「ARRAY(0x275cc8)」
といったアドレスデータではなく、「a b c d」と勝手に展開されたものがプリントされてしまいます。
987986:2007/02/09(金) 21:19:14 ID:???
すみません、試行錯誤してたら自己解決しました。
デリファンスを
@a = @$ref_array;
ではなく、
@a = @{$ref_array};
とやったらうまくいきました。
なぜそうなのかはわかりませんが・・・
988nobodyさん:2007/02/09(金) 23:20:06 ID:???
>>987
そもそもお前が986で示したプログラムにはそんな部分はないわけだが。
ちゃんと正確に晒さないと的確な回答は得られないと思われる。
989nobodyさん:2007/02/10(土) 18:29:35 ID:???
次スレ待ち保守
990nobodyさん:2007/02/10(土) 20:48:15 ID:???
991nobodyさん:2007/02/11(日) 05:04:06 ID:???
>>990
乙!

さて、埋めるぞ!
992nobodyさん:2007/02/11(日) 14:36:41 ID:???
use Perl6::Say;

say '埋め';
993nobodyさん:2007/02/12(月) 00:00:32 ID:???
use CGI::SOSHI;
use strict;

my $stop = CGI::SOSHI->new;
print $stop->soshi();


阻止!
994nobodyさん:2007/02/12(月) 00:01:34 ID:???
use BBS::WWW2ch;
write_thread 'php', '164519503', '梅';
995nobodyさん:2007/02/12(月) 04:45:55 ID:???
機械よ 産め!
996nobodyさん:2007/02/12(月) 05:09:21 ID:???
久米
997nobodyさん:2007/02/12(月) 12:40:25 ID:???
use CGI::SUSHI;
998nobodyさん:2007/02/12(月) 16:42:45 ID:???
うめうめ
999nobodyさん:2007/02/12(月) 17:30:16 ID:???
松竹梅
1000nobodyさん:2007/02/12(月) 18:04:59 ID:???
1000!

次スレ
Perlコーディング初心者質問スレ Part 54
http://pc10.2ch.net/test/read.cgi/php/1171102883/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。