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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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
ありがとう。
もとめていたスマートなコードです。
0152nobodyさん04/09/01 00:24ID:IFM26Jlf
だれか教えてください。
ダウンロードというボタンをおしたら、CSVがダウンロードできる仕組みにしたいです、
0153nobodyさん04/09/01 00:39ID:???
>>152
途中でやめるなよ
0154nobodyさん04/09/01 00:58ID:???
>>152
してください
0155nobodyさん04/09/01 01:15ID:IFM26Jlf
すまん。152だ。

だれか教えてください。
ダウンロードというボタンをおしたら、CSVがダウンロードできる仕組みにしたいです。

が正解でした。といううことでおしえてください
0156nobodyさん04/09/01 01:23ID:???
>155
教えてやろう。
PerlもCGIも使わなくてもできる。
よって板違い。
0157nobodyさん04/09/01 01:47ID:IFM26Jlf
156よ。よく考えれば単にリンクを張ればよいな。アドバイスあんがと
0158Pearl04/09/01 01:56ID:???
print <<"END";
...
END

と終端文字列を記述すると何も表示されないのに、

print "...";
print <<"END";
...
END

とすると表示されます。(print"...";の内容は表示されません)
これは何故なんでしょうか??
初心者ですいません…。
0159nobodyさん04/09/01 02:16ID:???
そこより前のコードで"が開きっぱなしと見た。
0160nobodyさん04/09/01 12:01ID:VNRqZmig
perlでのoop時の属性についてなんですが、
hashでの実装、use fieldsでの実装
どちらがいいんでしょうか?
fieldsのが便利だと思うんですが、
内部でpseudo-hashを使ってる?らしく
pseudo-hashは今後推奨されなくなるようで
その辺り困ってます。
--------------------------------------
sub new {
my( $class, $name, $height ) = @_;
my $this = {
'name' => $name,
'height' => $height
};
bless $this, $class;
}
--------------------------------------
use fields qw( name height );
0161nobodyさん04/09/01 12:17ID:???
>>160
5.9.0以降ではpseudo-hash使わない実装に変更されたので
普通に使う分には問題ないんじゃなかったっけ。内部の
phash直接触るような行儀悪いプログラム書いてりゃ別だけど。
0162nobodyさん04/09/01 12:33ID:VNRqZmig
>>161
ありがとうございます!
なるほど、確かに、phashを直接使うなみたいな事は書いてありました。
perl6になったらこの辺も変わりそう?ですし、
perl5では、これでいいってことで!
0163nobodyさん04/09/01 18:16ID:GIk9V8QY
sendmailを使ったプログラムを作ってるんですが、どうやらメールの件名に
日本語を使う時には特別な処理が必要なのですね。

今いろいろなサイト見てますが、皆さんのオススメの解説サイトがありましたら教えてください。
おながいしますm(_ _)m
0164nobodyさん04/09/01 18:28ID:???
特別な処理???
メール送信の基本はperlに限ったことではないが
0165nobodyさん04/09/01 18:41ID:???
>>163
解説サイト?

無いよ。
嘘だと思うんなら自分で探してみ?
016616304/09/01 19:59ID:GIk9V8QY
>>164
件名の分だけ他とは違うエンコードをしないといけないという意味です。
>>165
そうなのです。あまりいいところが見つからないのです。
実際のサンプルソースとかを載せながら解説してるサイトがあるといいなと思ったのですが;
0167nobodyさん04/09/01 21:10ID:???
RFC嫁
0168nobodyさん04/09/01 21:49ID:Fq5X9xKH
print "Location: http://www.yahoo.co.jp/\n\n";
上記のコードでリダイレクトさせる前に
htmlタグを読み込ませたいと思います。

<IMG SRC="http://www.hogehoge/test.cgi" width=1 height=1>
例えば上記のようなタグを読み込ませたい場合、
どのようにコードすればいいのでしょうか?

おながいします



0169nobodyさん04/09/01 22:00ID:???
>>166
お勧めサイトは(・∀・)ココダ!!
ttp://www.ietf.org/rfc/rfc2047.txt

>>168
うーん。
> width=1 height=1
リダイレクトした「数」をカウントできればいいというわけではないの?
0170nobodyさん04/09/01 22:06ID:3SqQ1yBx
$hoge = file( "http://www.hogehoge/test.cgi" );
print "Location: (p)http://www.yahoo.co.jp/\n\n";
0171>>16304/09/01 22:26ID:5tu92ZqP
$subj = Jcode::convert(\$subj, 'jis');
$subj = MIME::Words::encode_mimeword($subj, 'B', 'iso-2022-jp');
0172nobodyさん04/09/01 22:38ID:???
>>171
今時Jcodeなんて教えるなよ
0173nobodyさん04/09/01 22:39ID:???
今5.8のサーバは少ないだろ。。つーか、ほとんど無いと思われ。
017416804/09/01 22:51ID:Fq5X9xKH
>>169-170

レスありがとうございます。
そうですね、数をカウントできればいいというわけではないです。

$hoge = file( "http://www.hogehoge/test.cgi" );
これについてなんですが、
http://www.hogehoge/test.cgi の部分に変数を用いたい場合、
どんな感じになるでしょうか?初歩的な質問すいません。
http://$variable.com/test.cgi のようなURLにしたいのですが。
$hoge = file( "http://$variable.com/test.cgi" );
で変数として扱われるんでしょうか?
017516304/09/02 01:14ID:hfUgeMHv
>>169
英語よめません;
>>171>>173
>$subj = MIME::Words::encode_mimeword($subj, 'B', 'iso-2022-jp');
これって5.8でないと駄目なんですか?使用サーバのperlは5.6ですが。
後、このモジュール?ライブラリ?ってRFC2047の
1.encoded-word は 75バイト以内でなければならない.
2.encoded-word を含む行は 76バイト以内でなければならない.
をクリアしてないですよね?PERLメモ読んでて、とりあえずBASE64エンコードは
なんかのモジュールでやるとしても1と2をどうしようかと迷ってます。

みなさんはちゃんと1と2に対応したサブルーチン等を作ったりしてるんでしょうか?
■ このスレッドは過去ログ倉庫に格納されています