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

Perl コーディング初心者質問コーナー Part37

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/22 01:41ID:???
Perlのコーディングで困ってる人のスレです。
誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。

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

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

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

過去ログやお勧めサイトは >>2-10
0052nobodyさん04/08/24 19:18ID:???
>>51
お前のPCで
「ちゅう」
って打って変換したら常に初めに「厨」になるんだろうな・・・・・
0053nobodyさん04/08/24 19:36ID:???
>>52
なるけど、何か?
0054nobodyさん04/08/24 20:50ID:???
>>49
mime_plsはRFC2047を満たさないので自作してますが。
0055いらすま04/08/24 21:03ID:Hn5K2dOO
えーとですね。改造自由な掲示板のソースを手に入れたとですよ。
掲示板の背景の色をかえたいのですが、どうしたらよいので??
0056nobodyさん04/08/24 21:09ID:???
>>49
オレはIM::Iso2022jp使ってる
0057nobodyさん04/08/24 21:42ID:???
>>55
サングラスをかけろ
0058nobodyさん04/08/24 21:48ID:???
>>55
まずは、あちこちの板に駄スレを立てまくるのをやめれ。
0059nobodyさん04/08/24 22:30ID:???
おまえらJcode使えない環境か?
ってまあ74バイト区切りで改行いれなきゃいけないとか面倒なことがあってそれだけじゃたりないんだっけ?

フォームメールなんて作ったことないからわからんなw
0060nobodyさん04/08/24 23:08ID:???
>>57
でっ、できる・・
0061nobodyさん04/08/24 23:20ID:???
ここはナイスな回答者が揃っていて好き
0062nobodyさん04/08/24 23:48ID:???
>>57
それじゃあ背景以外も変わっちまうだろボケェ!
おまいはセンスはいいんだが、いつも後一歩だな。
0063nobodyさん04/08/25 00:17ID:???
おいおい ちょーまじれす
0064nobodyさん04/08/25 00:40ID:???
おまいらPerlの場合ってモジュールとただのライブラリってどっちがいいと思う?
最近オブジェクト指向でモジュールを1個作ってみたんだけど、確かに再利用性は高いし
インターフェースだけ覚えとくだけで便利なのは間違いないけど、それってライブラリもそんなに大差ないよね。
ライブラリの方が手軽だしさ。

まあDBIくらいになるとオブジェクト指向の方がいいんだけど、みんなはどんな感じで使ってる?
やっぱ小中規模であれば、1個モジュール1個ライブラリってのがいいと思うんだけどさ。
0065nobodyさん04/08/25 00:48ID:???
サブルーチンを再利用したいなら、普通の関数呼び出しのライブラリの方が手軽でいいかも。
メインルーチンを再利用したいなら、クラスモジュールにしとく方が有利かも。
0066nobodyさん04/08/25 01:06ID:???
>>65
ほう!そうゆう考え方が主流なのね。

基本的にある程度の振る舞いをもったオブジェクトが欲しい時とか
一貫性のある処理でそれだけで独立させたいときがムジュール。

ちょっとこれだけ再利用。みたいなものの集まりをライブラリとするってのが賢いよね。

ボンジュ〜ル?
0067nobodyさん04/08/25 01:17ID:???
オブジェクトだろうと、関数の集まりだろうとモジュール。。。
0068nobodyさん04/08/25 01:20ID:???
>>67
頭固いよ。。。
0069nobodyさん04/08/25 10:09ID:piXV00NL
画像のカウンタプログラムを書いていますが、
画像連結ライブラリを使うと本当に読み込みが早くなるのでしょうか?
返答よろしくお願いします
0070nobodyさん04/08/25 10:13ID:???
何故試さん
00716904/08/25 11:23ID:???
調べたり、テストしたりしましたが、わかりません
0072nobodyさん04/08/25 11:24ID:???
画像連結ライブラリって、内部でGIFを連結してprint OUTで一気に出力するアレでしょ?
カウンタなんて小さい画像の集まりだから、HTTPヘッダによるオーバーヘッド分がなくなるだけでも有利でしょうな。
大きな画像連結なら負荷やメモリを気にするところだが。

