Perlコーディング初心者質問スレ Part 38
(´-`).。oO(LWP を open に override してくれる神の光臨待ち。。。)
>>361 そういうライブラリはあればあったで便利かもしれんな。
package LWP::Open;
use base 'EXPORTER';
use LWP::Simple;
our @EXPORT = ('open');
sub open{
}
ここまで書いた後は頼んだ
>>364
use LWP::Simple;
use subs qw(open);
*open= sub { get($_[0]); };
$url="
http://www.hogehoge/";
$data= open($url);
365 :
nobodyさん:04/10/28 01:47:21 ID:GkfPSbvy
たびたび申し訳ないが、ちょっと教えて下さい
ハッシュのリストを作ってはみたものの
どうやってサブルーチンから出せばいいのかわからなくなりました。
sub XXX{
…
push @{ HoA{key_name} }, "value1", "value2";
…
return (??????);
}
このような場合ってどうやってリターンすれば宜しいでしょうか??
366 :
nobodyさん:04/10/28 02:07:20 ID:GkfPSbvy
というか、リストのハッシュと言ったほうがよさそうだ。
>>365 先にサブルーチンへリファレンスを渡してからゴリゴリするのが常套かと。
push @{$HoA{key_name} }, "value1", "value2";
こう?
return \%Hoa;
で、
$refHoA->{key_name}->[0]
別にグローバルならrefをreturnしてもいいけど、こうじゃないの?
my %HoA;
&XXX(\%HoA);
print @{$HoA{'key_name'}};
exit;
sub XXX {
my $refHoA = $_[0];
push @{$$refHoA{'key_name'}}, "value1", "value2";
return(0);
}
>>369 そんなことしない
サブルーチンで局所化した変数でもリファレンスを返すと、スコープ外でも変数の内容は維持される。
なんか変な気もするが、そういうものらしい
なんでかはしらない(局所化してもスコープ外で実際に破棄されるわけではない?)
つーか、perlモジュールのコンストラクタは普通に局所化したハッシュをblessしてるし
はじめから無名ハッシュにしとけばいいような。
sub XXX {
my $HoA;
push @{$HoA->{key_name}}, "value1", "value2";
return $HoA;
}
>>370 my宣言した変数は内部に被参照カウンタを持っていて、
それが0にならない限りデータ領域は解放されないです。
サブからリファを返した場合、そのリファを保持する限り
領域も保持され、破棄すると領域も解放されるです。
373 :
365:04/10/28 14:35:37 ID:???
ありがとうございました。みなさま。
どれも有効でしたが、368氏の方法が一番マッチしました。
ありがとうございました。
374 :
nobodyさん:04/10/29 18:08:56 ID:jolcQ+aO
変数名にハイフンは使っていいですか?
今ローカル環境がないのであまり無茶なテストをサーバでしたくないために質問しました。すみません。
アンダースコアは大丈夫なことは知っています。
ハイフンもハッシュのキーになら使えるということも知っています。(クォート必要ですが)
変数名にも使えるのでしょうか?
例)
$a-a = 1;
$aa- = 1;
$-aa = 1;
確か一番下はダメなはず。
宜しくお願いします。
ぐぐった
出てきた
>>374は腹を切って死ぬべきである
376 :
374:04/10/29 18:25:42 ID:jolcQ+aO
>>375 >ぐぐった
>出てきた
だから?ぐぐるのもここで質問するのも同じだろ。
まぁ、ぐぐったら出てくるという回答だとしたら・・・
ありがとうございました。ハイフンは使えないようで。それでは失礼します。
377 :
nobodyさん:04/10/29 18:28:19 ID:oV9k/ZOo
>>376 うわすげームカツクこいつ
マジで死ね 首吊って今すぐ死ねや 糞が
378 :
374:04/10/29 18:39:04 ID:jolcQ+aO
>>377 たかが2ちゃんでの出来事にいちいち本気になるなよ
380 :
nobodyさん:04/10/29 18:46:02 ID:oV9k/ZOo
>>378 ハァ?それが関係あんのか?
更に胸糞悪ぃなてめぇは
381 :
374:04/10/29 18:47:36 ID:jolcQ+aO
385 :
374:04/10/29 18:54:15 ID:jolcQ+aO
>>382 お前が死んだらいいんじゃないか?
自分のために人が何かしてくれるとでも思ってるの?
いい加減自立しろよ、な。
嫌いなやつは「氏ね」なんて理屈は小学生レベルだぞ。
もうすこし大人になったほうがいいんじゃないか、な。
この程度のもんぐらいならテストで作って動かしゃわかるってこった。
$abc=1234
の最後の文字列を消すようにはどのようにすればいいでしょうか?
この場合は、$abc=123にしたいです。
chop
$abc = int($abc/10);
すいません、初心者なんですが教えてください。
登録や削除のできるCGIを作っています。
一つのフォームから、いくつかのsubmitを使って、それぞれ処理を変えたいのですが、
どのようにすればよいでしょうか?
なんとなく、nameを使ったり、受ける側でif文を書けばいいのかな?という感じなのですが、
どうやって、if文でsubmitのnameを受けたり、分岐したりすれば良いのか分からない状態
です。
どうぞ、よろしくお願いします。
>>391 同じ name にして value を見る
>>392 すいません、その書き方が分からないので・・・
if文になるんでしょうか?
突然言い渡された仕事で、何が何だかさっぱりな状況なのでお願いします・・・。
連投になってしまい、すいません
------html-------
<INPUT name=text1>
<INPUT name=text2>
<INPUT name=text3>
<INPUT name=text4>
<INPUT type=submit value="ここ押せ" name=hoge>
-----------------
-------cgi--------
#!/usr/bin/perl
require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*in);
$txt1 = "$in{'text1'}";
$txt2 = "$in{'text2'}";
$txt3 = "$in{'text3'}";
$txt4 = "$in{'text4'}";
&jcode'convert(*txt1,'sjis');
&jcode'convert(*txt2,'sjis');
&jcode'convert(*txt4,'sjis');
処理
---------
こんなもんだろ。
>>394 まずはHTMLから勉強して濃いよアフォ
>>395 アフォに何を言っても無駄だからやめとけ
すいません、perlでテキストファイルを白紙に戻す方法ってあるんでしょうか?
なんかどこをみても載ってない気がする。
truncate
399 :
nobodyさん:04/10/29 22:58:21 ID:buGH5/R1
perlからhtmlファイルを「open」で呼び出した場合、呼び出し元はwebサーバですか?それともクライアント側ですか?
>>374 まあ裸では使えないが${'...'}のかたちにすりゃほとんど
なんでもアリ。
そうまでして使いたいものかどうかはギモンだがな。
${'a-a'} = 1;
${'aa-'} = 1;
${'-aa'} = 1;
print if(m/test/) while(<DATA>);
こんなことはできますか?
やってみれば?
403さんの言われた通りにやってみましたができませんでした。
どこがいけないのでしょうか。
>>405 ありがとうございます。
読んだ上で色々やってみましたが、このような書き方は仕様上不可能のようですね。
お手数おかけしました。
push(array, value) って value 省略したときに $_ 使ってくれないみたいなんですけど、
これって常識ですか?
省略したときに $_ を使うようになる条件て何かあるんですか?
409 :
407:04/10/30 05:22:56 ID:???
短いスクリプトではない場合あんまり暗黙の$_を使わない方がいいと思うよ
411 :
nobodyさん:04/10/30 10:59:58 ID:eCRfKScU
教えてください。
文字列ソートを
@data = sort{(split(/\,/,$b))[2] cmp (split(/\,/,$a))[2]} @data;
としてたものを、文字の数でソートしたいと思い、
@data = sort{(split(/\,/,length$b))[2] <=> (split(/\,/,length$a))[2]} @data;
とやってみましたが、ソートしてくれません。
lengthの位置を色々変えてみましたが、ソートしないかエラーかでした。
どうすれば(この場合)[2]番目の文字数でソートできるのでしょうか。
412 :
nobodyさん:04/10/30 11:13:52 ID:zVFP7DHQ
ファイルアップロードについて教えてください。
環境 -> Linux + Perl5 + cgi-lib.pl
kentさんのjoyfulとか、ほかモジュールを使わないでアップロード機能を
装備しているスクリプトを参考に下記のようにやってみたのですが、
まったくダメダメクンのようです。
ユーザーのファイルを受け取るには、これ以外何をやればよいでしょうか?
どうか教えてください。
$upfile = $in{'img'};
if ($upfile) {
$upfile =~ s/\\/\//g;
$img_file = basename $upfile;
open OUT,">$img_file";
binmode OUT;
binmode STDOUT;
print OUT $in{'img'};
close OUT;
chmod (0666,$img_file);
>>411 @data = sort{length((split(/\,/,$b))[2]) <=> length((split(/\,/,$a))[2])} @data;
>>412 デリミタの処理が一切見当たらない。
enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか?を確認するよろし。
415 :
412:04/10/30 11:39:40 ID:zVFP7DHQ
>>413 参考にしてみます。
>>414 >enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか
File::Basenameで取得したファイル名の中に、ローカルパスが格納されています。
001.jpg -------------------------------------------------------------
C:\Documents and Settings\admin\My Documents\My Pictures\任天堂\001.jpg
---------------------------------------------------------------------
てことは、$in{'img'}をopen DATA,"$in{'img'}";する必要があるってことです?
416 :
411:04/10/30 12:03:05 ID:???
417 :
412:04/10/30 14:08:03 ID:zVFP7DHQ
やはり、よくわからなかったので、おとなしくCGI.pmを使用することにしました。
みなさまありがとうございました。
ここにはファイルのアップを1から書ける人はいないから、
諦めた方がいいね
10文字以上20文字以内で、
英数字が使えて、最初の文字列にのみ数字を禁止するような
正規表現はどのようにすればいいでしょうか?
正規表現難しすぎる・・・。本読んでも頭がこんがら・・・
分かりやすいサイトあったら教えてください
422 :
nobodyさん:04/10/30 20:00:53 ID:M6l56cQx
WinXP + Apache + Perl5 cgiです。
cgiの再起呼び出しは可能なのでしょうか。
cgi上のフォーム で、cgiの一部を書き変えたいのですが。
>>422 そういうのは再帰呼び出しとは言わないような。。。
できるからやってみ。つーかやってみてから書きなはれ。
>>422 そのレベルで自己改変コードは危険すぎる。
つーか、99.999%書換え不要。
フォームからsubmitボタンが1回クリックされるごとに
1 -> 2 -> 3
と変更していく変数$aを作りたいのですが、
どうすればいいでしょうか?
大まかな方法は何となく分かるんですが、
ロック制御などについてよく分かりません。
426 :
nobodyさん:04/10/30 23:39:44 ID:JL00AQ8N
あg
カウンタじゃいけないのか?
428 :
nobodyさん:04/10/31 06:04:57 ID:PbybcUUP
s/(?:abc|bbc)/c/;
と
s/abc/c/;
s/bbc/c/;
とではどっちが速いですか?
429 :
nobodyさん:04/10/31 06:43:53 ID:/9xW7Y/D
<input type="file" name="file">
として、
$query->param('File')
で受け取った値を、同じ(type="file")として別のCGIなどに
渡す事はできないのでしょうか?
調べてみたところ、(type="file")はセキュリティのため、
初期値を設定したりスクリプトで値を操作することが出来ないとされており、
同じ内容を受け渡す事ができず、困っております。
よろしければ、おしえてください。
>>428 自分で試してみようとは思わないのですか?
動作が異なるものを比べても意味無いじゃん。
処理A,B,C,Dがあって、それぞれに対応する変数$a,$b,$c,$d(動作そのものではなく)があります。
これらの対応する変数の大きい順番に処理A,B,C,Dを行いたいのですがどうすれば良いでしょうか?
>>429 出来ないように作られているので出来ない。
出来るようにすると、お前以外の世界中の人が困るようになるので、出来るようには出来ない。
KENT-WEBにあるWeb ProtectというCGIを設置したんですが、
パスワード認証画面が携帯電話(au W11H)で表示することができないです
<tr>
<td class="ent2">
<table border=0 cellpadding=0 cellspacing=5 width="100%">
<tr>
<td colspan=2>$title</td>
</tr>
<tr>
<td>ユーザー名 :</td>
<td><input type=text name=id size=15 value="$cid"></td>
</tr>
<tr>
<td>パスワード :</td>
<td><input type=password name=pw size=15 value="$cpw"></td>
</tr>
<tr>
<td></td>
<td><input type=checkbox name=cook value="1" $checked>
パスワードを記憶する</td>
</tr>
<tr>
<td colspan=2 align=right height=50 valign=bottom>
<input type=submit value=" OK ">
<input type=reset value="キャンセル"></td>
</tr>
</table>
行数足りなくて最後の方ちょっと省略しましたが
これを携帯で表示させるにはどうすればいいのでしょうか?
>436
丸投げ改造スレへドゾー。
Aサーバに設置したスクリプトから、
lsコマンド使って、Bサーバのあるディレクトリの一覧を取得するようなことは
可能でしょうか?
>>437 いくつかのやり方に応じて適切な条件が揃わないとできんよ。
つーか、逆に言うとそれをやられないように作られてるんだから。
試行錯誤してやっと完成したスクリプト。
しかし初心者だけにセキュリティ的な部分が非常に気になります・・・。
何かセキュリティ的に大丈夫かどうかチェックする方法ないですかね?
2chでさらす以外で。
他の初心者さんたちはどうしてるんだろ?
上級者に聞くしかないでしょう。
じゃなきゃ自分が上級者になる。
>>439 どういうセキュリティを懸念してるんだ。
とりあえずはクロスサイトスクリプティングあたりか?
作ったものによるだろ。
XSSは当然として、セッションハイジャックやSQLインジェクションなど
その他色々。
4様が微笑みながら444ゲット ズサーーーー!!
445 :
nobodyさん:04/11/01 01:09:12 ID:CTnWn+hA
446 :
nobodyさん:04/11/01 04:25:18 ID:rUgrlUVh
net::ftpのdirをつかって、ファイルの更新日時を取得したのですが、
月がOctのように英語表記になってしまいます。
これはどのように数字に変更すればいいのでしょうか?
>>446 %Month = (Jan=>1, Feb=>2...)みたいなハッシュを用意しといてひけば
とりあえず数字にはなる。
s/Oct \d{2} \d{2}:\d{2}/10月$1日$2時$3分/g;
みたいに12行書く。
カッコ付け忘れ。適当に補ふ。
450 :
nobodyさん:04/11/01 19:42:22 ID:IPrYAMkf
キリ番を調べたいのですが、
100単位でのキリ番は、
$a = substr("カウント値",-2,2);
if($a eq '00'){ print "キリ番"; }
で処理しています。
連番に関してはなかなかいいアイディアが思い浮かびません。
参考となるカウンターやアイディアをご教授ください。
キリ番とかダサイからやめたほうがいいよ
>>451-452 アイディアのカケラも思い浮かばないような発想力不足のクズはこのスレにいないでいいよ
454 :
nobodyさん:04/11/01 21:05:16 ID:IPrYAMkf
>>450です。
確かにダサイのですが要望があったので色々と試してました。
0の連続するきっちりのキリ番やゾロ目なら数十桁くらいを配列にいれて
比較してたのですが、連番となると数が多すぎて…
漏れもダサイとは思うが、どうしてもやらにゃならんと言うなら
キリ番やゾロ目なら正規表現使う方が賢明だろう
連番はアイデアがないが
「自分が数字を見たとき連番かどうかをどうやって判断しているのだろう?」と
自分の頭の中の認知回路を自己分析してみると
実装可能なアルゴリズムを思いつけるかもしれん
ゾロ目:
sub zorome { my($x)=@_; $x % ('1' x length($x)) == 0; }
連番:
sub renban { my($x)=@_; zorome($x - substr('123456789', 0, length($x)-1));}
あたりでどう?
457 :
nobodyさん:04/11/01 21:25:11 ID:hZSImnu8
連番は、何個同じ数字がどこに並んでりゃいいの?3個どこでもよければ
while(($var =~ /(\d)/) and ($var =~ s/$1{3}//)){print "連番やん\n";}
458 :
450:04/11/01 21:49:58 ID:IPrYAMkf
>>450です。
>>456、
>>457様、ありがとうございます。
教えて頂いたものは負荷も少なく凄いです。
正規表現に疎いためまだ理解できていないのですが…
連番は何個からとかは特に決めていません。
12でも連番のキリ番として扱う予定です。
>>457様
$varに数値をいれるとして、$1の部分が理解できません。
これだと例えば1114も連番となってしまいますか?
$1を知りたければ、多少でもいいから正規表現を学ぶんだ
正規表現だとゾロ目は
$x =~ /^(\d)\1*$/
なのでこっちの方がシンプルかも? (最初が数字でその後0個以上の
同じ数字が文字列の最後まで続く)
最低n桁にしたければ*のところを{n-1,}にすればいい。たとえば
最低4桁なら
$x =~ /^(\d)\1{3,}$/
連番は
index("123456789", $x) >= 0
という手もある
セッションハイジャックやSQLインジェクションってどうやって防ぐの?
入力チェックが効果的ってどっかで見た気がするが。
463 :
450:04/11/01 23:27:32 ID:IPrYAMkf
>>450です。
>>460、
>>461様ありがとうございます。
正規表現でのゾロ目チェックは参考になりました。
連番でindexを使うのは気付きませんでした。
>>462 Perlコーディング初心者質問スレ Part 38
467 :
nobodyさん:04/11/02 08:25:16 ID:s3D5jAc8
Image::Magickで1M以上のJPG画像を縮小しようとしたら
サイズはあっているのですが画像の上の10%くらいで変換がおわってあとは真っ黒になります
なにが原因なのでしょうか
use Image::Magick;
$i = Image::Magick->new;
$i->Read('test.jpg');
$i->[x]->Scale("200");
$i->Write("temp.jpg");
途中で殺されたんじゃねーの
469 :
462:04/11/02 10:19:20 ID:???
あれ、俺マルチなんかしてねーぞ?
>>467 よくわからんが、Scale メソッドってそういう呼び出し方するんだったっけ
471 :
467:04/11/02 10:55:21 ID:MX3i4yL1
use Image::Magick;
$i = Image::Magick->new;
$i->Read('test.jpg');
$i->Resize(width=>200, height=>150, blur=>0.7);
$i->Write("temp.jpg");
これも駄目でした
正規表現の修飾子を変数に入れたまま
使う事は出来ないんでしょうか?
foreach(@list){
if(/$pattern/$a){
print "true";
}else{
print "false";
}
}
正規表現を勉強しようと、
CGIで正規表現と複数の文字列をPOSTし、
文字列がマッチするか検証するスクリプトを書いています。
>>474 出来ました。ありがとうございます。
if(eval "/$pattern/$a"){}
みんなならどっちにする?
$a=4 if $b;
$b=5 if $b;
と
if($b){
$a=4;
$b=5;
}
なんか{}(ブロック)をなくす方が処理が早いみたいなこと聞いて
こんなつまらないことで悩んでる状況。
ご教授ください。
その月が何日が最終日なのかを調べるほうほうは
どのようにつくればいいのでしょうか?
ツェラーの公式で検索してみ
>>476 それがものすごい回数繰り返されるループの中とかなら、
ベンチとって選べ。
そうでなければどうせ誤差ぐらいしか違わないから自分が
見やすいと思うほうにしとけ。
一般論としては、動くの作って動作速度に不満が出てから
プロファイラでどこが時間食ってるか調べて集中的に直せ、
と言われているようだ。
軽くベンチした感じでは、$bがfalseならif(){}の方が
3倍ぐらい早いが、$bがtrueなら25%ぐらい遅い。
sub last_day {
my($y,$m) = (shift,shift);
my @days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
return 0 unless (1 <= $m and $m <= 12 );
$m-- == 2
? $days[$m] + ($y % 4 == 0) - ($y % 100 == 0) + ($y % 400 == 0)
: $days[$m];
}
481 :
476:04/11/02 19:28:42 ID:???
>>479さん
神様のような方ですね。
ありがとうございました。
10回程度なので見やすいほうにさせていただきます。
($a,$b)=(4,5) if $b;
も、べんちまぁくしてねぇ(はぁと)
>>476 それだと条件分岐の評価が2回行なわれるので、
条件式次第では遅くなる可能性があるよ。
$a=4, $b=5 if $b;
$b and $a=4, $b=5;
($a,$b)=(4,5) if $b;
$b &&= 5 and $a = 4;
労力の割にはたいした効果が期待できないので、
最適化のためにblockを消したりとかは、した事ないけど。
日本時間、2004年11月2日午後10時を示す数字
04110222
をGMTで同じように8桁で表したいのですが、どの様にするのが
よいのでしょうか?
一旦、unix timeにして、-9時間して、戻すのが順当でしょうか?
できれば、use Time::Localはしたくありません。
(それが使えない環境などがありそうなため)
perl JST GMT でググってもTZとかしかでてきませんでした。
よろしくお願いします。
unixtime
ありがとうございました。
変数から特定の文字列がある場合、それを抜き取るという
動作をしたいんですが、これはどうすればいいでしょうか?
index と substr を使う方法を思いついたのですが、
もっとスマートな関数とかありますでしょうか?
age
>>488 if(/特定の文字列/){
$unko = $1;
}
>>490 抜き取られていない。
push @result,$1 while s/(特定の文字列)//;
とかいろいろ。
PerlでPHPのgetImageSizeみたいなのないですか?
特にSWFのサイズ取得とかあるサブルーチンあったら教えてくださいませ
>>484 あとは自分で何とかしる。
$_ = '04110222';
my @a = /(..)/g;
my @m = qw/31 28 31 30 31 30 31 31 30 31 30/;
$m[1]++ unless $a[0] % 4;
my $t = 946652400 + 3600 * ($a[3] + 24 * int $a[2] - 1 + 365 * $a[0] + (3 + $a[0]) / 4);
$t += 86400 * $m[$_] for 0..$a[1] - 2;
print scalar localtime $t;
>>484 Time::Localってperl本体に付属してたと思ってたんだけど、
分離されたんだっけ?
あとGMTにするのはgmtime使うかtimezoneいじるべきで
unix timeを9時間戻すのはよろしくないと思うよ。
ユリウス時間でも出してきたらどない?
>>495 > GMTにするのはgmtime使うかtimezoneいじるべきで
漏れもそう思うが、
> unix timeを9時間戻すのはよろしくないと思うよ。
これには何か理由があるのか?
498 :
484:04/11/03 15:46:43 ID:???
色々返答ありがとうございました。
質問の仕方が悪かったかもです。
どうやらgoogle君に聞いてみると、Time::Localは標準ライブラリらしいです。
なのでどの環境いっても使えそうです。
重くなりそうという根拠のない理由から、できれば避けたいと書きました。
#標準ライブラリということを確定的できる情報元ってないんでしょうか…
何をしたいかというと、
0411031500という時間をcookieのexpire時間にしたいのですが、cookieではGMT
でJSTを指定できないらしいので変換をしなくてはならないのです。
>>493さんのコードちょっとむずかしすぎてまだ理解できてないです…
以下のURLのサブルーチンでunix timeにはできそうです。
http://www.ybi.co.jp/koike/qa3000/qa3165.htm
>>497 うるう秒が間に入るとずれるから。ちゃんとサポートされたシステム
での話しだけど。
クッキーのexpire時間ぐらいならそう厳密じゃなくていいから
構わんと思うけどね。
502 :
497:04/11/03 16:41:31 ID:???
標準ライブラリだからといって必ず使えるという保障はないわけで。
あんまりこだわる必要はないと思うけど?
それよりも、なぜにcookieのexpireで人間的日付を元にするのかが気になる。
単純に timeから30日間有効 とかにしてしまえば楽なのに。
>>494 情報ありがとう!
やはり1つの関数で勝手にファイル判別してくれるとかはないんですかね?
まぁ手動で見分けて条件分岐すればいいんでしょうけども・・・。
2chで出てるようなIDを生成したいんですが、2chがどうやって生成してるのか教えて頂けないでしょうか?
前に、そういうサブルーチンを見かけた気がするんですが検索しても見つかりませんでした。
よろしくお願いします。
>>506 いやそれは分かるんですがcryptの元の文字列をどうしてるのか知りたいのです。
>>500 なるほど、4年に一度狂う位なら問題なさそうなので、unix timeにして-9時間に
しようかと思います。
標準ライブラリは、導入されていなかったり、過去のバージョンであるかわからない
とのことなのでやっぱり使わないほうが無難な気がするので使わない方向でいきます。
>>503 なぜ、人間的日付かというと、その時間になったら掲示板に投稿できなくなるという
改造を自分でして、読みやすいから0411031700みたいな形で設定ファイルに保存
するという形をとったからです。
ここから間違いかもしれませんが…unix timeで保存した方が良かったのかもしれませんね。
#やっぱり見やすいからそうしました。
>>508 それだけだと、総当りでIPアドレス算出できるから、日ごとに更新される乱数が使われてる。
512 :
505:04/11/03 21:07:28 ID:???
>>511 やりたいことができました。
本当にありがとうございました。
トリップの作り方はわかったのですが、
↓ここのIDはどうやって作るんでしょうか?
356 :Now_loading...774KB :04/11/03 21:01:50 ID:j7+5/dK/
誰かよろしくお願いします。
配列の数を吐き出す奴ない?length(@xx)とかやってもだめだった。
>>515 スカラーコンテクストなら@xxは配列の要素数になる。
わからなければscalar(@xx)としとけば確実。
>>517 $#xxは$[変えるとそれにつれて変わるので(要素数-1)として
使うのは危険だと習った。
$[ = 1;
@xx = (1,2);
print $#xx+1;
$[をいじったスクリプトなんて書いたことないけどね。
scalarでいいじゃん
520 :
515:04/11/04 01:27:14 ID:???
みんなありがd
521 :
515:04/11/04 03:06:36 ID:???
sub内だけで使用する変数ってlocal($hensuu)って宣言するんだっけ?
my
524 :
nobodyさん:04/11/04 11:55:35 ID:3xCNLIZD
特定のページからの来訪の場合のみ、
処理させたいんですが、この場合環境変数とif文使えばいいんでしょうか?
525 :
524:04/11/04 11:56:51 ID:???
あ、これだとノートンとか入れてる人には無効になってしまいますね。
あるプログラムからpostでID/PASSを送るプログラム作ってるんだけど、
ブラウザに丸見えになりますよね?
で、一応暗号化はしたんですけど、例えばネットカフェに
データが残ってて、解析されたら終わりってことですよね・・・
う〜んどうすればいいものか。
他のスクリプトはどうやっているんでしょ?
<form action="$url">
<input type="text" name="url" value="">
</form>
上記のようにアクション先にその場で入力された
URLを指定することってできるでしょうか?
>>527 Javascript使ってしか無理だと思うけど。
530 :
527:04/11/04 13:40:32 ID:???
javascriptを使用しない場合は不可能でしょうか?
531 :
527:04/11/04 13:41:16 ID:???
perlを使った方法はないでしょうか?
532 :
526:04/11/04 13:52:12 ID:???
POSTとGET以外に変数を別のスクリプトに渡す方法ってあるでしょうか?
できないこともないけど、スマートじゃないな
>>532 「変数を」別のスクリプトに渡す
ということは、foo.cgi->Browser->bar.cgiの過程で
foo.cgiが出力した値をbar.cgiに渡したいということか?
537 :
526:04/11/04 15:46:07 ID:???
>>537 そういうセッション管理で一般的に使われるのはCookieだな。
Passは最初の認証だけ使って、後はセッションIDをCookieへ入れといて、
ワンタイムパスワードをPOSTさせて認証処理・・・って感じになるのかな。
本なんかをちょっと見ただけで実際に作ったこと無いから、落とし穴があるかも。
Cookieは気をつけないとPOST以上に危険だから注意
あと、
>ブラウザに丸見えになりますよね?
の一言が気になるんですが、まさかtype="hidden"を知らないなんてことは・・・
unko
>>537 ActivePerl入れて、インターネットゾーンでも使えるようにレジストリ緩めれば、language=perlで好きなことできるよ。
そんな糞ページ誰も見ないがな。
544 :
nobodyさん:04/11/05 04:30:09 ID:127p6d3j
スクリプトに引数を付けることで処理を色々に分岐させようとしています。
例:-a、-l、-h、-v、-r、<引数なし>を引数とする。
現在、引数を見て処理させる場合、
if ($#ARGV == "0") {
if ($ARGV[0] eq "-a") { 処理1; }
elsif ($ARGV[0] eq "-l") { 処理2; }
elsif ($ARGV[0] eq "-h") { 処理3; }
elsif ($ARGV[0] eq "-v") { 処理4; }
elsif ($ARGV[0] eq "-r") { 処理5; }
else { &error; }
}
elsif ($#ARGV == "1") {
if ($ARGV[0] eq "-a" && $ARGV eq "-l") { 処理5; }
elsif ($ARGV[0] eq "-l" && $ARGV eq "-h") { 処理6; }
elsif ($ARGV[0] eq "-h" && $ARGV eq "-v") { 処理7; }
elsif ($ARGV[0] eq "-v" && $ARGV eq "-r") { 処理8; }
elsif ($ARGV[0] eq "-r" && $ARGV eq "-a") { 処理9; }
else { &error; }
}
などとしていますが、引数が増えるとそれだけ組み合わせも増えるわけで
現在引数による分岐だけで混乱しています。しかもこのスクリプトを実際に
使用する場合、引数の順序も固定されてしまうので、表現力が乏しくなります。
それぞれの引数に数字を割り当てて、それをfor (@ARGV)で見ていって
それらを加算した結果で処理させる方法などを考えましたが、
数字を割り振るコツも分かりません。
引数や、それらの組み合わせが増えたとき、どういう風に対処すれば
分かりやすく、作りやすいスクリプトが書けるのでしょうか。
よろしくお願いします。
545 :
544:04/11/05 04:39:45 ID:127p6d3j
上の例文は間違いです。
正しくは以下の通り。
if ($#ARGV == "0") {
if ($ARGV[0] eq "-a") { 処理1; }
elsif ($ARGV[0] eq "-l") { 処理2; }
elsif ($ARGV[0] eq "-h") { 処理3; }
elsif ($ARGV[0] eq "-v") { 処理4; }
elsif ($ARGV[0] eq "-r") { 処理5; }
else { &error; }
}
elsif ($#ARGV == "1") {
if ($ARGV[0] eq "-a" && $ARGV[1] eq "-l") { 処理5; }
elsif ($ARGV[0] eq "-l" && $ARGV[1] eq "-h") { 処理6; }
elsif ($ARGV[0] eq "-h" && $ARGV[1] eq "-v") { 処理7; }
elsif ($ARGV[0] eq "-v" && $ARGV[1] eq "-r") { 処理8; }
elsif ($ARGV[0] eq "-r" && $ARGV[1] eq "-a") { 処理9; }
else { &error; }
}
>>544 引数をハッシュに代入してexistsで条件分離したら?
for(@ARGV){
$param{$_} = '1'; #値自体はなんでもいい。
}
分岐は
if(exists $param{'-a'}){ 処理1;}
とか
if($param{'-a'} == 1){ 処理1;}
みたいの。
>>544 my %table = (
'a' => sub{ print "処理1" },
'l' => sub{ print "処理2" },
...
'r' => \&r_part,
'al' => \&r_part,
'hl' => sub{ print "処理6" },
...
);
sub r_part{ print "処理5" }
my $key = join('', sort @ARGV);
if (exists $table{$key}){
$table{$key}->();
} else {
print "ERROR";
}
548 :
547:04/11/05 07:02:16 ID:???
おっと、ハイフン取り除く処理を忘れてたーよ。
550 :
544:04/11/05 10:39:14 ID:T3r+ugEG
ああ、寝てしまった間にこんなにレスが付いてる!
ありがとう御座います!
ぱっと見た感じでは
>>546さんと
>>547さんは同じ処理ですか?
連想配列にこういう使い方があったと知って、眼から鱗の初心者です>私
両方を試してみます。ありがとうございます。
>>549 煩雑な徒手作業のところをできる限り自動化/半自動化していく積もりで
ゆくゆくはこうしたモジュールを有り難く使った方が効率が良いとは考え
ているのでこういう助言は本当に助かります。
ありがとうございます。
早速実験してみます。
ありがとう御座いました。
551 :
nobodyさん:04/11/05 11:05:29 ID:vXdBVIeu
スクリプトいじってたら
正規表現で
s/ //g;
とやっても空白がマッチしなくなりました
s/\s//g;
ならマッチします
原因と元に戻す対処法を教えてください
552 :
551:04/11/05 11:19:18 ID:vXdBVIeu
自己解決しました
553 :
nobodyさん:04/11/05 11:36:35 ID:vAMAiFLG
間違えてPHP質問スレに書き込んでしまったのでこちらで質問しなおします。
ttp://tohoho.wakusei.ne.jp/wwwperl2.htm こちらのsocket関数の項目に書かれているスクリプトを自分の
スクリプトに組み込んでますが
自分の使っているサーバーでperl -wcでスクリプトチェックを行ったら
Unquoted string "stdout" may clash with future reserved word at aaa.cgi line 543.
このような警告文が表示されました。
select(stdout);
のstdoutをAAAとか別のものに置き換えたらこの警告文が回避できましたが
別のものに置き換えても正常に動くのでしょうか?
perlのバージョンはThis is perl, v5.8.2 built for i386-freebsdです。
select(STDOUT);
555 :
553:04/11/05 12:26:44 ID:vAMAiFLG
>>554 どうも有り難うございます。
stdoutをそのまま大文字にしても動くんですね
556 :
nobodyさん:04/11/05 13:45:35 ID:uR92YhZO
現在CGIでのアクセス制限サイトを作っているのですが、
アドレス欄にIDとパスワードが表示され、
そのIDとパスワードを含んだアドレスを入力すると、
ログが記録されないのです。
(cgiの認証画面から入力するときちんと記録されます)
ログ記録はこんな感じなのですが。。。
どこか間違っているのでしょうか
sub record {
local($date,$time,$agent,@data);
# 時間&ホスト取得
$date = &get_time;
$time = time;
&get_host;
# ロック開始
&lock if ($lockkey);
# ログファイルの読み込み
open(IN,"$prvdir/$logfile") || &error("Open Error: $logfile");
@data = <IN>;
close(IN);
# ブラウザ情報
$agent = $ENV{'HTTP_USER_AGENT'};
$agent =~ s/&/&/g;
$agent =~ s/</</g;
$agent =~ s/>/>/g;
$agent =~ s/"/"/g;
557 :
556続き:04/11/05 13:45:59 ID:uR92YhZO
# ログ更新
while ($max <= @data) { pop(@data); }
unshift(@data,"$in{'id'}<>$date<>$host<>$agent<>$time<>\n");
open(OUT,">$prvdir/$logfile") || &error("Write Error: $logfile");
print OUT @data;
close(OUT);
# ロック解除
&unlock if ($lockkey);
}
558 :
556続き:04/11/05 13:54:30 ID:uR92YhZO
すいません、この認証処理の中で何か足りないのかもしれません。
どなたか解る方お願い致します。
sub pwCheck {
local($f,$id,$pw,$check,$time);
if ($mode eq 'enter') {
$time = time;
if ($in{'cook'} eq "") { $in{'cook'} = 0; }
&set_cookie($in{'cook'}, $time);
}
$f=0;
open(IN,"$prvdir/$pwdfile") || &error("Open Error: $pwdfile");
while (<IN>) {
($id,$pw) = split(/:/);
if ($in{'id'} eq $id) { $f++; last; }
}
close(IN);
if (!$f) { &error("認証できません"); }
$pw =~ s/\n//;
$check = &decrypt($in{'pw'}, $pw);
if ($check != 1) { &error("認証できません"); }
&fileOpen;
if ($mode eq 'enter') { &record; }
exit;
}
わかるなぁ〜その気持ち。。。
と、レスしてから改めて
>>556の説明を読んでたら混乱してきた。
何をしたくて、どこがどのように思った通りに動いてくれないのか
わからない…。
URLにクエリーが表示されちゃって困ったよー。って話じゃない…?
エスパー回答者向けだな
563 :
伊藤:04/11/05 17:14:02 ID:???
呼んだか?
564 :
nobodyさん:04/11/05 21:03:45 ID:w/zBhN/X
print " <a href=\"$script?action=icondisp&type=$FORM{'type'}\">$lbl_iconlist</a>\n";
これを新しいウィンドウで開きたい場合はどのように書き直せばいいのでしょうか?
以下のようにするとエラーなんです。
よろしくお願いします。
print " <a href=\"$script?action=icondisp&type=$FORM{'type'}\" target="_blank">$lbl_iconlist</a>\n";
>>564 バーカ
print ' <a href="' . $script . '?action=icondisp&type=' . $FORM{'type'} . '" target="_blank">' . $lbl_iconlist . '</a>' . "\n";
566 :
nobodyさん:04/11/05 21:38:56 ID:w/zBhN/X
>>565 全角にスペースにしわすれました
すいません
printf にした方が読みやすいとは思うけれどもども。。。
printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|;
$script, # スクリプトのお名前
$FORM{'type'}, # typeの値
$lbl_iconlist; # アイコソリスト(文字列)
>>567 あらやだ。
> printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|;
printf qq| <a href="%s?action=icondisp&type=%s" target="_blank">%s</a>\n|,
569 :
365:04/11/05 23:36:15 ID:???
print qq[<a href="$script?action=$icondisp&type=$FORM{'type'}" target="_blank">$lbl_iconlist</a>]."\n";
でいいんじゃないの?
ダブルクォーテーションとかの扱いは人それぞれだからどうでもいいじゃん自分で気に入ったの使えば
>>507 俺も同感
だからこそperlは何通りも書けるんだしね
そこがPerlの良さ
そこがPerlの悪さ
そこがPerlのぬるぽ
ところで、NullPointerExceptionをPerl語にすると何?
ガッ
釣れますか?
ダウンロードカウンタのCGIを作ろうとしています。
ブラウザにファイルの内容を送ろうと思うのですが,どうすれば良いでしょうか?
以下だとファイルが壊れてしまいます.
open(FILE,"$FileName");
binmode(FILE);
print <FILE>; ←while(<FILE>){print $_ }でもだめ.
close(FILE);
送りたいファイルは40KB程度ですが,数MB程度のファイルも対応できるとうれしいです.
お知恵をお貸しくださいm(_ _)m
578 :
577:04/11/06 17:41:38 ID:???
書き忘れましたが,ファイルはバイナリファイル(LZH,ZIP等)です.
よろしくお願いします.
>>577 環境によっては binmode(STDOUT); がいるんじゃないかな。
あと、バイナリファイルなら行読み込みにせず、readでバイト数指定して読み込み
while (read(FILE, $buffer, 1024*10)) ... バッファサイズは適当に
printで出力する場合はバッファoffするのも忘れずに $|=1 (念の為
>>577 binmode(STDOUT) してないだけじゃないの?
つーか、壊れるという曖昧な表現じゃなくて
バイナリエディタで比較してみたら こういう違いがでてきた、ってな感じで話してくれないと。
まぁ、それ見りゃ自分でもおかしいとこに気づくんだろうけどね
581 :
580:04/11/06 17:59:28 ID:???
んぁ。言葉選んでる間に答えられちゃってるよオレ
カコワリィ
582 :
577:04/11/06 18:12:10 ID:???
>>579-580 レスありがとうございました。
原因は二つで,binmode(STDOUT)されてないこと,行読みした結果,改行コードが欠落したことでした.
>>579 「$|」というのはPerlの環境変数のようなものなのでしょうか?
print $|;だと値を返すようですが・・・
手元の資料&Google先生を調べても分からなかったのですorz
>>580 ご指摘,ありがとうございます.
「どういう風に壊れたのか」を説明する必要がありました.
失礼しました.
>>580 Don't mind, 既知問題っぽかったから推測で書いちゃったけど
実は全然違う原因だったって事はよくあるからね.
>>582 $|は検索しにくいのが難点だな。Perl バッファリングで調べると詳細でてくるよ。
584 :
577:04/11/06 19:17:26 ID:???
>>583 とほほさんのBBSに質問がのってますね.
勉強したいと思いますm(_ _)m
585 :
nobodyさん:04/11/06 20:47:26 ID:55uCUnw3
○ , ○>
/ ̄'☆ )
>>1 / > /
☆をダブルクリックするとかめはめ波が出るぞ
注)設定とか環境のせいで正常にかめはめ波しないときがあります
587 :
nobodyさん:04/11/06 20:56:12 ID:ZyicEXrd
Win2K + Active Perl 5.8 を使用しています。以下のスクリプト
を実行すると、「p.tif」 のファイル名が文字化けしてしまいます。
「use encoding "shift_jis";」の行を外すと、正常に「あ.tif」に変換
されるのですが、この行を残したままrename するにはどうすれば
よろしいでしょうか?
use encoding "shift_jis";
chdir 'c:\\test';
rename "p.tif", "あ.tif";
588 :
nobodyさん:04/11/06 21:13:32 ID:jPPLQ8mN
○ , ○>
/ ̄'☆ )
>>587 / > /
☆をダブルクリックするとかめはめ波が出るぞ!
注)設定とか環境のせいで正常にかめはめ波しないときがあります
perl 5の正規表現で、content-typeヘッダに日本語があるかないかを判別するのに
iso-2022-jp|shift-jis|euc-jp|multipart\/mixed
という記述をします。これを応用して、『英語か日本語にマッチ』するかどうかを記述するには
どうすればよいでしょうか?
590 :
587:04/11/06 22:56:11 ID:???
>>587 は自己解決できましたが、もっとスマートな方法があれば
よろしくお願いします。
use encoding "shift_jis";
use Encode;
chdir 'c:\\test';
$str = encode("shiftjis","あ.tif");
rename "p.tif", $str;
HTMLの<!---->みたいに複数行をまとめてコメントアウト
する方法をど忘れしてしまったので教えてください。
「#」じゃなく。
593 :
592:04/11/07 19:14:26 ID:???
自己完結。
=comment # ここからコメント
=cut # ここまでコメント
回答方法もど忘れしてしまいました。
595 :
nobodyさん:04/11/07 20:51:25 ID:OKDqn1bD
お恥ずかしい話ですがsplitガどうしても上手くいきません。
@dat = split(/*/, <DAT>);
これで合ってると思うのですが、どうしてもエラーになってしまいます。
*DATは存在します。ちゃんと*で区切られています。
* → \*
597 :
nobodyさん:04/11/07 20:54:42 ID:V/bBugXz
全角半角混合の文字列からある順番の文字を取得したいのですがうまくいきません。
誰かお願いします。
文字列 $xx=あいうえおaiueo
から2番目の'い'を取り出だすとき
substr($xx,1,1);ではだめで
全角は2バイト分なので
substr($xx,3,2);でないとだめなようです。
599 :
597:04/11/07 21:00:05 ID:V/bBugXz
たとえば
ランダムに生成された全角半角混合の文字列
$xx=げあじgraふぇeあefaじえeaあい;
から9番目のeを取り出す方法を教えて
>>599 use Encode を使え
ただし 5.8 以上の perl でないとだめだが
文字列を1文字ごとに分割して配列に入れりゃいいんじゃないか?
んじゃ文字を配列にバラすコードを。文字コードは勝手にSJISと判断。
my @moji;
foreach ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g) {push (@moji,$_)}
print $moji[8];
どこまでしたいか謎だったからなぁ。やりたいのはこうかもしんないし。
my @moji = ($xx =~ /[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf]/g);
print @moji[2..8];
なんにせよ環境も要件もよくわからんと返しようがないのぉ。
605 :
597:04/11/08 02:03:34 ID:???
パールは5.8 以上みたいです。
トリップ生成用途だったのですが、これでうまくいきそうです。
みなさんどうもありがとうございます。
606 :
595:04/11/08 09:25:10 ID:???
607 :
595:04/11/08 11:09:36 ID:IV2+5aK4
@data = split(/\n/, <DAT>);
で代入したら、$data[0]にしか代入されていません。
どなたかよろしくお願いします。
>>607 その場合の <DAT> は一行しか読み込まないので、当然そうなるだろう。
というか何がしたいのだいったい。
ひょっとして君のやりたいことは @data = <DAT> だったりしないか。
つーか、<DAT>って何よw?
610 :
595:04/11/08 15:22:15 ID:hLOeveWj
>>608-609 あっ、すみません。<DAT>はファイルハンドルです。
>>608 なぜこの場合だと一行しか読み込まないのですか?
では、どうすればすべての行を読み込んでくれますか?
説明不足ですみません。返答お願いします。
612 :
595:04/11/08 16:59:14 ID:x02iMqC5
>>611 すみません。やっていることがおかしかったですね。
ありがとうございました。
@var=<IN>;
とすると改行\nが消えないですが、それを消して配列に代入する方法はありませんか。
たまにこういう釣りみたいな質問が来るな
>>615 { local $/ = undef; @var = split(/\n/, <IN>); }
あたりかな。ただしファイルの末尾の空行が消えるのが嫌なら、
splitの第3引数に負の値を与えるとともに、splitしたあとで
@varの最後の要素を捨てる必要があるだろう。
普通に読んだ後でchomp @varした方が書くのは楽だね。
chomp(@var=<IN>);
配列をヒアドキュメントでprintするとスペースも一緒にprintされてしまうわけですが、
これを回避するにはいちいちヒアドキュメントを閉じるしかないですか?
no
>>619 $"を空文字列にしておく
あるいは、
@{[join('',@a)]}として埋め込む
622 :
619:04/11/09 02:18:31 ID:???
>616
このスレで質問するとよく言われます。。
>617>618
ありがとうございます。
>623
言われないように努力したりしないの?
釣りだと思われるような質問しちゃってるんだよ?
Perlから,自分が動いているOSを知ることは出来ますでしょうか。
例えばWindowsで下を実行すると
print $^O
> MSWin32
とか出ますが,WinXPとかWin98とかくらいまで詳しく知るには,どういう方法がありますか。
(できればUnix系でも詳しく知りたいです)
626 :
nobodyさん:04/11/09 09:36:25 ID:enWymUQX
別のウェブサーバー上にあるファイルの情報をstatとかで更新されているか、
されていないかとかしたいのですが、どうやってやったらいいのでしょう?
$url = "
http://www.example.com/file.jpg";
@data = stat $url;
とかやっても取れないので(うすうすわかっていましたが)。。。
ウェブ上のデータとstatの内容を取得する方法を教えてください。
>>626 lwpでもなんでもいいけど
httpのヘッダで
Date か Last-Modified みるしかなかんべ。
取れなかったら諦めるしかない。
628 :
nobodyさん:04/11/09 10:07:38 ID:enWymUQX
>>627 ありがとう。
そういうものなんですか。
>>625 $hoge =`uname -m`; とか。
詳しいことはUNIXのコマンドリファレンスでも探せば良し。
>>626 他のサーバーのデータは、
socketでソケット作って、connectで繋いで初めて得られる。
色々複雑だから、素直に解説本読みなはれ。
>>629-630 ありがとうございます。こんな風にしていろいろな環境でOS名を取得できました。
# 自分の目的のためには下の例で事が済んだのですが。
#-------
my $OS;
if ( $OS = `uname -s` ) {
#do nothing
} elsif ( !$OS and eval{require Win32} ) {
$OS = ( Win32::GetOSName() )[0];
} else {
die "MacPerl?";
}
print $OS;
> Linux, FreeBSD, Win2000, Win98...
#-------
my $OS = $^O;
if ( $OS eq 'MSWin32' ) {
require Win32;
$OS = ( Win32::GetOSName() )[0];
}
print $OS;
> linux, freebsd, Win2000, Win98...
632 :
nobodyさん:04/11/09 23:22:24 ID:mn5HDpbS
CGIにhtml組み込んで、
アクセスしてみたら、真っ白のページが表示されます。
んで、ホームページのソース表示してみたら、
確かにそこにはhtmlソースがちゃんとあるんだけど、
表示されていない。
原因はどんなことが考えられますでしょうか?
>>632 どうせまともな HTML 吐いてないとかじゃないの?
タグの閉じ忘れ
つうか原因探ってほしいならソースをどっかにあげましょう
635 :
632:04/11/09 23:34:40 ID:mn5HDpbS
print <<__HTML__;
Content-Type: text/html; charset=EUC-JP
<html lang="ja"><head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
<title>test</title>
このコードに問題ありますか?
636 :
632:04/11/09 23:36:40 ID:???
タグの閉じ忘れっぽいですね、
他ブラウザで試したら表示されました。
企業から配布されてるスクリプトなのにテキトーだなぁ
サンクスでした。
637 :
nobodyさん:04/11/10 00:18:59 ID:sQyPPo3N
スレ違いだったら大変申し訳ございません。
cronでcgiを動かすにはどのように設定ファイルを書けば宜しいのでしょうか。
/public_html/a.cgi
にありますcgiを例えば1時間毎にa.cgi?a=1&b=2とパラメータを渡してcronで
実行したいのですが。
よろしくお願い致します。
スレ違いだな。スレタイを100回音読してから、また質問しに来ような
639 :
nobodyさん:04/11/10 00:37:27 ID:sQyPPo3N
>>638 大変申し訳ありません。
該当スレを御存知でしたらお願いしたいのですが。
>>637 perl /public_html/a.cgi
パラメータは渡せるが動的にするのはcronじゃ無理じゃないかな〜(知らないだけかも)
ちなみにコマンドラインのときはGETメソッドじゃなく引数になるから受け方違うよ
a=1とb=2が決まってるなら
ファイルの最初に宣言した方が早い
どうしてもCGIとして動かしたいならばWWW経由で/public_html/a.cgiを呼び出すプログラムが必要
それよりコマンドラインでperlを使ったことなさそうだけど
作るときちゃんと文法チェックしてるのかな?
642 :
nobodyさん:04/11/10 08:39:47 ID:QcwLl9v+
誘導済みのスレ違いの質問にレス付ける馬鹿。
晒し上げ。
643 :
nobodyさん:04/11/10 11:45:26 ID:I1NueUmN
@data = (system("df"));
とかして、ディスクの使用状況をテキストに書き出したいんだけど、
これじゃあ戻り値を取得できないですよね。
どうやったら取得できますか?
644 :
nobodyさん:04/11/10 11:55:42 ID:I1NueUmN
643です。
自己解決しますた。m(_ _)m
PERLで作成したファイルをPERLからダウンロードさせる場合に
どのようにしたらいいのでしょうか?
ファイル作成後に「ダウンロード」とボタンを表示してクリックしたら
ファイルをダウンロードするみたいな感じです。
646 :
nobodyさん:04/11/10 17:04:37 ID:I1NueUmN
>>645 print "<a href=\"file\">DL</a>\n";
リダイレクト前にcookieを作って、リダイレクトページで生成したcookieの値を取得したいのですが、
結構な頻度で値が取得できません。
ですが、少し時間をおいて取得すると値が取得できるので、
cookie作成のスピードよりもリダイレクト後のページで値を取得してるっぽいです。
従いまして、cookie作成時に少し時間を開けてからリダイレクトしたいのですが、
sleepを入れても意味がありませんでした。
この様な場合の対処方法をご存知の方がいらっしゃいましたら、どうかご教授ください。
よろしくお願いいたします。
648 :
nobodyさん:04/11/10 20:55:28 ID:sQyPPo3N
ファイルから1行読み取り、その読み取った行を削除してファイルを上書きするにはどうしたらよいのでしょうか。
aaa,bbb,ccc,ddd
111,222,33,4444
このようなファイルがありaaa,bbb,ccc,dddを読み込んだ後にaaa,bbb,ccc,dddを削除して
ファイルを上書きするような処理です。
よろしくお願いします。
650 :
nobodyさん:04/11/10 21:52:59 ID:QZhMSK0D
>>645 ダウンロードボタンをクリックしてCGIでperlを動かした先で
$length = (-s $file);
print "Content-type: application/octet-stream\n";
print "Content-disposition: attachment; filename=hoge.dat\n";
print "Content-Length: $length\n\n";
open(fp, "<$file");
binmode(fp);
print <fp>;
close(fp);
するとOKだと思う
651 :
nobodyさん:04/11/10 21:55:59 ID:QZhMSK0D
>>648 削除したい行以外を別の一時ファイルに書き込んで、元のファイル名にリネームする
で良いんじゃない?
他にいい方法があれば知りたい
何でわざわざ別ファイルに書かせなきゃならんのかがわからん
>>647 クッキーを食べない時と食べる時がある状況が良く分からないけど…。
<meta http-equiv="refresh" ..>
を使ってクライアント側で飛ばして見るとか。
# 状況は改善されない予感。
654 :
nobodyさん:04/11/10 22:24:11 ID:QZhMSK0D
読み書きモードでオープンすればいいんだっけ?
読み書きモードでその場更新でもいいけど、更新中にプログラムが
あぼーんすると変な状態で残ったりする。別ファイルに書き込み、
書き終わったらrenameなら書き換え前か書き換え後のどっちかには
なるので、オレはこのほうが好き。
647ではないんだけどプログラム変えてないのに
IEでcookieが急に読めなくなった。(前はできてました。)
プログラムAでcookie送信してプログラムBに遷移して
そのcookieを取ろうとしても取れなかった。
他のcookieは取得することができました。
ネスケでは大丈夫だったんだけどなぁ。
ちなみにCGI.pm使って
$hoge=param('hoge');
とやって$hogeが空になっており、
cookieのフォルダを見るとちゃんとそのcookieがありました。
まずはIEのクッキー設定を疑うよろし。
660 :
657:04/11/11 01:49:17 ID:???
657ミスりました。
paramのとこcookieです。
>>659 クッキーの設定も疑って全て許可にしてもだめだったのです。
でも、今家のPCで同じスクリプト走らせたらできました・・・。
で、サーバの方も試したらできました。
仕事場のPCからやった時はできなかったんですよほほほ。
ご迷惑おかけしました。
文字列$aが数字以外を含んでいたら、
エラー出したいんですが、
どうすればいいんでしたでしょうか?
~[0-9]を使えばいいことはわかるんですが・・・
if($a=^[0-9]){
echo"error";}
何か間違ってますか?(^^;
age
>>661 うむ、それもかなり激しく
if($a=~/[^0-9]/){
>>663 間違えまくってますね笑汗
ありがとうございます、助かりました。
/\D/ 小泉こうだろう?
666 :
nobodyさん:04/11/11 14:33:41 ID:tk5UM/xB
自分のPCで実行して、入力先をWEBページにして、
記載されている内容を処理しファイルに書きたいのですが
可能でしょうか?
基本的なことですみません。
何の言語を覚えたらいいのかわかりませんので。
何言ってるんだかわからん
668 :
nobodyさん:04/11/11 15:18:47 ID:tk5UM/xB
すみません。説明が下手で。
以下のようなことをWindows XP上でしたいのです。
できますか。
実行したら、例えばこの板のスレッド一覧
http://pc5.2ch.net/php/subback.html を読んで
インデックス/スレタイ/その時点での書き込み数
をCSVファイルに書き込むようなものです。
中でリンクから各スレを読んで
>>1のハンドルも取得できればなおよいです。
LWP
671 :
nobodyさん:04/11/11 15:28:02 ID:riaohoTo
翻訳
perlプログラムをローカルPCで実行
ネット上のウェブページの情報を取得
いろんな処理
ローカルPCに保存
ってこときゃ?
672 :
671:04/11/11 15:29:21 ID:riaohoTo
チョコ食ってる間に進んでた。
すまそ
673 :
nobodyさん:04/11/11 15:32:15 ID:R3WWGPIl
ウェブから入力された新しいユーザー名を、ユーザ名の入ったファイルを
チェックして必要があれば弾いたり空いている場所に追加したり削除する
CGIを作りたいのですが・・・・。
ユーザー名の入ったファイルを行入力演算子で配列に読み込んで、
それをいろいろやってから再び配列に戻して、最後に
$i=0;
while($i<=$count){
print FILE "$username[$i]\n";
$i++;
}
みたいに、改行して出力すれば次にCGIを呼び出したときに再び
行入力演算子で配列に読みこめるファイルが作成できるのでしょうか?
何度もやったのですが、どうしてもうまくファイルが作成できないのです。
>>671 そんな感じぢゃな。
perlプログラムをローカルPCで実行 → ActivePerl をゲットせよ
ネット上のページの情報を取得 → LWPの使い方を習得せよ
解読処理 → HTMLをパースする方法、正規表現とか HTML::Parser とかを習得せよ
CSVファイルに書き込む → まあ何とでもなるぢゃろう
>>672 その FILE とかいうファイルハンドラは
当然書き込みモードで open されとるんぢゃろうな?
>>668 perlスレなのでperlを覚えてください
676 :
673:04/11/11 15:35:58 ID:R3WWGPIl
>>674 いえ、入力モードで開いて配列に読み込んで、
一旦閉じてから再び出力モードで開いてます
677 :
nobodyさん:04/11/11 15:46:34 ID:tk5UM/xB
>>671 >>674 ありがとうございます。
>>675 覚えてからできないのがわかったら悲惨ですから
先に確認したいと思いました。
じゃ勉強始めます。
スレタイ見るだけのスクリプトなら、手元にあるから、貼っといてやるよ。
スレの中身見るのは、自分で作りな。
use LWP::Simple;
$url = "
http://pc5.2ch.net/php/subback.html";
@lines = split(/[\r\n]/, get($url));
foreach my $buf (@lines) {
if ($buf =~ /<base href="([^\"]+)"/){
$base_ref = $1;
last;
}
}
foreach $buf (@lines) {
if ($buf =~ /<a href="(\d+)\/l50">(\d+):(.*)\((\d+)\)/){
$thethread = $1;
$num = $2;
$title = $3;
$rescount = $4;
print "$thethread, $num, $title, $rescount\n";
}
}
レンタルサーバにてたまにcgiがCPU 90%を長時間(600hとか)使うことがあります。
このスクリプトの問題点を調べたいのですが、どのようにすればよい
かアドバイスを頂けたらと思います。
利用しているスクリプトは、余裕派掲示板です。
http://specters.net/cgipon/ バージョンは、2.62と、3.00 beta7を利用しておりどっちが
CPUを食っているかはまだわかりません。
そこまでCPUを使ってるのにkillしないサーバ屋もサーバ屋ですが、
とりあえず、他人の迷惑になるので調査したいのですが、とっかかり
がわかりません。
発生頻度は、1-2日に1回位起きてるのかもという位で、まだ
詳しくはわかりません。
よろしくお願いします。
>Perlのコーディングで困ってる人のスレです。
>>679 Devel::DProf
で調べると良いよ。
>>681 素晴らしいです。
#!/usr/bin/perl -d:DProf
にすれば良さげです。ちょっと仕掛けてみます。
ちょっといいか・・・?
>レンタルサーバにてたまにcgiがCPU 90%を長時間(600hとか)使うことがあります。
600時間てあんた、一体何動かしてるんだ?
ほぼ一ヶ月だぞ?
>>681 これ良いです
便利なものがあるもんですね
>>683 600minでした すまそ
一行ごとに解析できる Devel::SmallProf というのもあるらしい。
686 :
nobodyさん:04/11/11 21:11:26 ID:Z05OwTsM
@hogeに20行の文字列が入ってて、
それを指定した位置から指定した位置の複数文字([6]から[14]までの文字)を
$hogeに入れるにはどうしたらよいですか?
for(i=6;i<=14;i++){
$hoge .= $hoge[$i];
}
688 :
nobodyさん:04/11/11 21:35:44 ID:Z05OwTsM
$hoge = join('', @hoge[6 .. 14]);
ずっと気になっているんですが、.= とは何ですか?行数をどう処理するものなんですか?
連結演算子
<textarea>で作った2行の文字から改行を取り除くにはどうすればよろしいでしょうか?
$value =~ s/\n//;としてもだめでした。
perlバージョンは最新です。windows2000です
$value =~ s/\r\n//g;
>>692 Perlメモ
でググってから、もう一度来い
ありがとうございます。うまくできました。
>>690 $hoge .= $foo; と $hoge = $hoge . $foo; は同じ
>>692 漏れはどっちでも対応できるように $value =~ s/\r?\n//g; ってしてる。
>691>697
思い出しました、ありがとうございます
699 :
nobodyさん:04/11/12 09:07:08 ID:bxBJtrFy
$_ = "AAA_BBB ZZZZ-DDD_EEE/FFF.";
のような文字列中からアルファベット三文字のリストを抜き出そうとしています。
my(@list) = $_ =~ /(?:^|[^A-Z])([A-Z]{3})[^A-Z]/g;
foreach (@list) {
print "$_\n";
}
にしてみたのですが抜き出されるのは
AAA,DDD,FFFの3つでAAA_のマッチのあとのBBBとDDD_のあとのEEEがとれません><
>>699 こいでいいじゃん。
while(s/[A-Z]{3}//) {
print $&, "\n";
}
>>699 これでどうよ?
my $t = "AAA_BBB ZZZZ-DDD_EEE/FFF.AAA";
my(@list) = $t =~ /(?:^|[^A-Z])([A-Z]{3})(?=[^A-Z]|$)/g;
foreach (@list) {print "$_\n";}
最後のAAAにマッチさせたくないのであれば|$の部分をカット
702 :
699:04/11/12 16:58:54 ID:bxBJtrFy
701さんのでうまくいきました。
ありがとうございました。
パスの区切り文字が環境(OS)によっては / だったり、\ だったりするので
実行環境を判定して場合分けしようと思いましたが、定番の方法があれば教えてください。
一応、こんなことしか思いつかないのですが・・
$^X=~/exe$/i
705 :
703:04/11/13 13:14:55 ID:???
>>704 なるほどわかりました。これが定番なんですね。
スマートな方法じゃないのでがっかりんこです。
>>703 my $os = $^O;
my $separator = '/';
if ($os =~ /^MSWin/i or $os =~ /^dos/i or $os =~ /^OS2/i){
$separator = '\\';
} elsif ($os =~ /^MacOS/i) {
$separator = ':';
}
でも構わないと思うけど。
# 手抜きするなら、/[:\/\\]/で区切るとか。
>>703 やりたいことをまずは書いたほうが解決は早いよ。
ディレクトリ部分を削除してファイル名のみにしたいとか。そんな感じじゃないの?
708 :
nobodyさん:04/11/13 17:15:37 ID:OROQk2Kk
ファイルハンドルがcloseされているのかされていないのかを明示的に調べる
方法はありますでしょうか?
はい
710 :
nobodyさん:04/11/13 17:49:37 ID:j/c/9VEE
フォームに記入してもらったメールアドレスにsendmailでメールを送信するCGIを組んで運用しているのですが、
infoseekのwebメールサービスで本文の文字化けが起きてしまいます。
例)あああああ → ??????????
ヘッダには以下のものを設定してあります。
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
ググってみたところ同じ問題を抱えているweb管理者さんがたくさんいることはわかったのですが
解決方法を見つけることはできませんでした。
文字化けさせない方法があったら教えてくださいませ。
charset="iso-2022-jp" で試してみそ
712 :
nobodyさん:04/11/13 19:12:30 ID:j/c/9VEE
>>711 レスありがとうございます。
実は以前は""で括っていました。
これが文字化けの原因かも?と思い現在は""を外しているわけですが
やはり文字化けしてしまっているという状況です。
この問題が解決できれば、多くのWeb管理者さんが助かることになると思います。
(もちろん私もですが…)
どうか皆さん、お知恵をお貸しください。
化けるメールと化けないメールのヘッダを比べてみたら?
714 :
nobodyさん:04/11/13 19:33:36 ID:j/c/9VEE
>>713 レスありがとうございます。
何度も見直しているのですが、PCのメーラから送ったものと特に違う箇所は無いのです。
(Received、Message-ID、X-Mailer等は抜かします)
Subjectは両方ともISO-2022-JPのBでエンコーディングして(されて)います。
Charset=iso-2022-jp ではダメか?
とにかく化けたメールのヘッダを晒してみんしゃい
ごめん 710にかいてあった 鬱
自作のCGI(PHPのPEAR:Mailを使用)で、710と同じヘッダでInfoseek宛に
メール送信してみたが、文字化けはしない。
710の使っているCGIとHTMLのソースを見たら、原因が分かるかも。
719 :
710:04/11/13 20:07:15 ID:j/c/9VEE
>>717 あまり綺麗なソースではないので恥ずかしいのですが、よろしくお願いします。
xxxの箇所は伏せさせてください。
my $mailer = '/usr/sbin/sendmail';
my $mlfr= 'xxx@xxx';
my $mlto= '
[email protected]';
my $mlsb= 'xxx';
my $mlmsg = "あああああ";
my $mlhd= "Reply-to: $mlfr" . "\n" . "MIME-Version: 1.0" . "\n" . "Content-Type: text/plain; charset=iso-2022-jp" . "\n" . "Content-Transfer-Encoding: 7bit" . "\n" . "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";
my $err = 0;
open( MAIL, "| $mailer -t -f'$mlfr'" ) or $err = 1;
if ( $err == 0 ) {
print MAIL $mlhd;
print MAIL $mlmsg;
print MAIL "\n";
close( MAIL );
}
なお、通常のメーラ、そしてyahooやhotmailなど他の無料メールサービスでは正常に表示されています。
$mlmsgはホントにiso-2022-jpか?
> my $mlmsg = "あああああ";
でエラー出てないから、送ってるコードはiso-2022-jpじゃ無いだろ。
コード変換しろ。
722 :
710:04/11/13 21:17:27 ID:j/c/9VEE
>>720 鋭いご指摘ありがとうございます。
素晴らしく見事に見過ごしてました…orz
$mlmsgにコード変換かますことで解決しました。
皆さんありがとうございました。
- - - - - ここまで釣り - - - - -
>ググってみたところ同じ問題を抱えているweb管理者さんがたくさんいることはわかったのですが
...
|
|
│
/V\ J
/◎;;;,;,,,,ヽ
_ ム::::<,,゚ A゚>::| ジーーッ
ヽツ.(ノ:::::::::.:::::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
>この問題が解決できれば、多くのWeb管理者さんが助かることになると思います。
...
727 :
710:04/11/13 21:37:32 ID:???
>>727 その文字化けの注意点は
710が思ってる文字化けの問題ではないと思われる
>>710 my ($err);
my $mailer = '/usr/sbin/sendmail';
my $mlfr= 'xxx@xxx';
my $mlto= '
[email protected]';
my $mlsb= 'xxx';
my $mlmsg = "あああああ";
my $mlhd= "Reply-to: $mlfr" . "\n" . "MIME-Version: 1.0" . "\n" . "Content-Type: text/plain; charset=iso-2022-jp" . "\n" . "Content-Transfer-Encoding: 7bit" . "\n" . "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";
if (open( MAIL, "| $mailer -t -f'$mlfr'" ))
{
print MAIL $mlhd;
print MAIL $mlmsg;
print MAIL "\n";
close( MAIL );
} else {
$err = 1;
}
関係ないけど、こんなのどう?
>>729 my $mlhdの行がイモ過ぎる。
書き直してやれよ。
my $mlhd=<<EOF;
Reply-to: $mlfr
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
From: $mlfr
To: $mlto
Subject: $mlsb
EOF
メールの改行コードって ¥r¥n じゃなくていいんだっけ?
>>731 そのままprintしてもいいよね
print MAIL <<_EOF;
Reply-to: $mlfr
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
From: $mlfr
To: $mlto
Subject: $mlsb
_EOF
>>732 sendmailがよきにはからってくれるが、明示的に
print MAIL <<_EOF;
Reply-to: $mlfr\r
MIME-Version: 1.0\r
Content-Type: text/plain; charset=iso-2022-jp\r
Content-Transfer-Encoding: 7bit\r
From: $mlfr\r
To: $mlto\r
Subject: $mlsb\r
\r
_EOF
とする方が望ましい。
(;゚Д゚)
(my $mlhd = <<"EOF") =~ s/(?<!\r)\n|\r(?!\n)/\r\n/g;
Reply-to: $mlfr
...
EOF
737 :
nobodyさん:04/11/15 00:54:44 ID:Pp2G7AAw
ここで質問してよいのか迷ったのですが、もし不都合でしたら御指摘ください。
perlのスクリプト中で、あるURLのhtmlファイルを取得して、そのファイルの
データを処理したいのですが、その取得方法がわかりません。
ぜひご教授お願いします。
>>703 遅レスだが、ポータビリティを重視するならFile::Spec
使ったほうがいいんじゃない?
ソートに関して…躓いています。
@data = (
'あ,1,A',
'い,2,B',
'う,3,C',
'え,4,D',
'お,5,E',
'か,6,F',
);
という例があったとして、これを数字でソートし、
さらに4にもっとも近い順からソートしたいのですが、これが上手くいきません。
方法があれば何卒教えて頂きたく思います。どうか宜しくお願いします。
こんなんじゃ?
for(@data){
$data{$_}=abs(4 - (split(/,/,$_))[1]);
}
foreach (sort {$data{$a} <=> $data{$b}} keys %data){
print $_, "\n";
}
my @new = map{ $_->[1] }
sort{ $a->[0] <=> $b->[0] }
map{ [abs((split(/,/))[1]-4), $_] } @data;
--
# 数字は8桁以内
my @new = map{ substr($_, 8) }
sort{ $a cmp $b }
map{ pack('A8A*', abs((split(/,/))[1]-4), $_) } @data;
--
#
>>741さんと同じハッシュ使用
my %temp = map{ $_ => abs((split(/,/))[1]-4) } @data;
my @new = sort{ $temp{$a} <=> $temp{$b} } keys %temp;
>map{ pack('A8A*', abs((split(/,/))[1]-4), $_) } @data;
map{ sprintf('%08d%s', abs((split(/,/))[1]-4), $_) } @data;
だね…。
すみません、便乗でいいですか?
>740さんの例題をすこし弄って、
@data = (
'赤,あ,1,A,6',
'青,い,2,B,5',
'赤,う,3,C,4',
'青,え,4,D,3',
'赤,お,5,E,2',
'青,か,6,F,1',
);
これを>740さんの質問通り三つ目で四に最も近い数字でソートします。
この後が僕の質問なんですが、
これを更に一番目でソートし、最後に五番目でソート…
というのは出来ますでしょうか?
具体的にはこんな感じでしょうか?
@data = (
'青,え,4,D,3',
'青,い,2,B,5',
'青,か,6,F,1',
'赤,う,3,C,4',
'赤,お,5,E,2',
'赤,あ,1,A,6',
);
一応、>741さんや>742さんの解答を参考に頑張ってみたんですが、
やっぱり上手くいきませんでした。
複雑だし無理かもしれませんがどうかお願いします。
sort { } の中身を工夫すればできる
できなければ駱駝本を買って sort 関数のところを読め
746 :
nobodyさん:04/11/15 12:09:37 ID:44z8JY7I
jcode.pl v2.13 を使っているのですが、大量のバッチ処理をしていてふと
気付いたら、以下のようなメッセージが極々々まれに出てるのに気付きました。
Character in "C" format wrapped at [フルパス]/jcode.pl line 554.
行554には $s2e{$code} = pack('CC', $c1, $c2); とかかれているのですが、
恥ずかしながらなぜ警告(?)メッセージが出てるか自分でわかりません。
どなたか教えて頂けないでしょうか?
(ネットで探してみましたがちょっとよく分からくて)
$c1と$c2の値がすでに文字列なんじゃないの。
>>746 とりあえず診断メッセージがわからないときはperldiag(1)を
見るのがいいと思うのだが。
Character in "C" format wrapped in pack
(W pack) You said
pack("C", $x)
where $x is either less than 0 or more than 255; the "C" format is
only for encoding native operating system characters (ASCII,
EBCDIC, and so on) and not for Unicode characters, so Perl behaved
as if you meant
pack("C", $x & 255)
If you actually want to pack Unicode codepoints, use the "U" format
instead.
749 :
nobodyさん:04/11/15 15:03:24 ID:44z8JY7I
>>748 ありがとうございます。英語力は全く無いのですが、
0〜255の範囲以外のが来てるのでエラーになっているのですね。色々試しています。
750 :
737:04/11/15 21:26:40 ID:YvLIGcES
>>739 ありがとうございます。LWPを使ってうまくいきそうです
(何をやってるのか自分でまだ理解できてなかったりしますが・・・)
751 :
nobodyさん:04/11/15 22:45:40 ID:v6KPj5Kw
漠然とした質問で申し訳ないんですが、1000行程度の1対1対応のデータを
1回のプロセスで何度も検索する場合、あらかじめハッシュを作った方が速くなるのでしょうか?
いまいちハッシュの性能というのが分からないのですが、検索キーをかえるたびに
1行目から値を探していくのと、ハッシュにキーを入れて値を得るのと、
ハッシュのほうが速そうな気がするんですが、やっぱり速いでしょうか?
>>751 case by caseとしか言いようが・・・
行という言葉を簡単に使ってるけども、
実際には行の切り出しという処理が入るわけだし、
それなら固定長でデータを扱う方が早いわけだし、
ハッシュというか位置インデックスを作れば固定長の呪縛が無くなるし、
というか何度も検索する必要があるのか?という根本的な疑問も残るし、
長くなったがオレの言いたいことはこれだね!
なんで試してみない?
>>752 実際二つ作ってみるのが早いですよね。めんどくさがって申し訳ないです。
組み合わせの検索をする感じなんですが、大体2500〜40000くらいの組み合わせから
条件に合うものをピックアップする感じで、やはりとにかく試すことにします。
ありがとうございました。
>>751 よくわからんが、もし言いたいことが
while($hairetsu[$index] ne $hikaku){ $index++; }
と
$index = $hash{$hikaku}
を比べたいのなら、後者の方が圧倒的に速い
755 :
751:04/11/15 23:54:50 ID:???
>>754 バッチリそんな感じです。ハッシュの方から作ってみる事にします。
>>754 えーと。。whileつーのは。。やっぱりいいや。
意味せんとしていることは伝わってるみたいだし。
757 :
751:04/11/16 00:18:23 ID:???
>>756 ああ読み違えました!のかな?
今必要としているのは、キーと値の両方で、キーはただの行数とかじゃなくって
ユニークなデータなので、while($hairetsu[$index] ne $hikaku){ $index++;}
の方だと無理なのかもしれません。ごめんなさいよく分かりません。
普通は、1000個もハッシュ作ってからindex検索するるより、
1000行ベタ検索した方が速い。30000行でもそうだったかな。
ごめん、30000行のはSQL+pnamazuとベタとの比較で、
そりゃDBのが速いが、pnamazuが介在してるからか、
たいして変わらなかった。QDBMあたりでやったらどう
かな。こんどやってみるか。
1回しか検索しないなら要素がいくつだろうがリニアサーチの方が速いけど、
何回も検索するならソートしてから二分探索するかハッシュ作った方が全然速い。
要素が1000個でも。
>>760 1回の検索ではリニアサーチの方が速いんなら、何回やっても
リニアサーチの方が速いだろうが(プッ
1*n < 1.2*n、ほれ回数が多くなるほど差は広がる。
>>761 mod_perlなんかならハッシュだな。つまり、何回も検索する際、
perlを起動しなおさない。作ったハッシュをメモリに保存しとく。
あと、namazuとかsufaryとかindexファイルを別に作っておくとか
すれば、
>>760でOK.
最初にハッシュを作るステップを抜きにすれば、
リニアサーチよりハッシュの方が速いということ?
みんな
require 'ファイル';
って最初の方に読んじゃってますか?
そのファイルが必要な処理がある直前(複数箇所)で
requireしてるんだけど問題ありますかね?
複数箇所と行っても一回の起動では一箇所しか呼び出しません。
>>744 遅レス御免。
これで処理しても示されてる結果にはならないが、
条件が複数のソートはこんな感じでいいと思う。
$sort_routine = sub {
my @La = split /,/, $a; my @Lb = split /,/, $b;
abs(4 - $La[2]) <=> abs(4 - $Lb[2]) || $La[0] cmp $Lb[0] || $La[4] <=> $Lb[4];
};
@ahoo = sort $sort_routine @data;
768 :
762:04/11/17 06:08:04 ID:???
ごめんなさい。質問を勘違いしてました。
質問内容は
・3の要素でソート
・1の要素で安定なソート
・5の要素で安定なソート
で、その順番を逆転させれば一回でできる訳ですね。
5の要素でソート、同じ値なら1の要素でソート、同じ値なら3の要素でソート。
use sort "stable";
my @new = map{ $_->[3] }
sort{ $a->[0] <=> $b->[0] or $a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] }
# sort {$a->[1] cmp $b->[1] or $a->[2] <=> $b->[2] } # 3と1の要素だけでソート(例示と同じ結果を得る)
map{ my @v = split(/,/); [$v[4], $v[0], abs($v[2]-4), $_]; } @data;
>>745 つっこんでごめん。
769 :
767:04/11/17 07:36:26 ID:???
なんだ、
>>767の方法ってPerlメモってところで既出だったのか・・・。
せっかくその場で考えたのに、空しいぜ。
よく読んで頭冷やしてくるか。
>>766 条件などで読むファイルを変えたいときは、
途中に書いたことはあったけどね・・・。
何でもないときは、先頭に書くのが基本でしょ。
そのプログラムが、どのファイルに依存しているかを明示しておけば、
後々運用管理するのに楽になるし。
Perlメモお世話になってます。
771 :
nobodyさん:04/11/17 18:32:44 ID:tQLRR4kH
同じファイルハンドル(この場合$fh)から別ファイルに続けて書き出そうとすると
何も出力できません。
open (OUT,"> test/$test");
while(<$fh>){ #$fhはファイルハンドルが入っている
prin OUT $_;
}
close(OUT);
という処理を繰り返し実行すると2つ目のファイルは
なにも表示されません。
1回実行したあとファイルハンドル($fh)を表示してみましたが、
確かに指し示しているファイルは1回目と変わりません。
ファイルハンドルを書き出した後ファイルハンドルって
どうなってしまうのでしょうか?
>>771 prin じゃなくて printだよね?
while は$_を操作しません。
773 :
771:04/11/17 19:13:30 ID:tQLRR4kH
すいません。printです。
forでも同じでした。
774 :
771:04/11/17 19:20:12 ID:tQLRR4kH
なんどもすいません。
できました。書き出す前にtellでファイルハンドルの場所を
取って来て、書いた後seekで戻す事によって解決しました。
お騒がせしました。
776 :
nobodyさん:04/11/17 19:38:43 ID:GNPvE3vb
htmlの部分とCGIの部分を分けてコーディングしたいです。
何かよいモジュールなどありませんでしょうか。
HTML::Template
779 :
質問です:04/11/18 01:55:30 ID:U6GG0aJq
$file = "file.xxx";
$size = -s "$file";
print "Content-Disposition: attachment; filename=\"$file\"\n";
print "Content-Length: $size\n";
print "Content-Type: application/octet-stream\n\n";
open(DAT, "$file");
while(<DAT>){
print;
}
close(DAT);
のようなコードで file.xxx をダウンロードしたいのですが、
ダウンロード画面はちゃんとでてダウンロードできるのですが、
ファイルが壊れて保存されます。これはなんででしょうか。
OSはwindowsでapacheで動かしてます。。
>OSはwindowsでapacheで動かしてます。。
DATもSTDOUTもbinmode()せにゃあかんのでは?
すいません。そのとおりでした。
ありがとうございます。
感謝感謝。
TO:[123] こんにちわ。
↑のような文字列から数値部分(123)だけを取り出す場合、どう書くのがスマートでしょうか?
TO:[数値] という書式は固定です。
$string =~/^TO:\[(\d+)\]/;
$no = $1;
785 :
nobodyさん:04/11/18 13:06:46 ID:If69CbzI
s/"/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;
これは"が"に変換されてるデータ($_)から"を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての"が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの"のみです。
最初にいきなりs/"/"/g;などとやらず、fontタグの"だけを"に戻す方法すにはどの様にすれば良いでしょうか?
すいません、書き直します・・・。;は全角です。
s/";/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;
これは"が";に変換されてるデータ($_)から";を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての";が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの";のみです。
最初にいきなりs/";/"/g;などとやらず、fontタグの";だけを"に戻す方法すにはどの様にすれば良いでしょうか?
馬鹿ですいません・・・。&quot;は全角で書きましたが本来は半角です。
s/&quot;/"/g;
1 while s/<font([\s\w\=\#\"\'\+\-]+)>/<font$1>/i;
1 while s/<\/font>/<\/font>/i;
これは"が&quot;に変換されてるデータ($_)から&quot;を"に戻し、
fontタグを有効にする処理ですが、これでは$_内の全ての&quot;が"に戻ってしまいます。
しかし、"に戻す必要があるのはfontタグの&quot;のみです。
最初にいきなりs/&quot;/"/g;などとやらず、fontタグの&quot;だけを"に戻す方法すにはどの様にすれば良いでしょうか?
stylesheetが使われる可能性も考えろよ
そもそもなんでFONTタグ内の " が " に変換されとるの?
>>789 説明不足ですいません。
BBSのログで、保存する時点ではタグに関わる記号&;<>は全てデコードしてあります。
で、読み出して表示する際に許可したタグのみ有効にする仕組みになってて、fontタグのみ有効にしてます。
>>790 × &;<>
○ &"<>
でした・・・。
792 :
789:04/11/18 13:54:44 ID:???
だったら、<> の2種類だけをエンティティーコードに変換すりゃええやん。
s!(?<=<font)([^>]+)!my $s = $1 ; $s =~ s/"/\"/g ; $s!ieg ;
こうかなあ。
すいません。色々悩んだ挙句、ログに記録する時点でダブルクォートは&quot;に変換しない
って事にしました。
(´д`)
♥ → そのまま。
&hiroyuki; → &hiroyuki;
みたいに実態参照が定義されていない場合のみ & をエスケープしようと思ったら、
定義されているやつを全部リストとかで持ってないとダメなんだろうか。
使えるモジュールとかありますか?
>>797 HTML::Entities
decode_entitiesに食わせて変化するか(定義されていれば変化する)
または、
%entity2charハッシュのキーにあれば定義されている
といったあたりでいけると思う。
>>794 なんで
>>793のでうまくいかないんだ?
俺っちも考えたが、793と同じような形になったし。
もしかしてネタ?
>>798 ありがとう。うまくいってるようです。
でも借りてるサーバーには HTML:: が無いんだけど、まあコピーして置いとけば動くだろう。
>>799 すいません。<>も&lt;&gtに変換された状態なのを説明してませんでした。
<>のままの状態だと
>>793さんので出来ました。
>>801 s!<(/?font\b.*?)>! (my $s=$1) =~ s/"/\x22/g; "<$s>" !egis;
ではどう?
<font **>と</font>の両方を < > も含めて戻せると思うんだけど。
>>802 ばっちり復元出来ました!すげー!
FONTタグで囲まれたデータ部分の&lt;&gt;&quot;はそのままで、
タグの記述部分だけちゃんと変換されてます。
ありがとうございました!
超初心者な質問です。
telnetモジュールを使用して、リモートコンピュータに接続してから、
・screen起動
・外部プログラム起動
・CTRL-A d で[detached]
という操作をperlで実行したいのです。
色々サイトを回って調べて、telnet接続まではできたのですが、
上記手順の「CTRL-A d で[detached]」で行き詰っております。
CTRL-Aという操作をperlのtelnetモジュールで行うには、
どういう記述をすればよいのでしょうか?
805 :
804:04/11/19 10:44:06 ID:???
説明が悪かった気がします。
何でscreenを使用したいかというと、
webブラウザ上で、サーバのプログラムを起動させ、常駐させたいからです。
通常のデーモン(inetdなど)であれば、わざわざscreenなど使わなくても
telnetモジュールで接続させ、コマンドを実行させればよいのですが
今回起動させたいプログラムは、バックグラウンドで動作してくれないため、
常にコンソールを開いておく必要があるのです。
なので、仮想的に常駐させるためにscreenを選んだというわけです。
当方、UNIX系OSに触れて1週間足らずなので、
「screenなんて使わなくても この方法でいいだろバカ」
という意見なども助かります。
806 :
nobodyさん:04/11/19 10:59:05 ID:n9OG7mgX
swfからcgiをたたいて、画像の縦横サイズを変更し、
swfに表示するということをやっております。
画像は正しくロードできるのですが、ファイルサイズが取得できず、
ローディング表示ができなくて困っています。
詳しく説明します。
まずswf内で
_root.[object].loadMovie("hoge.cgi", "POST");
を使い、ロードの要求をします。
するとhoge.cgiでimageMagickというモジュールを使い、
縦横サイズを変更します。ここでPOST送信されている
stageWとstageHとranはswfから送られてくる変数です。
807 :
806:04/11/19 10:59:50 ID:n9OG7mgX
つづきです。
---
use Image::Magick;
if($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}else {
$query = $ENV{'QUERY_STRING'};
}
foreach $pair (split(/&/, $query)){
my ($key, $value)=split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$key}=$value;
}
$i = Image::Magick->new;
$img="img/cover$form{'ran'}.jpg";
$i->Read($img);
($width, $height)= $i->Get('width', 'height');
if($width/$height>=$form{'stageW'} / $form{'stageH'}){
$newwidth =$width*$form{'stageH'}/$height;
$i = $i->Transform(geometry=>$newwidth);
}else{
$newwidth= $form{'stageW'};
$i = $i->Transform(geometry=>$newwidth);
}
print "Content-type: image/jpeg\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
undef $i;
exit;
---
808 :
806:04/11/19 11:00:52 ID:n9OG7mgX
つづき2です。
--
そして戻ってくる画像データをswf内にて
getBytesLoaded()やgetBytesTotal()で調べています。
するとロードされたバイト数はしっかり取得できているのに
対し、総ファイルサイズはロード中はずっと0になっていて、
ロードが完了すると総ファイルサイズが表示されます。
OS FreeBSD
perl 5.8.x
Flash ver.6.0
どうか、よろしくお願いいたします。
ヘッダじゃない? Content-Length
$alldataが空じゃなく、$ENV{'CONTENT_LENGTH'}が空の状態で
read STDIN,$alldata,$ENV{'CONTENT_LENGTH'};
を実行したら$alldataの中身は変わってませんでした。
原因はどこですか?
811 :
810:04/11/19 14:33:50 ID:???
すいません、ちゃんと空でした。
右下じゃなくて右上でした
perlで変数を()でくくって宣言しているのをしばしば見かけるのですが、
($tmp) = "hoge";
とか。
これは何の意味があるんでしょう?
>>816 その例ではまったく無意味かと
($foo, $bar) = @_;
とかやると
$foo = $_[0];
$bar = $_[1];
の効果が得られる。
多分書いた人の癖じゃないか?
>>817 レスありがとうございます。
某レスQのCGIにしばしば出現てて悩みました。()の中はスカラ変数が一つだけなんです。
実際は右辺はサブルーチンだったりするんですが、配列は戻ってこない。
($ret) = &getMessage("$filename$EXT");#戻り値は0か1
とか。
悩むのやめときます。
ていうかレスキューなんか参考にするのやめれ
820 :
804:04/11/19 22:47:11 ID:???
>>814 レスありがとうございます。
/dev/nullについて調べて、実際に動かしてみました。
要するに出力をポイっとやるわけですよね?
末尾の2>&1は何でしょうか?色んなサイト調べてみましたが、
nullの動作に触れてるところばかりHITしたらしく。。orz
nohupもためさせてもらいました。
動作的にはscreenと似ているので、助かります。
しかし、nohupすると、私のUNKサバではかなり重くなってしまいます。。
出力を書き込んでいるからでしょうか?
あと、nohupや &での開始だと、telnetモジュールを切断させた後
ジョブをフォアグラウンドに復帰させる方法が見当つきません。。
我侭ばかりですいません。よろしくお願いします。
821 :
804:04/11/19 22:50:33 ID:???
論点がPerlからズレてきているようなので、質問を訂正します。
割り込みキー入力(今回の場合はCTRL+A)を
perlからコンピュータに送信する方法はあるのでしょうか?
板汚し申し訳ないorz
>>818 そうやっておくと、もし2つ以上の返り値があった場合に
最初の値だけ取って、残りを捨てるということができる。
安全策ってわけだな。
あまり誉められたものではないと思うけど。
>>821 試してないけど\x01送るんじゃ駄目?
だからさ、2つ以上の返り値があるのかどうかわかんなくなっちゃうでしょ
825 :
823:04/11/19 23:20:43 ID:???
>>821 おっと2>&1についてもついでに答えるんだった・・・
「標準エラー出力を標準出力に纏める」という意味。
nohupが重くなる理由はmanに書いてあったぞ
> スケジューリング優先度は 5 増やされるので、
> 実行の割り当て時間はやや小さくなる。
そんなに大きく変わるかは知らないが
826 :
804:04/11/20 00:21:15 ID:???
>>823,825
レスありがとうございます。
大変貴重な情報をいただきました。
若干板違いな質問にも丁寧に答えてくださって、感謝です。
質問です.
ある, 改行コードがCR+LFのテキストファイルがアップロードされた際, 改行コードをLFに
変換し, そのファイルを保存するcgiを書きたいのですが, 以下のように書いてみましたがうまくいきません.
LFに変換されずCR+LFのまま保存されてしまいます.
#!/usr/bin/perl
use CGI;
$query = new CGI;
Content-type: text/html\n\n
$fn = $query->param('filename');
$type = $query->uploadInfo($fn)->{'Content-Type'};
if($type =~ /^text\//){
open(FILE,">test.txt");
while (<$fn>) {
$temp = $_;
$temp =~ s/\r\n/\n/;
chomp($temp);
print FILE "$temp\n";
}
}
どのようにしたらいいでしょうか?宜しくお願いします.
>>806 >>809のContent-Lengthは、レスポンスの方だと思う。
print "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
で、$filesizeにjpegデータのサイズを入れておく。
(一旦テンポラリファイルを作らないとだめかも知れないけど)
windowsなら\nをさらに\r\nに直してくれる自動サービス付き
バイナリモード binmode を参考に
>>822 contextによって返す値がかわる関数もあるし意味もなくカッコつける癖は
まねしない方がいいと思われ
>>821 screen使った事ないけど、man読んでみた限りでは、
-d -Dでいけるんじゃ?
それから、うに板の方が適切な質問じゃないかと。
for(@list) {
...
}
の中で現在の行番号を取得する良い方法はありませんか?
$_ == $list[$hoge] になるような $hoge が知りたいのですが……。
カウンタ変数を新たに作るしかないんでしょうか。
834 :
806:04/11/21 13:04:12 ID:Ewup0dSn
>829さん
お力添え、ありがとうございます。
早速やってみます!!
>>833 for(0..$#list){
処理
}
>>835 希望の処理ができました。
ありがとうございます。
837 :
nobodyさん:04/11/21 18:47:52 ID:8gMC3V6h
perl+mysqlでカートを作りました。
一応入力チェック(サニタイジング)として、like演算子のワイルドカードである
「%」と「_」があったら削除してます。
よく考えたら「_」はメールアドレスとして普通に使われてる可能性があるんですよね。
そこで質問ですが、_これってlike演算子以外では安全ですよね?
DBIのprepare時にプレースホルダを使用してるのですが、みなさんは_対策とかしてますか?
>>837 データを新規レコードとして挿入するだけなら問題ない。
まあlikeなんて挿入で使わないんだから気にするなよ。
839 :
nobodyさん:04/11/21 19:01:17 ID:ubTrO76H
@user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'});
if ($user_agent[0] eq 'DoCoMo') { $URL=$iURL; }
elsif ($user_agent[0] eq 'J-PHONE') { $URL=$vURL; }
elsif($user_agent[0] eq 'UP.Browser' || $user_agent[0] =~ /^KDDI/) { $URL=$eURL; }
else { $URL=$pURL; }
print "Location:$URL\n\n";
print "Content-type: text/html\n\n";
print "<HTML><HEAD><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10;URL=$URL\"><TITLE>auto jump</TITLE></HEAD><BODY><A HREF=\"$URL\">自動でジャンプしない場合はこちらから</A></BODY></HTML>";
exit;
というのでHPを携帯なら携帯で察知して携帯用HPに
飛ばすようにしているのですが
話題の京ぽんを携帯用に飛ばしたいのですが出来ません。
ご教授ください。
>>837 プレースホルダつかってるなら勝手にエスケープしてくれるんじゃないの?
841 :
nobodyさん:04/11/21 19:48:30 ID:w/cY/u9z
>>841 urlのマッチングなんて探せばすぐ見つかるだろが
843 :
nobodyさん:04/11/21 20:07:53 ID:w/cY/u9z
どこが間違ってますか?
正規表現メモを参考にしたんですが。
846 :
841:04/11/21 21:33:14 ID:???
確認してくれた方ありがとうございます。
正規表現事態は間違ってないみたいですね。
しかしなんでだろう・・
847 :
nobodyさん:04/11/21 22:26:23 ID:hibhMAES
今使ってるレンタルサーバーはcgiを別サーバーに置くようになっています。
cgiサーバーからhtmlサーバー内のログファイルを読み込むには、別サーバなので、
ソケットを使わなければいけないということで、とりあえずトップページを表示させようと、
次のソケットスクリプトを実行してみました。
$host = "www.xxxxxxxxxxx.com";
$page = "/";
$line = "";
$addr = (gethostbyname($host))[4];
$name1 = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name1);
binmode(S);
select(S);
$| = 1;
select(stdout);
print S "GET $page HTTP/1.0\r\n\r\n";
while (<S>) { $line .= $_; }
close(S);
print $line;
ページの指定を$page = "/index.html";にするとNot Found
$page = "/";にするとForbiddenという反応が返ってきてうまくいきません。
これはただ、パスの指定が悪いだけなのか、やはりサーバーの設定で
ソケットが使えないようになっていて、cgiサーバーからhtmlサーバーの
ファイルを読み込むのはあきらめなければならないということでしょうか?
>>847 ソケットが使えないようになってるならそもそも
返事すらもらえないはずなので、パスじゃねーの?
最初にすべきことは使えるかどうかの確認じゃないかと
>>847 パスが合ってる筈なのにって場合は、リクエストにHOSTも入れた方がいいかも知れんね。
851 :
839:04/11/21 22:51:26 ID:ubTrO76H
京ぽんのuser agentをいろいろ設定しましたが
どれもだめです。
そもそもの書き方を間違えているのでしょうか?
>>847 print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
>>851 京ぽんつーのが何なのか知らないが、elseの中でUA名を表示させてみれば
どういうUA名で分岐すればいいのか分かるのでは?
perlの掲示板に検索機能をつけようと思ってるのですが、ログが1投稿毎に別ファイルにしてあります。
いちいち1ファイルごとに読み込んでマッチ処理の繰り返しでは負荷的にも問題あるので、
データディレクトリでgrepかけて、該当したファイルのみ読み込みたいのですが、
perlでやるにはどうすればよいでしょう?
数値Aと数値Bを比較して大きい方を変数に代入したい場合、
最もシンプルな記述はどんな感じになりますか?
$hensu = $a > $b ? $a : $b;
>>854 >>1 【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
>>854 open(IN,"grep '$keyword' file|");#実際にgrepを実行する
って手があるが、鯖によってはgrepはダメかもしれない。
ファイル名の検索ならFile::findで一発なんだが・・・。
860 :
855:04/11/22 01:31:38 ID:???
>856
ifで書くと長いので。
>857
多謝。
>>860 大きなお世話かもしれんが、最初のうちはif使ってたほうが良いぞ
>>859 ありがとうございます。
grepからの出力を拾う方向で実装してみます。
grep で子プロセス1個作るのも結構な負荷だぞ。
ファイルの数が多ければ grep の方が軽いが、
少ないなら perl の中でループ回す方が鯖にやさしい。
てのはコーディングというより負荷軽減スレにふさわしい話題だが。
864 :
856:04/11/22 02:58:22 ID:???
>>860 最もシンプルに答えただけなんだが、理解できなかったみたいだな。
理解してるみたいだけど…?
"?"を使えって事だろ レスがシンプルなだけで要望には応えてないが
あのレスだけで理解できたらここで質問なんぞしない希ガス
868 :
nobodyさん:04/11/22 05:42:53 ID:/gdSyseW
>>847 >>852 >print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
hostを入れたら違う反応が返ってきて次のメッセージが表示されました。
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
ただ、期待したトップページは相変わらず表示されませんでした。
このメッセージからソケットが使えるって判断できるでしょうか?
869 :
nobodyさん:04/11/22 06:30:29 ID:/gdSyseW
>>868 トップページにはフレームを使っているので、表示されないみたいです。
取得したいログファイルを指定したら、見事に表示されたので、ソケットは使えることは確認できました。
ただ、次の応答メッセージが頭にくっついてくるので、これを取得しないようにすることはできるでしょうか?
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
>>869 ヘッダの最後は
CRLFCRLF(最低限LFLF)
になってるので、取得した後、そこまでカットすれば問題ないっしょ。
872 :
nobodyさん:04/11/22 07:20:47 ID:/gdSyseW
>>871 取得した後で加工してカットするということですか?できれば、取得時にカットしたいのですが、
不可能であれば、最終手段はそうするしかないですね。
>>872 <>で読むなら、空行が出るまで別の変数に入れておくとか、空読みするとか。
あと、socketとconnectのエラー処理をした方がいいよ。
LWP使ったほうが楽じゃないかと...
875 :
nobodyさん:04/11/22 10:28:03 ID:/gdSyseW
>print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
素人考えで申し訳ないですが、GETのところでオプションなどをつけてその応答メッセージを
出さないようにすることってできないものですかね?
HTTP/1.1 200 OK 〜〜text/html 取得したログファイルの内容〜
取得した内容は↑のようになっていて、応答メッセージと取得したログの間は半角スペースと
なっています。
応答メッセージを取得時にカットできない場合、取得後にカットするわけですが、シンプルに
カットするには、どういう方法があるでしょうか?perl初心者なもので、たびたびすみません。
>>859 初心者にセキュリティホールのある方法教えるな。クズ。
878 :
806:04/11/22 11:50:53 ID:dylfkRdn
>829さん
print "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
と書いてみました。swf側でファイルサイズを取得できて大喜びだったんですが、
jpg画像が途中から壊れて表示されるようになってしまいました。
>(一旦テンポラリファイルを作らないとだめかも知れないけど)
すみません。調べてみたのですが、ちょっと意味が。。。
>>878 もしContent-lengthをつけただけでそうなったのなら、
$fileseizeの値がおかしい可能性が高いな。
880 :
806:04/11/22 13:03:45 ID:dylfkRdn
>879さん
レス、ありがとうございます!
print "Content-type: image/jpeg\n";
print "Content-length: 100000\n\n";
とかやってみたのですが、やはり画像が壊れて表示されます。
(こんなことしてはいけないのかな。。。)
881 :
806:04/11/22 13:14:51 ID:dylfkRdn
>879さん
できました!!
やはり値がうまく入っていないだけでした。
ただ
($width, $height, $filesize)= $i->Get('width', 'height', 'filesize');
と値をとっただけなのでリサイズ前のファイルサイズがとれているだけなのですが。
テンポラリファイルとは一度このファイルをtmp.jpgとかにしてそのファイルサイズを
を測らなくてはならないという意味だったのでしょうか?
882 :
nobodyさん:04/11/22 14:04:38 ID:/gdSyseW
>>876 http://x68000.q-e-d.net/~68user/ x68userのページで、「HTTP クライアントを作ってみよう」という記事を見ましたが、
どうもヘッダを除いてボディだけを出力するというのはできなさそうに感じました。
LWPについてはx68userのページで一通り見ましたが、掲載されていないように
見受けられるので、いろいろ検索してそれらしい解説ページを見ましたが、
使用方法について内容の濃いページを見つけられませんでした。
一般的にどのサーバーにもLWPのモジュールが入っているのか?、当方のレンタル
サーバーでLWPは使えるのか?といった辺りからよくわかりません。
(見当違いなことを言っていたらごめんなさい。)
結局、ソケットでヘッダー(応答メッセージ)も含めてファイルを取得し、文字列操作
して、わざわざいらない部分を取り除かなければならないことになりそうです。
同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを
参照するだけで、えらく苦労しています。
884 :
nobodyさん:04/11/22 14:30:16 ID:C0NQJmHQ
サーバーに新しいメールアカウント(例:abc)を作り
そこに添付されてきた画像ファイルをCGIで読み込み
メインアカウント(例:main)内にあるフォルダに保存させています。
読み込むCGIをgetmail.cgiとするとこれを手動で実行すると
問題なく動作するのですが
crontabを用いて自動実行させると添付ファイルの保存がされません。
crontabによりgetmail.cgiは動作しているものの
保存のみがされないようです。
0-59/2 * * * * cd /home/sites/www.xxx.jp/web && /home/sites/www.xxx.jp/web/mailget.cgi
で実行させています。
環境はRed Hat Linux 7.3
Apache 1.3.27
Sendmail 8.11.6
です。ちなみに、別のレンタルサーバー(FreeBSD)では動作していました。
原因がどこにあるのかご教授ください。
>同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを
>参照するだけで、えらく苦労しています。
いやそれはそういうモノだ
Perlコーディング以前の「コンピュータが動くしくみ」とかいう次元の問題として
886 :
nobodyさん:04/11/22 14:54:17 ID:/gdSyseW
>>882 ひとまず、ご指摘の箇所を適用してヘッダーを読み飛ばし、ボディだけ抽出できました。
ありがとうございました。
>>877 じゃあ初心者にセキュリティホールの無いやり方を教えてみろクズ。
何も提案できない奴が偉そうな事抜かすな。
>>884 実行ユーザ名・使用するファイルのパミッション・使用する環境変数等々
チェックすることはいっぱいあるよ。
んでも、エラーを適切に処理してればどこでコケたか分かるでしょ?
>>887 初心者自体がセキュリティフォールです。はい。
ふぉーる
890 :
nobodyさん:04/11/22 16:04:25 ID:C0NQJmHQ
>>884です。
>>888さん、ありがとうございます。
色々チェックしましたがイマイチ解りません。
ブラウザから実行した場合は正常なのですが
crontabで自動実行した場合のみ保存がなされません。
調べたところ、添付ファイルの取り込みも問題ないようで
問題なのはopenして書き込む部分が実行されていないと言うことです。
ファイルの所有者とグループが違うのかと思ったのですが
これらは変更したりできるのでしょうか?
>>888 検索方法の話であって初心者云々関係ねーし。おまけにフォールだし。
子供達を責めないで(by デスラー)を思い出すな。
「私は子供に生まれないで良かったと、胸をなでおろしています!」っての。
>>888は初心者に生まれないで良かった胸をなでおろしてるんだろうな。
次スレ案
【初心者は】Perlコーディング初心者質問スレ Part 39【セキュリティフォール】
#! c:/perl/bin/perl
print "Content-type: text/plain\n\n";
print "Hello Perl !";
今日からPerlをはじめまして、本どうりにこれを打ち込んで、表示さしてみると
ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
メモ張にHello Pealと表示されます、本ではブラウザ上に表示されると
なっているのですが、違うCGIをためしてみるとちゃんとブラウザに表示されます。
本の付属のサンプルでやってもこれだけは、安心できる発信もとからの・・・
ファイルを開く 保存・・がでてブラウザに表示されません。これだけ
なぜかこうなります。
無視して、これは飛ばして次のCGIからやったほうがいいのでしょうか?
原因がわかるかたぜひおしえてください。
>>887 とりあえず、$keywordをサニタイズするようにぐらい書いておけ
うーん、grepのシェル起動はやっぱマズイ気がするな。
$keywordが実行されないようにしないと。
バッククォートは確実に殺しとけ。
そもそもgrep使っても1ファイルずつひらいて舐めるのは
かわらないのでperlの中だけで完結した場合に比べて
劇的に処理が軽くなるとはとは思えないのだが。
898 :
888:04/11/22 16:58:04 ID:???
(((η)
| | (っ))) ヒャッホー! オレ様がスレタイに!!
| | //
|∧_∧ //
>>890 (´∀`*// cgiの実行ユーザ名でcrontab -eを実行してないのでは?
l / その場合ならパーミッション関係でエラーがでて
保存できないこともありうる。原因を探らないと。
open() 関数の戻り値が false だったら $! を表示させてみる、とかな
900 :
nobodyさん:04/11/22 17:51:31 ID:TZImgkmI
sendmail時のことで質問です。
subjectはちゃんとmimeエンコードしてるのですがfromに日本語を埋め込む時にも
mimeエンコードする必要がありますか?
JISでそのまま書いても駄目ですよね?
from: "送り先の人間の名前" <
[email protected]>
みたいになってますがどうすれば大方のメールソフトで問題なく動作するでしょうか?
>>887 クズのくせに威勢がいいな。
特別に教えてやろう安全なパイプの使い方だ。二度と初心者に穴コード教えるなよ。ヘッポコ。
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('grep', $keyword, 'file') || die 'grep';
}
>>900 MIMEエンコードすりゃいいだけだろ。何が聞きたいんだ?
>>894 .cgiファイル?
まあどっちにしろ
__END__を忘れてないか
あとどんな本だ?
>>894 ここはコーディングの質問スレなので、それ以前の方はお引き取りください。
904 :
nobodyさん:04/11/22 19:16:13 ID:4/apYG7/
>>901 そんなんで虚勢張られてもなぁ・・・
空しくならない?
後出しじゃんけん キタ━━━━(゚∀゚)━━━━ッ!!
っていうか悪意のある入力値のサニタイズとは関係ない気が。
外野だけど$keyword = quotemeta($keyword)じゃだめ?
バッククォートとシングルクォートだけで良いと思うけど。
()もマズイか?
いずれにせよ、パイプの使い方云々って話じゃなくて。
909 :
nobodyさん:04/11/23 01:23:12 ID:nMfYIywn
あのね、僕ちゃん達、何のためにサニタイズするの?
shが余計な解釈して、コマンド実行されると困るからでしょ。
>>901の方法でパイプ使えばshは経由しないから、安全なの。
910 :
nobodyさん:04/11/23 02:23:51 ID:7PvclRNn
まぁまぁ、まぁまあ、
マーライオン , ―‐ 、
/r‐' ,ェェr‐..、
| l | ____Y)........
| l ヽ ┴‐┬'''''''''' ::::.........
| l l `ー‐1 ::::::::.......
7レヘ! / ::::::::::::.....
l |. | / :.:.:.:::::...
/7ーー7777! :.:.:.:::::....
T--l⌒ヽ{ l :.:.:.:.::::::...
|vv'レ⌒!'ー! :.:.:.:.::::::...
|vv'ヽソー1 :.:.:.:.::::::.
_ヽVVVー7__ :.:.:.:.:::::..
,〜〜〜〜〜〜〜ヽ ヽ、 :.:.:.:.:.:..::..
∠二二二二⌒二二二二二二ユ :.:.:.:.:.::::::...
>>881 出力するデータのサイズを出力しないとだめだよー。
>>894 ・IEを投げ捨てて他のブラウザを使う。
・おまじないとして最後に"/"を付ける。
・Windows XP SP2にして、IEをレスポンスヘッダに従うように設定する(できるらしい)。
・HTMLで出力する。
原因はIEの仕様。
894は拡張子がcglとかなんだってば
>>913 > ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
> メモ張にHello Pealと表示されます、
これから察するに、CGIとして動作していると思うが。
>>894 CGIとして動作しているのはたしかだが
ダイアログを出したくないんだったらこうしなされ。
x print "Content-type: text/plain\n\n";
o print "Content-type: text/html\n\n";
>>909 ポカーン。
$keyword に
; rm -rf *;
って入れると実行されちゃいますが?
死ねよキチガイ。
みんな冷静になって
>>894を読んでみろよ。
print "Hello Perl !";
なのに「Hello Peal」って表示されるんだぞ。
Perl自体のバグでは?
919 :
nobodyさん:04/11/23 11:08:09 ID:nMfYIywn
>>916 顔真っ赤にして、嘘付くなよ。ヘッポコ
実験すれば実行されないことは簡単にばれちゃうのに、事実を捻じ曲げてまで絡んでくるとは
そんなに馬鹿にされたのが悔しいのかな?
でも、実際馬鹿なんだからしょうがない。親を恨んであきらめることだ。
$keyword=';rm -f *';
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('/bin/echo', $keyword, 'file') || die 'grep';
}
while(<IN>) {
print $_;
}
>>919 grepに失敗するだけでrm -rf は実行されるぞ低能
あとrm -rf *;
だ。;が抜けてる。*fileだったらそんなファイルなけりゃ何も削除されん罠
922 :
nobodyさん:04/11/23 11:27:41 ID:nMfYIywn
>>920 やってから言えよ。ヘッポコ。行末の;を入れたって実行されねーよ。
破壊的な馬鹿だな。
気になったから試してみた
"test.pl" [New File] 12 lines, 213 characters [E]
[***@***** test]$ chmod +x test.pl
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*
[***@***** test]$ ./test.pl
;rm -f *; file
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*
コードは
>>919に;いれた奴
>>916は逃亡か?
perlは奴のようなヘッポコでもそれなりのコードをでっち上げる事が出来てしまうので、
「俺ってできるじゃん」と勘違いしてしまったのだろう。
勘違いして玉砕してしまった
>>916に「伝説のヘッポコ」のコテを贈ろう。次からはこのコテで出て来い。ゲラゲラ
│ト、l、 /´, '`⌒'´ `ヽ: : .
ヾヽ!lV/ / ,/ / ,' ハ、: .
,ィニ≧ゝレ' / / ,./ / , ハ : : .
く<-‐7´ _」] l l/_,∠/ / / / い : : .
 ̄ノ/: :f r'l l /レ'/、_/‐ト'、/l| li l : : : : .
. : {ハ : :|{(l|y==ミ _ノ、/ソリ ll | : : : : :
: : : :ヽヽ: :|、lハl、゙ ⌒ヾlノリ ll l : : : : : :
: : : : : : : : V\ヽ、 `ー ゛ノルんイリノ : : : : : :
: : : : : : : : : ,.--、_ハ`−r=ニ--、′ノ. : : : : : : :
: : : : : : : : / /-ョロ'ヲ´ i l : : : : : : : : : :
: : : : : : : 〈 ,ハフ'兀「 ! } : : : : : : : : :
: : : : : : : : ヽ, ト{‐lハ. ヽ ' ノ : : : : : : : :
926 :
nobodyさん:04/11/23 13:14:57 ID:7PvclRNn
どうせここにいる連中は俺より低脳なんだから、
黙って頭下げて俺の靴でもなめてりゃいいんだよカスどもが(pgr
↑ 締め付けチカンビーム発射!!
928 :
nobodyさん:04/11/23 14:24:02 ID:nMfYIywn
その中で最下層に位置してるのが
>>916である事は間違い無さそうだ。
おやおや、めずらしく荒れてますな。
そろそろ次スレの頃合かの。
初めまして。gzipに関する質問です。
gzipの利点は「負荷を削減する」「転送量を減らす」というのは分かりましたが、早さの面ではどうなりますか?
私としては、転送量を減らすので早くなりそうな気もしますが、ブラウザに解凍する処理をさせるので遅くなりそうな気もします。
ご回答を宜しくお願いします。
無名ハッシュに、ハッシュのスライスで値をセットしてそのリファレンスを
返すことを一度にやりたいんですけどできません。
どうやればいいのでしょうか?
PerlとPHPってどっちがいいですか?
ページ全体(例えばyahooのトップなど)を配列に取り込む方法はないでしょうか。
自分のサイトで他ページの情報を一部使いたいのです。
>>930 自鯖でやらせるんならええけど、レンタルでやったら怒られること間違い無しであろう。
2ch閉鎖みたいに転送量でゴルァされて初めて意味がある処理ではある。
935 :
930:04/11/23 16:51:27 ID:???
>>934 >レンタルでやったら怒られること間違い無しであろう。
それは何故ですか?
>>931 無名ハッシュのリファレンスを得るなら、先に得ないと無理だと思う。
で、無名のハッシュのリファレンスを得て、ハッシュスライスに値を代入にしてみたけど。
use strict;
use Data::Dumper;
my @pos = qw(msn yahoo google);
my $value = 'search engine.';
my $hash_ref;
@{($hash_ref = {})}{@pos} = ($value) x @pos;
print Dumper($hash_ref);
>>935 回線の負荷は減らせるが、逆にサーバマシンの負荷は増大する。
938 :
930:04/11/23 17:54:03 ID:???
>>937 そういうことだったんですか。。負荷状況を見ながら導入を検討したいと思います。ありがとうございました。
>>930,938
ブラウザの負荷はあまり気にしなくても良いよ。
低スペックのPCでISDNでも体感速度は速くなった。
もし、テーブルを使ったレイアウトをしているなら、
gzipよりもHTMLを変更した方が体感速度は速くなることが多い。
サーバー負荷が心配なら予め圧縮しておくと良いよ。
execでメタキャラクタを解釈させないようにすると。
でもこれじゃ
>>854の言う「データディレクトリでgrepかけて、該当したファイルのみ読み込みたい」
ってのは無理だね。
結局、grepだって一つ一つファイル開くんだし
スクリプト内で一つ一つ開いてやれ。たいして負荷かわらんってオチか。
楽にやりたけりゃFile::Searcher使えって話。
@aaa = (['a','b','c'],['A','B','C']);
この['a','b','c']を@bbbに入れたいなんて場合はどうすればいいですか?
>>944 IEコンポーネントとか使わないと難しいんじゃない?
LWP云々の問題じゃないし
=@{$aaa[0]};
>>944 > LWPモジュールだと、テキストデータしか取得できないと思うのですが、
取れるだろ?
949 :
944:04/11/24 17:31:19 ID:???
>> 948
画面のスクリーンショットを取得できるんですか?
もう少しマニュアル読んでみます。
いや、
>>944 の言いたいことは、
HTMLレンダリングしたページイメージを取得したい、
という話らしい。
>>946 の言ってるとおり、それは LWP とか「取得」とかいう問題ではなく、
LWP で取ってきたデータをローカルでレンダリングするにはどうしたら、
という話になるわけだが。
必要なデータを渡すと gecko 使ってレンダリングして
Image::Magick オブジェクトを返してくれる、
とかいうモジュールがあるといろいろ便利そうではあるが、
かなり難しそうだわなあ。
html2[jpg,bmp,png,ps etc.] でググれば結構見つかるよね。
大体がブラウザにレンダリングをさせて画面をキャプチャーするタイプ。
他にも、Windows限定だけど web制作板のCSSでイケてるかも知れないデザインサイトスレで
使っているwebnailとか。
デスクトップ環境構築してるなら、数行のShellスクリプトで済むけど。
サーバー側で使うとなると、ちょっと敷居高いんじゃないかな。
あるディレクトリ内のファイル名一覧を取得する時って、
opendir,readdirかFile::Findかどちらを使うべきだろう。
1000ファイルほどあるんですが、パフォーマンス的には変わりませんかね?
(ファイルは階層的に掘り下げる必要は無いんですが)
@array = ('aaa','bbb','ccc');
$key = 'bbb';
このような変数があるとして、$keyが@arrayの要素に存在するかどうかを
一発で判定する書き方って無いでしょうか?
(;゚Д゚)
いえ、ループとか制御構文使わないで、1行ですっきり判定する方法ないかなーと・・・
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
map使えば簡潔に書ける。と思うが。
ていうか連想配列でif($array{$key}){処理;}とかでいいじゃない。
>>956 my $count = grep{ $_ eq $key } @array;
# 中身はループだけどね。
最近CGI.pm使い始めたんだけど、もしかして重いですか?
cgi-libでReadParseして%inを取り回してた方が負荷的にも鯖にやさしい?
さあ?ってか必要なのだけインポートしなよ。
CGI.pm は実際に呼び出された関数だけコンパイルする仕様なので、
import するかどうかはあんまり負荷に影響しない。
-compile :all とかするとさすがにアレだが。
俺も CGI.pm のコンパイルは若干重めだと思うが、
Template Kit や DBI の重さに比べれば誤差なので、
遠慮なく使っている。
それに mod_perl 環境下ではコンパイル負荷をほぼ無視できるしな。
Template Kit重いのかー。
ヒアドキュメントだらけでなんとかしたかったんだが、やめとくか。
掲示板で、データを順番に、任意のハッシュに入れたいのですが、
my @data_list = qw/name date com/;
my %data = ();
〜〜
while (<FILE>) {
my @temp = split(/<>/);
$data{$data_list[$_]} = $temp[$_] for (0..$#data_list);
print '名前:', $data{'name'}, $data{'date'}, $data{'com'}, '<br />';
}
現在はこのように一旦別の配列に格納してからループしてます。
split(/<>/) からストレートにハッシュに格納することは難しいでしょうか。
971 :
nobodyさん:04/11/26 08:28:36 ID:hJWQX2yr
質問させてください。
ActivePerl-5.8.4.810-MSWin32-x86.msi とwin2000を使っています。
my $Name_T = '';
$Name_T =~ s/([\x20(){},+^~%`])/{$1}/g;
いろいろ試してこのような正規表現で以下の文字が$Nameに含まれている場合{}をつけて置換しようとしました。
(){},+^~%` とスペース
+なまえ+ → {+}なまえ{+}
%^なまえ^% → {%}{^}なまえ{^}{%}
こんな感じです。始めは上手くいっていたのですが不具合をみつけました。
"タ"や"ミ"、全角の"+"などです。
"タ"や"ミ"は"ボ^}"と置換されていまい、全角の"+"は"+{}"と置換されてしまいます。
ご指摘、アドバイス等いただければ幸いです。
>>971 文字コードをEUCにして下さい。
SJISだと他にも同じような事がいっぱい起こります。
>>970 ハッシュのスライス使って
@data{@data_list} = split(/<>/);
あたりでどうすか?
974 :
970:04/11/26 10:48:29 ID:???
>>973 ありがとうございます。無事考えていた処理ができました。
スライスというものを使えばいいのですね……知りませんでした。
975 :
971:04/11/26 11:00:48 ID:???
>>972 ありがとうございます。
文字コードEUCについて調べてみます。
976 :
972:04/11/26 13:09:04 ID:???
>>971 そういえばSJISでも、
s/\Q([\x20(){},+^~%`])\E/{$1}/g;
だったら大丈夫かも…。
まぁ、EUCにもしておいた方が無難。
977 :
nobodyさん:04/11/26 14:49:02 ID:eKQW3m7f
簡易なアンケート(書く人がフォームに文章を書いて、ボタンを押せばデータに文章が保存される)
と言う事がしたくて教本を見ながらやっていたのですが
#!/usr2/bin/perl
BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); }
#ライブラリ
require 'cgi-lib.pl';
#デコードするサブルーチン
&ReadParse(*form);
#ライブラリ
require 'jcode.pl';
#文字コード変換のサブルーチン
&jcode'convert(*form, 'sjis');
#連想配列から値だけを取り出し、区切りのハイフンを追加
$data="$form{'kansou'}\n\n-------\n\n";
#追加書き込みモード
open(ENQ, ">>enquete.dat") || die "File 'enquete.dat' Open Error."
flock(ENQ, 2);
print ENQ $data;
flock(ENQ, 8);
close(ENQ);
--以下HTML文--
これをサーバー上で実行すると
「syntax error at enquete.cgi line 21, near "flock" Execution of enquete.cgi aborted due to compilation errors.」
と言ったエラーが出ました。
教本についてたサンプルを使ってやっても同じエラーが出てしまうのですが…どこか間違っている部分がありますでしょうか?
ググってもどれが参考になってるのかもよく分からず…お手数ですがご教授お願いいたしますm(_ _)m
さげ忘れ…すいませんorz
syntax error at enquete.cgi line 21
と出たときの8割は
20行目の行末のセミコロンを付け忘れている
>>977 21行目で構文エラーだって書いてあるんだから、どこがその
行か示せよ。そのコピペは20行ないからソースそのままじゃ
ないので意味ナシ。
おおかたopen 〜 || die 〜の行の最後にセミコロンがない
せいだとは思うがナ。
なんと…三十分も見落とし続けてた…お恥ずかしい●| ̄|_
解決しました、ありがとうございましたorz
>>980 改行が多すぎると出たので改行も消してました。
重ね重ね申し訳ないorz
実行ステップ数は変わらない場合、1ソースよりも、ソース分割して必要に応じて
requireしていく方が速いでしょうか?
use Benchmark;
実行ステップ数が変わらないんじゃたいして意味無いと思うぞ。
昔は、BBSのスクリプトとかで、表示、書き込み、検索でcgi自体を分けたりしてた頃もあったなぁ。
でも最近はベタ書きばかりだけど。
javaではしっかりモデリングするんだけど、言語によって人格変わる。
>>971 文字 x があり、x が'\x20(){},+^~%`'のいずれかであった場合、
xを'{}'で囲むということは、言い換えれば(\x7b x \x7d)という文字列を作るということです。
'+'は (\x81\x7b)で、\x7bは'{'なのでマッチし、
'{}'で囲って(\x81\x7b\x7b\x7d)になります。
(\x81\x7b)は'+'で、\x7bは'}'なので、'+{}'になります。
'タ'は(\x83\x5e)で\x5eは'^'なのでマッチし、
'{}'で囲って(\x83\x7b\x5e\x7d)になります。
'ミ'は(\x83\x7e)で\x7eは'~'なのでマッチし、
'{}'で囲って(\x83\x7b\x7e\x7d)になります。
(\x83\x7b)は'ボ'、\x5eは'^'、\x7eは'~'なので、
それぞれ'ボ^}'と'ボ~}'になります。
解決策は
use encoding "shiftjis";
です。
>>976 大丈夫ではありません。
次スレキボン
CGI.pmの場合、$query->param(hoge);とかでフォームからの入力データを参照できますが、
タグを無効にしたり文字コード変換したりしますよね?
この場合、新たなハッシュテーブルなりに入れるか、$queryを直接書き換えるか、
どんな風にデータを取り回してますか?
私は色々変換した後に新たなハッシュテーブルに入れて、それを以降の処理で使うようにしてますが、
何だか領域が勿体無い気もします。
>>988 Perlスクリプトである以上、メモリを使うのはしょうがないよ。
掲示板のログをまるごと配列に入れるのは論外だけど、
通常の操作なら(・ε・)キニシナイ
cgi-lib使ってた頃は%inを直接いじってたので、CGI.pmに乗り換えた時に
$queryから更に別領域にデータ確保するのは何となく抵抗あったな。
でもやっぱりデコードやらコード変換した後に別領域に入れてるよ。
気にスンナ。
($hoge) = split(/<>/)
と
$hoge = substr($_, 0, index($_, '<>')
はどちらが効率が良いでしょうか。100回ぐらい繰り返します。
>>992 100回ぐらいならどっちでもいいと思うが気になるなら
ベンチ取れよ。$_がどういう文字列かにもよりそうでは
ある。
100回程度ならまず差は出ないだろう。気にするな、それがパールの世界だ。
ぱっと見、substrの方が最初の'<>'が見つかった時点で文字列サーチ
終わるから速そう。てことでベンチ。
use Benchmark;
$s = 'foo<>baa';
timethese(undef, {
split => sub {
($hoge) = split(/<>/, $s);
},
substr => sub {
$hoge = substr($s, 0, index($s, '<>'));
},
});
てな感じで結果は
Benchmark: running split, substr for at least 3 CPU seconds...
split: 4 wallclock secs ( 3.21 usr + -0.01 sys = 3.20 CPU) @ 396900.00/s (n=1270080)
substr: 2 wallclock secs ( 3.11 usr + -0.00 sys = 3.11 CPU) @ 1306832.15/s (n=4064248)
予想通りsubstr圧勝。
996 :
992:04/11/27 18:32:47 ID:???
インタプリタが左辺の変数を数えて、splitはその分だけサーチするなんて事を
やるとでも思ったか。
ベンチってオモロイから良くやるけど実用上意味が無い場合が多いな。