Perlの手始めは向いてるね。カウンタ。
00736904/08/25 11:27ID:???
>>72
ありがとうございます。失礼ですが、もしPHPだといったいどうなのでしょうか?
0074nobodyさん04/08/25 11:34ID:???
いっしょだよ
0075nobodyさん04/08/25 11:36ID:???
テストしたいんだったら、1000ファイルくらい画像連結させて比較すれば差がでるんじゃないの。
00766904/08/25 11:37ID:???
>>74,75
ありがとうございます
0077nobodyさん04/08/25 11:40ID:???
っと、1000ファイルすべて違うファイル名にしないと意味ないけどさ。ブラウザにはキャッシュというものがあるからね。
0078nobodyさん04/08/25 12:39ID:???
>>69
お前みたいにくだらない部分にこだわるやつに限ってゴミソースで重かったりする。
だまってテーブルレイアウトやめればそんなくだらない差は気にならなくなる。

ついでに言うと連結処理あり、なしのベンチとってそれもちゃんと考慮に入れろや。
0079nobodyさん04/08/25 18:46ID:???
>>75
1000ファイルもあると I/O のコストの方が高くならない?
逆にHTTPサーバーの方のキャッシュが期待できる連結なしの方が早くなりそうだし、
最適化の仕方次第で結果が代わったりするんじゃないかな。(予想だけど
ベンチマークとるなら実際の運用環境に近い条件でやらないと意味がないと思う

>>69
GIF画像の連結はやったことないので、一般的な回答になるけど。
アルゴリズムの優劣とかならはっきりとした一般答がでるかもしれない、
でも、こういった、環境や実装に大きく依存するベンチマークは自分でとらないと役にたたない。
画像連結の方法だけとってみても、perlでやるのか、ライブラリか、外部プログラムに頼るのかで結果が代わってくるはず。

0080nobodyさん04/08/25 18:59ID:???
>>77
この場合、キャッシュは考慮すべきといっても、offにすべきではないと思う。
連結なしの場合、httpヘッダでcache controlや期限を適切に設定していれば、
ファイルを送る必要はなく文字列出力だけで済む事もあるのだから。

クライアント数とアクセス数を分けて考えてテストする必要がある。
(再訪問者が多い場合にクライアント側のキャッシュの効果が期待できる)
0081nobodyさん04/08/25 19:21ID:???
ほしゅあげ。

http://pc5.2ch.net/test/read.cgi/php/1060009605/l50
0082nobodyさん04/08/25 19:25ID:???
↑
(;・∀・)また、騙されたの?
ttp://pc5.2ch.net/test/read.cgi/php/1060009605/

% kill -9 81 || kill -9 81 || kill -9 81
% killall -TERM me
0083nobodyさん04/08/25 23:12ID:???
>78
今回に限って言えば、ベンチは意味が薄いのではないだろうか。
サーバとの経路とかでも結果が大きく変わるだろうし。
0084nobodyさん04/08/26 00:15ID:???
クライアントから一回だけ要求を受け取って、
2種類のレスポンスを返す方法ってありますか?

例えば
GETで要求されたURLの応答に
200 OK
を返した直後にクライアントとの接続を閉じずに
304 Not Modified

を返せるような。
どなたかお知恵を貸してください。お願いします。
0085nobodyさん04/08/26 00:19ID:???
>>84
無理。
どういう理由でそういうことをしたいのかを明確に書けば別解のアドバイスが出てくるかも知れず。
でも、ここはperlコーディングスレなので、webprog 初心者スレの方がいいんじゃないかな。
0086nobodyさん04/08/26 00:25ID:???
>>85
そっちできいてみます。ありがとうございます。
0087nobodyさん04/08/27 07:40ID:gO3gmMRy
SSIで、9桁の乱数を生成して表示するスクリプトはどのようにして
作ればよいのでしょうか?
例えばどこかのhtmlから<!--#exec cmd="ransuu.cgi"-->を呼び出すと
253145968や040104580とかランダムな9桁の数値を返すものです。
全くの初心者で困っています。教えて下さい、お願いします。
0088nobodyさん04/08/27 07:52ID:???
rand;rand;printf "Content-type: text/plain\n\n%09d",rand(10**9);
00898704/08/27 08:43ID:???
>>88
本当にありがとうございます!!!!!!!!
0090nobodyさん04/08/27 10:01ID:???
>>83
遅レスだけど、ベンチはローカルでやるのが普通だろ。
0091nobodyさん04/08/27 10:16ID:???
>>88
あたまでrandを2回呼んでるのはなぜ?
00928804/08/27 15:08ID:???
3回目のrandが返す値が好きだからー!!
0093nobodyさん04/08/27 17:15ID:???
<FORM method="POST" action="hogehoge">
<INPUT type="submit" name="Reload" value="再読込">
</FORM>
こんな感じでホームページに設置されているボタンを押すPerlスクリプトって作れないでしょうか。
0094nobodyさん04/08/27 17:51ID:???
>>93
そのスクリプトの用途を聞かせ願えないか?
0095nobodyさん04/08/27 18:07ID:???
すみません。物騒な聞き方でしたね。
こういう感じのサーバなのです

1.FTPサーバーに管理ファイルをアップする。
2.社内のローカルホスト(http://192.168.0.200:8080/reload.html)にアクセスして更新ボタンを押して更新完了
3.上記をファイルの数だけ繰り返す

私のところに1の管理ファイルがバイトから1日10件くらい集まるので、
これをいちいちアップして更新して・・・というのは、かなり面倒なのですが、
社内鯖の仕様を変更するのは問題があるので、自動でアップ処理してくれるスクリプトを組もうと思った次第です。
最終的には

1.設定フォルダ内のファイルを社内鯖にアップする
2.更新ボタンを押す
3.これを毎朝9時に行う

ということをしたいのです。
0096nobodyさん04/08/27 18:17ID:ScoK2mkg
>>95
対策@私の場合
1.バイト君にFTPサーバーの特定のディレクトリにファイルをうpするように指示をする。
2.その特定のディレクトリを監視するスクリプトを、例えばcronで1時間ごとに起動して、
  ファイルが存在すれば何らかの更新作業をさせる。
3.私は他の作業をする。
0097nobodyさん04/08/27 18:17ID:???
ボタンを押すというのは難しいから、そのデータPOSTを自前でやった方が良いと思われ。
0098nobodyさん04/08/27 18:50ID:???
へたれですみません。どうやったらいいんでしょうか > データPOST
0099nobodyさん04/08/27 18:53ID:???
getではだめなの?
getならリクエスト1個で終わるんだけどね
0100nobodyさん04/08/27 19:08ID:???
Net::FTPとLWPがあればささっと書けそうだけどな。
0101nobodyさん04/08/27 19:14ID:???
>>97
ボタンを押すほうが簡単じゃないでしょうか??
01029304/08/27 19:15ID:???
とりあえずFTPのところは書き上げて、手元で動かす分には問題ない程度に動いてます。
WWWは扱ったことがないので、ぐぐって勉強してます。

>96
支給されてるクライアントがNTなので、タスクマネージャーで実行しようと思ってます。

>99
サーバ側の仕様には手を出せないのでPOSTでがんばってます。

>100
ttp://member.nifty.ne.jp/hippo2000/perltips/LWP.html
これでいいんでしょうか? 入手してみます。
0103nobodyさん04/08/27 20:43ID:???
LWPで普通に出来ないか?
0104nobodyさん04/08/27 22:09ID:ScoK2mkg
>>102
> 支給されてるクライアントがNTなので、タスクマネージャーで実行しようと思ってます。
ではそれで毎日9時に動くようにすれば?
でもってなぜCGIが必要なんだろう?
確認ならばメールで通知、返信すれば自動で更新作業させるなりと方法はあるのに。
0105nobodyさん04/08/27 22:28ID:???
なんで「ボタンを押す」ことが必要なのだろうか。
ブラウザ立ち上げておかないといけないし、強制終了してしまっていたら立ち上げなおしたりしなきゃいかんし。
0106nobodyさん04/08/27 22:34ID:???
>104-105
おまえら少しは文章を嫁
01079304/08/27 23:10ID:???
お世話になっております。

ttp://digit.que.ne.jp/work/index.cgi?Perl%a5%e2%a5%b8%a5%e5%a1%bc%a5%eb%2fLWP#i5

この辺りを読んで解決しました。また1つ賢くなれました。ありがとうございました。
0108nobodyさん04/08/28 00:00ID:???
>>106=意味不明
0109nobodyさん04/08/28 02:17ID:???
どっちにしろ>>95を信じたやつは(ry
0110nobodyさん04/08/28 13:06ID:???
>>101
ボタンを押すのが簡単ってのは人間が操作する場合で、プログラムにとっては、POSTリクエスト送る方が簡単。
プログラムでそういったことをエミュレートしたいなら、ブラウザのオートメーションを調べてみるといい。

冗長になるは言うまでもないけど。一応フォローしておくと、
HTTPの仕組みを知らない人にとってはこっちの方がコードが簡潔だったりする、
ちょっとした用途にスクリプトを書く場合でもコードを大幅に節約できるといった利点がある.
0111nobodyさん04/08/28 17:38ID:???
なんでもいいから犯罪者にアドバイスはヤメレ
0112nobodyさん04/08/29 22:39ID:???
検索CGIを作っているのですが、
エスケープが必要な文字の検索で詰まってます。

$str =~ s/($key)/<$1>/g;

こんな感じで、ヒットしたキーの前後に文字を追加してるんですが、
これだと、正規表現の文字(ドット. や プラス+ )自体を検索することが
できません。

何かいい方法ありますでしょうか
0113nobodyさん04/08/29 22:53ID:???
>>112
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq6.html#How_do_I_match_a_pattern_that_is
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlre.html
http://perldoc.com/perl5.8.4/pod/func/quotemeta.html
011411204/08/29 23:11ID:???
>>113

ありがとうございます!
quotemetaなんて便利なものがあったんですね。
0115nobodyさん04/08/30 10:02ID:???
0116nobodyさん04/08/30 10:28ID:???
そういえば、ひさびさPerlスレ見た
0117nobodyさん04/08/30 13:20ID:WEq7wEdz
@data = split(/\//, $_);

"/" でセパレートされた文字列を分解してそれぞれ配列に入れたいのですが、
どうすればいいか教えてください。
0118nobodyさん04/08/30 13:27ID:???
>>117
?
0119nobodyさん04/08/30 13:29ID:???
>>118
同意。
0120nobodyさん04/08/30 13:30ID:???
>>118
>>119
どこが?なのでしょうか?
0121nobodyさん04/08/30 13:37ID:???
すいません。
分かりました。。。

>>117の1行目が答えなんですね。(-_-;)
0122nobodyさん04/08/30 17:23ID:???
何が起こったんだ
0123nobodyさん04/08/30 17:29ID:I+lehIeA
すみません、3つ以上の数が等しいかどうか調べたいのですが、
以下のようにやってもエラーになります。
perl -e '$var=1; $var1=1; $var2=1; print "Ok!\n" if ($var==$var1==$var2==1);'
どうやったらいいのでしょうか。おせーてください。

0124nobodyさん04/08/30 17:37ID:???
>>123
and
0125nobodyさん04/08/30 17:41ID:???
>>124
えっと、>>123の場合は、1なので、==をandに代えればできますが、他の数の場合
まずいです。
perl -e '$var=1; $var1=1; $var2=2; print "Ok!\n" if ($var and $var1 and $var2 and 2);'
これでもOk!になってしまいます。
0126123=12504/08/30 17:44ID:???
あそうか、一個ずつandでやるんですね。
($var == 1 and $var1 == 1 and $var2 == 1)
もっと簡単な方法がないかと思ったものですから。
24ケースくらいあるんで書くのたいへん(TT)
0127nobodyさん04/08/30 17:52ID:???
>>126
my @var1 = (3, 3, 3, 3, 3, 3);
my %tmp = (); @tmp{@var1} = ();
print "var1 ", 1 == keys %tmp ? 'ok.' : 'no.', "\n";

my @var2 = (2, 2, 2, 2, 4, 2);
%tmp = (); @tmp{@var2} = ();
print "var2 ", 1 == keys %tmp ? 'ok.' : 'no.', "\n";
0128nobodyさん04/08/30 17:52ID:???
>>126
ループ
0129nobodyさん04/08/30 17:56ID:???
よいこは1 == keys %tmpと書かずにkeys %tmp == 1と書こうね。
0130nobodyさん04/08/30 18:02ID:???
>>129
根拠は?
0131nobodyさん04/08/30 18:47ID:???
読みにくいから
0132nobodyさん04/08/30 19:53ID:???
>>130
比較では不確定なモノを左に書くのが一般的。
これを逆に書くと何となく気持ちが悪い。
それを何とも感じないヤシはセンスが悪い。
0133nobodyさん04/08/30 20:15ID:???
もしその人がバカだったらぶん殴ってやる
もしバカがその人だったらぶん殴ってやる
0134nobodyさん04/08/30 20:58ID:???
CPAN落ちてない?
0135123=12504/08/30 21:04ID:???
>>127
高度な技を伝授いただきありがとうございます。
@tmp{@var1} = ();
というところですが、ハッシュの配列ということでしょうか。
これは、らくだ本にも出ていますでしょうか。今手元にない
のですが。

0136nobodyさん04/08/30 21:07ID:???
定数を左辺に書くと==と=を間違えたときにすぐわかるけどね
0137nobodyさん04/08/30 21:22ID:???
>>135
ハッシュのスライスだね。ぐぐれば出てくるよ。
0138nobodyさん04/08/30 21:23ID:???
>>135
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html
0139nobodyさん04/08/30 21:33ID:c+ZgByNi
$name2が、$name3[0]〜$name3[$i]のどれかの値と一致した場合にある動作をするようにしたいのですが
どうやればよいでしょうか。
0140nobodyさん04/08/30 21:44ID:???
>>136
その言い訳は何年も前に死滅したはずだが?

Found = in conditional, should be == at -e line 1.

頭が化石になってますよ。
0141nobodyさん04/08/30 23:29ID:WEq7wEdz
for(0..10) {
for(0..10) {
・・・・・
}
}

ネストさせると、最初のfor文は$_ですが、中のfor文は何になるのですか?
0142nobodyさん04/08/30 23:32ID:???
>>141
?
0143nobodyさん04/08/30 23:38ID:???
>>141
$_
0144nobodyさん04/08/30 23:50ID:???
>>139
for(@name3){
print"bingo\n" if($_ eq $name2);
}
0145nobodyさん04/08/30 23:59ID:???
>>141
変な質問ですみません。

>>143
ネストしてても一緒なんですか。

for(0..10) {
  for(0..10) {
    $data[$_][$__] = ・・・
    ・・・・・
  }
}

だったらいいなと勝手に思ってました。
そうすると

for(0..10) {
  for($i=0; $i<10; $i++) {
    $data[$_][$i] = ・・・
    ・・・・・
  }
}

とすべきなんですね。
0146nobodyさん04/08/31 00:56ID:???
>>145
for(0..10) {
  for my $i (0..10) {
    $data[$_][$i] = ・・・
    ・・・・・
  }
}
0147nobodyさん04/08/31 04:35ID:nQH60qUM
truncateについて教えてください。
winxpにversion 5.005_03 built for MSWin32-x86-objectですが、思ったとおりにtruncateが動作しません。

open(FILE,'>aaa.txt');
print FILE "aaaaaaaa";
seek(FILE,0,0);
truncate(FILE,0);
print FILE "bbbb";
close(FILE);

これは、思ったとおりに動きます。aaa.txtは「bbbb[eof]」の4バイトになります。

$aaa='FILE';
open($aaa,'>aaa.txt');
print $aaa "aaaaaaaa";
seek($aaa,0,0);
truncate($aaa,0);
print $aaa "bbbb";
close($aaa);

これは、なぜか「bbbbaaaa[eof]」の8バイトになります。
seekは正しく機能して、truncateは機能していないからこの結果だと思うのですが、なぜ機能しないのでしょうか。
上の例を見ても、truncate機能自体はあると思うのですが・・・
0148nobodyさん04/08/31 05:22ID:???
>>147
お前が馬鹿だから
0149nobodyさん04/08/31 06:56ID:???
truncate($aaa,0) or die $!;
0150nobodyさん04/08/31 07:11ID:???
>>147
$aaa='FILE'; → $aaa = *FILE;
015114504/08/31 08:36ID:???
>>146
ありがとう。
もとめていたスマートなコードです。
■ このスレッドは過去ログ倉庫に格納されています