Perl コーディング初心者質問コーナー Part33
1 :
nobodyさん :
04/03/01 02:46 ID:1GeWO7LH いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
2 :
nobodyさん :04/03/01 02:49 ID:1GeWO7LH
3 :
nobodyさん :04/03/01 02:49 ID:1GeWO7LH
4 :
nobodyさん :04/03/01 02:50 ID:1GeWO7LH
5 :
nobodyさん :04/03/01 02:51 ID:1GeWO7LH
6 :
nobodyさん :04/03/01 02:53 ID:1GeWO7LH
前スレはけっこうキレイに終わりましたね。
今年もよろしく
今月もよろしく
今週もよろしく
今日もよろしく
12 :
nobodyさん :04/03/01 15:07 ID:OuFmXd5y
質問です。 現在GIFカウンタ作っています。 QUERY_STRINGの値で、昨日・今日・合計の三つの数値のどれを呼び出すかを決めています。 例えば<img src="counter.cgi?total">と書けば、カウントが1増えた合計値が表示されるのはいいのですが、 <img src="counter.cgi?total"><img src="counter.cgi?today">などと書いた場合、 ?totalで+1された後に、さらに?todayで+1されてしまい、カウントが2つ上がってしまいます。 どのような記述をすれば回避できますでしょうか?
また糞スレ盾やガッ他・・・
Perlをかけない
>>13 がいるスレはここですか?
>>12 Todayがカウントアップする時にTotalもカウントアップするのは問題ないのでは。
Totalが+1でTodayが+2とか言うのは問題だが。
>>12 1:全部セットで使うと決めて、Total(today)でのみカウントアップにする
2:アドレスでカウントアップを制限する
>>12 です。
>>15 氏
お言葉有難うございます。
totalのみを表示するときには、totalがカウントアップするときにはtodayもきちんとカウントアップします。
また、todayのみを表示するときには、todayがカウントアップするときにはtotalもきちんとカウントアップします。
問題となっている点は、今日と合計のアクセスを表示する場合、
<img src="counter.cgi?today"><img src="counter.cgi?total">
と記述しているのですが、二回CGIを呼び出すため、カウントが2つ回ってしまうということです。
例えば、合計カウントが1000、今日のカウントが200の場合、
<img src="counter.cgi?today"> だけならば、合計1001、今日201となります。
同じく、<img src="counter.cgi?total"> だけならば、合計1001、今日201となります。
しかし、
<img src="counter.cgi?today"><img src="counter.cgi?total">
このように両方呼び出した場合、
1つめのCGIの呼び出しで合計1001、今日201となり、表示するのは201なのですが、
totalの値を呼ぶ際にもう一度CGIを呼ぶことによって合計1002、今日202となり、合計の表示が1002となってしまうのです。
ロジックの問題なので、WebProg 初心者の質問 Part7に行ったほうがいいですかね。
連稿失礼します。
>>16 氏
>1:全部セットで使うと決めて、Total(today)でのみカウントアップにする
やはりこの方式が一番手っ取り早いでしょうか。
そちらのやり方も検討してみます。
わざわざレス有難うございました。
Perlで短くかつバカなプログラムを書いてください。↓どうぞ
print qq(↓の数字で俺の運命が決まる!<br>\n); printf qq(%d<br>\n), int(rand $#Life); my @Life = qw(溺死 焼死 轢死 凍死 瀕死 田中麗奈と恋人になる 田中麗奈と結婚 田中麗奈とSEX SEX後に腹上死 SEXなんて永遠に出来ず孤独死); my $count = 0; foreach (@Life){ printf qq(%d %s<br>\n), $count++, $_; } これでどうだ。
23 :
22 :04/03/01 19:48 ID:???
ブフー!流石に見直し無しで書いたら酷い間違い方だな。 まぁいいや。俺は4、5、6です。
半角数字0〜9を全角数字0〜9に変換したいんですがどうやるといいんでしょうか。 具体的には、変数に任意の数が入っていて、それを全角にしたいんです。 $data = 1234; としてここで何か処理をして $dataの値を"1234"としたいわけです。 自分では $data =~ s/0/0/g; $data =~ s/1/1/g; : : $data =~ s/8/8/g; $data =~ s/9/9/g; というのを考えたんですがもっとうまい書き方はないかと思い質問してみました。
25 :
22 :04/03/01 20:14 ID:???
$data =~ s/\G(\d)/('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')[$1]/eg; # (w
>>17 一定期間内において同一IPからのカウントアップ要求が
ダブらないようなチェックルーチンを入れればいいだけなんじゃ?
いろいろやってみましたがどういう処理にしたら上手くいくのか分からないので 質問させてください。 「hoge.log」というファイルがあり中身は 3212421321,ほげ,1543443246,ほげ,ほげ . . . . 3546754134,ほげ,3224654724,ほげ,ほげ 2346567945,ほげ,6735432758,ほげ,ほげ . . . . となっています。 つまり、[ランダムな10桁の整数],ほげ,[ランダムな10桁の整数],ほげ,ほげ って感じのが改行されていっぱいあると思ってください。データはコンマ区切り。 そこで、サブルーチンで引数1「3546754134」と引数2「1234567890」を渡して、 引数1とマッチする行をhoge.logの先頭の行に持ってきて、さらに先頭に持ってきた 行の三番目のランダムな10桁引数2に置換したいのです。 ご理解いただけるでしょうか。 だれかエライ人明解なコードを教えてください。
30 :
29 :04/03/01 21:34 ID:???
日本語が意味不明でした。 訂正 # そこで、サブルーチンに引数1「3546754134」と引数2「1234567890」を渡して、 引数1とマッチする行をhoge.logの先頭の行に持ってくる。 さらに先頭に持ってきた行の三番目の区切りの「ランダムな10桁の整数」を 引数2に置換したいのです。 #
sub hoge{ my($line,@line); open(IN, "+<hoge"); while (<IN>){ /^$_[0],/o and ($line= $_,last) or push(@line, $_); } seek(IN, 0, 0); $line=~ s/,\d{10},/$_[1]/; print IN $line,@line; close(IN); }
32 :
31 :04/03/01 22:06 ID:???
間違ってた 試してないけど sub hoge{ my($line,@line); open(RW, "+<filename"); while (<RW>){ /^$_[0],/o and ($line= $_,last) or push(@line, $_); } seek(RW, 0, 0); $line=~ s/,\d{10},/,$_[1],/; print RW $line,@line; close(RW); }
33 :
29 :04/03/01 22:23 ID:???
>>31 氏
すごい・・・。perl初めて一週間なのですが私にはこのような考え方は
一生生まれないのだろうな。配列の使い方ってこんな風に使えるのですね。
いっぱいコード書いて、たくさん練習します。
ちなみにまだよく
>>31 氏のコードを理解できてません。一生懸命徹夜で理解してみます。
なんでか知らないけど、思うように動いてしまった。
そんな感じの空虚さが頭でグルグル回ってます。あと何年勉強したらこういう
コードがすぐに書けるようになるのだろうか。がんばります。
#私はCの知識もなければperlがはじめての言語なので、プログラムの感覚も
泡を握っているようでむなしいです。#
とにかくありがとうございました。
>>24 my @numbers = qw(0 1 2 3 4 5 6 7 8 9);
$data = join('', map{ $numbers[$_] } split(//, $data));
こんなでもいいんじゃない?
35 :
31 :04/03/01 23:02 ID:???
>>34 処理速度・負荷がどうかわからんが、例えばSJISの場合以下のように
したらどう? 実行環境が今ないからベンチ採れないけど
tr/\x30-\x39/\x4f-\x58/;
s/(.)/\x82$1/g;
perlに限った話しではないですが、 複数行の文字列をprintする時、 print ( "hoge\n" ); print ( "hoge2\n" ); print ( "hoge3\n" ); とそのままやるのと、 $buffer .= "hoge\n"; $buffer .= "hoge2\n"; $buffer .= "hoge3\n"; print ( "$buffer" ); と変数に入れて最後にprintするのどっちがいいのですか。 見やすさ、スピード、慣習、などの観点から。
37 :
34 :04/03/02 00:00 ID:???
>>35 use Benchmark qw(:all);
my $result = timethese(-5, {
34=>sub{
my $data = 123456;
my @numbers = qw(0 1 2 3 4 5 6 7 8 9);
$data = join('', map{ $numbers[$_] } split(//, $data));
},
35=>sub{
my $data = 123456;
$data =~ tr/\x30-\x39/\x4f-\x58/;
$data =~ s/(.)/\x82$1/g;
},
});
cmpthese($result);
Benchmark: running 34, 35 for at least 5 CPU seconds...
34: 4 wallclock secs ( 5.28 usr + 0.00 sys = 5.28 CPU) @ 27106.27/s (n=143155)
35: 5 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 37172.03/s (n=197186)
Rate 34 35
34 27106/s -- -27%
35 37172/s 37% --
# @numbersを外へ掃き出した場合。
Benchmark: running 34, 35 for at least 5 CPU seconds...
34: 4 wallclock secs ( 5.31 usr + 0.00 sys = 5.31 CPU) @ 36571.67/s (n=194287)
35: 4 wallclock secs ( 5.28 usr + 0.00 sys = 5.28 CPU) @ 37336.99/s (n=197186)
Rate 34 35
34 36572/s -- -2%
35 37337/s 2% --
# 正規表現の方が速いか。
Perlで出力したHTMLソース内でSSIを使うにはどうすれば良いんでしょうか Print <<_EOF_; Content-type:text/html <html> ......(略)...... <!--#exec cgi="./fSize.cgi"--> ......(略)...... </html> _EOF_ でやってみたのですが、SSIが単なるコメントとして扱われてしまいました。
39 :
eaoska047124.adsl.ppp.infoweb.ne.jp :04/03/02 00:12 ID:QKupWf2O
2chのfusianasanみたい↑に、 リモートホスト? みたいなものを、取得したいんですが、 $ENV{'REMOTE_ADDR'}; と書いても、数字のIPしか取得できませんでした。 文字列取得するには、どうすればいいですか?
C言語みたいに #define NUMBER
Perlは、 C言語みたいに #define NUMBER 200 のように、定数を宣言できませんか?
43 :
42 :04/03/02 00:14 ID:???
( ゚д゚)ハッ!
44 :
41 :04/03/02 00:15 ID:???
>>40 ごめんなさい、途中で書き込む押してしまったみたいです。
>>41 $NUMBER=200;
で$NUMBER使えばいいんじゃないの?
>>39 鯖によって、$ENV{'REMOTE_ADDR'}; がホスト返さないこともあるから、その場合は
$addr = $ENV{'REMOTE_ADDR'};
$host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $_;}
って書こうとオモタラ$ENV{'REMOTE_ADDR'};ですか。そりゃとれんよ・・・
$ENV{'REMOTE_HOST'}な
ミスタ ×$ENV{'REMOTE_ADDR'}; がホスト返さないこともあるから ×$ENV{'REMOTE_HOST'}; がホスト返さないこともあるから
49 :
41 :04/03/02 00:22 ID:???
>>45 それだと、packageにしたとき、使えないみたい
と思ったらいけました。
ごめんなさい。
それでいけました。
失礼しました。
ここは、ドジッ娘がいっぱいで、ほのぼのとしたインターネットですね。
sub NUMBER () {200} これでコンパイラはサブルーチンではなく定数と認識する。 呼び出す時は、「&」とか「()」とか付けずにやる。 でも名前空間はサブルーチンのあれ使ってるからダブルクウォートで展開出来ないよ。
>>36 cmpthese結果だけ。($bufferはmyで確保)
Rate $buffer="hoge" print("hoge\n") print <<"HERE"
$buffer="hoge" 646465/s -- -56% -84%
print("hoge\n") 1454545/s 125% -- -65%
print <<"HERE" 4129032/s 539% 184% --
# ヒアドキュメントを使いましょう。
>>38 出力するHTMLを静的ファイルにして、CGIの結果をSSI取り込むとか。
または静的ファイルを出力して、Locationするとか。
>>41 use constant NUMBER => 200;
>>51 と本質は同じなんだけど…。
print "@{[NUMBER]}";
で展開ー。
ドジッ男て聞かんなあ・・・
すいません質問です。 カウンタや掲示板のログを読み出すときの、 open(DATAA,"$log"); この部分の$logの前に>や+<とか色々ありますけど、 この辺を詳しく説明してくださる人いませんか? どれを使っても読めるんで、違いが良くわからないのですが。
56 :
36 :04/03/02 13:09 ID:???
暇な人お願いします。
>>36 文字列連結するほうは、メモリ確保、開放を繰り返し行うが、その程度なら
たいしたことではない、好きにしろ、俺はヒアドキュメント使う。
セッションクッキーを書きこんで内容を参照すると、二番目の値の 先頭に半角のブランクがはいって困っています。連想配列に格納して 参照しようとすると先頭の半角もキーにしているためにマッチしません。 半角を入れずにクッキーを書きこめますか?だめなら、取り込んだ後で 半角を取り去るいい方法がありますか?? 書きこんでいるコードはこれだけ : print "Content-type: text/html\n"; $cmax=0; print "Set-cookie:m_lng_max=$cmax\n"; print "Set-cookie:AVR=1\n\n"; クッキー表示用のCGIで表示させると、 m_lng_max=0; AVR=1 となって、;とAの間に半角スペースがはいります。
2バイト文字(ひらがなとか)を逆に並べるにはどうしたらいいんですか? 1バイト文字では、reverse関数を使えば実装できるのは確認したんですが、 $str = "あいうえお"; print join('' , reverse(split(// , $str))); とやっても、文字が化けて読めません。 もしかして、できないんでしょうか・・・?
>>58 $cookie_data = "name\:$name\,mail\:$mail";
print "Set-Cookie: hoge=$cookie_data;\n";
こんな感じで一つの変数にまとめて突っ込んで、あとから取り出すのじゃダメなん?
>>59 Perlメモのプログラムを見たら、一応出来た。
$str = "あいうえお";
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
@chars = $str =~ /$ascii|$twoBytes|$threeBytes/og;
print join('' , reverse(@chars));
63 :
62 :04/03/02 14:04 ID:???
64 :
58 :04/03/02 14:19 ID:???
>>61 さん
それで全然オッケーです、やってみます。ありがとう。
でも、どうして二番目以降の先頭にブランクがつくのかなあ。
仕様ということにしとこ。
open FILE, "+<test.txt"; @chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n"); print FILE "@chinko"; close FILE; このようにしてtest.txtを覗くと しりとり りんご ごりら らっぱ ぱんつ つまようじ このように2行目以降の先頭に半角スペースが入ってしまいます。 だれか原因と対策を教えていただけませんか。
age
マジレスおながいします。
ぃゃ改行させたいんです。掲示板のログを作成する部分でログファイルもパっとみてわかる書式で保存したいんです。 掲示板のログが件名からリモホから本文から全部1行でまとまってると見るに耐えないので。 2行目以降の頭の半角スペースが憎いんです。 ループさせて1行ずつ保存するしかないんですかね。
>>66 しりとり
りんご
ごりら
らっぱのマークの正露丸
やっぱり釣りか・・・
>>66 open FILE, "+<test.txt";
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE @chinko;
close FILE;
3行目
print FILE "@chinko";
の@chinkoの
""を取ればok
暇な俺が微妙に不親切に教えてやろう。 まずは単純に配列にデータ突っ込んで、 print @chinko; とだけやれ。 答えはそこにある。
ほんとは print "@chinko\n\n"; としたかったんだけどね。ありがとう。 \n\nは分けてやります。
>>76 それって意味あんの?
配列の最後に改行が2回入るだけじゃん・・・
>>76 ・・・
悪いことは言わない。
Perl止めろ
2行空けると見やすくなる。っていうだけ。
>>79 ファイルの終端から2行空けて何の意味があるんだ?
>>79 open FILE,"+<test.txt";
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE @chinko;
print FILE "\n";
close FILE;
こうしれば?
一応期待どうりになるよ
配列・リスト・スカラーをわかってやってるんか?こいつは。
>>80 新規のログを@new_logにぶっこんでファイルに出力して2行改行いれて
配列に\n\nいれてもいいけどいまさらいじるのめんどくさい。
ぃゃちょっとだけど。
その次の行からあらかじめ保存してある@temp_logをぶっこむ。
最終的に期待道理になればなんでもえーじゃないの。
print foreach(@chinko);
ハァ? だから、データの後に意味のない改行入れてどういう効果があるんだ? お前はファイルの中身の最後とエディタの縁の間に空白がないと嫌なのか?
@temp_logの最後には記事番号の現在地が格納されてるのでエディタの縁との間隔は0です。 新規書き込みの時は一番上に今の記事番号が格納されることになるけど、 レスとか含めてログファイルには記事番号の順番にログが格納されるわけじゃないんですよ。 なのでtemp_logの最後においとくとpopで取得して++したらpushで格納できるから便利なのですよ。 ログの続きで改行あけずに格納すると視認性悪そうですしねー。
ていうかageてたごめん。
No<>名前<>記事 No<>名前<>記事 No<>名前<>記事 No<>名前<>記事 ・・ ・・ ・ って普通にするんじゃいかんのか?
ログがこうなってると見やすくてよくない?
うん。超面倒。でもまあそうしたいからがんばるよ。
>>89 なんていうか、ド素人というか・・・
ログファイルの見た目なんかどうでもいいやろ。。
簡単にコード組めるか、のほうが大事やろ
別にいいじゃん。俺は見やすいのがスキなんだよ。 趣味でやってんだから細部まで凝りに凝りたいじゃん。
95 :
nobodyさん :04/03/03 01:00 ID:NMlynacq
ある問題が解けなくて困っています。 問題↓ ファイル xy-data.dat には,カンマで区切られた2つの整数データが並んだ行が何行か格納されている. 各行の最初の整数値をx,次の整数値をyとしてx-y座標上の点(x.y)をファイルの行数個考える.これらの点のうちで、原点が(4,7)、半径4の円の内側(円周上は除く)に含まれる点の数を出力するプログラムを作成せよ. 画面には、結果である数以外の出力をしないこと. ファイルは open("IN_FILE","<xy-data.dat"); としてopenし,このファイルからデータを読み出す時は, $xy=<IN_FILE> $xy =~ /(\d+)\D+(\d+)/; $x = $1; $y = $2; として読み出せばよい.(まず変数$xyにファイルから1行読み出し,次に$xyの内容をカンマで区切られた前半と後半に分けて,前半を変数$xに後半を変数$yに代入する) また,読み出しが終わったら, close(IN_FILE); としてクローズすること. どうすればいいのか見当がつきません。お願いします
>>94 @chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
open FILE,"+<test.txt";
@unko=<FILE>;
unshift @unko,@chinko;
truncate(FILE,0);
seek(FILE,0,0);
print FILE @unko;
print FILE "\n";
close FILE;
97 :
96 :04/03/03 01:12 ID:???
スマン open FILE,"+<test.txt"; @unko=<FILE>; unshift @unko,"しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n","\n"; truncate(FILE,0); seek(FILE,0,0); print FILE @unko; close FILE;
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n"); open FILE, "+<test.txt"; @unko=<FILE>; unshift @unko,"\n"; unshift @unko,@chinko; truncate(FILE,0); seek(FILE,0,0); print FILE @unko; close FILE;
>>98 ラスト4行はこの方がいいんじゃないのか?
seek(FILE, 0, 0);
print FILE @unko;
truncate(FILE, tell(FILE));
close(FILE);
ログの整形表示は、それようのプログラムを別に作るのが普通じゃないでしょうか? と言ってみるtest
>>99 tellって関数、ググッタりして見てもよく分からないんだが
バカにもわかりやすく教えてもらえんかねぇ?
>>100 サブルーチンにはしてあるけどね。
まだ作ってない機能とかもあるし、最終的にいくつかの機能を別プログラムにしようかなとは考えてる。
最後まで作ったら1000ステップぐらいいきそうな勢いなので。
>>96 関連
今日はもう疲れたので明日リファレンス見ながら理解してみます。ありがとう。
メール送信に関して質問です。抜粋していますが、フォームから入力したデータを
入力者に確認メールを送信すると言うプログラムです。
$mailにはフォームの「メールアドレス」の項目の内容が入り、あとは以下のとおりです。
質問は確認メールが送信されたメールを見ると、送信者の欄が
[email protected] になっています。サーバのホスト名が入ってしまいます。
これをtestだけにしたいのですが、どうしたらいいのでしょうか?
$from= "test";
$subject "アンケート";
## 入力者に確認メールを送信
open (MAIL,"| /usr/sbin/sendmail -t");
print MAIL "To: $mail\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-type:text/plain\n\n";
print MAIL "送信しました。\n\n";
close(MAIL);
106 :
104 :04/03/03 03:15 ID:???
>最後まで作ったら1000ステップぐらいいきそうな勢いなので。 !!!!!!!!!!! この俺に突っ込めと言うのかっ・・・
108 :
nobodyさん :04/03/03 06:42 ID:UA3CbL7u
連想配列を連結するには foreachなどを使って一個一個代入していくしかないのでしょうか?
%aaa = (%aaa, %bbb);
110 :
nobodyさん :04/03/03 08:09 ID:UA3CbL7u
>>89 そういうことしたいなら俺定義XMLでログ記録して、
XSLで整形表示とかのほうが効率良さげと思うんだけど。
>>111 もうそいつには構うなって。
>>101 tellだけに教えて君ですか。そんなエサに俺様以下略。
>>111 こいつの辞書には「効率」って文字はねぇんだよ きっと
どうせどんな助言与えても聞くきねぇんだから、うち等から言える事はもう無いさ
114 :
24 :04/03/03 17:34 ID:???
>>24 の質問に答えてくれた方々
皆さんありがとんございました。
>>34 を使おうと思います。
115 :
104 :04/03/03 19:04 ID:???
116 :
nobodyさん :04/03/03 19:17 ID:JGcO0sWg
質問でつ。 $hash{$key}{'このキー'}; 上のような連想配列で 'このキー' のキーの一覧を得るには どうすればよいのでしょうか? よろしこ おながいします。
>>116 keys %{$hash{$key}}
>>95 my $cnt = 0;
open(IN_FILE, "xy-data.dat") or die $!;
while(<IN_FILE>){
my ($x, $y) = /(\d+)\D+(\d+)/;
( *円内側の領域を表す式* ) and $cnt++;
}
close(IN_FILE);
print $cnt;
exit;
>>101 ファイルハンドルが参照しているファイルの位置
(ファイル先頭からのバイト数)。
>>104 $from = "test <
[email protected] >";
>>115 いつまでもスレ違いの話題するな。
perl以前にsendmailについて勉強しろ。
>>120 のリアル厨房よ
分からないのなら黙ってろよ(w
>>122 じゃ特別に教えてやるよ。
sendmail -tやめてsendmail -bsでSMTP叩けばFrom: testで出せるよ。
馬鹿には使いこなせないだろうけどな。
124 :
118 :04/03/03 22:50 ID:???
>>121 失念してました。
その上、元の質問はfromを詐称したいって話だったのね…。
吊ってきます。
>>123 分かんのなら初めっから素直に答えとけや(w
その方法はしらねーけど、設定によってだけどほとんどのとこで使えないぞwww
使えねえ答えでは意味が無い
>>125 大抵は使えるはずだ、つーか、これを禁止する設定は知らん、多分無いだろう。
お前には使いこなせないだろうがな。
>>126 もうバカは相手にすんなって
ほっとけばいなくなるから
130 :
nobodyさん :04/03/04 00:19 ID:uAtEzihH
>>125 >設定によってだけど
何と言うか、頭悪そうな発言だな。
「この鯖にはsendmailを入れてはいけない設定になっております」
こういうのでも納得しそうな
>>125 を晒しage
>>128 iq();
sub iq{ return 0;}
test
134 :
nobodyさん :04/03/04 02:00 ID:WZx4Ntes
http://www.cj-c.com/cgi_s/access.htm ReverseAccess
http://saya.kiy.jp/cgi/ftlink.html このCGIは「CJ-Clubさんの ReverseAccess 」を改造したものを再配布条件に基づき再配布しています。
上記の本家版だとserverステータスで "cgiヘッダーが出力されない" が出ます。
下の改造バージョンだと正常に動作します。
スクリプト構造の一番の違いはjavascriptで外部表示出来るか否かです。
元スクリプトのバージョンも違うので一概に言えません。
環境は
XPpro
04server
perl
です。
本家スクリプトもとりあえず動作はしますが一定時間がたつとログがリセットします。
下の改造版だとすべて正常に動作します。
原因が分からず困っています。
助言をお願いします。
>>135 作者に聞いて。
それにここはそういう質問のスレじゃないので。
サブルーチンの中から__DATA__や__END__を<DATA>で読もうとすると Can't call method "****" without a package or object reference と言うエラーが出ますが、どうすれば出なくなるのでしょうか。
138 :
nobodyさん :04/03/04 02:28 ID:SI8u2VDD
>>137 君の言う通りなら以下のスクリプトでエラーが再現する筈だが。
#!/usr/local/bin/perl
sub read_data { print <DATA> }
read_data();
__DATA__
foo bar baz
エラーメッセージをよく読もう。
>>137 間違って書かなきゃ別に出ないけど。
どうやって書いてエラーにしてるわけ?
output{ print "Content-Type:text/plain;charset=UTF-8\n\n"; defined(<DATA>) ? print <DATA> : print ''; } .... output(); __END__ (文字) #------------------- と、このようにしています。 サブルーチンの外に出せばエラーは出なくなります。 また、Can't call method 〜 と同時に他のエラーが出ることもありません。 テスト環境は Win2K + Apache2.4.08 + ActivePerl5.8 です。
>141 sub output {} #書き込み時ミス
と思ったらスクリプトのミスでした(「sub」忘れ)。 お騒がせしました……。 #まさかポカミスで一日悩むとは。
> defined(<DATA>) ? print <DATA> : print ''; この書き方に一体何の意味があるのだ? print <DATA>;だけと同じだろうよ まあ質問用に書いたのかもしれないが
>>144 defined(<DATA>) ? print <DATA> : print '';
はバグっぽいが、わかってないのはバカっぽいな。
それは何と言うか、色々やっていた時の名残です。 ここに書く時直前では (略):print 'nodata'; とか書いてたので中を消してそのまま出してしまいました。
defined で1行目読んで、print してるのは2行目なんだけど。 書きミスじゃなくて、バグっぽい。 $/ = undef; なんてやってたら、はまりそ。
言ってる意味が今解りました。 実は __END_ _直下の行が消えるのは何故だろうかと疑問に思いつつ そう言うものなのだと思ってました。 と言う事は、__END__ 以下があるか無いか調べるにはどうしたら良いのでしょうか。
>>148 __END__ 以下に何が書いてあるかプログラマが把握できない
状況というのは健全でない気がするが。
単純にやるなら
if (my @data = <DATA>) { ... } else { ... }
なり
local $/ = undef;
if (length(my $data = <DATA>)) { ... } else { ... }
なりご自由に。
defined(my $data = <DATA>) ? print $data : print '';
151 :
nobodyさん :04/03/04 12:42 ID:FGoSTbqM
どうも昨日違うスレで質問して怒られたのでこちらに移動します。 perlをインストールしてソースを書いてブラウザに表示させたところ ソースコードがすべて出てきてしまいました。#!usr/local/bin〜__END__まで すべて表示されました。 単刀直入にいってどの部分がおかしいとこういう現象になるんですか?自分ではどこがわるいのかわかりません
>>151 AddHandler cgi-script .cgi
154 :
151 :04/03/04 12:54 ID:???
>>152 どうもありがとうございます。その解説部分の#はちゃんとはずしてあります。
>>153 私にはちょっとむずかしそうですが、パソコンはいじってないのでtext/plainとかには
なっていないように思います。localhost/sample.cgiとしてアクセスしていますし、ドキュメントルートにちゃんとファイルは置いています。
コマンドラインでも確かめてみようと思います。親切にありがとうございました。
質問させてください。 readdirでファイル名一覧を取得した場合、 必ず「.」「..」は最初の二つに出てくるものなんですか? 例えば、取得したファイル名を配列に突っ込んだ後でファイル名を取り出そうとする場合、 配列の添え字は[2]からアクセスすれば問題無いですか? 自分の環境では問題無いのかもしれませんが、 他の環境でもこのような「.」「..」のものも必ず取得するのでしょうか?
>>155 サブディレクトリには必ず存在するもの。(ファイルシステムによるが)
ファイル名を取得する際、「.」と「..」なら無視するようにしてみては。
157 :
151 :04/03/04 14:02 ID:???
perlのヴァージョンを調べようと思い、コマンドラインからperl-vとうってみたんですが ダメでした。パールのパスはインストール時にちゃんととおってました。 windows2000を使っているんですが、インストーラをヴァージョン2にしてから、 パールをインストールしたんですが、やたらインストールに時間がかかったので、 うまくインストールできてないんでしょうか? だれか分かる人がいたら教えてください。よろしくお願いします。
>>154 ドキュメントルートのOptionに+ExecCGIがないとかでは?
>>155 先頭が「.」なファイルも除外していいんなら
my @filelist = grep( /^[^.]/, readdir(DIR) );
とか。ディレクトリを省きたいっつーんなら
my @filelist = readdir(DIR);
foreach (@filelist){
next if( -d );
#処理
}
とかがお手軽。
>>158 >>155 です。
ファイルテスト演算子の-dを忘れていました。
next if (-d);
を利用しようと思います。
ご親切に有難う御座いました。
161 :
151 :04/03/04 15:17 ID:???
>>159 半角入れたらできました。。
どうもすれ違いなようですので、教えてくださったスレに移動しようと思います。
ありがとうございました。
>149-150 ありがとうございます。 外のファイルに出してる方が確かに良いのですが、 どうせ数行程度の文しか使わないような感じなので 態々外のファイルを読むよりも中に書いて置こうという事になったのです。
>>155 FATのルートには"."と".."は無い。
>>155 です。
>>163 情報ありがとうございます。
開発環境がWin2000と2003 Serverなので、当分問題は無いでしょうけど、
その辺も考慮してコーディングしていきたいと思います。
わざわざレス感謝です。
ところでさ、俺、perl経験はあんまなくて、 win98でActivePerl使ってて、ダブルクリックでpl動かしてるんだけど、 コンパイルエラー行を出す時、 他のファイルに open FILE, 'エラーファイル名'; while(<FILE>){ $aaa .= $_; } eval $aaa; print "$@ \n"; sleep(10); ってな記述してエラーメッセージ出してんだけど、 これって非常識? もっと手っ取り早いやりかたあんのかな?
普通はコマンドプロンプトを起動させて「perl hoge.pl」 エディタで起動させて同時にカレントディレクトリを移動させたりすれば便利
167 :
nobodyさん :04/03/05 03:04 ID:ReR1r8Jb
>>165 いまいちなにがしたいのかよくわからないけど、
スクリプトの文法チェックならperl -c hoge.plで可能。
なんと、あの記述はコマンドめんどくさいってアホな理由から生まれたのです!
俺の根性がびーーーん。
エディタで起動ってなんのエディタだろう??
無知ですんません。
>>167 >いまいちなにがしたいのかよくわからないけど、
単にダブルクリックしたいだけです。エッヘン!
169 :
168 :04/03/05 03:48 ID:???
>エディタで起動ってなんのエディタだろう?? あ。意味分かった。 今までperlをエディタから起動した事なかったf(^_^;)
170 :
nobodyさん :04/03/05 03:59 ID:ReR1r8Jb
コマンドめんどくさいだけの理由で変な我流の書き方すんのはやめておいた方がいいよ。 俺はEmEditor使ってるけど、エディタから直接ボタン一個でプロンプト起動して 自動で走らせるようにしてある。この方法だとdieで終了しても閉じないから エラー内容もちゃんと見れる。
>>170 ありがd!
俺も秀丸からボタン一つで新規秀丸ファイルに出力されるようにしてきた。
evalしてた俺ってなんて馬鹿MAXなんだろう。。。_| ̄|○
ヴぁかMXA
なんでわざわざファイルに出すんだろう…
174 :
nobodyさん :04/03/05 23:51 ID:yEaLcmjc
変数名の文字列を知る方法を教えてください。 $test=1 だったら、 $hoge{'test'}=1 にしたいのです。「test」の部分は未知の場合にどうやったらいいかわかりません。 よろしくです。
>変数名の文字列を知る方法 Perlソースは読めるから 未知な場合がどういう場合なのか・・・
例: @pairs = split (/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $FORM{"$name"} = $value; }
BBS系の使い方だな。
このあいだperlを始めてようやく自力で掲示板を作れるようになりました。 次のステップとして たとえば、発言一覧などをいちいちアクセスされるたびにCGIがHTMLソースを吐くようではサーバに負担が掛かるので 発言一覧のような閲覧頻度の高いものはHTMLファイルに出力して変更があった場合更新するようにすれば負荷が軽減されるように思うのですが 他のスレで 146 名前:nobodyさん 投稿日:2004/03/04(木) 01:31 ID:??? なんでHTMLへ書き出したいんだ? メリットだけじゃなくてデメリットもあることを承知の上でか? と言うような書き込みを見つけました 具体的にデメリットとしてはどのようなことが挙げられるでしょうか
>>178 cookieとか使ってた場合、HTMLにすると意味がなくなるからな。
JavaScript使えばできないことはないが、切られるとどうしようもないしな。
>>176 1 行にしてみるてすと
%FORM = map { (split /=/)[0,1] } split /&/, $buffer;
>>178 HTML書き出しのデメリット
設置できる条件が厳しくなる(CGIディレクトリに置いたHTMLへアクセスできないとダメ。とかね)
リアルタイムに更新されない(だれかが書き込むまでずっと「最新」マークが表示されっぱなし。とかね)
まぁ、掲示板の場合はそれ以上にメリットはあるよ。
全部HTMLな掲示板つくってみたけど、表示負荷をあまり考慮しなくて済むからかなり無茶ができる。
ファイルハンドルが存在するかしないかを調べるにはどうしたら良いのでしょうか。 というか、ファイルが既に開かれているかいないか、の方が 自分の考えてる事にニュアンスが近いです。
tell(FH) >= 0 これで
質問です。 my変数を使うことのメリットって何ですか? グローバル変数だけだと不具合とかってあるんですか?
大きなコードになるほど重要性が増してくる。 複数人での開発になったら必須。 最大のメリットは保守性。
>>186 いつかあなたにもmyの必要性がわかるときが来るよ。
>>186 myもしてないコードって読めたもんじゃないよ
基本は、処理はことごとく関数化して変数は全部myする姿勢で。
スクリプトがでかくなると特に重要やね。 あまり大きくなく保守が楽な規模のものでも、 例えばブロック毎に変数名使い回せるとかいうのは 日曜すくりぷたな人にとっても結構嬉しい事なんじゃないだろうか。 まあ使って損は無いし(あっても得の方が大きい) 特に理由が無い限りmy宣言はした方が良いと思うよ。
「特に理由が無い限り」どころか「特殊な事情が無い限り」使うべきだと思うが。< my あ、use strictと組み合わせること前提ね。
use strictの無いPerlスクリプトなんて金玉の無い男みたいなもんだ。
>>186 です。
色々なご回答有難うございました。
どうやら金玉の無い男みたいですので、もう少し色々と勉強してみます。
一度通る事を確認したら僅かな負荷を気にして useしないようにするという場合もありそうな気がしますが、 チェック時だけではなく常にuse strictする理由って何かありますか。 例えば、局所変数のチェックをするついでに何かしらのエラーチェックをしてくれるとか。
>>194 #!/usr/local/bin/perl
use strict;
(my $now_dir = $ENV{'SCRIPT_FILENAME'}) =~ s|/[^/]+$||;
(my $base_dir = $now_dir) =~ s|[^/]+$||;
print "Content-Type: text/plain\n\n";
$ENV{'QUERY_STRING'} =~ /^(\w+)/;
length $1 or error('No assigned new dir name.');
my $new_dir = $base_dir . $1;
-e $new_dir and error("$new_dir already exists.");
chdir $base_dir or error($!);
rename $now_dir => $new_dir or error($!);
chdir $new_dir or error($!);
print 'ok.';
sub error {
print "Not changed: @_";
exit;
}
>>195 http://perldoc.com/perl5.8.0/lib/strict.html
>>197 さん
どうも素早い返信ありがとうございます〜
さっそく試してみたいと思います
それにしてもchdir使えばいけるとは・・・思いもつきませんでした
危うくcpでフォルダ全コピーして削除する方法をするとこだったし
モジュールの話かコーディングの話か良くわからなかったのでこちらに。 例えば、JcodeのOOは Jcode->new(\$str)->utf8; の様にすれば良く、これは $char = 'utf8'; Jcode->new(\$str)->$char; でも良いようなのですが、 %char(UTF-8 => 'utf8'); Jcode->new(\$str)->$char{'UTF-8'}; のようにハッシュを使うと構文エラーと言われます。 ハッシュを使うにはどうすれば良いのでしょうか。
>>195 実行時チェックはシンボリックリファレンス(${'var_name'}のようなやつ)の禁止だけなので、
厳密にいうとデバッグがすんだらuse strict 'refs'のみにしてもかまわない。
が、本当に些細な負荷でしかない(しかも、コンパイル時チェックなので実行速度には影響しない)ので
敢えてそこまでする意味はない。っつか、黙ってuse strictしとけ。
>>199 $enc = $char{'UTF-8'};
Jcode->new(\$str)->$enc;
または
Jcode->new(\$str)->${ \$char{'UTF-8'} };
しかし意味も無くメソッドを変数にするのはお勧めできない。読み難い。
Jcode::convert(\$str, $char{'UTF-8'})とするのが普通だと思うぞ。
>>196 イメタグでCGI叩かせて、必要なら更新するという方法もある。
>201 HTMLで出力している意味をわざわざ遠回りしてまで殺して何の意味が?
203 :
182 :04/03/07 13:04 ID:???
>>196 リアルタイムに更新されない。と考えるとデメリットだけど、
リアルタイムに更新されなくて済む。と考えるとメリットになる。
メリットとして生かせるつくりにすることが重要。
204 :
nobodyさん :04/03/07 15:18 ID:hh7UC8Wb
質問です。 Win2000にActive Perl ver 5.8.3を入れています。 flockの使用可否について調べているのですが、 $file = "data.dat"; open(OUT,"<$file"); eval { flock (OUT,2); }; if ($@) { warn "flock NG"; } else { print "flock OK."; } こう書いてコマンドラインで実行すると、必ずOKと出力されます。 これってevalの使い方あってますか? また、Winってflock効くのでしょうか?
ありがとうございます。 >200 そうだったのですか。 Jcodeのマニュアルに Jcode->new(\$str)->euc; のやり方のほうが良い、 みたいな事を書いてあったので変更しようとしていたのです。
206 :
こば :04/03/07 16:33 ID:E9jZV2PD
こんにちわ 質問です。 以下の二つの違いを教えて頂けないでしょうか? print "<FONT size=\"5\">\n"; #ダブルクオート入り print "<FONT size=5>\n"; #ダブルクオートなし
>206 HTMLの事をなぜここで聞く?
HTMLの書きかた。 極めてスレ違いでござる。
いや、板違い。
210 :
こば :04/03/07 16:49 ID:E9jZV2PD
失礼しました。
>>202 大部分のアクセスはstatするだけだから、データ作り直すより速い。
下記のようなパールスクリプトをtaintモードで動かしたいのですが、 どうしてもサーバエラーになってしまいます(デバッガで見ると 「Too late for "-T" option at copy.cgi line 1.」と出ます)。 � #!/usr/bin/perl -T $a_dir = '../a/data'; $b_dir = '../b'; system("cp -r $a_dir $b_dir"); � 内容としては、あるディレクトリを丸ごとほかのディレクトリに バックアップするような ものなのですが、 taintモードで動かすこと自体が不可能なのでしょうか? もしくはどうすればtaintモードで動くでしょうか?
214 :
nobodyさん :04/03/07 20:04 ID:hh7UC8Wb
>>204 鯖として運営してるマシンで、いまどきflockを効かせないようにしてる鯖ってあるんか。
215 :
nobodyさん :04/03/07 20:05 ID:hh7UC8Wb
217 :
194 :04/03/07 22:03 ID:???
今日1日
>>197 を試したんだが全く成功しない…
いろいろ変数かえたりしたんだが全くダメだ
UNIX系のサーバーで試しにやったら動いたんだけど
Windowsで動かしたいんだけどなぁ
やっぱフォルダ全コピーしかないのか_| ̄|○
>>217 みたいな、
こうしたとかも書かずにただダメなのかとだけ言ってる連中って、
何の意味があって書き込んでるんだ?
同情して欲しいのか?
うん、そもそも、何でCGIが置いてあるディレクトリの名前換えたいか理解不能だし。 それがわかれば他の解決法もあるかもしれないのに。
掲示板に検索機能を付けて、 ($id,$name,$value,$other) = split(/\,/,$line); if($name =~ /$search/ or $value =~ /$search/) { という具合に、「名前」か「本文」に、「検索用の単語」が含まれていれば、という仕組みを作ってみたんですが、 検索用単語がエスケープする必要のある文字(表示とか)だと、エスケープしないと検索結果に出ません(表\示で検索しなければならない)。 どうしたらいいんでしょうか? そもそも間違ってますか?
ギャアー
223 :
221 :04/03/08 02:16 ID:???
表示、を検索する場合、「表\示」、「表\」で検索できますが、「表」では無理です。 $nameや$valueの中身が「表\示」になっている、というわけではない、ということですかね。
>>217 use Win32API::File qw(MoveFile);
226 :
225 :04/03/08 03:48 ID:???
書いた後にFile::Copyのmoveで出来ることに気が付いた…。
227 :
221 :04/03/08 06:25 ID:???
>>224 有難う御座います。
$name =~ s/\\//g;
$value =~ s/\\//g;
とやって、該当部分の\を無くす、でマッチさせるやりかたで出来ました。
ただ、そうすると、
$name =~ s/$search/<em>$search<\/em>/g;
$value =~ s/$search/<em>$search<\/em>/g;
で強調してる部分が適応されません。
$valueの中の$search(表示)に該当する部分、ってのは実質(表\示)なわけですからマッチされない、ってわけですよね。
また詰まりましたです。
228 :
221 :04/03/08 06:37 ID:???
$name =~ s/$search/<em>$search<\/em>/g; $value =~ s/$search/<em>$search<\/em>/g; の直前にも、 $name =~ s/\\//g; $value =~ s/\\//g; 入れたら解決しました。 ただ、本文の\が全部消えてしまいますけどいいんですかね。
229 :
221 :04/03/08 08:17 ID:???
>>227 のやりかたで、
$name(\を抜いたもの)と$search(\がないもの)がマッチするか確認する、ってするよりも、
$searchがエスケープシーケンス込み、になるようにした方が、em要素も適応できてよさげな気がするんですが、
$searchにどういう処理を加えたら「表\示」のような中身になるんでしょうか?
index使えば?
231 :
221 :04/03/08 08:22 ID:???
>>230 \の位置を調べて、その位置に\を入れる、という処理をするということですか?
>>221 if($name =~ /\Q$search\E/ or $value =~ /\Q$search\E/) {
どうよ?
233 :
221 :04/03/08 10:41 ID:???
>>232 まさしくそれです。
まだ覚え初めて1ヶ月経たないので、細かいところが弱いです。
有難う御座いました。
機種依存文字を差し替え(あるいは削除)する、ってのは容易にできますかね。
235 :
221 :04/03/08 11:09 ID:???
解決したと思ったんですが、「\」で検索すると、「表\示」がヒットしてしまいます……。
euc-jpにしる
237 :
221 :04/03/08 11:25 ID:???
>>236 それが確実ですよねぇ。
検討する方向で頑張ります。
ご面倒おかけして申し訳ありません。有難う御座いました。
すいません。質問させて下さい。 # ランダムで数字を表示 $n = int(rand 43) + 1; # CGIヘッダの出力 print "Content-type: text/html\n\n"; # HTMLの出力 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<html>\n"; print "<head><title>ランダム数字</title></head>\n"; print "<body>\n"; print "<p>今回の数字-----------★<big>$n</big>★</p>\n"; print "</body></html>"; というプログラムを作りましたが、この「今回の数字」という部分の 文字の色を変えるにはどのように修正したらよいでしょうか?
>>238 Web制作板の初心者スレでHTMLの書き方を聞いてこい
Perlの部分が質問の対象じゃないのか。 (・∀・)カエレ!!
>>238 use CGI;
$n = int(rand 43) + 1;
print "Content-type: text/html\n\n";
$obj = new CGI;
print $obj->p($obj->font({color=>'red'},'今回の数字').'-----------★'.$obj->big($n).'★')."\n";
「今回の数字」という部分の文字の色をランダムに変えるには と言うのなら答えてもいいが…
243 :
238 :04/03/09 09:30 ID:???
確かに質問内容がプログラムとは関係ないですね。すみませんでした。 それなのに丁寧な回答ありがとうございます。 昨夜、ヒアドキュメントを使う事で簡単に解決出来ました。 タグはXHTMLしかやってなかったので、それが原因のようでした。 241さんのプログラムは今日家に帰ったら試してみます。 もしよければ242さん教えて頂けませんか? それと今やろうとしている事で質問させて下さい。 $x = int(rand 5) ; @abc = ( A , B , C , D , E ) ; @key_a = ('Apple','Age','And','Angry') ; @key_b = (頭文字Bの単語 ); @key_c = (頭文字Cの単語 ); @abcの中からランダムに選んだアルファベットに対応した @key_?の中からまたランダムに選び出すという プログラムを作りたいのですが、これにはどうしたらよいでしょうか?
>>243 モマエは質問の前にもうちょっとドキュメント読んだ方がいい
新しい事やる度に質問する事になる
あーやべ俺ちょうしんせつ涙が出てくるワ
何故わざわざシンボリックリファレンスを使うという面倒な方法を思いつくのだろう。
Cのようなポインタを扱う言語でプログラムした経験が無い初心者だと、
ハードリファレンスよりもシンボリックリファレンスの方が
直感的にわかりやすいらしい。
>>243 真面目に答えると、二次元配列などを使うのが普通の発想だと思う。
%abc = (A=>['Apple','Age','And','Angry'],B=>[頭文字Bの単語],C=>[頭文字Cの単語]);
とかそんな感じ。これだと例えば $abc{A}->[2] が 'AND' になる。
ラクダ本だと「リファレンスとネストされたデータ構造」の章あたりを読むとよい。
>>243 %abc;
for ($ii=0; $ii<@abc; $ii++){
$abc{"$abc[$ii]"}{'key_a'} = $key_a["$ii"];
$abc{"$abc[$ii]"}{'key_b'} = $key_b["$ii"];
$abc{"$abc[$ii]"}{'key_c'} = $key_c["$ii"];
}
print $abc{'A'}{key_a}; #=> Apple
hash勉強せい
>>238 head要素内にtitle要素しかないのに4.01strictなのか、とか
250 :
248 :04/03/09 11:50 ID:???
質問です。 ShiftJISに含まれていない文字(半角カナなど)だけを実態参照に変換したいのですが, どうしたらいいのでしょうか。
>249 validatorには注意されるけど「HTML的」にはstrict(validではなく)。 詳しい事は製作板で識者にでも教えて貰って下せえ。
SJISに半角カナは含まれてると思うけど。
254 :
251 :04/03/09 15:03 ID:???
>>253 書き方がまずかったです。
要は一般的にまずいとされている文字を実態参照にしたいということです。
gzipで圧縮済みのファイルをcgiでヘッダ書いて送りたいのですが 0001.html.gz って名前のファイルを gzsend.cgi?0001 みたいに呼び出してますが画面真っ白で何も表示されません。 鯖はxreaです。 HTTPD + ActivePerl な環境のローカルだとうまくいくのですが… ソースはこんな感じです。 print <<HERE; Content-type: text/html; charset=Shift_JIS Content-Encoding: gzip Content-Language: ja Pragma: no-cache Cache-Control: no-cache HERE if ($ENV{'REQUEST_METHOD'} eq "GET") { $key = $ENV{'QUERY_STRING'}; } open(ALL,"$key.html.gz"); binmode(ALL); binmode(STDOUT); print <ALL>; close(ALL); exit; これで <a href="gzsend.cgi?0001">表示</a> <a href="0001.html.gz">Download</a> みたいな使い方したいのですが…いったい何が悪いのやらさっぱりです。
>>251 use Jcode; もしくは require 'jcode.pl';
$_ = "アイウエオ";
Jcode::convert(\$_, "euc"); もしくは &jcode'convert(\$_, "euc");
s/。/?/g;
中略(ちなみに61行分)
s/゚/?/g;
Jcode::convert(\$_, "sjis"); もしくは &jcode'convert(\$_, "sjis");
あとは以下を参照して。
HTML4 で使える文字実体参照
http://www.ne.jp/asahi/minazuki/bakera/html/reference/charref あとEUCで書く事
SJISでかくなら s/ア/?/g; → s/竺/?/g みたいにわざと文字化けさせた状態にする事
258 :
255 :04/03/09 17:07 ID:???
>>256 使えます。
普通にgzip圧縮転送は
ヘッダーに Content-Encoding: gzip と
if (-d "\\") { open(STDOUT,"| gzip.exe -1 -c"); } #ローカルテスト用
else { open(STDOUT,"| /bin/gzip/ -1 -c"); }
こんなんでうまく動きます。
gzipで圧縮済みのファイルをcgiから送るのがうまくいかなくて悩んでるんですけど。
>>258 あぁ そういうことか
ごめん勘違いしてた
単なるgzファイルをCGIから吐かせたいのね
それって根本的にContent-type: text/htmlじゃなくないか?
262 :
255 :04/03/09 19:20 ID:???
>>260 自動広告挿入無効の"x"ディレクトリに設置してみたところ動作しました。
普通に鯖側で圧縮して送る時は"x"ディレクトリじゃなくても動作するのに…
まぁ、そういう思いこみもあって盲点でした。
助かりました。ありがとうございます。
しかし今度は gzsend.cgi? の?以降になんか変なの書いたり何も書かなかった時に
何も指定されてません とか そんなファイルありません ってHTML吐くようにしてたのに
それが表示されなくなりました。
"x"ディレクトリに変える前はうまくいっていたのに…
エラー画面でなくてもさほど困らないしとりあえずこのまま使います。
>>261 Content-type: text/html; charset=Shift_JIS
Content-Encoding: gzip
なヘッダー書いてから.gzなファイル送ってやるとgzip圧縮転送と等価にブラウザにはHTMLで表示され
なおかつ圧縮済みだから鯖に負荷掛からない。
さらに以下みたいにして
<a href="gzsend.cgi?0001">表示</a> <a href="0001.html.gz">Download</a>
一つのファイルで表示用とダウソ用を兼ねる→(゚д゚)ウマー を狙ったんですよ。
263 :
へたれ :04/03/09 21:51 ID:vgAvuUAX
こんにちは、一般的な事なのでここに書き込んでいいのか良くわかりませんがとりあえず書いてみます。 掲示板を設置して、そこにアクセスしている端末のUSER_AGENTやアクセス数を解析したなぁ…って 思ったんですがCGIからCGIを呼び出すことって出来るんでしょうか? 掲示板のCGIの中で、端末解析用のCGI(手元にあるのはSSI動作のです)を呼べばいいんだろうと思うんですが やり方がわからないんでうまくいかないんです。どうやったらいいんでしょう?? よろしくおねがいします。
264 :
nobodyさん :04/03/09 21:52 ID:vgAvuUAX
こんにちは、一般的な事なのでここに書き込んでいいのか良くわかりませんがとりあえず書いてみます。 掲示板を設置して、そこにアクセスしている端末のUSER_AGENTやアクセス数を解析したなぁ…って 思ったんですがCGIからCGIを呼び出すことって出来るんでしょうか? 掲示板のCGIの中で、端末解析用のCGI(手元にあるのはSSI動作のです)を呼べばいいんだろうと思うんですが やり方がわからないんでうまくいかないんです。どうやったらいいんでしょう?? よろしくおねがいします。
265 :
nobodyさん :04/03/09 21:55 ID:vgAvuUAX
こんにちは、ヘタレですけどよろしくお願いします 掲示板を設置して、そこにアクセスしている端末のUSER_AGENTやアクセス数を解析したなぁ…って 思ったんですがCGIからCGIを呼び出すことって出来るんでしょうか? 掲示板のCGIの中で、端末解析用のCGIを呼べばいいんだろうと思うんですが やり方がわからないんでうまくいかないんです。どうやったらいいんでしょう??
266 :
へたれ :04/03/09 21:57 ID:vgAvuUAX
すみません 表示されなくて何回も…やっぱりヘタレです
この、「ヘタレ」がっ!!
すいません。質問させてください。 あるフォルダに、.htaccessと.htpasswdによるアクセス制限を 掛けています。アクセスすると、認証ダイアログが立ち上がることになるのですが・・・。 これを、フォームか何かで入力して、cgiで受け取って処理して認証画面が 出ないようにすることは可能なんでしょうか? ご存知の方おられましたら、よろしくお願いします。
269 :
nobodyさん :04/03/09 22:47 ID:4E/0UBZO
以下の処理で <a href="test.html#hoge"> と同様の処理を行うには どうしたらよいでしょうか? --a.html-- <frame src="test.cgi" > --end-- --test.cgi-- my ($html) = << "__END_HTML__"; <html> <head> </head> <body> <a name=hoge id=hoge>ほげ</a> <body> </html> __END_HTML__ if (open(HTML, "test.html")) { print $html } --end-- 教えて下さい。
>>263 例えば同じディレクトリに hetare.cgi があったとして、
$a = `hetare.cgi`;
と書けば、一応 hetare.cgi を実行できんこともない。
いろいろ細かい制約もあるので、常に期待した通りに動くとは限らんが。
>>268 必ずしも質問の意図を正しく捉えていないかもしれないが、
「.htaccess で制限かけたディレクトリがあって、普段だとBASIC認証しないとアクセス不可だが、
あるフォームからCGIにID/パスワードを送ると、BASIC認証に成功した状態になって、
例のダイアログを経なくてもそのディレクトリ内のファイルにアクセスできるようになる」
ということをしたいのだったら、不可能だろう。
付け加えると、この質問は「WebProg 初心者の質問」スレの方がふさわしかった。Perl と関係ないから。
>>269 なにをしたいかよくわからないが、少なくともこのスレの範疇では無さそうだな。
なにをしたいかよくわからないので、どのスレに誘導していいかもわからん。すまん。
272 :
268 :04/03/09 23:34 ID:???
>>270 ありがとうございます。やはり不可能ですよね・・。
>>271 先日までは、それでOKだったんですが、IEの2/2のパッチを当てると
URLを使った、BASIC認証が不可能になってしまったので・・・。
すみません。質問させて下さい。 今、アクセスカウンターを作っています。 カウント数のみ表示されるのはうまくいったのですが、 「sprintf」を使って数字の前に0を付けて桁数を揃えようと 修正したものが何度やってもうまくいきません。 for ($i=0; length($count)>$i; $i++){ $number=substr($count, $i, 1) ; $dinumber=sprintf("%06d",$number) ; print "<IMG SRC=$gifdir/$dinumber.gif $size ALT=$dinumber>" ; } これだと画像が表示されない上に数字の前に0がつかない状態です。 どこが間違っているのでしょうか? ちなみにうまく動いていたときのプログラムです。 for ($i=0; length($count)>$i; $i++){ $number=substr($count, $i, 1) ; print "<IMG SRC=$gifdir/$number.gif $size ALT=$dinumber>" ; }
変更前のコードが何をしているかよく考えてみればわかりそうなものなんだが。 まずはそこから勉強した方がいいと思うぞ。
275 :
nobodyさん :04/03/10 00:44 ID:qF7ZudiB
#!/usr/bin/perl $|=1; use Fcntl qw(:flock); $outfile = "outtmp.html; print "Content-Type: text/html\n\n"; open(OUT,"> $outfile"); flock (OUT, LOCK_EX); print OUT "aa"; close OUT; print "Done"; たったこれだけなのに、outtmp.html;が作成されません。 なぜなのでしょうか・・・。凡ミスだとは思うのですが、数時間考えても分からず。。。
4行目
>273 ファイルが読み込めないのは単にファイル名が違うだけとかだったりしないか。 下(元)の奴だと0.gif〜9.gifを読み込むようになってるが 上(改造後)の奴だと000000.gif〜000009.gifを読み込むようになってるし。
278 :
275 :04/03/10 01:17 ID:qF7ZudiB
>>276 あれ・・・おはずかしい。ありがとうございます。
しかし、これでも500エラーにはならないんだ。。。
500エラーて。。 まずコマンドからコンパイルエラーメッセージと変な記述の警告をあてにしようよ。
500エラーなんてものに頼っていては、凡ミスはなくならない。 エラーログ見るとかCGI::Carp使うとか、とにかくPerl自体のエラーを見られる環境を 作ってからいじるべし。できれば use strict; と -w オプションも使うのが望ましい。 数時間考える暇があるんならこっちに時間をかけれ。
274さん、277さん回答ありがとうございました。 length関数とsubstr関数についてはもう一度調べなおしてみました。 forの部分で$countの長さを取り出し、それを0番目から1文字分 抜き出すという事でよいですよね?ということは、この$count自体を 先に整形する必要があるのかと思い、先にsprintfで数字の前に 0をつけてからfor文で処理するようにしました。 これは今日帰ってから試してみます。 $gcount = sprintf("%06d",$count); for ($i=0; length($gcount)>$i; $i++){ $number=substr($gcount, $i, 1) ; print "<IMG SRC=$gifdir/$number.gif $size ALT=$number>" ; }
282 :
nobodyさん :04/03/10 10:14 ID:SqQ9bd0u
tie関数について質問させて下さい。 下のプログラムは、PRINTメソッドが無いよ〜って怒られてしまいます。 mainパッケージは触らず、 PRINTやREADといったメソッドを定義せずに済む方法はありませんか? よろしくお願いします。 #!/usr/bin/perl package main; open(F,">hoge.txt"); tie *F , 'tieHandle' , *F; print F "test\n"; close F; package tieHandle; sub TIEHANDLE { bless \$_[1]; } sub CLOSE { my $fh = shift; *FILEHANDLE = $$fh; print FILEHANDLE "\n","=== CLOSE method called. ===","\n"; close FILEHANDLE; }
283 :
ヘタレ :04/03/10 10:50 ID:huq9wT6V
>>270 ありがとうございます、でも$a = `hetare.cgi`;としてどうするんでしょうか?
変数に設定したあとどんなスクリプトを書けばいいんでしょうか?
また、制限ってどんな事があるんでしょうか?
もし参考になる文献とかありましたら調べてみますんで教えていただけないでしょうか
質問ばっかりで申し訳ありません。
>>283 `hetare.cgi`; と書くだけで hetare.cgi が実行される。
$a = `hetare.cgi`; とすると、hetare.cgi を実行した出力結果が $a に入る。
ポイントは、' (シングルクォート) でなく ` (バッククォート) を使うところにある。
「perl バッククォート」で google 検索かけてみそ。
制限だが、今回はアクセス解析CGIだということなので、たぶん問題は無い。
しかし、環境変数やカレントディレクトリは呼び出し元プロセスのがそのまま使われるとか、
CGI引数を渡したい場合にはちょっと知恵がいるとか、
そういうことがあるので、便利だからと言ってほいほい使っていると後でハマる。
>>280 動かない→悩む→ココで質問な人が多いようですね。
チェックの仕方知らない人も結構いるんじゃないかな?
自分がやってるチェック法を紹介しておきます。
−−以下−−
cmd /k perl -c %1
−−以上−−
って内容のバッチファイルを作り、それのショートカットにソースファイルをドロップ。
ローカルの環境です。Perl は Active Perl です。
use strict; と -w は今のところ使ってません。
ここに、Perl Checker ってのもあります
http://www.kent-web.com/utility/index.html open(PROC,"perl -c $file 2>&1 |");
なんて事やってるだけだけど。
286 :
ヘタレ :04/03/10 13:31 ID:huq9wT6V
>>284 さん
ありがとうございますm(_ _)m実は簡単に出来るんですね、
print"<!--#include ....とか、変な事やってました、恥ずかしいです。
ありがとうございました。
質問です。 $input = 10; としまして、 @dataに1,2,3,4,5・・・と数字が入っていまして、 $inputの値がこの配列の中に入っているかどうかを調べるのはどのようにすればいいのでしょうか? 配列に対してindexは使えないですよね?
288 :
251 :04/03/10 15:32 ID:???
初心者にありがちな誤り >何と言っても最大の誤りは、さまざまなエラーを指摘してくれる -w スイッチを >指定し忘れるというものである。 >2番目に大きな誤りは、use strict を使うべきところで使わないというものである。 とにかく、error.log(デフォルト設定)に出されたエラーの内容を把握する事が、 バグを取り除く為に最も効率の良い手段。 もしエラーの内容がわからなければ、らくだ本の9章に載せられている解説を読めば良い。 らくだ本を持っていなければ、エラーの一部分で検索してみるとか、 或はここで聞けば誰かが教えてくれるかも知れない。
しかし致命的ではないエラーまで出るからややこしくなる諸刃の剣。
>>289 grepだと、上の例なら
配列内に1 ・・・ 100ってあって、
$inputが1だったら、凄まじい量が出てくると思われ。
293 :
287 :04/03/10 15:59 ID:???
>>289 すいません、grepを今使ってみたのですが、
$input = 5;
@match = grep (/$input/,@data);
foreach (@match) {
print "$_ ";
}
@dataが1から30までなのですが、
5だけでなく、15や25も出てきてしまうようです。
この場合ですと5だけを取り出したいのです。
@match = grep{/^$input$/}(@data) @match = grep{$input eq $_}(@data)#数値比較なら ==
295 :
nobodyさん :04/03/10 16:23 ID:fPcyCnVN
use strictやらmyやら使わなきゃだめみたいなこと
くどく言ってる香具師がいるけど、初心者は、そんな
ことより、正確なコーディングに集中すべし。
例えば、
>>293 のだって、いちいちそんなことしている
必要はないだろ。strict厨、my厨引っ込め!
っていうか調べたいだけなら (grep{$input eq $_}(@data))? print 'match': print 'unmatch'; で良い気がs >295 煽りなのかネタなのか、単に勘違いしてるのか良く判らんが、 「正確なコーディングに集中す」るのに my や use strict はこれ以上なく有効だぞ。 そもそも、何故相手を厨と罵ってまでこれらを使いたくないかの方が意味不明(´ω`)
297 :
nobodyさん :04/03/10 16:45 ID:fPcyCnVN
>>296 はぁ?
普通の入門書の最初のほうには、strictやmyを
使ったスクリプトは出さないのだが、それだけのことが
分からず、まだ、stりctやmyにこだわってるから
厨になるんだよ。
>>297 普通の入門書の最初の方にstrict やらmyやら-wやら-Tやら、
出さないわけを想像もできんの?
もし真面目に言っているのなら、 それでもやはり特殊な事情が無い限り use strict を使う事を奨める。 と言うかこのスレでも使った方が良いと言う理由は出てるんだけどな。 初心者にとって、むしろ初心者であればあるほど、 正確な、バグの無いスクリプトを書く手段として 最もお手軽で良い方法が use strict だと言う事だ。 #勿論、my 変数についての理解はある程度必要だが #これは現在の Perl の基本中の基本の一つなので早めに学習しておく事 もし俺みたいな匿名が言うのが気に食わないのならば、 Larry が使った方が良いと言っているよと教えておこう。
>>298 やさしくするためだよ。無駄な負担を減らすために名。
stりctやmyはずっと後で出てくる。
最初からstりctやmyを使えって主張を取り消しますか?
stりctやmyなんていつになっても出てきません。
302 :
nobodyさん :04/03/10 17:26 ID:fPcyCnVN
>>299 >Larry が使った方が良いと言っているよと教えておこう。
問題は、どの段階かからだ。
さぁ、Larryがc言語の知識もプログラミングの知識もない
まっさらな素人に最初からmyやstrictを使えって言っている
箇所を引用してもらいましょうか。
デフォルトでuse strictではないということから察するに、 Larryはstrictを知らない人にまでstrictを強要しないということなのかもしれない。
-wでも出るし、エラーの場合は、デフォールトで標準出力に 何行目のどの辺がおかしいか出てくるんだよ。最初は、それで 十分。
気楽なプログラミングには制限がきつすぎることもある と書いてあります。
306 :
nobodyさん :04/03/10 18:26 ID:XGcN6IuW
use strict; している状態で $title='掲示板'; 1; 等と書いた設定用plなどを requireしてやるとうまく読み込めないんですけど、 読めるようにする事はできますでしょうか?
no strict;で一時的に制限解除するとか?
>>306 $main::title = '掲示板';
で、だめ?
309 :
306 :04/03/10 18:43 ID:???
>>307 ,308
返答ありがとう御座います。
解除すると問題なく動作するのですが、
strictしたままでの方法は無いものかと疑問になりまして。
>>308 試してみましたけどダメでした_| ̄|=○
#スレ違い談義がここまで進むとは思わんかった >302 なんで、そう極端な例を出すのかわからない。 少なくとも、初心者の誤りとして Larry は>290が引用したところの文を挙げている。 「使うべきところで」使わないのは誤りだと。 そして、Perl ではつまらないエラーをなくし、正しいプログラミングをする為に use strict は「特殊な事情が無い限り使うべき」。 余談だが、俺の言ってる初心者の定義は少し広いかもしれない。 言葉ではやや説明し難いが、貴方の言っている完全な素人の範囲には留まらない。 もし、最初からそのような完全な素人の事だけを初心者と言っていたのであれば、 こちらの言っている事はある程度撤回しよう。 それでも、出来る限り早い段階からレキシカル、グローバルを意識したプログラミングを 覚えて置くべきだとは主張する。 #因みに、Larry もラクダ本ではループ等と同じくらいの章(2.6)と比較的早い段階で教えている
>>308 それだけなら
設定ファイル
package MyConfig;
$title = '掲示板';
1
本体
use strict;
print (HTTPへっだ);
print $MyConfig::title;
でやれないかな。
やっぱuse strictとかするべきなんかなぁ 俺は、結構大きなもの作る(といってもたかがしれてる)。 今までで一番時間かけたのは、DBを使った成績の管理かな。 成績入力、平均算出、順位順に並び替え、などなど。 全部グローバル変数でやりましたよ。 一人でやるなら、全体が把握できてるから構わないけど、チームでプロジェクトをやるときにはmyで局所化したほうがいいってことだ、と思い、毎日グローバル変数でがんばっております。
変数をきちんと把握出来るならばそれでも良いんじゃない。 殆どの人は使うべきとか使った方が良いとは言ってるが、 何が何でも使えと言ってる人は逆に少数だろう。 要は、さまざまな利点が自分にとって意味がない思うのならば使う必要はないし、 そうでなければ使った方が良いんじゃない? 程度の事を主張しているに過ぎないのだと思う。
誰でも最初は全部グローバル変数で作りたいのは当然だと思うよ。 でも、そのうち気づくさ。
初心者ってこんなことにいつまでもこだわるんか?
use strictより、4.01strictの方が難しいと感じるのは漏れだけでつか?
StrictHTMLはほとんど原理主義的な意味合いが強いからなあ 俺はTransitionalで妥協。
>>317 慣れれば簡単。tu-ka、文章の意味づけが理解できるようになる。
SEO 対策にも使えるんだけどねぇ(哀)@相変わらずtable厨不思議マークアップな職場
( ´,_ゝ`)プッ
%ENVの値を例えば $QUERY_STRING = $ENV{'QUERY_STRING'} のように代入してるスクリプトを良く見かけるのですが、 単に読み込むだけなら代入する必要はありませんか?
322 :
へたれ :04/03/10 22:03 ID:huq9wT6V
>>284 さん
にCGIの中でCGIを呼び出すのはバッククォートで出来るって教えていただいたんですが
実際にbbsのCGIからアクセス解析のCGIをにやってみたらダメでした、同じディレクトリに呼ぶCGIを
おいてやってもダメでした。dopvCOMETを`dcw.cgi?md=s&&pg=indexx`;
ってやって呼んだんですがウンともスンとも…やり方が間違ってるんでしょうか?
ご存知の方居られましたらお助けください。
323 :
nobodyさん :04/03/10 22:40 ID:QACy8cAZ
>>323 それだとアクセス解析にならんぢゃろな。アクセス元とかrefererとか集計したいんだろうし。
>>322 えーと
>CGI引数を渡したい場合にはちょっと知恵がいるとか、
の制限に引っかかっちょるんぢゃよ。
バッククォートでやる場合は、?以降の引数をそのまま引き渡すことはできない。
環境変数を使って渡さなきゃいかんのだが、ちょっと修行がいる。
>>268 フォームからCGIにパスワード渡したらCGIがアクセス制限掛かってるフォルダの
ファイルと等価の内容を吐く用にするじゃ駄目?
326 :
nobodyさん :04/03/11 02:35 ID:YAYdGisP
今日からperlな者ですが質問です。
http://XXX/test.cgi とアドレスバーに入れたときに「ファイルのダウンロード」となるときがあるのですが
どうしてでしょうか?本当に分かりません。
327 :
へたれ :04/03/11 02:45 ID:X5d27yF/
>>324 その修行ってどうやればいいでしょうか?
いい参考書みたいなのってあるんでしょうか?
>>326 コーディングと関係ないです。
Apacheスレあたりを当たってください。
329 :
326 :04/03/11 04:15 ID:???
「気」という文字をURLエンコードすると%8bCとなってしまいます。 正確には%8b%43ですよね?以下がコードです。おかしなところは無いと思うのですが、 &url_encode("気"); sub url_encode{ $str = shift; $str =~ s/(\W)/'%'.unpack("H2", $1)/eg; $str =~ tr/ /+/; print $str; }
332 :
nobodyさん :04/03/11 11:20 ID:rL/aIPwV
どうしてもわからないので教えてください。 自宅サーバ設営のため、Kent Webさまよりyybbsをダウンロードしました。参考書 (Mac OSX Unix的活用講座)の指示通りperlの居場所を指定し直し、アクセス権を 設定しましたが、「Internal Server Error」となって動きません。KentさまのFAQ をみてチェックしましたが、いちおう問題なく設定されているようにおもえます。 いったいなにがダメなのでしょうか?Askaのほうはうごくのですが・・・ 環境はサーバもクライアントもMac OS X 10.3.2です。
* こ こ は コ ー デ ィ ン グ の ス レ で あ り 、 設 置 云 々 は ス レ 違 い な の で 悪 し か ら ず *
>>332 >Kent Webさまよりyybbsをダウンロードしました
これはどーでもいい。
perlpass->perlのコンパル->httpd->実行の確認
の順番で確認しろ。
あと完全にスレ違いだから。これ。
>>334 perlpassとperlのコンパルについて教えてください。初耳なので。
337 :
nobodyさん :04/03/11 13:32 ID:qdK0the5
変数を別ファイルに設定ファイルとしたいんだけど ラクダvol2のdo関数の項目でdoを使うとよいとかいて あったけど、use strictを使うとaborted due to compilation error と怒られました。use varsで変数を宣言しても同様です。 <main.pl> use strict; do './ini.pl'; print $aa; <ini.pl> use vars qw/$aa/; $aa='aa'; スコープの問題だと思うけどuse strictを使って exporterやファイルopenして処理する方法以外でよい方法は ない?設定ファイルは簡潔にしたいので。。
339 :
337 :04/03/11 13:42 ID:???
>>335 ぼくも、perlpassについて知りたいでつ。
先頭のPerlのパスの事なんじゃないの?
>>335 =
>>340 なんだから、いちいち反応せんでもよし。
しかも、パスなんざ環境でいくらでも変わるっちゅーに。
・・・。
そんな餌でオレ様がクマー(
343 :
nobodyさん :04/03/11 16:57 ID:GX3EcYk6
hogehoge.cgi/www.domain.com/ などでアクセスした場合の$ENV{"PATH_INFO"}の先頭のスラッシュを取り除きたいのですが、 $file=$ENV{"PATH_INFO"}; $file =~ s/^\///; これだけでいいのでしょうか?
perl -w でバグ?取りをしてるんですけど、 QUERY_STRINGが必要な部分のエラー項目を-wで見ようとすると、 ?mode=などがオプション扱いされて、参照できないのですが、 他にエラー項目を参照する方法ってありますか?
345 :
nobodyさん :04/03/11 18:33 ID:Jy84bKJO
変数って使い回した方がいいですか? それとも各処理毎に分けたほうがいいかな? $name = 'ほげ'; print "名前$name"; # $name = 'ほげ'; は以後不要 $name = 0; if (〜eq〜) { $name = 1; } みたいな感じで
>343 $ENV{"PATH_INFO"}の内容が / で始まるならそれで良いと言うか 試せば直ぐ判りそうな気が。 >344 良く解らんかった……。 >345 普通、同一ブロック内なら変数名は処理毎に変える方が良いと思う。
ハッシュへの配列によるキーと値の追加方法について。 今は @temp = %hash; push @temp, @_; #@_内は key1,value1,key2,value2 以下略 %hash = @temp; undef(@temp); #気分的に とやっているのですが、これを余分な変数を介さず 直接追加する方法は無いのでしょうか。 %hash .= @_; とかやってみたのですが駄目でした。
>>348 %hash = (%hash, @_);
351 :
nobodyさん :04/03/11 21:24 ID:AiFNJNW+
1: 自分はこう言う事がしたい。 sendmailを使って、特定のアドレスにフォームの内容を送信したい。 2: それでこんな風にやってみたが・・・ CDRにあったスクリプトを、パスを適正にかえて用いた。 3: こんなエラーが出て上手く行かなかった。 メアドによっては成功する。メアドに'ne'を含むものは、演算子とみられるせいかダメ。\n\eとしてもダメ。 変数にいれてみてもダメでした。 成功するメアドは、変数操作でもうまくいきます。この板に来たのは初めてですが、失礼なことがあったらすいません。 よろしくおねがいします。
「こんな風にやった」というのは、自分で書いたコードを見せろという意味。 人の書いたやつを意味も分からずいじっただけなら、改造スレにでも行ってくれ。
>>352 分からないなら余計なことを書き込むな。
CDRって何? くだー?
355 :
353 :04/03/11 22:57 ID:AiFNJNW+
さすがに新参者には厳しいですね。 意味もわからずにいじってるわけではありません。じゃヒアドキュメントのところを。 $message = <<END_OF_MAIL; To: *****.home.ne.jp Subject:テスト Reply-To: $in{"mail"} <名前> $in{"name"} <アドレス> $in{"mail"} <感想> $in{"comment"} END_OF_MAIL
357 :
353 :04/03/11 23:01 ID:???
>>351 えーとですね、
「3:こんなエラーが出て上手く行かなかった」というのは、
「ダメだった」と書かれてもそれじゃどうしようもなく、
ダメだったときのエラーメッセージなりログなりを提出せよ、
と、そういうことなんです。
それがないと、何が起きているかわからない。
会社の後輩でも、毎回「まず error_log を見てから俺に相談しろ」と口を酸っぱくして言ってるのに
全然憶えないやつがいるんだけど、なんでみんなああなのかね。
359 :
353 :04/03/11 23:08 ID:AiFNJNW+
>>356 おそれいります。
文字列'ne'を含まないアドレスについては、うまくいくという意味です。
@のエスケープに関しては、すべて行っています。
361 :
351 :04/03/11 23:23 ID:AiFNJNW+
>>360 すいません。
言い忘れましたが、Tera Padというテキストエディタでみると、
'ne'のぶぶんがprintと同じようにボールド体で表示されるのです。
そこで、\n\eとしてみたところ、ボールド体ではなくなりましたが、それで実行すると、
文字列'ne'以下が省略されたかたちでメールが送られた、というメッセージがでました。
どう考えたらいいのでしょうか。
362 :
353 :04/03/11 23:43 ID:???
俺必死杉
>>361 それを「わけもわからずいじっている」と言わずしてなんといおう。
364 :
nobodyさん :04/03/12 04:58 ID:SsTHKK/b
文字列をあるばしょで切りわけたいんですが、 以下のようなときにもっといい方法無いでしょうか。 $str = '200402'; ($year,$month) = (substr ($str,0,4),substr ($str,4,2));
>>361 Tera Pad云々ということはソースに直接メアド入れてるんでしょ?
その付近のソースを貼ったらわかるんじゃないの?
てかそのアドレスを代入した変数を正規表現でチェックしてる?
だとしたらそこがあやしいよーな
>>364 $strの取得の仕方を変えたらいいんじゃない?
明らかにsubstr使うのがベストだろうけど。 $str = '200402'; $str =~ /^(\d{4})(\d{2})$/; print $y = $1; print $m = $2;
>>364 >>364 TMTOWTDI.
# substr
my($year, $month) = (substr($str, 0, 4), substr($str, 4, 2));
# unpack
my($year, $month) = unpack 'A4A2', $str;
# パターンマッチ
my($year, $month) = $str =~ /^(\d{4})(\d{2})/;
# 置換1 (非破壊)
(my $year = $str) =~ s/(\d{2})$//;
my $month = $1;
# 置換2 (非破壊)
my $month;
(my $year = $str) =~ s/(\d{2})$/($month = $1, '')[1]/e;
# 回りくどい方法
my @tmp = split //, $str;
my $year = join '', splice @tmp, 0, 4;
my $month = join '', @tmp;
>>367 > $str =~ /^(\d{4})(\d{2})$/;
2004年の2月しか想定されてないけど、そうでいいのかな?
370 :
369 :04/03/12 05:33 ID:???
すまん。誤読した。
371 :
364 :04/03/12 05:36 ID:???
_とかであらかじめ切っておいて、、というやり方でもできるんですけど それだと弄る箇所がかなり多くなってしまうんで、 スマートに切り分ける方法があるのならな。と思って質問してみました。 やっぱり_で区切っておいてsplitの方がよさげなんで、そっちで行きます。 わざわざ有難うございました。
リロードしてなかった。。
みなさん有難うございます。
>>368 さんのアンパックが魅力的なんですけど。
ちょっと調べてみます。
373 :
351 :04/03/12 08:25 ID:J1fEY9aw
>>365 おそれいります。さきほどとはちがうソースを作ってみました。
mailtoに代入されたアドレスのうち、****\@jcom.home.ne.jpだけにエラーが生じます。
時間がないので失礼します。
#$mailto = "****\@taurus.livedoor.com";
#$mailto = "****\@jcom.home.ne.jp";
#$mailto = "****\@****.org";
$mailto = "****\@yahoo.co.jp";
jcode::convert(\$name, "jis");
jcode::convert(\$comment, "jis");
open(MAIL, "|$sendmail $mailto");
print MAIL "Subject:comments and questions\n";
print MAIL "Reply-To: $in{'mail'}";
print MAIL "\n$in{'comment'}";
close(MAIL);
$jcom = "jcom.home.ne.jp"; #$mailto = "****\@$jcom"; とかでも無理?
375 :
nobodyさん :04/03/12 11:25 ID:S7woz7f4
ゲームのアイテムなどの相場情報の報告などを集計して相場平均価格を 出したいのですが情報操作目的の、普通ではあり得ない価格報告を 平均価格を計算する時に使ってしまうと平均価格が狂ってしまうのでそれを避けたい のですが良い計算方法が浮かびません。 10 + 20 + 20 + 30 / 4 = 20 #正常 10 + 20 + 20 + 3000 / 4 = 762.5 #異常 こういう事態を避けたいのです。 perlコーディングというより数学計算式の問題のような気もするのですが 該当スレが見つからなかったのでここに書かせて頂きました。 どなたかよいアドバイス頂けないでしょうか?
>>375 レスありがとうございます。
標準偏差で調べてみようと思います。
誘導も感謝いたします。
>>375 統計学には、はずれ値の除外に反復切断法というのがある。
四捨五入についてお聞きします。 小数点第一位で四捨五入を行なうときには、 $hoge = int($hoge + 0.5); とすれば整数部分のみが取得できますが、 小数点第二位で四捨五入を行なうときには、 ($hoge + 0.05); の他に、どのような記述を追加すればいいのでしょうか。
すいません、説明不足かもしれません。 # パーセンテージを算出する $percent = ($count / $total * 100); print <<"EOF"; <IMG src="グラフ.gif" width="グラフの長さ" height="10"> $percent</TD> EOF こうある場合で、小数点第二位で四捨五入した値を$percentに表示したいのです。
printfの書式演算子を見るべし。
指定したディレクトリ以下の空フォルダ削除する方法はどうしたらよいのでしょう? 再帰とかいろいろ調べてるのですが、いまいちでして。。
指定したurlからHTMLやファイルを取得する時に使うモジュールで 皆さんが普段使っているものやおすすめのものを教えてください。 socketから書くの('A`)ノ マンドクセ
URLラッパーがついてるPHPはファイルの取得がものすごく楽だな。
my $hashref = $pkg1->return_hash_ref(); #ハッシュのリファレンスを返す $pkg2->get_hash_ref($hashref); package pkg2; .. sub get_hash_ref{ my $self = shift; $self->{'hashref'} = shift; .. } のように渡した時、get_hash_ref()内で while(my($key, $value) = each %{$self->{'hashref'}}){ ${$self->{'hashref'}}{$key} = 0 unless $value; } とかやっても0が代入されないようなのです。 何が悪いのでしょうか。
染色体
>>389 こんなでも動くけど。
my %hash = (a=>1, b=>undef, c=>3, d=>4, e=>undef);
my $pkg2 = pkg2->new();
$pkg2->get_hash_ref(\%hash);
while(my($key, $value) = each %hash){
print $key, ' => ', $value, "\n";
}
exit;
package pkg2;
sub new
{
return bless {}, shift;
}
sub get_hash_ref
{
my $self = shift;
$self->{'hashref'} = shift;
while(my($key, $value) = each %{$self->{'hashref'}}){
${$self->{'hashref'}}{$key} = 0 unless $value;
}
}
> ${$self->{'hashref'}}{$key} = 0 unless $value;
これが通るのが謎。
$self->{'hashref'}->{$key} = 0 unless $value;
こうするのがいいっしょ。
393 :
nobodyさん :04/03/12 20:12 ID:hneCqJMt
今クッキーに書き込む処理をする部分を作ってるんですが、 Windows XPの場合cookieファイルはどこにあるんでしょうか? 98SEのときと保存の仕方が違うようなのです。
394 :
330 :04/03/12 20:50 ID:???
>331さん いろいろ検索してみたのですが、'C'にも対応したコードがわかりません。 上記のコードはperlメモの写しなのですが、世間じゃ大概urlエンコードには この方式を利用していますよね?手持ちの本も見てみたのですが、 これも'C'にはマッチしないものでした。 ということは大半のperlスクリプトに'気'を渡したら誤動作を起こすということでしょうか?
> 98SEのときと保存の仕方が違うようなのです。 この書き方って、あんまり印象良くないね。 周知の事実なんだが、自分が、さも今発見したっていうか。 そんなもん、知らない方がおかしいっての。 98SEからPC触ってるんだったら、この何年、何やってたんだって話だよ。 少しは自分で調べることを覚えないとな。 いつまでたっても、初心者じゃカコワルイ。
------------------------------------------------------- こ こ ま で 釣 り 堀
400 :
393 :04/03/12 22:01 ID:???
以前と同じ方法でクッキーの書き込みと取得もできてたんだけど そのクッキーファイルの保存状況を確認しようとしたら見つからなかったんです。 とりあえずcookieでCドライブに検索かけて cookieがあるフォルダまでは到達して探してたんだけど 目的のファイルが見つからなくてもしかしたら別のフォルダもしくは 特殊な方法で保存してあるのかと思ったけどようやく発見しました。
401 :
nobodyさん :04/03/13 01:09 ID:i+mpAF5R
テスト環境はWinXP、AnHTTPD、ActivePerlです。 $logno = 1 $num = 2 $ext = ".txt" だとして、$temp = "$logno_$num$ext" とすると 2.txt と帰ってきてしまいます。 手持ちの入門書(CGI&Perlポケットリファレンス)で見る限りはアンダーハイフンを エスケープする必要があるという記述は見つけられないのですが、 $temp = "$logno\_$num$ext" としたらきちんと 1_2.txt と帰ってきました。 これはどういう理屈なのでしょうか。
$logno_ を変数名として扱うから。
エスケープしたくないのであれば{}で明示してあげるのも良いだろう。 ${logno}_$num$ext
404 :
401 :04/03/13 01:52 ID:???
405 :
393 :04/03/13 12:47 ID:???
すみません。そちらで改めて質問させていただきます。
406 :
nobodyさん :04/03/13 17:17 ID:0t1k16sr
use strict;してるのですが、 my %NEW; my $maxno だと正常動作するのですが、 my %NEW,$maxno; だと正常動作しません。 こういうもんなんでしょうか? どっかで、こういう例を見たような気がするのですが・・・。
408 :
406 :04/03/13 17:34 ID:???
409 :
nobodyさん :04/03/13 20:27 ID:3lH9+FV2
■ そふとはうす ■
単位はすべて円です
Windows日本語製品版です。Macもあります。
Office 2003 Pro 10000
Windows XP Pro 4000
Windows 2000 Pro 4000
Windows 2003 Server Enterprise 15000
FrontPage 2003 4000
Acrobat6.0 Pro 7000
Illustrator 10.0 10000
Illustrator CS 10000
PageMaker 7.0 7000
Photoshop 7.0 10000
Photoshop CS 10000
Premiere Pro 10000
Flash MX 2004 5000
期間限定で販売します。希望品,郵便番号,送り先住所,氏名,合計金額を記してお申し込みください。すべてユーザー登録できません。ほかにも商品(Win,Mac)ございます。
リスト希望の方は「リスト希望」のタイトルでメールください。
ご注文はここ→
[email protected] 広告希望はコチラ
[email protected] メール専門広告代理店 本気と書いて大マジっス!広告
410 :
nobodyさん :04/03/14 10:20 ID:YQY2sb9a
自分もuse strict;を使って見ようと思いちょっと短いコードを 書いてみたのですが疑問があります。 use strict; print "content-type: text/html\n\n"; print $a; exit; $aは宣言されていないのになぜかエラーがでません。 $abに変えるとエラーがでました。これはなぜなのでしょうか?
$aと$bはsortで使う特殊変数だからじゃ?
412 :
nobodyさん :04/03/14 10:30 ID:YQY2sb9a
そうなんですか。なるほど勉強になります。ありがとうございました。
413 :
nobodyさん :04/03/14 12:54 ID:YQY2sb9a
もうひとつ聞きたいのですが、 今作ってるBBSのタイトルや文字色などの設定はsetting.cgi というものに書かれています。 $title = 'BBS'; $color = '#555555'; のように それを呼び出して変数をセットしていたのですが、use strictを 使った場合はmainパッケージを指定して $main::title のようにしないとだめなのでしょうか? 使うたびにいちいち$main:: と記述するのが面倒なのですが・・・
414 :
nobodyさん :04/03/14 12:57 ID:2Zg8YvJb
>>413 mainパッケージなら、パッケージ名を省略できるぞ。
$::title
>>413 名前空間が同じなら、
use vars qw($title);
とか
>>413 自分ひとりで使うなら自由だろうけれども。
他人や素人にも可能なように、設定ファイル形式にするのはどうか。
418 :
die($/); :04/03/14 14:24 ID:ntUNbT3i
cpan ってなんて読めばいいのでしょうか? 気になって朝も起きれません
しー○ん
420 :
die($/) :04/03/14 14:48 ID:ntUNbT3i
しーぽんですか、ありがとうございました
(´ω`)・・・
まことに初歩的な質問かもしれませんがどうか教えて下さい。 既存のスクリプトを改造しているのですが、以下のようなことをしようと 思っています。 1)フォームより***.txtといったようなファイルを送信する 2)入力されたファイルを解析して結果を表示する ・・・というものです。 フォームにテキストそのものを書き込む方法ならその値を読み込む 方法なら簡単だと思うのですが・・・ フォーム入力から例えば***.txtというファイルを送信した場合に これを一旦任意のディレクトリにアップロードして、スクリプト内で ファイルをopenして処理する以外に方法はないのでしょうか?
423 :
413 :04/03/14 19:33 ID:MYhrucqa
レスありがとうございます。 use strict; としたあとに、 my $val = 10; print "Content-type: text/html\n\n"; print $val; exit; としたところ動きました。どうもありがとうございました。
>>422 >これを一旦任意のディレクトリにアップロードして、スクリプト内で
>ファイルをopenして処理する以外に方法はないのでしょうか?
どうもないらしい。少なくとも俺は知らん。
CGI.pmのドキュメントを読めばわかると思うが、
同じように一時ファイルに保存する分、それがセキュリティの穴になりうる可能性があるとのこと。
まあ、さっと保存してさっと処理してさっと消して、穴になる確率を極力減らす努力をしよう。
425 :
nobodyさん :04/03/14 19:45 ID:wZU93kf1
>>422 ファイルのアップロードはCGI.pmやCGI::Liteを使えば簡単。
って話じゃないのかしらん。
427 :
422 :04/03/14 20:14 ID:???
>>424 さん、
>>426 さん
ありがとうございます。
必死にぐぐってみているのですが、どうもそれらしい資料が見当たらない
のはそういう理由なのでしょうね。
>>424 さんいアドバイスいただいたようにセキュリティの穴を作らないよう
素直にテンポラリファイルを作って対処したいと思います。
何分perlの勉強を始めたばかりでわからないことばかりですがひとつひとつ
問題を乗り越えていきたいと思います。
どうもありがとうございました。
428 :
422 :04/03/14 20:21 ID:???
>>426 さん
考えていたのは送信したpostで受けたファイルをいちいち保存しないでそのまま
メモリ上に展開して解析、値を返す、、、ようなことを考えていました。
もっと精進します。
アップロードされたファイルは標準入力に入ってやってくるわけだから
multipart を自力でデコードすれば原理的に不可能な話じゃないだろう
CGI.pm の man に書いてあるのは、
「CGI.pm はテンポラリファイルを作るので盗聴の恐れもあるんだよ」ということで、
本来はテンポラリファイルを作らず自力でデコードする方がセキュリティは高い。
なんだが、自力でデコードするのがめんどいので、
たいていみんな「盗聴されてもいいやー、どーせuploaderだしぃ」とか妥協して
CGI.pm に頼ってしまうわけだ。
自力でデコードするなら、
ttp://www.hk.airnet.ne.jp/~ahero/cgi/cgiex11.html あたりを参考にしてみては。
>>429 そのサイト見たけど、えらいテキトーなコードだな
ファイルなんだから「盗聴」じゃなく「盗視」というべきなんではw それはともかく、アップローダーとかなら見られても問題ないが、 そうでないなら自力でデコードするべきということだな。 つーか何でCGI.pmが危険を承知でそんな設計になってるんだ?
>>431 CGI.pmはメモリーをガンガンに食うので、とりあえず気休めにメモリ効率のいい方法を使ってみた、とか。
432はちょっと431に対してまとはずれなことを言っているようです。
CGI.pmは使った事無いけど、テンポラリファイルを 外から不可視のディレクトリ内に作らせるようには出来ないのかい。
>>434 できるんだけど、その場合でも CGI プロセス自身からは見えないとまずいので、
そういうパーミッションのディレクトリにせざるを得ない。
で、suexec 使ってない apache だと、全ての CGI プロセスから丸見えってことだよね、
とかそういう話。
man CGI にも 「suexec にしる」 と書いてあるんだが、
mod_perl な人とかは suexec できないので辛いよな。
ファイルロックって何でいるんですか? ファイルに書き込むときには使ったほうがいいんですかね? いまいち必要かがわからないので誰か教えて…
437 :
nobodyさん :04/03/15 02:32 ID:L0Oup+5/
以下のようなDBから必要なレコードとってきてタブ区切りテキストをダウンロードしようとしています。 # SQLの発行 $sql = "select no, date, standard, exception, company, address, quality, class, url from $tblname where del = 0 order by no"; $result = $conn->exec($sql); # 行数、フィールド数の取得 $rows = $result->ntuples; $fields = $result->nfields; # データファイルを作成 for($r = 0; $r < $rows; $r ++) { for($f = 0; $f < $fields; $f ++) { $v = $result->getvalue($r, $f); $data .= qq|$v\t|; } chop($data); $data .= qq|\n|; } print "Content-type:text/plain\n\n"; &jcode::convert(\$data, 'sjis'); print $data; ここで、実際にIEでダウンロードすると、当たり前といえば当たり前ですが、ダウンロードファイル名がデフォルトでスクリプトのcgiファイル名となってしまいます。 一度、サーバーにファイル書き出しして開いて送ればいいのですけど、それをしないで好きなファイル名でダウンロードできるようにする方法ありますか? perlというより、CGIですが。。
438 :
422 :04/03/15 02:40 ID:???
>>429 お礼が遅くなってスマソです。教えていただいたリンク先ですが。。。
当方にはまだまだ敷居が高そうですが、今後の参考にさせていただきます。
>>436 未熟者が語るようなことではありませんが、例えば1つのファイルに複数の
書き込みがあったとしたらどうなると思います?
何らかの制御をして順番を決めないと競合してファイルが壊れてしまうはずです。
そのためにロックして1つの書き込みを処理している間は他の書き込みをロック
して防ぐことでファイルの破損を防ぐ。。。ということだと解釈していますが。
諸先輩方、いかがでしょうか?
>>438 ファイルロックは書き込み処理の寸前にするのでしょうか?
またflock($fp,LOCK_UN);といった感じでロックを開放する処理も書き込み後行った方がいいのでしょうか?
441 :
422 :04/03/15 03:17 ID:???
>>441 ありがとうございます。もっと勉強して出直してきます。
本来初心者スレかファイルロックスレの範疇だが…… >440-441 基本的には「ロック > 処理 > アンロック」、 例えば一つのファイルを更新する場合は「ロック > 読み > 書き > アンロック」 の順番が守られていれば、open() はロックの先でも後でも良い。 #ロックの方法論は別の話 現に、flock() は以下のようにして使う。 open(FILE, 'file.dat'); flock(FILE, 2); # ロックは open() の後 .. #読み書き等の処理 .. flock(FILE, 8); # アンロック close FILE; # そして close() ロックスレは途中荒れてるが読んでみると良い。
あれ初心者スレとのマルチか……まあ良いや。
>>437 ブラウザ依存だけどこんな感じのを吐けばいい。IEなら動く
Content-Type: application/octed-stream
Content-disposition: attachment; filename=xxx
446 :
422 :04/03/15 04:39 ID:???
>>443 なるほど。勉強になります。
ロックスレもじっくり読ませていただき勉強します!
今日はいろいろ勉強になります。諸先輩方に感謝します。
掲示板を作る際に記事のキーとして現在時刻を用いようと思うのですが 同じ時間になってしまうことはあるのでしょうか。 $key = time(); こんな感じで。
キー値として時間を使うのは不適当だと思うがどうだろうか。
>>447 CGIを同時起動させて時間取得を千回ほどループさせてみてはどうだろうか。
CGI.pmを使ったアップローダーのサンプルなのですが、どうもうまく実行できません。 line 27のハッシュの使い方がまずいようなのですが、いまいちわからず何が悪いのかわかりません。 環境はWinXP + Active Perl 5.6 + An HTTPDです。
#!/usr/local/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } # 画像ファイルのサイズ制限(KB) $img_max = '100'; # 画像を保存するディレクトリー $images = '画像を保存するディレクトリー'; use CGI; $query = new CGI; $filename = $query->param('File'); # ファイルを読み込む while(read($filename, $buffer, 2048)) { $file .= $buffer; $file_size ++; if($file_size > $img_max / 2) { &Error("ファイルサイズが大きすぎます"); } }
# 拡張子を取り出す $type = $query->uploadInfo($filename)->{'Content-Type'}; if ($type =~ /jpeg/i) { $ext = 'jpg' }; elsif ($type =~ /gif/i ) { $ext = 'gif' }; else { &Error("その形式の画像ファイルは保存できません"); } $new_file = "test" . ".$ext"; # ファイルを指定ディレクトリにコピー open(OUT, "> $images/$new_file"); binmode(OUT); print(OUT $file); close(OUT); chmod(0666, "$images/$new_file"); # 完了メッセージの表示 print <<END_OF_HTML; Content-type: text/html <HTML> <BODY> ファイルのアップロードに成功しました。 </BODY> </HTML> END_OF_HTML exit;
453 :
450 :04/03/15 12:24 ID:???
すみません。自己解決しました。 このソ−スではファイルの入力部分のhtmlが不足していました。 書き足したところ上手くできました。お騒がせしました
454 :
nobodyさん :04/03/15 13:47 ID:L0Oup+5/
>>445 おおお。うまくいました。ありがとうございます!
455 :
nobodyさん :04/03/15 15:01 ID:gPR3Vlyr
質問です。 @number=("1","3","7","16",,,); のように、まったく規則性が無い数値が大量に入っている配列があるのですが、 この中から最大値および最小値を取り出す場合、何かいい方法は無いでしょうか?
457 :
T.K :04/03/15 16:03 ID:???
>>455 sortを使う。
-----------
sort @number; #@numuberを並び替える
$max = $number[0];
$min = $number[$#number];
>>455 > 質問です。
> @number=("1","3","7","16");
> のように、まったく規則性が無い数値が
クオートしてたら文字列だろ、
@number=("1","3","7","16");
print ((sort@number)[-1]);# 7、と表示する。
459 :
458 :04/03/15 16:31 ID:???
>>458 >
>>455 > > 質問です。
> > @number=("1","3","7","16");
> > のように、まったく規則性が無い数値が
@number=("1","3","7","16");
print ((sort{$a <=> $b}@number)[-1]);# 16 と表示する
# 明示的に数値として比較する必要がある
数値としてソートすりゃいいじゃん sort{$a <=> $b}(@number);
461 :
450 :04/03/15 16:41 ID:???
ちょっと必要があって
>>451-452 のCGI.pmを使用したファイルアップローダー
でPerlの実行ファイル***.cgiをアップロードしたのですが、アップロードした
ファイルがInternal Server Errorとなり動きません。
まったく同一なファイルをCGI.pmでアップロードしない場合は問題なく動作します。
そこでCGI.pmでアップロードしたファイルを開くと改行コードはCR+LF、文字コードも
Shift_JISで問題ありませんでしたが、改行が増えた状態になっています。
どうやらアスキーではなくバイナリでアップロードされているようだったので、
ググって調べてみたところHTMLファイルのエンコードタイプが
multipart/form-data ではバイナリデータしか送れないことがわかったので、
application/x-www-form-urlencoded と変えました。
これでアップロードすると改行が増えることなく元のファイルとまったく同一
にアップロードされているようです。
しかしそれでもアップロードしたファイルは起動できずエラーになります。
さらに調べてみたところ、
>フォーム中に <INPUT type="file"> を含む場合は "multipart/form-data" を使用して下さい。
ということが書かれてありました。
原因はどうやらエンコードに問題があるようなのですが、この矛盾した状態でどうやったらファイルを
アップロードが正しくできるのでしょうか?
462 :
450 :04/03/15 16:43 ID:???
>HTMLファイルのエンコードタイプが multipart/form-data ではバイナリデータしか送れないことがわかったので、 application/x-www-form-urlencoded と変えました。 抜けていましたが、htmlファイルのフォームの記述のことです。 <FORM ACTION="./upload.cgi" ENCTYPE="application/x-www-form-urlencoded" METHOD="POST">
464 :
458 :04/03/15 17:03 ID:???
>>462 LFなファイルをそんまま送ればいいじゃねえの?
俺なんかEUC-JP LFで作ってそんまま生で送ってるよ
asciiモードなんか使わない、めんどくさいし間違いの元
465 :
450 :04/03/15 17:07 ID:???
>>463 CGI.pmに関することだからと思ってこちらに書き込ませてもらいましたが、
仰るとおりですね。スレ違い失礼しました。
>>464 どうもありがとうございます。試してみます。
根本的に勘違いしてるしな
>>461 任意のスクリプトが実行可能なアップローダですか…。
他サイトがやばいから、公開しないでね。
>>455 use List::Util qw(max min);
...
my ($min, $max) = (min(@number), max(@number));
>>469 意味がわかんねえよ。
「今いるページのURI」ってなんなんだよ。
CGIでやってるなら、それはCGIを設置してるURIに固定だろ。
それともローカルで実行させるスクリプトのことか?
IEと連動させて、IEのアドレスバーの内容を読み取りたいってことか?
$ENV{'REQUEST_URI'}のことと思われ。
473 :
nobodyさん :04/03/15 22:33 ID:c+xa9RIL
アドレスが一行ずつ書かれたサブネットマスク付きのファイルに対して、(12.100.0.0/15とか)丸ごと置換したく s/[0-9]*.[0-9]*.[0-9]*.[0-9]\/[0-9]*/置換したい文字列 と書きました。しかし一部 134.置換した文字列 という風にアドレスが一部残ってしまいます。 色々正規表現を変えてみたのですが、うまくいかず困ってます。 というか、やはり上の書き方がわるいのでしょうか・・・?
474 :
469 :04/03/15 22:38 ID:???
>>473 $ip =~ s/\d+\.\d+\.\d+\.\d+\/?\d*/$replace/;
こうじゃねえの?
[0-9]とするよりは、\dを使った方が専用の仕組みを使っている分速い(らしい。ベンチとったことない)
*だと、直前の文字が0個でも引っかかる。ので、必ず数値があるのがわかっている場合は、+を使う。これなら1文字以上の意味になる。
.は「任意の文字」つまり「なんでもいいから一文字」の意味になるので、ドットの意味で使う時はエスケープ(\.)する。
つか、正規表現を勉強しなおすか、正規表現スレに行ってくれんか?
>>474 を踏まえて上で。
>>471 あんた、すごい読解力だな。エスパーかと思った。
なんでわかった? どうやって理解した?
俺も何を言ってんだかさっぱりわかんなかったよ
>>471 は医療とか教育関係者?
俺もなんとなくだがREQUEST_URIだとはおもたが ええ、負け惜しみですよ
479 :
nobodyさん :04/03/16 01:03 ID:N9sS5GGB
ユーザーファイルが下記のようになっていて、 taro<>100<>aho jiro<>150<>jinan sabuchan<>40<>kitajima それを @usr_name, @usr_pts, @usr_memo に格納してあります。 $usr_name[$i]さんの点数=$usr_pts[$i](備考:$usr_memo[$i])って感じ。 usr_ptsでソートしてファイルを書き換えたいのですが、 簡単にできる関数ってありませんか? 自分で作るしかない?
DBを使えば楽なんだがな
>>479 データの持ち方が変、だと思う。
そのデータなら、
while ( <FILEHANDLE> ) {
chomp;
@line = split /<>/;
push @user, { map { $_=>shift @line } qw( name pts memo ) };
}
こんな風に読み込んで、
$user[$i]->{name}さん。
$user[$i]->{pts}点
備考:$user[$i]->{memo}
とアクセスした方がよくね?
ま、人それぞれだが。
で、このデータの持ち方なら、sortでいける。
@new_user = sort { $a->{pts} <=> $b->{pts} } @user;
降順(点数の高い順)なら、
@new_user = sort { $b->{pts} <=> $a->{pts} } @user;
書き込む時は、
foreach $user ( @user ) {
print FILEHANDLE split /<>/, map { $user->{$_} } qw ( name pts memo );
print FILEHANDLE "\n";
}
現在のデータ形式にこだわりたいのならば、色々方法は思いつくけど、
面倒臭くてバグが入り込みやすいのでオススメできない。
482 :
479 :04/03/16 01:21 ID:???
>>481 丁寧にありがとうごじゃいます。
ご指導の通りその方法でやってみます!thx!
(´-`).。oO(コードの他のところに影響出るんだろうなぁ。。。
普通、デコード処理はforeachで行いますが、 $query =~ tr/&=/\0/; $query =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg; %in = split(/\0/,$query); じゃ駄目ですか?
>>483 あー。7行プログラミングスレで出てきたねー、それ。
その方法だと、
<input type="text" name="name">
<input type="text" name="name">
このように同じname属性を持つフォームが複数あった場合、
競合してどれか一つの値のみになってしまう。
それを覚悟の上ならば、別に問題はないと思う。
485 :
481 :04/03/16 01:39 ID:???
訂正。書き込む時。 foreach $user ( @user ) { print FILEHANDLE join(/<>/, map { $user->{$_} } qw ( name pts memo )); print FILEHANDLE "\n"; } # split と join じゃ正反対だっての……_| ̄|○
486 :
479 :04/03/16 02:01 ID:???
○ ゲンキダセヨ ノ|) _| ̄|○ <し
>>484 ありがとうございます。
軽さはどうなんでしょうかね。。
質問です。 ログからデータを読み出すときに、 open(DATA,"<$log"); @line=<DATA>; foreach$temp(@line){ ($hoge,$bar,$foo)=split(/\t/,$temp); print"$hoge,$bar,$foo"; 以下処理 } と書いているんですが、いちいちsplitの時に変数を決めずに foreach$temp(@line){ @data=split(/\t/,$temp); print"$data[0],$data[1],$data[2]"; 以下処理 } のように配列に突っ込んでその中身を見るほうが速かったりしますか?
すいません、ベンチって何ですか? Googleで Perl ベンチ とかで調べてみたのですけど、よくわかりません。
>>488 普通に考えて
わざわざ配列にsplitで切って突っ込んで
また配列から切り読みするよりかは
変数決めた方が早いっしょ?
しかし、100万ループくらいさせて
微妙にベンチに差が出る程度かと
>>492 回答有難う御座います。
そこまで厳密にこだわる必要と言うのはなさそうですね。
494 :
nobodyさん :04/03/16 11:55 ID:bxdLayrh
サブルーチンに文字列の変数を渡すときは、以下のように渡すとわかるのですが、 my @aParamlist = &get_aParamlist($hoge); sub get_aParamlist{ my $strhtmlbody = shift; (中略) return @aParamlist; } 配列の変数@hogeを渡すときはどのようにすればいいのでしょうか? my @aParamlist = &get_aParamlist(\@hoge); のように参照渡しというのをやることはわかったのですが、 my $strhtmlbody = shift; に該当する、変数@hogeを受け取る部分の書き方がわかりません。 どなたか教えていただければ幸いです。
495 :
494 :04/03/16 12:01 ID:bxdLayrh
すいません。 my @$aParamlist = shift; とやることはわかったのですが、 この配列の最後の要素はどうやって取得するのでしょうか? (普通なら$#ARRAYとやるところ)
496 :
458 :04/03/16 12:13 ID:???
>>495 > すいません。
> my @$aParamlist = shift;
>
> とやることはわかったのですが、
> この配列の最後の要素はどうやって取得するのでしょうか?
> (普通なら$#ARRAYとやるところ)
普通に考えてやってみれ
497 :
494 :04/03/16 12:19 ID:bxdLayrh
すいません、自己解決しました・・・おさわがせしました my $aParamlist = shift; print $#$aParamlist;
>497 単に最後の要素を取得したいだけだったら $$aParamlist[-1] でも良いような。
どっちが早いか、って聞いてくるやつに限って素人 もうそういう質問はスルーでいんじゃね?
素人が集まるスレだから当たり前なわけだが。
501 :
nobodyさん :04/03/16 13:57 ID:cS+tmipm
$Addr_spec_re = qr<$local_part\@$domain>; あるモジュールをインストールして上記の行でエラーが出ます。 perlのバージョンが古い為にqr<>記法に対応していない為と思われますが、 どんな書き方に改めれば大丈夫ですか? またそれに伴って$Addr_spec_reを使ってる正規表現の箇所にも変更必要なら 教えていただけませんか? いろいろ調べたのですがよくわかりませんでした。
502 :
501 :04/03/16 14:11 ID:???
>>501 普通に
$Addr_spec_re = qq<$local_part\@$domain>;
ってクオートしちゃいました。
コンパイル済みにならない、ってだけですよね。
503 :
nobodyさん :04/03/16 14:36 ID:DnhEtv1I
/ ̄ ̄ ̄ ̄\
( 人____)
|ミ/ ー◎-◎-)
(6 (_ _) )
_|/ ∴ ノ 3 ノ
(__/\_____ノ_←クソスレ立てた
>>1 / (__)) ))| |
[]__ | | 鋼錬命ヽ | |
|] | |______)_)
\_.(__)三三三[国])
/(_)\::::::::::::::::::::|
|Sofmap..|:::::::::/:::::/
|____|;;;;;;/;;;;;/.
(___|)__|)
504 :
nobodyさん :04/03/16 14:37 ID:DnhEtv1I
/::::::::::::::::::::::::::\〜プーン
/::::::::スーパーアニオタ\〜プーン
|::::::::::::::::::| 持た猿|〜プーン ←
>>1 |;;;;;;;;;;ノ∪ \,) ,,/ ヽ〜
|::( 6∪ ー─◎─◎ )〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|ノ (∵∴ ( o o)∴)〜 < PERLPERL!!
| ∪< ∵∵ 3 ∵> ムッキー! \___________
\ ⌒ ノ_____
\_____/ | | ̄ ̄\ \
___/ \ | | | ̄ ̄|
|:::::::/ \___ | \| | |__|
|:::::::| \____|つ⊂|__|__/ /
|:::::/ | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
カタカタカタカタ
505 :
nobodyさん :04/03/16 14:37 ID:DnhEtv1I
僕らはいつでも叫んでる〜♪ _,..--―‐--.、 / ,;ヘ ヽ i i ! i + i ヽ() ! i i _, 、<_ ` y、 + 〈.´=.! ` `=´ 6.) .! '''.|_,! ''' 〈 |'´! 救出成功 __,..-‐!(_,-―-、__,) ' ,! i. _,.r'´ ̄ ヽ、. !`ー'Tー' _,r'´ i、._ _,..r'´,,.... _ ヽ `ヽ、_,..-‐´ `ヽ、 ,'´ _,r'´ ⌒ヽ< /_∠、_ 〃′ __ `ヽ、 i ,r'´ ` `/ ⌒ ⌒ヽ' ̄ `ヽ `)、 !_ ⌒/ ,r'´ ̄ _ , ;;,,, ヽ. ,r' ,′ / ヽ、 i / ∧ ,′ ′ ! ,i ∧/ ゚w゚; Vヽ i ,,、,),、 ,、_ ,. ! !/ ト、_,.-‐´ `、 〃/ノ''ヘヾ Y'´ Y ,イ ⌒ヽ、 ,!、 ` ‐ 、. ゞ∽(|iソ;゚Д゚)リ `i _ノ、 Y、i、 _,..-―-.、_ ` ヽ 、_,.-l,i .l ! ./ .!、 `ト、_ \!' `ヽ、_ ,; イ il , i __、 ) 〈 ヽ `ヽ、_. `ヽ、 、 、_人 Y 〉 ' V `、 ヽ、 ヽ、>ー-- !^ ,l、|_, ! ! `;、 ` \__,..--..、 ヽ ',r'´ 〈. ! パンチ5分の2
506 :
nobodyさん :04/03/16 14:38 ID:DnhEtv1I
) ) /( / ( /i / ̄ ̄ ̄ ̄ ̄ ( ヽ、 { ∧__∧ ( ( < キック2分の1に勝てるとでも? )ヽ`ー、 \ ( ´_ゝ`) ノ ) \_____ ( \ ) ) / <__イ //⌒,フ /⌒`ヽ、`( ( ⌒ヽヘ、フへ' /~ ,、 i/⌒\ ヽ ヽ \ヘしヘ_ノ ノ/ ⌒`ー' ) ヽ `〜⌒> ゝ--イ⌒ /⌒`ー'~ 八 `フ⌒ヘ/ |へイ ( `ー'~ ,へ{ _ノ |ヘ、 ヽ _ノ ) `ー―'' ~ | / / ヽ_ノ | / / ( ) ) | | イ | |. | / |ヘ\ ∠/  ̄
507 :
nobodyさん :04/03/16 14:39 ID:DnhEtv1I
, --- 、_ /ミミミヾヾヽ、_ ∠ヾヾヾヾヾヾjj┴彡ニヽ / , -ー‐'"´´´ ヾ.三ヽ ,' / ヾ三ヽ j | スミス / }ミ i | | / /ミ ! } | r、 l ゙iミ __」 何か不愉快か?アソダーンソ君 |]ムヽ、_ __∠二、__,ィ|/ ィ } | ◎  ̄`ミl==r'´ ◎ / |lぅ lj 「!ヽ、_____j ヽ、_ -' レ'r'/ `! j ヽ j_ノ ', ヽU_ U┘ ,i ヽ ___'...__ i ハ__ ヽ ゙二二 ` ,' // 八 ヽ /'´ / ヽ |ヽ、__, '´ / / \
508 :
nobodyさん :04/03/16 14:40 ID:DnhEtv1I
∩ ( ⌒) ∩_ _ / \ /,. ノ i .,,E) / \ / @@@ / /" / \ / / _、_ @ / ノ' / \\ あんたら\ (. ノ` )/ /.|@@@ \\\ @@@ \.∧∧∧∧/ |#_、_ @ (⌒\@# _、_@ < 母 > | ノ` ) PERLばっか \ ヽヽ( ノ`) < 者 > |. ^ やってないで (mJ ^ ⌒\ < の > と ) ─────────< 予 >─────────── @@@ < 感 > @@@ OK。,;⌒⌒i. @#_、_ @ < !!! > @#_、_ @⌒ヽ( ;;;;;) ( ノ`) /∨∨∨∨\ ( ノ`) と) /|| ^ ||\. / @@@ \ /⌒ ^ | |.| |/ |;,ノ 〈|゚ ̄ ゚̄| トントン./ @ _、_ @. \ イ ( )| / .,i ヽii__リ / / ( ノ` ) 私の \ / V ̄V | | ,,i; ._ヽ||)とノ ̄/ / ^ \ 時代が \ \,,,丶, | |,,,; .ililili二l/ / / ̄ ̄ ̄ ̄/ .\ \ ,, __(__ニつ/ FMV /__ \/____/
509 :
nobodyさん :04/03/16 14:41 ID:DnhEtv1I
/__;;;;;;;;;;;;;;;;;;;;;` '''- 、
,,.=''";;;//ミ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ
/;;;;;;;/彡'⌒ヽ!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'、
,';;;;;;;//〃 l;;;;l'、;;;;;;;;;;;;;;;;;;;;;;;;;;;',
,';;;;;;;;|/〃 '、;! '、;;;ヾ;;;;;;;;;;;;;;;;;;;',
,';;;;;;;;;;l〃-=、,, ヾ、ヾ、ヾ;;;;;;;;;;;;;;;;;!
/;;;;;;;;;;;;;;ヽ斗≡ミト''゛ ゞ≦气ミ 〉;;;;;;;;;;;!
{;;;;;;;;;;;;;;;;;;;', ゞ;;;;'゙ ` |! ';;;;シ/;;;;;;;;;;;;;;} 俺が今日からお前達をコーチすることになった宗方仁だ!
ヾ;;;;;;;;;;;;;;;;;;', || !;;;;;;;;;;;;;;ノ
>>3 、立て!コートで休むな!
!;;;;;;;;;;;;;;;リ _!! !/;;;;;;;;;/
>>4 、膝のタメが甘ァいッ!
!;;;;;;;l;;;;;;/ /::i /;;;;;;;ノ
>>5 、腰が引けてる!
';;;;;;;|;;;;;/ ,. -ニ-、 f;;;;;;;/
>>6 、部外者は口を出すな!
>;;;l;;;;∧ `ー ‐‐' !;;;;;/
>>7-1000 、ダッシュ100回! 5セット!
,ノ:.:`ル' >--、  ̄ /;;;ノ
_____,,,. -‐''":.:.:.:.:.:.ヽ /r/7/ \ ,, イ/;/!
//:.:.:.:.>、ヽ ヽ:.:.:.:.::/_/77/ } /`´ /シ:.:.:.:.ヽ、
/l /:.:./:./:.ヽ:.ヽ >' _/777/ ./ /|´!:.:.:.:.:.:.:.ヽ、
/:.:.:l l/:./:.:.:.:.:.:.:';.:.:>' _/7777/ } / / ヽ|:.:.:.:.:./,.-`l
|:.:./l l/:.:.:.:ヽ、:.:.:./ _/7777/ ./ ,' !:.:.:.:/ /! ト、
!:/://:.:.:.:.:.:.:.:.:.:.>' _/777777/ } ∧ ! !l:.:./ /、| |:.::',
510 :
nobodyさん :04/03/16 14:42 ID:DnhEtv1I
___ / \ ________ / ∧ ∧ \ / | ・ ・ | < さぁてパソコンしか脳のないPERLでも作るか | )●( | \________ \ ー ノ \____/ / \ | \ ____ | \ \ // // | \ \ // // | \ \ // // | \ ○―――――) | | ̄ ̄ ̄ ̄匚 ̄ ̄ ̄ ̄ ̄|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄
511 :
nobodyさん :04/03/16 14:43 ID:DnhEtv1I
/ ヾ''" ~`ヽ / _,,,... ヽ;: /""ヽ ヽ / ;'" "\ l /;:;;:::-'''ヽ, i / /::::::::-'''''"~ ヽ, .| / /;:;;:::''' ヽ ヽ | | ヽ | / ;/ 、 ,/ ヽ i, / ;:;:ヽ \, / ヽ i, i / )( \, 、 ,/ , ヽ ヽ | | ⌒ ,,___\l,::,l/___| | | |. ー-ゞ'-'">><ー-ゞ'-'"'| | | ;:| '""^ 、 | | | ヽ. ゝ( ,-、 ,:‐、) | | | /ヾ.. / ヽ | | | | ./ゝ二ニニニニ二、 | | .. | `、ヽ へ"\┼┼┼ノ/ / | | ヽ\ `\ ̄ ̄ ̄ノ / | | l `ー-::、_ " ̄ ̄" ,,..'|ヽ./ ヽ. :人 /`ー――''''' / /;:;:;:;;:;:;: _/ わ し の パンチ5分の2をくらっておい で 何 さ ら し と ん じ ゃ キ サ マ ラ
うぉ、久々だな
小学生がこんなスレに来たんですか?
春厨の時期ですね〜
516 :
nobodyさん :04/03/16 16:45 ID:VuQW4BOK
ご意見、御指導お願いします。 HP宣伝掲示板を設置しているのですが、 何度もしつこく投稿してくるサイトのURLを 拒否設定にして、「そのURLは投稿できませんよ」 と、表示させているのですがしつこく登録を試みてきます。 で、拒否表示ではなく、ロケーションなどを使って 空白のページに飛ばすか、500エラーを返すか どっちが効果的か悩んでいるのですが、 皆さんはこういう場合、どうされますか?
517 :
487 :04/03/16 17:24 ID:???
for (0..500000){ $buf = "abc=def"; $buf =~ tr/&=/\0/; %in = split(/\0/,$buf); } for (0..500000){ $buf = "abc=def"; foreach (split(/&/,$buf)) { ($n,$v)=split(/=/); $in{$n} = $v; } } foreachの方が1.2倍以上早かった。 日本語だったりするともっと差が出そうだ。 データの取り方はこんな感じでいいですか。
>>516 こ こ は コ ー デ ィ ン グ の ス レ で す
>>517 それで本当に比較できてると思うか?
まあ、好きなように納得してもいいけど
521 :
517 :04/03/16 20:10 ID:???
・・・Benchmarkモジュールなるものがあるのか データはたくさん取りましたが。
>>521 間違ったデータを集めたって意味ないだろ。
たったあれだけの短い
>>517 のコードのどこが無意味かさえわからない?
DBMファイルを扱おうかと思うんですが、 SDBM, GDBM など色々あって正直何を使えばいいのかわかりません…。 それぞれのメリットデメリットは何があるのでしょうか? 試しに、SDBM, GDBM を使ってみたところ、 SDBM は pag と dir ファイルが生成されて、ファイルサイズは 1024 バイト。 GDBM は、ファイル名を指定できて、ファイルサイズは何もデータが入っていなくても 12288 バイトのものができました。 GDBM についてはデータを増やすと、それに比例してファイルサイズも増えていくみたいです。(12288バイト以下には絶対ならない) これって、ちょっとしたデータに使う場合は、GDBMだと毎回10Kくらいのファイルが作られちゃうってことなのでしょうか? また、SDBMは、1KB以上のデータは扱えないのでしょうか?扱うとどうなるのでしょうか? Perl のバージョンは5.6、OSはLinuxです。
525 :
523 :04/03/16 22:53 ID:GOniTDMI
>>524 レスありがとう。
DB_File がなんとなくよさそうな気がしてきました。
(比較表が抽象的でいまいちわかりませんでした…)
それと、DBMファイルは全部ロック機能はサポートしているのでしょうか?
GDBM は自動で flock がかかると聞いたことがありますが。。。
欲しい情報を見つけることが出来なかったので、
ご存じの方がいましたら教えていただきたいのですが。
perlスクリプト中のperl呼び出し時に起動オプション[-w]を付けて書いています。
そうしても処理結果自体は欲しい結果が得られるのですが、
警告文として、以下のものが出力されます。
警告文
Use of uninitialized value in string eq at test.cgi line 10.
Use of uninitialized value in string eq at test.cgi line 52.
該当スクリプト記述
10 : if ($ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($form{'key'} eq '')
http://www.att.or.jp/perl/man/perldiag.1.html ここの情報で未定義値を初期化しないで使用しているという
原因までは解ったのですが、if文のeqに対してどう初期化を
行えば良いのか、解決策を探すことができませんでした。
この問題の解決方法をどなかたご教授下さい。
>>526 if (defined $ENV{REQUEST_METHOD} && $ENV{REQUEST_METHOD} eq 'POST'){
ちょっと質問です。 perlのソートを使おうとしているんですが、微妙に意味が分からない事になりました。 sort {$a <=> $b} @aaa; 数字を並べる時、この書きかたが一般的だと思うのですが、 $aと$bってなんでしょう。 「イツのまに、なにが代入されたのでしょうか?」←これが質問1。 で、実際のソートは、返ってくる数字「-1」「0」「1」の三種類によってsortが返すリストの順番だと思ったのですが、 「それは正解ですか?」←質問2 もし、正解ならば「-1」「0」「1」の三種類が発生する形式ならば可能ですか? それとも、必ず「$a」「$b」を使うような形式にする必要がありますか?←質問3 詰まる所、$aと$bの中身がよく分からないので、sort自体がよく分からない物になってしまってます。 m(__)m
$aiueo = "1■2■■■3■4■5■■■"; @values = split(/■/, $aiueo); $i = 0; foreach $value (@values){ if($value eq ""){ @values[$i] = "NULL"; } print "$i : @values[$i]\n"; $i++; } これを実行すると、 0 : 1 1 : 2 2 : NULL 3 : NULL 4 : 3 5 : 4 こう表示されます。 しかし、最後の5以降はsplitでは無視されてしまうようです。 自分としては 0 : 1 1 : 2 2 : NULL 3 : NULL 4 : 3 5 : 4 6 : NULL 7 : NULL 8 : NULL としたいのですが可能でしょうか。
PerlのDBIを使って、MySQLを操作しようとしています。 書籍やインターネットでやり方を調べていく中で、次のような 注意事項が記載しているものを見つけました。 1:$dbh = DBI->connect(****); 2:$sth = $dbh->prepare(*****); 3:$sth->execute(); 4:$sth->finish(); 5:$sth = $dbh->prepare(*****); 6:$sth->execute(); 7:$sth->finish(); 8:$dbh->disconnect(); の様に一回のDBコネクション中で2回のコマンド発行を するときは、一回目(上記2〜4)と二回目(上記5〜7)で ハンドル変数名を変えなければならない(例えば5〜7は $sthではなく、$sth2にする)というものです。 自分の環境下の簡単なプログラム中では問題なく 動いているのですが、本当に注意すべき内容なのでしょうか?
>>528 こっちはあんたの質問がよく分からんよ…
物凄く簡単に言うと、リストから2つ取り出して$a、$bに代入されて { } 内を呼び出すというのを
何回も繰り返すのがsortの基本動作。
$a、$bってのはこの名前で決まってるから変更できない。
{ } 内では -1、0、1 のどれかを返しさえすればどんな式だっていい。
$a、$bを参照しなくてもかまわないけど、それじゃソートを使う意味がまったくない。
>>530 そんなの注意すべき点でもなんでもない。
その糞情報のソースを晒せ。
The Wars of Roses を設置してるんですが、キャラ作成後 エラー、ファイルが開けませんって出ます。 助けてください
すいません、リストの取り出しについてなんですが @list = (A,B,C,D,E,F); ってのがあって EとFだけ取り出して別の配列に入れたい 場合ってのはどうやってやればいいんでしょうか
%hash = ( element1 => [ 1, 2 ,3, 4, 5], element2 => [ 3, 4 ], element3 => [ 5, 6 ], ); print "Content-type: text/html\n\n"; for ($i=0; $i<= (@hash{"element1"} -1) ;$i++){ print $hash{"element1"}[$i] . "<br>"; } てっいうスクリプトがあるんですが、 $i<= (@hash{"element1"} -1) の部分、リファレンスに関する知識が乏しいために、 苦し紛れに書いていて、見苦しいです。 もっとスマートに($#などを使って?)書くには どうすればいいのでしょうか? というか、こういう場合、普通、 $i<= (@hash{"element1"} -1) の部分はどうやって書くもんなのでしょうか?
538 :
nobodyさん :04/03/17 11:35 ID:8yt30+/4
>>535 foreach(@data) {
if($_ eq ("E" || "F")) {
push(@tmp,$_); next;
}
push(@new,$_);
}
print @tmp;
print @new;
539 :
501 :04/03/17 11:39 ID:???
>>537 > てっいうスクリプトがあるんですが、
ホントか?あるのか?
@hash{"element1"}って何表わしてる?
ホント動いた?
> $i<= (@hash{"element1"} -1) の部分はどうやって書くもんなのでしょうか?
$i < @{$hash{"element1"}}
540 :
nobodyさん :04/03/17 11:39 ID:8yt30+/4
訂正 foreach(@list) { if(($_ eq "E") || ($_ eq "F")) { push(@tmp,$_); next; } push(@new,$_); }
541 :
nobodyさん :04/03/17 11:41 ID:8yt30+/4
ちょっと気になったんだけど $_の値がEもしくはFだったら というifの書き方だけど if(($_ eq "E") || ($_ eq "F")) 以外にいい方法ない?
>>422 >>424 続き〜
一時ファイルが他のCGIスクリプトが読むことが出来ないことを保証するには、
スクリプトを実行するためにsuEXEC または CGI ラッパを使ってください。
一時ファイルはモード 0600(ワールドもグループも読むことが出来ない)で
作成されます。
一時ディレクトリは以下のアルゴリズムを使って選択されます:
1. 現在のユーザ(例えば"nobody")がホーム・ディレクトリに"tmp"と
いうディレクトリを持っていれば、それを使います(Unixシステムのみ)
2. 環境変数TMPDIRがあれば、示された場所を使います
3. そうでなければ、以下の場所を当たります /usr/tmp, /var/tmp, C:\temp,
/tmp, /temp, ::Temporary Items, and \WWW_ROOT.
それぞれの場所はそれがディレクトリであるか、書きこみ可能かをチェックされます。そうでなければアルゴリズムは次の選択を挑戦します。
>>541 > if(($_ eq "E") || ($_ eq "F"))
foreach $list(@list) {
if(grep{$list eq $_ }qw(E F)) {
push(@tmp,); next;
}
push(@new,$list);
}
比較対照を動的にできる
545 :
544 :04/03/17 11:47 ID:???
>>544 push(@tmp,$list); next;
ね
なるほど。THX。
>>529 ($values[0], $values[1], ・・・・ $values[8]) = split(/■/, $aiueo);
「他のサーバーのCGIの出力結果を自分のサーバーのCGIで受け取る方法」 についてお聞きしていいでしょうか。 一方は自分の所有するレンタルサーバーで、すでにCGIを幾つか設置してあるのです。 もし、フリーのHP(ここではisweb)のCGIから自分のサーバーのCGIを呼び出す、 いわばスクリプトの流用ができれば作業も楽だし iswebのサーバーにも余計な負担がかからなくて良いかなと思って試しています。 レンタル鯖のCGIは今は単にテキストデータを処理してprintで画面に出力するだけです。 具体的にはshowdat.cgiでlog.datの内容を整形して1行ずつ書き出しています。 この、動的に出力された整形済みのデータを他のHPから呼び出し、CGIで利用したいのです。 レンタル鯖のほうで整形済データをfixedlog.dat等に書き込んでからそれを外部から読むのではなく、 @iswebのreaddat.cgiにアクセス Aiswebのreaddat.cgiの内部で、レンタル鯖のshowdat.cgiにアクセス Bレンタル鯖のshowdat.cgiが動作し、レンタル鯖のlog.datの内容を整形して返り値とする C返り値をiswebのreaddat.cgiが受け取り、表示する という流れなのですが・・・・・・
549 :
548 :04/03/17 12:05 ID:???
(↓続き)
上のAの所が方法がわからず、
readdat.cgi内で
open(LDAT, "<
http://rentalhost/showlog.cgi ") || die "file open error!";
while(my $line = <LDAT>) {
print $line;
}
close(LDAT);
としてみたのですがうまくいきませんでした。外部のサーバーのものに限らず、
「CGI内でCGIにアクセス」というのはどう実現するものなのでしょうか?
質問が長くなって申し訳ないのですが、ヒントだけでもよいのでどなたかお願いします。
今一度確認するが、ネタだろ?
>>549 @iswebのreaddat.cgiにアクセス
Aiswebのreaddat.cgiがshowdat.cgiを叩く
Bレンタル鯖のshowdat.cgiがlog.datの内容を整形してそいつをGET/POSTでreaddat.cgiを叩く
Cパラメータ受け取ってiswebのreaddat.cgiが表示する
だろな
今一度確認するが、それもネタだろ?
553 :
548 :04/03/17 12:39 ID:???
すごいのが沸いてきたな。
LWP
CGIで他の鯖と読み書きの質問ってちょくちょく出るな。 実際に動かせる鯖はかなり限られると言うのに。
>>553 @iswebのreaddat.cgiにアクセス
Aiswebのreaddat.cgiが空フレームを作りそこにshowdat.cgiを表示
どだ?
あ、という事はreaddat.htmlでいいじゃん
559 :
548 :04/03/17 13:41 ID:???
iswebはソケット禁止(使えない)
561 :
t :04/03/17 14:09 ID:???
d
これって意味あるでしょうか? open に失敗したら、自作のルーチンに引数でエラー文字列を渡したいんですが、 もしかすると、open に失敗した時点で die してしまうので print_error にすらいかないのでしょうか? myopen( FH, 'test.txt' ) or print_error( $! ); sub myopen( $$ ) { open( $_[0], $_[1] ) or return; close( $_[0] ); } sub print_error( $ ) { print $_[0]; exit; }
if (open FH, 'text') { close FH; } else { print_error($!); } #perlって括弧なしで書けたっけ?
>562 そう書くならmyopenでtrueなりfalseなりを返さないといかんのでは?
565 :
nobodyさん :04/03/17 16:50 ID:llxz20WZ
失礼します。
質問の内容がこちらで適切かどうか判断しかねるのですが…
トップページでクッキー及びセッションIDを設定、
クッキー及びIPで、トップで一括して荒らしのアクセス拒否をして、
セッションで中に直接飛べないようにしようとしています。
クッキーの設定の部分について質問なのですが、
---------------------------------------------------
print "Content-type: text/html\n";
if (length($str_cookie) == 0) {
$str_cookie = (gethostbyaddr(pack("C4", split(/\./, $ENV{'REMOTE_ADDR'})), 2) . time);
print "Set-Cookie: クッキー名=クッキーデータ; expires=Thu, 1-Jan-2030 00:00:00 GMT; path=/cgi-bin;\n";
}
print "Set-Cookie: セッション名=セッションデータ; path=/cgi-bin;\n";
---------------------------------------------------
以上のようにすると、
http://www.どこか.com/cgi-bin/index.cgi という形でアクセスしたときにはうまく動作するのですが、
http://www.どこか.com/cgi-bin/ でアクセスするとクッキー及びセッションが発行されません。
これは、パスの設定の仕方が悪いのでしょうか?
567 :
965 :04/03/17 18:35 ID:???
>>566 うう・・すみません
混乱から醒めて、冷静に見たら関係ないですね。。
よく見たら初心者質問スレってのがあったので、移動します。
失礼しました。
なんか、やたらと質問的な書き込みが増えたな……。
>>534 放置されてるのはわかってるんだが、一言だけ。
「二度と来るな」
まあ、それだけじゃアレなんで。
「作った奴に聞け」
>>529 @values = grep{ $_ ne '■' } split(/(■)/, $aiueo);
>>541 (・ε・)キニシナイ!!
>>541 いいかどうか分からないけど
if(/^(E|F)$/)
>>568 ・・
Perl コーディング初心者質問コーナー Part33
573 :
568 :04/03/18 01:12 ID:???
>>571 いやま、そのとおりなんだが。
すまん、活発になったのが気になったようだ。
574 :
nobodyさん :04/03/18 10:13 ID:imQmJK7b
質問いいでしょうか。 number<TAB>name<TAB>mail<TAB>text というタブ区切りのデータがあります。 これらのnumberの部分だけを取り込みたいのですが、 open(DATA, "<$log"); @data=<DATA>; foreach $temp (@data){ ($number,$name,$mail,$text)=split(/\t/,$temp); } このように書くと、$numberしか使わないのですが、他の変数も生成してしまい、 perl -cwでチェックすると怒られます。 こういう場合はどのように記述したらいいのでしょうか?
($number) = split(/\t/,$temp); でよろし
>>576 ちなみに、
$mail = (split(/\t/,$temp))[2];
とすれば任意のパーツ取り出し可能。
578 :
nobodyさん :04/03/18 11:46 ID:DQQyLTpV
ちんなみに ($num, undef, undef, undef) = split... でもok
わ、こんなにもレスが。
>>574 ,576です。
ご親切に有難うございます。
$mail = (split(/\t/,$temp))[2];
($num, undef, undef, undef) = split...
どちらも便利そうな使い方なので、よく覚えておきます。
580 :
571 :04/03/18 13:35 ID:???
>>573 ごめんなさい、こっちも冗談なんで気にしないで下さい。
春だなあ・・
↑その発言が一番春っぽいがな
こ こ ま で 春 --------------------------
585 :
nobodyさん :04/03/18 16:36 ID:imQmJK7b
586 :
nobodyさん :04/03/18 19:10 ID:LItTEfZF
587 :
nobodyさん :04/03/18 20:03 ID:msXg0fxA
>>584 プゲラゲラッチョ( ´,_ゝ`)
いやぁ〜春ですね(w
>574-579 splitの第3引数をきちんと設定すると余計な処理が減るからサーバーに優しい。 数が明確なら第3引数をしっかり渡す事を勧める。
>>589 >余計な処理が減るから
すまん、解説キボンヌ。
$mail = (split(/\t/,$temp))[2];
(undef, undef, $mail, undef) = split(/\t/,$temp);
これでも下のコードのほうがいいってこと?
>590 なんのこっちゃ。 $mail = (split(/\t/, $temp, 4))[2]; の様にすれば良いってだけかと。 第三引数に最大分割数を指定できるって話ね。
592 :
577 :04/03/18 21:26 ID:???
>>590 > これでも下のコードのほうがいいってこと?
splitの第三引数、って言ってるじゃん
$mail = (split(/\t/,$temp,4))[2];
(undef, undef, $mail, undef) = split(/\t/,$temp,4);
だよ
分けるのは四つだ、と明示できるなら明示せよ、ということ
数は数えられるよな? 第「3」引数。 $mail = (split(/\t/,$temp,4))[2]; こうすると、splitは4分割で処理を終了する。 全ての場合で早くなるとは限らないが、ほぼ全ての状況で早くなる。 まぁ>574みたいに確実に行の戦闘にあるなら、substringとindex使った方が速いんだろうが。
ケコーン(AA略
use Benchmark; my $str = "number\tname\tmail\ttext"; timethese(1000000,{'TEST1'=>'&test1($str);','TEST2'=>'&test2($str);','TEST3'=>'&test3($str);','TEST4'=>'&test4($str);','TEST5'=>'&test5($str);','TEST6'=>'&test6($str);', }); sub test1{ my $str = shift; my ($number,$name,$mail,$text) = split(/\t/,$str); } sub test2{ my $str = shift; my ($number,undef) = split(/\t/,$str,2); } sub test3{ my $str = shift; my $number = (split(/\t/,$temp,2))[0]; } sub test4{ my $str = shift; my $number = substr($str,0,index($str,"\t")); } sub test5{ my $str = shift; $str =~ /^([^\t]+)/; my $number = $str; } sub test6{ my $str = shift; $str =~ /^(.*?)\t/; my $number = $str; }
Benchmark: timing 1000000 iterations of TEST1, TEST2, TEST3, TEST4, TEST5, TEST6... TEST1: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 332889.48/s (n=1000000) TEST2: 4 wallclock secs ( 2.46 usr + 0.00 sys = 2.46 CPU) @ 406008.93/s (n=1000000) TEST3: 3 wallclock secs ( 2.54 usr + 0.00 sys = 2.54 CPU) @ 393236.34/s (n=1000000) TEST4: 2 wallclock secs ( 2.30 usr + 0.00 sys = 2.30 CPU) @ 434216.24/s (n=1000000) TEST5: 1 wallclock secs ( 2.01 usr + 0.00 sys = 2.01 CPU) @ 496770.99/s (n=1000000) TEST6: 1 wallclock secs ( 1.93 usr + 0.00 sys = 1.93 CPU) @ 517063.08/s (n=1000000) 正規表現も使い方次第で速くなるのな。
>>574 です。色々なお話を有難うございます。
今自分がやっているのはログをsplitで分割するだけなので、
「この行を全部タブがある部分で区切れ」よりも、
一行に存在するタブで区切られたデータの個数はわかっているので、
「この行にはタブで区切られたデータが4つあるから4つに区切れ」というように、
指定可能ならばsplitの第三引数を渡した方がいいということですね。
> 正規表現も使い方次第で速くなるのな。 貴殿には「詳説 正規表現 (オライリー)」を薦める
>>595 splitは/\s/で切ると、速度が出るよ。
フォームから入力した文字列をjcode.plで変換して、 そのままhoge.txtにprintするのって危ないですか? ファイル名は time() の値にする予定です。
言葉足らずですみません。 フォームから入力した文字列をjcode.plでsjisに変換したものを $text として、 $file = time().'.txt'; open(FILE, ">$file") || error('open error'); print FILE $text; close(FILE); とする予定です。 ファイル名を決める部分を'.html'にするとブラクラやウイルスなどの危険性があるので '.txt'としたのですが、'.txt'にしてもやはりウイルスなどの危険性があるのでしょうか。
603 :
nobodyさん :04/03/18 23:40 ID:v217X1kZ
( ゚д゚)ポカーン
ありません!大丈夫です!
結局何を聞きたいのかがわからない。 サニタイズの話なのか、ファイル名の話なのか。 HTMLを解釈するブラウザでそのまま開くつもりなら、 <と>を実体参照に置き換えるのが手軽。 コーディング方法としては単純で、単純にs///で置き換えれば良い。 ファイル名なんてのはそんなの好きにすれば良いと思うってかここで聞く事じゃない。 拡張子なんてどうでも良い。ファイルの中身が問題だろう。 #質問内容とは違うけどtime()だと同時投稿されるとファイル名が被るという問題が 公開しない、自分が読むためだけのコメント投稿フォームでも作ってるのか?
IEで閲覧すると、中身で判断して表示するから、 HTMLタグが含まれるだけで、HTMLとして表示してくれるよ。
>>605 テキスト投稿CGIを作ろうとしています。
投稿者がテキストを投稿したら、time().txtで保存、
同時にindex.htmlにテキストへのリンクを付け足す、という流れです。
普通の掲示板の場合<と>の置換をしていたのですが、
txtの場合実体参照などがそのまま>などと表示されるので、
置換作業は一切行わないことにしました。
ですが、やはりtxtを表示するのもブラウザである以上、
悪意を持った何者かが何か細工すればブラクラ程度に機能してしまうのでは、
と不安になり質問しました。
>>607 ということはブラクラなどを仕込もうと思えば幾らでも仕込めちゃうってことですね……。
なんとかhtmlで保存してみます。
#なかなか書き込めない…´Д`ナジェディス
610 :
nobodyさん :04/03/19 01:04 ID:koDF+TRW
CGIのための実践入門Perlって本よんでるんですけど、 郵便番号の - を除くプログラムが出てきますた $_ = "123-1234"; s/(\d\d\d)-?(\d\d\d\d)/$1$2/; ?の意味って何ですか? ?がなくとも同じ結果が得られると思うのですが。
613 :
nobodyさん :04/03/19 03:57 ID:KxdLBMtC
すぐ♪そこ♪
615 :
nobodyさん :04/03/19 13:29 ID:3UeG122v
DBに保存する掲示板の、書き込みを検索する機能を作っています。 検索結果を表示するときに、Googleみたく検索キーワードを強調表示し、 さらにその前後の文字列を含めて切り抜いているのを実装したいのですが、 どのようにすればよいでしょうか。 たとえば、 「私はりんごが好きで、あなたはみかんが好きで、二人はバナナが好きです」 を「りんご バナナ」で検索した際、検索結果には 「私は<em>りんご</em>が好きで、あ...で、二人は<em>バナナ</em>が好きです」 という感じにしたいです。前後五文字を切り抜いています。 これだけならなんとかなりそうですが、「あなた みかん」で検索したときに 「...が好きで、<em>あなた</em>は<em>みかん</em>が好きで、二...」というように 切り抜き範囲に別なキーワードがさらに見つかった場合などを考えるといい方法が浮かびません。
616 :
615 :04/03/19 13:36 ID:???
すみません大事なことを書き忘れました。 検索して見つかった文章は$textに入っていて、検索キーワードは@keywordsに配列で入っています。 foreach $keyword(@keywords){ $text =~ s/(.*)($keyword)(.*)/substr($1,-10)<em>$2<\/em>substr($1,10)/eg; } こんな感じのを考えていましたが、いろんな場合を考えるとイマイチなのは先ほど書いたとおりです。
>>615-616 ここはコーディングスレ。
>「...が好きで、<em>あなた</em>は<em>みかん</em>が好きで、二...」
これの何がイヤなのか知らんが、どうしたいか仕様ぐらい考えてから来い。
618 :
615 :04/03/19 15:37 ID:???
>>617 すいません、イヤなんじゃなく、むしろそうしたいんです・・・。
基本的には、前5文字. <em>キーワード</em>. 後5文字 で切り抜く。
ひとつの文章内で複数ヒットしたら、切り抜きを「...」で結ぶ。
複数ヒットしたキーワードが切り抜き幅以内の近距離にあった場合は
まとめて前後5文字で切り抜く
さらに、文頭や文末だったら「...」はつけないとかいう気配りも欲しいです。
自分で作ったのは
$preview = $text;
foreach $keyword(@keywords){
$preview =~ s/($keyword)/<em>$1<\/em>/g;
}
$preview =~ s/([^>]*)(<em>.*?<\/em>)([^<]*)/"...". substr($1, -30). $2. substr($3, 0, 30). "..."/eg;
それっぽいだけで、これではあちこち不備があるようです。
文章内で複数ヒットしたときにキーワードより前が切り抜かれなかったりしてます。
直感だが、正規表現置換には向かんのではないかなあ。 「アルゴリズム+データ構造=プログラミング」という古い格言に従って、 コードを書く前にまずどういうアルゴリズムで実現するか考えてみるべきだろう。 一例だが、以下のようなアルゴリズムが考えられる。 1. ヒットした文字列の部分にマークをつける 2. その前後5文字にもマークをつける 3. 非マーク部分を削除しつつ、マーク/非マークの境界に "..." を挿入 これをコードに落とすときはどうするかと言うと、 配列をマーク用に用意し、文字と配列要素を1対1に対応させて、 キーワードの出現位置を index で検出し、その前後の配列要素を1にして、 全部検出終わったら、次は配列を前から舐めてって1のところと0のところを… みたいな感じ。
620 :
615 :04/03/19 17:14 ID:???
>>619 ありがとです。なんとかコード起こしてみました。
行数制限に引っかかるので省略記法で書いてます。
あとは半角文字が含まれた場合の対応と、この強引なコーディングをもう少しスマートにしたいです。
ポイントをご教授いただければ幸いです。
$preview = ''; $pos = 0; $flg = 0; # 変数初期化
$mark[$_] = 0 for(0..length($text)); # マーク初期化
# マーク付け
foreach $keyword(@keywords){
while(1){
$markPos = index($text, $keyword, $pos); # キーワード出現位置取得
if(0 <= $markPos){
$mark[$_] = 1 for(($markPos - 10)..($markPos + length($keyword) - 1 + 10));
$pos = $markPos + 1;
}else{
last;
}
}
}
# マーク判別して $preview 生成
for(0..length($text)){
if(($flg == 0) && ($mark[$_] == 1)){ $flg = 1; }
if(($flg == 1) && ($mark[$_] == 0)){ $flg = 2; }
if(($flg == 2) && ($mark[$_] == 1)){ $flg = 0; $preview .= "...";}
$preview .= substr($text, $_, 1) if($mark[$_]);
}
# キーワードの強調
foreach $keyword(@keywords){
$preview =~ s/($keyword)/<em>$1<\/em>/g;
}
今は試せないので正規表現は省略するが、 キーワードに<em></em>を付けた後、 </em>(もしくは文頭)〜<em>(もしくは文末)の〜が11文字以上あった場合間を...に置換、 ではどうだろうか?
622 :
615 :04/03/19 17:40 ID:???
>>621 書いてみたら意外に難しかったです。
しかも正しく動いてないっぽい・・・。
</em>(5文字) .* (5文字)<em> のところがうまくいったりいかなかったり
( ... にならずそのまま出る)です。
$preview = $text;
# キーワードの強調
foreach $keyword(@keywords){
$preview =~ s/($keyword)/<em>$1<\/em>/g;
}
if($preview =~ /^(.+?)<em>/){
if(10 < length($1)){
$preview =~ s/^.+?(.{10})(<em>)(.*)$/\.\.\.$1$2$3/;
}
}
if($preview =~ /<\/em>(.+?)$/){
if(10 < length($1)){
$preview =~ s/^(.*)(<\/em>)(.{10}).+$/$1$2$3\.\.\./;
}
}
if($preview =~ /<\/em>(.+?)<em>/){
if(20 < length($1)){
$preview =~ s/(<\/em>.{10}).*?(.{10}<em>)/$1\.\.\.$2/;
}
}
$writer = "n"; $diary{"order"} = "nm"; $diary{"order"} =~ s/$writer//e; この様なスクリプトを書きました。 ローカルで実行すると $diary{"order"} = "m"; と意図した動作をしたのですが,サーバにアップするとこのような動作をしません。 これは何でなのでしょうか
624 :
623 :04/03/19 19:37 ID:???
ちなみにサーバでは $diary{"order"} = "mmn"; となります
626 :
621 :04/03/19 22:20 ID:???
>615 $previewに特定の文字(以下では\0)が含まれていない事が条件だが、 こんな感じでどうだろう? foreach $keyword(@keywords){ $preview =~ s/($keyword)/<\0>$1<\/\0>/g; } $preview =~ s/(<\/\0>[^\0]{10}|^)[^\0]+?([^\0]{10}<\0>|$)/$1\.\.\.$2/g; $preview =~ s/\0/em/g;
627 :
623 :04/03/19 23:28 ID:???
あっ! 多分これが原因ですね… ありがとうございました
628 :
nobodyさん :04/03/20 10:10 ID:pZHNeEFd
BBSのPerlの投稿表示の部分を修正していて、 メールアドレスがある場合はNAMEにリンクさせて、ない場合はリンクが発生しないということをしたいのですが… if (($MAIL ne "") && ($NAME ne "")) { print "<b>:<a href=mailto:$MAIL>$NAME</a>:</b>\n"; }elsif (($MAIL ne "") && ($NAME eq "")) { print "<b>:<a href=mailto:$MAIL>nobodyさん</a>:</b>\n"; }elsif (($MAIL eq "") && ($NAME ne "")) { print "<b>:$NAME:</b>\n"; }elsif (($MAIL eq "") && ($NAME eq "")) { print "<b>:nobodyさん:</b>\n"; } ↑では上手くいきません。 MAILを入力しようとしまいとmailto:でリンクされます。 NAMEはしっかり分岐して動いてます。 どのように修正したらいいんでしょうか?
>628 $MAILの中身が本当に空っぽかどうかをしっかり確認するべき。 あと、こうした方が見やすいぞ。 if($NAME eq ""){$NAME = "nobodyさん";} if ($MAIL ne "" ) { print "<b>:<a href=mailto:$MAIL>$NAME</a>:</b>\n"; } else { print "<b>:$NAME:</b>\n"; }
>>628 if ($MAIL eq "") { ... を if ($MAIL) { ... にしても一緒かなぁ。
>>630 それだとメル欄に1とか0とかで入れられるとマズいのでは、
632 :
nobodyさん :04/03/20 13:19 ID:Y1bzghLT
ほんとうに初歩的な質問で申し訳ないのですが 配列と配列をつなぎ合わせるにはどうしたらよいでしょうか? @array1 = (1,2,3); @array2 = (4,5,6); 例えばこの配列の操作に関してなのですが @array1 = (1,2,3,4,5,6); と言う様にしたいのです。pushを使えば@array1 = (1,2,3,[4,5,6]); となってしまいますし、foreach (@array2) { push (@array1,$_)}のように すればいいと思うのですが、同様に操作したい配列が後に@array3 @array4... と続いているのでもう少しスマートな方法でしたいと思っております。 joinか何かでできたような気がするのですが方法を見つけることができませんでした。 よろしければアドバイス頂けないでしょうか?
>>628 print "Content-type: text/html\n\n";print <<"EOF";
<HTML><HEAD><TITLE></TITLE></HEAD><BODY>
EOF
# データ入れて試して。
$MAIL = "";$NAME = "";
if ($MAIL ne "") {
if ($NAME ne "") {
print "<b>:<a href=mailto:$MAIL>$NAME</a>:</b>\n";
} else {
print "<b>:<a href=mailto:$MAIL>nobodyさん</a>:</b>\n";
}
} else {
if ($NAME ne "") {
print "<b>:$NAME:</b>\n";
} else {
print "<b>:nobodyさん:</b>\n";
}
}
print <<"EOF";
</BODY></HTML>
EOF
これなら動いたが。全部をelsifにするのはイクナイ。MAILが空の場合と値がある場合でifはわかりやすく2つ置こう。
>MAILが空の場合と値がある場合でifはわかりやすく2つ置こう。 これ消し忘れ。スマソ。
>>632 @array1 = (@array1, @array2);
これじゃマズいの?
>>635 ・・・だぁぁぁ 俺寝不足なのかな。
ありがとうございました。頭のトロイ子丸出しで申し訳ないです。
>>632 >pushを使えば@array1 = (1,2,3,[4,5,6]);
……そんなんなるかなあ。
リファレンス見たら、第二引数は配列でいいことになってるぞ。
push @array1, @array2;
他にもあるんなら、
push @array1, ( @array2, @array3, @array4 ... );
でいいんじゃねえか。
push @array1, [@array2];
とか、
push @array1, \@array2;
とか変なことやってんじゃねえのか?
もしくは、@array2自体におかしな代入しているとか。
638 :
nobodyさん :04/03/20 20:29 ID:bXEf4bM+
strict な perl で、ハッシュのキーから変数を生成したいんですが、 以下のようなスクリプトだと、何も print してくれません。 -------------------------------- use strict; my %hash = ( name1 => 'hoge', name2 => 'fuga' ); for my $key ( keys %hash ) { $main::{$key} = $hash{$key}; } print $main::name1; exit; -------------------------------- 更にできれば $main::name1 ではなく $name1 で取得したいんですが、 perl 5.6 以下なんで our も使えません。(perl 5 です) どうすればいいのでしょうか???
意味が分からん。 >$main::{$key} = $hash{$key}; >print $main::name1; なにをやってるのかよく考えて見れ。 >更にできれば $main::name1 ではなく $name1 で取得したいんですが、 これもめっちゃイミフ。
640 :
639 :04/03/20 21:07 ID:???
ところで、 >何も print してくれません。 俺のperlではちゃんとエラーメッセージをprintしてくれたけど。 Name "main::name1" used only once: possible typo at - line 9. Use of uninitialized value in print at - line 9.
641 :
638 :04/03/20 21:11 ID:bXEf4bM+
>>639 すんません。。。
分かりにくかったですね。 m(_ _)m
------------------
my %hash = (
name1 => 'hoge',
name2 => 'fuga'
);
------------------
というハッシュから、
------------------
my $name1 = 'hoge';
my $name2 = 'fuga';
------------------
という変数定義をしたいって意味です。
use strict なしでは、
------------------
for my $key ( keys %hash ) {
${$key} = $hash{$key};
}
print $name1;
------------------
とやると、ちゃんと 'hoge' が print されてたんですが、
use strict した場合に同じことをする方法が思い当たらなかったので。。。
>>638 シンボリックリファレンス。
strictな記述ではスカラー変数の自動生成出来ない。
あと、ourがサポートされてるperlでもシンボリックに対してourは認識されない(と思った記憶)
ハッシュのキーと同一な名前をもつ変数をpackage mainのネームスペースにインポートしたいという事だろうが、 そんな設計が駄目設計だという事に気付け。
644 :
639 :04/03/20 21:18 ID:???
>use strict した場合に同じことをする方法が思い当たらなかったので。。。 strictした時はおそらく自動生成出来ないと思われ。 no strictすれば? あと、俺もあまりそれ良い設計とは思えない。
645 :
638 :04/03/20 21:21 ID:???
>>642 変数の自動生成が出来ないとは知りませんでした。。
ご指摘有難うございます。
>>643 ダメ設計かどうかもわからなかったです。。(初心者丸出しだ…
もっと勉強します。
変数の動的生成は個人的に結構使いそうだと思っていたんですが、
普通にperl自体では避けた方がいいのでしょうか???
647 :
638 :04/03/20 21:25 ID:???
>>644 CGIで、フォームからのクエリを %form に入れて、
%form のキーから変数を自動生成しようと思ってました。
素直に
my $name1 = $form{name1};
とするしかないですよね。。(汗
>変数の動的生成は個人的に結構使いそうだと思っていたんですが、 >普通にperl自体では避けた方がいいのでしょうか??? 普通は同じ事が出来て、見やすくて、記述が綺麗になって、速度も速い方法が他に用意されてるから。 それと、ハッシュのまま使うのが一番柔軟で使いやすくもある。スカラーにしたい理由が見つからない。
649 :
638 :04/03/20 21:31 ID:???
>>648 スカラーにしたかった理由は、
>>647 です。
同じことが出来て、速い方法…
すいません。教えていただけますでしょうか…
>>649 647のどこにスカラーにしたい理由が書いてありますか?
651 :
648 :04/03/20 21:36 ID:???
>>649 長い変数名書きたくないって理由だったらお断りだよ。
ただ、キミがちゃんとことごとく局所化する記述書けてるなら、
sub age{
my $age = $form{'age'}; #この関数ではこの値を使う。
#処理
}
みたいな記述はお勧めできる
>>650 フォームからのクエリを %form に取得した後に、
スカラー変数を自動生成して、
スクリプトの記述量($form{})を減らしたかったのが主な理由です。
653 :
638 :04/03/20 21:43 ID:???
>>651 (゚Д゚)…まさにその理由でした。。。
あんま楽すんなってことですね…
みなさん失礼しました。
654 :
648 :04/03/20 21:44 ID:???
>スクリプトの記述量($form{})を減らしたかったのが主な理由です。
減らさんくて良し。
スカラーにしたら汚くなる&処理の柔軟さを捨てるだけだから。
どーしても自動生成したいなら、
>>646 のヤツ使うよろし。
誉められた記述じゃないけど、自動生成の中ではそれが一番マシ。
655 :
638 :04/03/20 21:46 ID:???
>>651 今までは
my $name1 = $form{name1};
my $name2 = $form{name2};
…
と記述していたところを、
もっと簡単に定義できないかというのが今回の発端でした。
651さん、、親切に有難うございました。。。
んじゃ変数名を$fとか$nみたいに短くすれば? 後で見たとき間違いなく意味不明になるが。
>>656 それはそれで混乱しますね…
地道に書くのが一番ですか。。。がんばりますw
れすくーとかの影響なのだろうか・・・(哀)
>>658 おまい以外誰も影響受けてないから安心汁
$type eq 'A' or $type eq 'B' or $type eq 'C' or $type eq 'D'; 上記の記述なんですが、もうちょい短くならないでしょうか? $typeと4回書かれているのはなんか俺の感性に反するんですが…。 それだけの理由です。
>俺の感性に反するんですが…。 感性よりも知識を付けろハゲ
662 :
660 :04/03/21 02:52 ID:???
すんません、やりかた思いつきました。 scalar grep {$type eq $_} (A, B, C, D); コスト高いけどこれで(・∀・)
$type =~ /^[A-D]$/
664 :
660 :04/03/21 02:58 ID:???
グハッ! 正規表現の存在忘れてた。。。 ありがd。
665 :
628 :04/03/21 11:31 ID:???
>633 動きますた(=゚ω゚)ノ 他の方々も貴重な情報さんくすこでした(*´Д`)ハァハァ
>>660 何度もチェックする、チェック対象が複雑、などの場合はハッシュを使ってチェックするのが最速。
my %valid_types = map{ $_ => 1 } qw(A B C D foo bar baz);
if($valid_types{ $type }){
# ...
}
perlって読みにくいね。 C#の方がいいじゃん。
>>667 どこを指して読みにくいのかと。
Perlは読みにくいといいたいだけちゃうんかと。
670 :
nobodyさん :04/03/21 19:39 ID:Bb+Pz/Rr
PerlのCGIでファイルの文字コードをUTF-8にして保存、サーバ上で実行するとエラー500になります。 簡単なCGI(例えばHello World等)でテストを行いましたが、エラーの解決法がよくわかりません。 UTF-8(Unicode)以外の文字コードにするとプログラムは正常に動きます。 PerlではUTF-8は一応サポートされていて実際使っている方もいるようですが、 何かうまくいくコツなどありましたらどうかご指南ください。
>>670 エラーログ等でPerlのエラーを確認すること。
あれだろ。 「ぱーる」って読むのか「ぴーる」って読むのかわかりにくいってんだろ。 「しーしゃーぷ」は見たまんまだもんな。
673 :
T.K :04/03/21 20:55 ID:???
>>655 $key に name1 が、 $valに中身があるとして
クエリを分解して読み込むときに
${$key} = $val;
ってやってforeachでループさせれば君のやりたいことはできるよ。
実は俺も長くなるからそうやってたんだけど
やっぱあとあと大変だということがわかった。
PHPに乗り換えようとしたときも変数の取り扱いがちょっと違うだけで
違和感感じてなじめなかった。
おとなしく$form{}でやってたほうがよいよ。
そうか? しーどんぶり、じゃねえの?
perl は ぱるる、 url は うるる、 ってのは、もはや常識ですね
676 :
T.K :04/03/21 22:36 ID:???
ぺーる
677 :
T.K :04/03/21 22:38 ID:???
>>675 じゃあNullPointerExceptionは?
なるぽ
679 :
T.K :04/03/21 22:57 ID:???
_∧_∧ / ̄ ( ・∀・)⌒\ 待ちくたびれたぞ __ / _| | | ヽヽ / / \ | | ,,,,,,,iiiiillllll!!!!!!!lllllliiiii,,,,,,, \\| |____| .| | .,llll゙゙゙゙゙ ゙゙゙゙゙lllll, \/ \ | | .|!!!!,,,,,,,, ,,,,,,,,,!!!!| | ヽ_「\ | |、 | ゙゙゙゙!!!!llllliiiiiiiiiilllll!!!!゙゙゙゙ .| | \ \――、. | | ヽ .| .゙゙゙゙゙゙゙゙゙゙ | | / \ "-、, `| | ヽ | | _/ / "-, "' (_ ヽ ヽ .| | / __ノ "'m__`\ヽ_,,,, ヽ | | `ー― ̄ ヽ、__`/ー_,,,, ゙゙゙゙!!!!!!!lllllllliii| | \゙゙゙゙゙゙゙!!!!!lllllllliiiii| | \ ヽ | | ヽ \ | | | \.| | `ヽ、,,_ノ| | ゙゙!!!,,,,,,,, ,,,,,,,,,!!!゙゙ ゙゙゙゙!!!!llllliiiiiiiiiilllll!!!!゙゙゙゙ /.// ・l|∵ ヽ\
数字が22531などの切りのイイ数字でない場合、端数を切って22000と言うような ことをしたいので無い知恵絞って以下のような事を考えてみたのですが これだと予想していないような桁には対応できませんしやり方が不細工かなと思いまして。 いつもは動けばいいが信条なのですがもう少しスマートに書けないか悩んでいます。 数字桁数を操作する関数などがあればいいのですが。お知恵を拝借できないでしょうか? if ($price <= 999){ $tempPrice = (int($price / 10)) * 10; }elsif($price > 999 && $price <= 9999){ $tempPrice = (int($price / 100)) * 100; }
有効数字2桁ってことか?
682 :
680 :04/03/22 02:42 ID:???
>>681 はい。
1桁2桁など可変できれば更にうれしいですが今は先頭2桁固定にできれば幸せになれます。
@n = qw/1 11 111 1111 11111 111111/; $d = 2; foreach (@n) { s/(?<=.{$d}).+/'0' x length $&/eg; print "$_\n"; }
m/^([0-9]{2})([0-9])*/; $1 . ('0' x length $2); 今すごく適当に思いついて作っただけ。
my $position = 2; my $mask = 10**(length($price)-$position); $price = int($price/$mask)*$mask if ($mask > 0);
substr($num, 0, 2, '0' x length($num)-2);
my @num = qw/1 11 111 1111 11111 111111/;
my $digit = 2;
foreach my $price (@num) {
my $len = length $price;
$price -= $price % (10 ** ($len - $digit)) if $digit < $len;
print "$price\n";
}
>>685 if に頼らずコンピュータの演算誤差なんかで丸めることって出来ませんかね?
689 :
nobodyさん :04/03/22 09:48 ID:UDEoFMoy
#! /usr/bin/perl use Jcode; $a="abc"; Jcode::tr(\$a, '0-9A-Za-z', '0-9A-Za-z'); print "Content-Type: text/html\n\n"; print $a; 上記CGIスクリプトが、 E200042 "Not an ARRAY reference at C:/Perl/site/lib/Jcode.pm line 439." というエラーになってしまいます。なにがいけないのでしょうか。 perl 5.6、Jcode.pmは0.82 です。 このスクリプトは、半角文字を全角にするためのテストで書いたもので、 実際には$a内の全ての半角を全角にしたいです(記号・カタカナ等も)。 そういった処理を一発でできる関数ってのは無いですよね?
690 :
685 :04/03/22 10:41 ID:???
>>688 $maskは0にならないから、if文要りませんでした。
(%演算子では0で剰余を取ろうとして、上手くいきませんね。
if文を消すなら、三項演算子でごまかすという手もありますが、小手先技ですね…)
my $position = 2;
my $mask = 10**(length($price)-$position);
$price = int($price/$mask)*$mask;
>>689 # スクリプトがEUC-JPで書かれているとして
$a = Jcode->new('abc')->tr('0-9A-Za-z', $replacement);
>>690 > $a = Jcode->new('abc')->tr('0-9A-Za-z', $replacement);
$a = Jcode->new('abc')->tr('0-9A-Za-z', '0-9A-Za-z');
でした。
692 :
689 :04/03/22 11:36 ID:???
sub getWide{
# 半角を全角に(英字はさらに大文字に)変換
$jcode = Jcode->new(\$_[0]);
$jcode->tr('0-9A-Za-z', '0-9A-Za-z');
$jcode->tr('a-z', 'A-Z');
$jcode->tr(' !#$%&()=^~\|@`[{;+:*]},<.>/?_-', ' !#$%&()=^ ̄¥|@‘[{;+:*]},<.>/?_−');
$jcode->h2z->euc;
}
>>690 を参考にして、関数にしてみました。
オブジェクト指向な書き方をしないとだめなんですね。
これですべて全角になるでしょうか?記号を変換しているところは思いつく記号('と"以外)を
やみくもに列挙しただけで、足りないものがあるかも知れず不安です。
ハイフンは最後にかかなきゃいけないのに気づくのに苦労しました(今後のためのメモ)
また、最後の一行で半角カナを全角にしてるんですが、
「ダ」は「タ゛」になっちゃいますか?と思って実験したら、
ちゃんと「ダ」になりました(今後のためのメモ)。
693 :
680 :04/03/22 12:24 ID:fR/XRXq7
>>688 >>685 なるほど!こういうやり方もあるんですね。悩んでいただけに目からウロコと言うか。
ありがとうございました。スマートだなぁ。
win環境しかなく、鯖を使ってテストは迷惑だろうと思い質問させていただきます。 open (OUT,">$num.dat"); print OUT $buffer; close (OUT); として新規ファイル名$num.datに$bufferの内容を書き込むとき、 パーミッションはいくつになってるのでしょうか? また、こういう風なことをするとき、みなさんex1のようにchmodで変更してると思うのですが、 ex2のようにopenした直後にchmodで変更ってことは出来ないのでしょうか? (ex1のようにしたくない理由がちょっとありまして・・・。) #------------------------------ex1 open (OUT,">$num.dat"); print OUT $buffer; close (OUT); chmod 0606,"$num.dat"; #------------------------------ #------------------------------ex2 open (OUT,">$num.dat"); chmod 0606,OUT; # これは無理なら chmod 0606,"$num.dat"; print OUT $buffer; close (OUT); #------------------------------ ディレクトリなら確か作るときに第二引数でmodeを渡せたと思うのですが、 ファイルは出来ないようでちょっと困ってます。
>>696 前に調べてたときにsysopen知ったんですが
使わないほうがいいみたいなこと書かれてましたけど大丈夫なんでしょうか?
>>965 FileHandleモジュールか、IO::Fileモジュールでパーミッションの指定ができます。
>>697 バッファリングするヤツと一緒に使ってはいけない。
umaskとかはどうですか?
>>694 そう思ったら貴様が作れよ。。なんちて
my @num = qw/1 -1 11 -11 111 1111 11111 111111 -111111/;
my $digit = 2;
foreach my $price (@num) {
my $len = length(my $p_price = abs $price);
$p_price -= $p_price % 10 ** ($len - $digit) if $digit < $len;
$price = $p_price * ($price <=> 0);
print "$price\n";
}
04とか03とか2桁に整形された形の数字から 0をとり省くのはどのような方法があるでしょうか?
702 :
nobodyさん :04/03/23 14:54 ID:awaWqGNM
use strict; sub hogehoge{ my @myarray; (中略) $myarray[5][0] = 'foo'; $myarray[5][1] = 'bar'; $myarray[5][2] = 'hoge' ・ ・ ・ } と同じようなことをpushを使ってやりたいのですが、 どうすればいいのでしょう? 試しに push ($myarray[5] , 'foo'); のようにやると、 「Type of arg 1 to push must be array (not array element) at」 と怒られてしまいます。
>>701 my $num = '03';
$num = sprintf( "%d", $num );
>>703 さん
なるほど。有難うございます。
>>702 push (@{$myarray[5]} , 'foo');
>>702 push @{$myarray[5]}, qw(foo bar hoge);
リファレンスわかってて、なんでデリファレンスわからんかなあ
>>702 よく意味がわからんけど、
pushの二つ目の引数は配列じゃなきゃだめ
707 :
706 :04/03/23 15:03 ID:???
誤爆。 一つ目の引数
HTML::Templateモジュールでは、 最後に print $template->output;で ブラウザに表示するのが普通ですが、 これを、HTML全体を変数に格納する方法はないでしょうか?
710 :
709 :04/03/23 16:39 ID:???
自己レス my $foo = $template->output; でOKですた。。。
695です。ちょっと用事でしたスイマセン。 皆さんレス有難うございます。 それで、モジュールは少し理由があって出来れば使いたくないです。 umaskググったんですが説明が、「umask:umaskを設定します」と書いてあり、 だからそのumaskって?感じでした。 で、695で書いたのを、まぁ暴走はしないだろうと思ってレン鯖で実行してみたら、 chmod 0606,OUT;はまぁ無理ですが、 open (OUT,">$num.dat"); chmod 0606,"$num.dat"; print OUT $buffer; close (OUT); できちんとパーミッションが606に成ってくれていました。 #因みにchmodをしなければ644でした。 ということなんですが、このままいって大丈夫でしょうか? いろんなソース見てきましたが、openしてるファイルをchmodしてるのは見たことが無いんですが。
>>705 たぶんリファレンスわかってないんじゃないかな・・・
>>713 わざわざ有難うございます理解できました。これ使って出来ますね。
ところで711は問題ないか解るかたいませんでしょうか。
さっきから検索してるんですが、711のようなのが、いいのかだめなのか解らないです。
とりあえず無理なら教えていただいたumaskを使おうと思っているのですが。
かなりしつこくて申し訳ないです。うざかったら放置してください。
>>714 なぜcloseした後にchmodせずにopen中にやりたいわけ?
寝てしまってましたすいません。。おはようございます。 んっとややこしいと思ったんで書かなかったんですが、 解りにくいかもですが簡単に書くと、条件分岐してaかbのファイルを開かせ、 別々の処理した後、共通の処理、でクローズといった形で aの場合だけモードを変えたい。ということです。 つまり、、下のようなソースにaの場合のみchmodを加えたいです。 if ($hoge eq 'a') { open FH,">a.log"; [aの処理] } else { open FH,">b.log"; [bの処理] } [共通の処理] print FH $foo; close (FH); もちろんcloseの後にもう一度条件分岐で大丈夫ですが、 不可能で無い限りopen中に入れたいなと思いました。
>>716 open が実行されたら0バイトのファイルが作成されるから
その後にchmodしても一応問題はないけど。
質問です。
1. ハッシュの要素を全て削除したい。
2.
http://www.rfs.co.jp/sitebuilder/perl/02/05.html によれば、%hash = (); でできるようなのですが、Win32 + ActivePerl 5.8.0 で
できませんでした。以下、実験したスクリプトです。
$hash['a'] = "ABC";
%hash = {};
%hash = ();
$hash = ();
$hash = {};
print $hash['a'];
3. エラーは出ませんが、"ABC" と表示されてしまいます。
719 :
718 :04/03/24 16:19 ID:???
ぼけてました。 $hash{'a'} = "ABC"; で解決しました。
>>719 何が解決したのかよくわからないけど、
俺はundef使ってる
ハッシュは[]じゃなく{}だった、ということだろ
>>718 %hash = ();
undef %hash;
どちらでもお好きな方で。
おすすめのDBI関連解説の書籍/サイトを教えてください。
724 :
718 :04/03/24 19:59 ID:???
725 :
nobodyさん :04/03/24 20:39 ID:6j96YsNk
すいません、質問です。 Perlで日記を作ってる最中です。 一番下に、1 2 3 ・・・・ 11 12 と月別のリンクを作って、 番号クリックしたらその月の日記を見れる、、、って感じで。 クリックしたらその番号を変数に入れて、日記のログ出力のルーチンに飛ばすみたいな事できますか? できるならどういうテクを使うんでしょうか?
>>717 ごめんなさい遅くなりました。
了解です。皆さんどうもありがとうございました。
729 :
725 :04/03/24 21:48 ID:6j96YsNk
いや、見るのも書くのもCGIでしたいんですけど・・・。 ログファイルから、クリックした数字の月だけのログを出力したいんです。
>725 そこらへんに転がってる日記スクリプトとか、 なんならいわゆる「ページ移動」が可能な掲示板スクリプトでも調べれば ヒントを得られると思う。
!@array と @array == 0 は同義なのでしょうか? !$scr と $scr eq 0 が違うのは文字と数字の判断の違いでnull値が入るのは わかったのですがよくこういった比較演算子?で混乱してしまいます。 よろしければ教えて頂けないでしょうか?
>$scr eq 0 正確に書きたいなら $scr == 0 もしくは $scr eq "0" な。
便乗質問です。 その日記スクリプトにハイパーリンクで月選択ができる場合 href="./diary.cgi?month=1"といったように、GETのみとなるのでしょうか?
逆に聞くが、選択した月の値をわざわざPOSTすることに意味はあるのか? リロードとかするたびにダイアログでてウザいだけかと。
735 :
nobodyさん :04/03/25 00:04 ID:O9PiycAh
HTML⇒CGI へのデータの受け渡しについて質問があるのですが、 インラインフレーム内にCGIを表示させて、そのCGIのどこかの変数に、値を代入したいんです。 具体的に言うと、 <IFRAME SRC="data.cgi?value"> として、valueをどこかの変数に入れることはできますか? いろいろなサイトを見て、 read(STDIN, $val, $ENV{'CONTENT_LENGTH'}); こうすれば、$valにvalueが代入されるという話を聞いたんですができませんでした。 (何も代入されていませんでした。) 誰かわかる人がいたら教えてください。 よろしくお願いします。
>read(STDIN, $val, $ENV{'CONTENT_LENGTH'}); そりゃPOSTの場合だ。 GETとPOSTの違いを勉強汁。
俺なんかめんどいからpl頼りだぜ。 cgi-lib.pl使ってるよ。 エロイ人たちは容量を最低限に抑えるために中に書き込んでるの?
ホントはライブラリやモジュール使ったほうがいいと思うよ でも俺はフォームからの受け取りくらいは そう面倒でもないし簡単だから大概自前。
for (0 .. 5) { print;}は当然出来ますが逆に for (5 .. 0) { print;}とするとダメですよね で reverseをつかって for (reverse 5 .. 0) { print;} なら出来ると思うんですが、この方法は妥当でしょうか
間違いました。 for (reverse 5 .. 0) { print;} ↓ for (reverse 0 .. 5) { print;}
>>739-740 for ($start < $end ? $start .. $end : $end .. $start) { ... }
>>737 フォームのデータ取ってデコードって言っても4、5行っしょ?自分で書こうよ。
>>741 それだったら全部012345みたいな順になると思うんですが・・・。
ループの中で 5-$_ みたいにして生成すれば? ていうか何故そんな値で回したいのかよく分からんのだが。
( ゚д゚)ポカーン もういいです。
746 :
nobodyさん :04/03/25 11:06 ID:sU+YK1M2
sub hoge{ (中略) return (%hPGTname2PTCid, %hPGTname2PTTid); } my (%hPGTname2PTCid, %hPGTname2PTTid) = &hoge; として2つのハッシュ配列を取得したいのですが、 前者のハッシュ配列しか取得できていない模様です。 どうすれば2つのハッシュ配列を取得できるのでしょうか?
747 :
nobodyさん :04/03/25 11:09 ID:w7s8ctdp
基本的なことで申し訳ないんですが、例えば「CGIのテスト」と表示させて3秒後に「3秒後」と表示させたい場合、 #!/usr/local/bin/perl print "Content-type:text/plain\n\n"; print "CGIのテスト\n\n"; sleep(3); print "3秒後"; exit; と、書くと「CGIのテスト」と「3秒後」が実行後3秒してから同時に表示されてしまいます。 色々見てみましたがよく理解できません。 命令はプログラムの上から順に実行されると思い込んでいたんですがそうではないんですかね。 こうゆう基本的なことを自分で解決するのに良いウェブサイトや本はありますか? よろしくお願いします。
for (reverse 5 .. 0) { print;} でいいだろ。 for (my $i = 5; $i >= 0; $i--) {print;} とか。
>>747 クライアントサイドでどーぞ。javascriptとか。
>>746 return ([\%hPGTname2PTCid, \%hPGTname2PTTid]);
my ($hPGTname2PTCid, $hPGTname2PTTid) = @{&hoge};
「$hPGTname2PTCid->{キー}」の形式で参照する。
適当に書いたんでなんか変かもしれないが。
あ、これでいいのか…余計なことしてた。スマソ my ($hPGTname2PTCid, $hPGTname2PTTid) = &hoge; return (\%hPGTname2PTCid, \%hPGTname2PTTid);
>>752 なんでわざわざ無名配列に入れる?
return (\%hPGTname2PTCid, \%hPGTname2PTTid);
my( $...., $..... ) = hoge();
でいいじゃん。
っと、書いてる間に訂正された・・・。
756 :
752 :04/03/25 11:32 ID:???
757 :
746 :04/03/25 11:39 ID:???
758 :
746 :04/03/25 11:50 ID:???
>>751 さんもありがとうございます。勉強します。
759 :
747 :04/03/25 12:13 ID:w7s8ctdp
>>750 さん
>>751 さんありがとう。
How can I read in a file by paragraphs? あたりを読めということですかね。さぱりわかんないんですけど頑張ってみます。
760 :
749 :04/03/25 12:19 ID:???
俺は・・・・・。
CGI.pmを使用して下記のスクリプトを実行すると <input type="hidden" name=".cgifields" value="ItemNum"> というタグが自動的に追加されます。 -nostickyを使用すると出ないのは分かってるのですが、 どのような原理で、scrolling_listのname属性が、hiddenのvalue値に設定されるのでしょうか? print start_form(), hidden('ItemId',"id"), scrolling_list('ItemNum',['1','2','3','4','5'],['1'],1),"個", submit('','購入'), end_form;
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
ハンガリアン記法に基づくと、 ハッシュってどういう風に変数名をつければいいのでしょうか?
花子とか愛とか、かわいらしい名をつけてあげてください。
>>761 > どのような原理で
CGI.pm をテキストエディタで開いてソースコードを追ってくれ。
766 :nobodyさん :04/03/25 16:07 ID:???
>>765 やってみます、分からないと思うけど・・・・
767 :761 :04/03/25 16:34 ID:???
register_parameter が関係ありますか・・?
768 :nobodyさん :04/03/25 17:28 ID:xE36oyJb
今日からperlをやろうと思ったのですが、いきなりエラーが出ました。
でもどこを修正すればいいのか分かりません。
どうかご教授してください。
【OS】Win98SE
【perl】perl, v5.6.1 built for MSWin32-x86-multi-thread
【コード】
print <<EOL;
<html>
<body>
<p>Hello perl world</p>
</body>
</html>
EOL
【エラー】
Can't find string terminator "EOL" anywhere before EOF
at test.cgi line 1.
769 :nobodyさん :04/03/25 17:30 ID:???
test.cgi 1行でストリング・ターミネーター「EOL」をEOFの前にいかなる場所にも見つけることができません。
770 :nobodyさん :04/03/25 17:37 ID:???
use strict;
eval{
my $htmlPTC = &get_htmlPTC('hoge');
};
のあとに、
$htmlPTCの値を取り出したいのですが、
どうすればいいのでしょうか?
use vars qw($htmlPTC);
とやってもとりだせませんでした。
771 :nobodyさん :04/03/25 17:46 ID:???
>>768 Content-type: text/html;
772 :nobodyさん :04/03/25 17:50 ID:???
>>771 あーあ
773 :768 :04/03/25 17:56 ID:xE36oyJb
>>771 レス、ありがとうございます。
でも、同じエラーが出てしまいました。(´・ω・`)ショボーン
【コード】
print "Content-type: text/html; charset=Shift_JIS\n\n";
print <<EOL;
<html>
<body>
<p>Hello perl world</p>
</body>
</html>
EOL
【エラー】
Can't find string terminator "EOL" anywhere before EOF
at test.cgi line 3.
774 :nobodyさん :04/03/25 18:00 ID:???
>>767 Yes.
>>770 my $htmlPTC = eval { get_htmlPTC('hoge') };
$@ and error();
>>773 EOL の後ろに空白が付いているか改行していないに 300 ペリカ。
775 :768 :04/03/25 18:00 ID:???
以下のようにするときちんと表示されました。
何故だろう??
【コード】
print "Content-type: text/html; charset=Shift_JIS\n\n";
print "<html>";
print "<body>";
print "<p>Hello perl world</p>";
print "<html>";
print "<body>";
776 :nobodyさん :04/03/25 18:01 ID:???
>>773 最後のEOLの後ろにちゃんと改行入れてる?
777 :768 :04/03/25 18:02 ID:???
>>774 空白がついてました。ヽ(´ー`)ノ
ありがとうございます。
778 :768 :04/03/25 18:04 ID:???
>>776 空白でした。
すみません。m(_ _)m
779 :nobodyさん :04/03/25 18:27 ID:???
現在open()しているファイルのパスを調べるにはどうすれば良いのでしょうか。
指定したファイルを開かずに他のファイルを開いているというとんでもない事が起こっていて、
しかもその開いているファイルが見付からないのです。
#絶対パス、相対パス共に調べた
なので現在のファイルハンドルがどのファイルに関連付けられているかを
知ることが出来たら良いのですが。
780 :nobodyさん :04/03/25 18:30 ID:7rJYuY6t
配布CGIを設置する際の質問はここでよろしいのでしょうか?
KENTのyybbsをiswebに設置したいのですが404が出てしまいます。
その前に1998特報倶楽部の画像掲示板を/cgi-binの中に設置しました。
その画像掲示板は無事動くのですがyybbsが動きません。
http://www.kent-web.com/bbs/yybbs.html FTPで上にあるようにまず一番上(index.htmlやcgi-binがある場所)にyybbsフォルダを作りました。
そしてパーミッションとかを設定したあと
http://アドレス/yybbs/yybbs.cgiと入れたのですが404でした 。
yybbs.cgiはまだいじってません(パスはそのままで大丈夫です)ので壊れたって事は無いと思います。
もしかしたらcgi-binの中にyybbsディレクトリを作らなくてはならないのですか?
781 :nobodyさん :04/03/25 18:36 ID:???
>>780 >配布CGIを設置する際の質問はここでよろしいのでしょうか?
よろしくない。
そして誰もよろしいなんていってないのに質問するな。それなら1行目に何の意味が?
787 :746 :04/03/25 23:36 ID:???
>>749 =
>>760 ご、ごめんなさい、_| ̄|○
ありがとうございました。
788 :763 :04/03/25 23:37 ID:???
>>764 まじれすキボンヌ。(まじれすだった?)
789 :nobodyさん :04/03/25 23:40 ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
790 :nobodyさん :04/03/25 23:43 ID:???
>>788 あ男の子でしたか
じゃあ最近は翔とかそういう所謂男らしい名がいいかと思います。
元気に育つといいですね。
791 :763 :04/03/25 23:55 ID:???
みんなはハンガリアン記法の場合、ハッシュはどう書いてるんだろか
792 :nobodyさん :04/03/26 00:14 ID:???
perlとどう関係があるのかと…
793 :nobodyさん :04/03/26 00:18 ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
794 :nobodyさん :04/03/26 02:51 ID:???
>>791 マジレスすると、変数に付いている%や$や@は何のためにあるのかと。
795 :nobodyさん :04/03/26 09:34 ID:???
>>773 print <<"EOL";
にしたらどうよ。
796 :nobodyさん :04/03/26 09:48 ID:???
( ゚д゚)ポカーン
797 :nobodyさん :04/03/26 10:00 ID:???
遅レス(・∀・)カコイイ!!
798 :nobodyさん :04/03/26 10:27 ID:tN6LIksl ある会員リストを登録更新表示するCGIなのですが、 更新作業で、 1)更新を受け付ける 2)データベースを更新 3)一つ目の関連するファイルの更新 4)二つ目の関連するファイルの更新 5)最新リストを表示 としているのですが、3,4の作業の負荷が高く5の最新リスト表示まで 時間がかかります。 実際5の最新リスト表示には2のデータベース更新が終わっていれば 問題ないので例えば 1)更新を受け付ける 2)データベースを更新 5)最新リストを表示 として 3)一つ目の関連するファイルの更新 4)二つ目の関連するファイルの更新 は別プロセスとかでバックグラウンドでやらせたいのですが 方法がわかりません。 基本的にどんな風にすればいいですか?
799 :nobodyさん :04/03/26 10:36 ID:7ogawnvX 友人と二人でjoyful2chという画像掲示板を使っているのですが 連続投稿の時間規制と同じ文字数のレスを直後に書けない規制が やっかいなのでなくしたいのですが、設定でオンオフできないので その部分に関するスクリプトを削ってしまえば、 機能は停止するのでしょうか? その部分に関するスクリプトは以下のようなところだとあたりを付けました。 # 連続投稿チェック if ($addr eq $ip && $wait > $times - $time2) { &error("連続投稿はもうしばらく時間をおいて下さい"); } # 重複チェック $flag=0; foreach (@lines) { ($no2,$reno2,$date2,$name2,$mail2,$sub2,$com2) = split(/<>/); if ($in{'name'} eq $name2 && $in{'comment'} eq $com2) { $flag=1; last; } } if ($flag) { &error("重複投稿のため処理を中断しました"); }
800 :nobodyさん :04/03/26 10:46 ID:???
>>798 ロジックを語るならスレ違い。スレタイ嫁。
801 :nobodyさん :04/03/26 10:47 ID:???
>>799 試してから質問したんだよな?
試した結果はどうだったよ?
まさか試さずにどうなるかの結果だけを教えてくれなんて都合のいいことは言わないよな?
802 :nobodyさん :04/03/26 10:51 ID:tN6LIksl
>>800 どこいけばいいですか?
803 :nobodyさん :04/03/26 10:52 ID:???
春休みUZEEEEEEEEEEEE
804 :nobodyさん :04/03/26 10:56 ID:???
>>800 WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。
>>798 「別プロセスを作りたいのでコーディング方法教えて」という話なら
fork 関数の説明嫁、で終わりだが、率直な疑問として、
「別プロセス作らなくても1->2->5->3->4の順番で処理すりゃいいぢゃん?」
という気がするのだが、
まあここはコーディングスレなので、ロジックについては語らないことにしよう。
805 :nobodyさん :04/03/26 11:16 ID:???
>>804 >
>>800 > WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
> ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
> という気が前々からしている。
スレ違い。スレタイ嫁。ニッキはニッキスレ
806 :798 :04/03/26 11:21 ID:???
>>804 「別プロセス作らなくても1->2->5->3->4の順番で処理すりゃいいぢゃん?」
という気がするのだが、
そうですよね、処理順変えればいいだけですよね。
なんか勘違いしてました。
どうもありがとうございました。
807 :nobodyさん :04/03/26 11:48 ID:???
生まれてきたのも勘違いであって欲しい
808 :nobodyさん :04/03/26 13:39 ID:???
>804
ロジック自体の意味が検索で見付からなかった
(ロジックボードとかばかり出てくる)のですが、
ロジック = 手順、アルゴリズム = 方法とかいう認識で良いのですか。
809 :nobodyさん :04/03/26 14:01 ID:???
my $flag = 1;
if ( $flag ) {
use constant HOGE => 1;
} else {
use constant HOGE => 2;
}
これで、HOGE が 1 になるかと思いきや、
なぜか 2 になる。
最後に指定したやつがセットされるのはなぜ?
810 :nobodyさん :04/03/26 14:24 ID:???
>>809 use は実行時でなくコンパイル時に処理されます
811 :nobodyさん :04/03/26 14:36 ID:???
>>808 ロジックやアルゴリズムの話はスレ違い。
812 :809 :04/03/26 15:18 ID:???
>>810 なるほど。
ありがd
813 :nobodyさん :04/03/26 16:03 ID:???
>>812 BEGIN
{
require constant;
if(...){
import constant FOO => 1;
}else{
import constant FOO => 2;
}
}
# or
my $flag;
BEGIN{ $flag = 1 } # $flagはコンパイル時に決定している必要がある
use constant FOO => $flag ? 1 : 2;
# or いっそconstantを使わない
BEGIN{
if(...){
*FOO = sub(){ 1 };
}else{
*FOO = sub(){ 2 };
}
}
814 :nobodyさん :04/03/26 16:11 ID:???
>>791 正直読み難い上に意味も無いのでお勧めできないが、下記のような感じかな。
DBD::Excelの作者である川合氏はこの命名法を使っているね。
しかしPerlでハンガリアンしてどういうつもりなのかマジで謎。特に@aXxxと%hXxx。「馬から落馬しました」みたいな。
そりゃまぁ、リファレンスだけなら俺も$sref_xxx,$aref_xxx,$href_xxxとかする事もあるがね。
$sString
$iInteger
$nNumeric
$oObject
$hHandle
$rsRefToScalar
$raRefToArray
$rhRefToHash
%hHash
@aArray
781 :
nobodyさん :04/03/29 09:10 ID:WLF8C9h8
ログコピペ乙age
ファイルロックについて質問です。 $retry = 5; while (!mkdir ($lockdir, 0755)) { if (--$retry <= 0) { &error("BUSY"); } sleep(1); } #一連の処理 rmdir($lockdir); このようなファイルロックをよくみかけるのですが、 何故ディレクトリを作る事によって、ログなどの対象ファイルがロックされるのですか?
784 名前: nobodyさん :sage 投稿日: 04/03/25 (木) 21:23 ID:???
>>739 > for (reverse 0 .. 5) {
リストが作られるから、
0..10000なんてやると、かなりメモリ食うと思う。
悪い、レス番号にだまされて連続で張るつもりだった。 既に張っている人、乙!
2chの板にマッチさせるには
http:\/\/\w+ (\.2ch\.net\|\.bbspink\.com)\/\w+\/
であってますか?
質問です。 localとmyの使い分けについてなのですが、 どちらを使っても厳密な違いはないのでしょうか? localはPerl4、myはPerl5以降という話を見たことがあるのですが、 環境を選ばずに正確に動作させるのならば、 myではなくlocalで統一したほうがいいのでしょうか。
>>788 これを検索汁
レキシカルスコープ変数
ダイナミックスコープ変数
改行で区切った単語リストを読みこみ、それぞれについてgooの辞書に照合し、 意味を結果ファイルに書き出していくスクリプトを作ったのですが、うまくいきません。 動作自体には問題はないのですが、結果ファイルに照合した単語を書きこむと、 一部の文字が化けてしまいます。 例えば阿諛追従という文字列をgooの辞書で検索し、結果を書き出すと、 ?∽∫ヌ従 となってしまいます。検索結果は問題なく書き込まれています。 単純に阿諛追従とテキストに書き出すスクリプトで試してみましたが、文字化けは 起こりませんでした。ちなみにスクリプトはShiftjisで書かれています。 実行環境はWindowsMe+ActivePerl最新版です。 いくら考えてもどこがおかしいのか分からないので、申し訳ないのですが、 短いコードですので全部載せさせて下さい。 --------------------------------------- #!/etc/env perl use strict; use LWP::Simple; use Win32::FileOp; my $file="a.html"; my $meanfile = "mean.txt";#結果ファイル my $str; my $wordfile = "word.txt";#単語リスト my $mflag = 0; open IN, "$wordfile" or die "$!"; my @wordlist = <IN>; close IN; open OUT, ">>$meanfile" or die "#!";
foreach (@wordlist) {
my $word = $_;
&url_encode($word);
my $url="
http://dictionary.goo.ne.jp/search.php?MT= " . "$str" . "&kind=jn";
print $url;
if (is_success(getstore($url,$file)))
{
open IN, "$file" or die "$!";
print "$word\n";
while (my $data = <IN>) {
if ($data =~ m/<!--meaning_body-->/) {
$mflag = 1;
chomp($word);
print OUT "<title>$word</title>\n";
next;}
if ($data =~ m/<!--\/meaning_body-->/) {
$mflag = 0;}
if ($mflag == 1) {
$data =~ s/<br>/\n/g;
$data =~ s/<small>|<\/small>|<b>|<\/b>//g;
if ( ! ($data eq "\n") ) {
print OUT "<contents>$data</contents>\n";}}}
close IN;}}}
close OUT;
ShellExecute 'open' => $meanfile;
sub url_encode{
$str = shift;
$str =~ s/(\W)/'%'.unpack("H2", $1)/eg;
$str =~ tr/ /+/;
}
よろしくお願いします。
795 :
792 :04/03/29 23:06 ID:???
>>794 さん、ありがとうございます。
見てみました。gooはEUC-JPでした。
で、ますます混乱してしまいました。
単語リストはSJIS、照合結果のhtmlファイルはEUCJP,
単語リストから抜き出した単語と照合結果のhtmlファイルから
抜き出した意味のデータを組み合わせて結果ファイルに書き
込むと結果ファイルはEUCJP・・・・・
EUCJPと認識されているテキストにSJISのコードを書きこむと
化けるのは分かります。でもそれならSJISで書きこんだコード
全てが化けるのではないのですか?
阿諛追従は文字化けしましたがその他の大半の単語はそうは
なりませんでした。どうしてこのようなことになるのでしょうか?
それと、Windowsの基本文字コードはSJISですよね?なのに
どうして<title>SJISの文字列</title><contents>EUCJPの文字列</contents>
とprintで書きこんだテキストファイルがEUCJPとして認識され
てしまうのでしょうか?Windowsがテキストファイルの文字コード
をどのように判別しているか定かではないのですが、もし先頭の
何文字かをもとに判定しているとしたら、
Windowsにおいてperlから特に処理を
施さずに生成した文字列はSJISのはずでそれがファイルの先頭に
書きこまれているにもかかわらずなぜテキストファイルがEUCJP
として認識されてしまうのでしょうか?
文字コードに関する認識不足が多分にあると思われますが、
なにとぞご容赦下さい。
>>788 検索キーワードは
>>789 参照だが、少し補足
ぶっちゃけ、myとlocalは全く用途が違う。
myはlocalの代わりには出来ないし、localをmyの代わりに使うことはない。
変数の宣言にはmyを使う。。
localは既存の変数を一時的に局所化する為に使う。
sub f{
# 通常使う変数はmy
my($foo, $bar);
my @array = ($foo, $bar);
# 既存の変数を一時的に置換え
local $_ = 'str';
local $SomePackage::PublicVariable = 1;
}
# 関数f()の呼び出しが終われば、$foo,$bar,@arrayは消滅し、$main::_,$SomePackage::PublicVariableは関数呼び出し前の値が復帰する
過去ログ消滅しちゃってますね・・・・ 非常に有用なのでぜひ参照したいのですが、 どうにかならんのでしょうか?
「仕事人★がpc2鯖をpc鯖と間違えてログ消したために
pc5鯖に復旧した時に一日分消えてしまったよ事件」のログなら
>>766-780 もともとのレス番は766から814らすぃな
あげわすれました。お願いします。
801 :
779 :04/03/30 00:22 ID:???
あ、↓これで検索すると、、、
「perl while read buffer」
$bytesread抜きの、つまり
>>799 で書いた
>while (read($fh,$buffer,1024)) {
のような形で書かれたページも見つかりますね。
いらないのかな。何の意味があるんでしょう。
マルチですが失礼します。以下こぴぺ CGI::Sessionつかって $session = new CGI::Session("driver::File", undef, {Directory => $session_dir}); $sid = $session->id(); $session->param("aaa", "v_bbb"); のようにして、得たセッションIDをもとに次にアクセスするときにその セッションIDをもとに $session = new CGI::Session(undef, $sid, {Directory => $session_dir}); として、前のセッションのデータにアクセスしようとしたんですが、データを 引き継げてないようです。これは使い方が間違っているのでしょうか? ぶっちゃけparamメソッドで入力したデータに二回目以降のアクセスで 取得できるようにするにはどのようにすればいいのでしょうか? $session_dirに指定したファイル?もどこにあるかわからないし、、、 わからないことずくしです。
>>802 有難うございます。
サンプルとなるコードを検索してそれを理解する。わからなければ時には弄くり倒しながら。
そして理解できたら自分なりの方法でコーディングする。
これがコピペプログラマーでしょうか?
bytesreadが定義済み変数なのかは調べた。しかし探してもそのような記述は見当たらない。
英語は苦手だから日本語texinfoの
ttp://flex.ee.uec.ac.jp/texi/perl/perl_90.html だって見た。それでも解決しない。
ところがbytesreadという変数を使ったコードを紹介するサイトが山のようにある。
・・・私には理解できない。
しかし言われてみて思った。
while内で$bytesreadを参照し処理をしていたスクリプトがあった。
そのソースからコピペして$bytesreadは使わないのに残したままである。
そんなコードを参考にしてしまった。
こんなところですか?
>>795 結果を書き出すのにEUC-JPかShift_JISかに統一しる。
# 私のところでは、そんな化け方しないけど。
>>797 HTML版はあるけど、2chブラウザ用のが無いのかも。
>>803 $session_dirディレクトリの中にファイルが作られる。
まずはそこから確認。
>804
>while内で$bytesreadを参照し処理をしていたスクリプトがあった。
>そのソースからコピペして$bytesreadは使わないのに残したままである。
>そんなコードを参考にしてしまった
恐らくそういうこと。というか、
>>5-6 あたりを参照するのは基本だが底から少しでも探した?
世の中のコピペプログラマがいかにダメコード汚染を撒き散らすかということがよくわかるよ。
とはいうものの、readに関していうなら、C言語では極めて重要なreadの戻り値がPerlでは意味が薄れている為、
マニュアルを読んだだけではその意味するところを理解し難いというのはあると思うけどね。
次スレ立てる人は $テンプレ =~ s/pc2/pc5/g; するのを忘れずに。
>>808 Bareword found where operator expected at - line 1, near "$テ"
(Missing operator before e?)
syntax error at - line 1, near "$テ"
Unrecognized character \x83 at - line 1.
な上に、gオプションはいらないだろ。
${'テンプレ'} =~ s/pc2/pc5/;
どうでもいいか・・・
どうでもいいな。
だが
>>808 は次スレ立つ時期に同じことを言うのを忘れずに。
>>795 >Windowsがテキストファイルの文字コードをどのように判別しているか定かではないのですが
Windows 自体は文字コードの判別など「しない」。
ブラウザかテキストエディタか知らんが判別しているのはアプリ側。
つまり自動判別に頼る場合(ロジックが異なる可能性があるから)、
開くアプリによって結果が異なることもある。
先頭数文字で判別するアプリもあれば、どちらかのコードで解釈できなくなった時点で
コードを決定するアプリもあるだろう。
>阿諛追従は文字化けしましたがその他の大半の単語はそうは
>なりませんでした。
「その他の大半の単語」の方は本文(意味)の方もちゃんと読めるのか?
結論としては
>>805 の通り、文字コードを統一してから書き込めってことだが。
ActivePerl 最新版(5.8系列)なら use Encode すれば文字コード変換を使えるはず。
久しぶりにPerlを弄り始めて突っかかってしまいました。 変数の型(HASHやARRAY)を返す関数があったと思うんですが 忘れてしまいました、誰か助けてぇ〜
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
814 :
792 :04/03/31 10:48 ID:???
>>805 >>811 どうもありがとうございました。
Encodeではありませんが、jocde.plでEUCJPに統一することで解決しました。
>「その他の大半の単語」の方は本文(意味)の方もちゃんと読めるのか?
はい、何故か本文の方は全く文字化けしませんでした。
817 :
nobodyさん :04/03/31 16:37 ID:msaZKwho
サブルーチンや関数って こうじゃなくて sub hoge{ } こう書くのが正しいのですか。 sub hoge { }
CGIで、COOKIEを書き込めるのってもしかしてPOSTでCGIが呼び出された時だけなんですか?
>>820 呼び出し方は関係ないよ。
httpヘッダを出力して、それをブラウザが解釈すれば書き込まれる。
>>820 いいえ。
なお、その質問はスレ違いです。
823 :
820 :04/03/31 22:33 ID:???
ん・・・・わかりにくくてすいません COOKIEの書き込みを行っているんですが、 なぜか$EMV{'HTTP_COOKIE'}にCOOKIEの値として認識されてきません。 もっとも単純なCOOKIEを書き込んで、読み出すだけ、のCGIであれば問題は無いのですが、 なぜかいろいろ付け加えていくウチに、$ENV{'HTTP_COOKIE'}の値を正常に読み込まなくなってしまいます。 何度1から作り直しても同じ事が起きるのですが、これは原因として考えられる部分が他にあるのでは、と考えています Perlの都合上でCOOKIEの書き込み読み込みに異常を来すような例は考えられますでしょうか ちなみに、COOKIEに関する部分は至って単純で、ソースは以下の通りです。 これを動作させたところ、COOKIEの中身が表示されるべき所に全く文字は出力されませんでした。 $jcode= './jcode.pl'; $getArg= './getarg.pl'; require $jcode; require $getArg; print "Content-type: text/html\n"; print "Set-cookie: style=",$PostARG{'style'}||$CookieARG{'style'},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; print "Set-cookie: access=",$date{'mon'},$date{'mday'},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n\n"; 中略 print $CookieARG{'style'}; print $CookieARG{'access'}; print $ENV{'HTTP_COOKIE'}}; 後略
824 :
nobodyさん :04/03/31 22:34 ID:fllGa8Oy
getarg.plの内容 %GetARG = %PostARG = %CookieARG = (); ($date{'sec'},$date{'min'},$date{'hour'},$date{'mday'},$date{'mon'},$date{'year'},$date{'wday'},$date{'yday'},$date{'isdst'}) = localtime(time); foreach ( split /[&,]/,$ENV{'QUERY_STRING'} ){ ($name, $value) = split /=/; $value =~ s/\+/ /g; $value =~ s/%([0-9a-fA-F]{2})/pack("C", hex($1))/ego; &jcode'convert(*value,'sjis');# コードをShift_JISに $GetARG{$name} = $value; } if($ENV{'REQUEST_METHOD'} =~ /^POST$/i){ read(STDIN , $POST , $ENV{'CONTENT_LENGTH'}); foreach ( split/&/,$POST ){ ($name, $value) = split /=/; $value =~ s/\+/ /g; $value =~ s/%([0-9a-fA-F]{2})/pack("C", hex($1))/ego; &jcode'convert(*value,'sjis');# コードをShift_JISに $PostARG{$name} = $value; } }
825 :
nobodyさん :04/03/31 22:35 ID:fllGa8Oy
@_ = split(/; /,$ENV{'HTTP_COOKIE'}); foreach ( @_ ){ ($name, $value) = split /=/; &jcode'convert(*value,'sjis');# コードをShift_JISに $CookieARG{$name} = $value; } foreach ( keys %CookieARG ){ print "Set-Cookie: $_=",$CookieARG{$_},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; } foreach ( keys %GetARG ){ print "Set-Cookie: $_=",$GetARG{$_},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; } foreach ( keys %PostARG ){ print "Set-Cookie: $_=",$PostARG{$_},"; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; } 1;
スレ違いって文字は読める?
827 :
nobodyさん :04/03/31 22:56 ID:fllGa8Oy
どこで聞けばいいんですかね・・・
またCOOKIEの仕様を理解してないのが現れたか… スレ違いだから答えない。
コードの問題かクッキーの問題か教えてから誘導してやれば良いのに。 取り合えずここじゃないとなると初心者スレなんかなあ……。
スレ違いスレ違いって言うんですけど、じゃあどこなら聞けるんですかね
んなもん知るか
その質問もスレちがくぁwせdrftgyふじこlp;
833 :
nobodyさん :04/03/31 23:51 ID:fllGa8Oy
スレ違いスレ違いと言われても COOKIE関連のまともなスレなんてWebProg板に無いんですが
834 :
nobodyさん :04/03/31 23:54 ID:fllGa8Oy
・・・Perl関連で困ってるのにここじゃダメなんて・・・ どこで聞けば分かるんだ
835 :
nobodyさん :04/04/01 00:01 ID:f/d+tf5t
だいたい、COOKIEそのものの書き込みは出来てるんです 単純にCOOKIEに値を書き込んで、それを読み出すくらいは出来てるんです。 ただ、それに肉付けしていったときに読み込めなくなったりしたので、他の部分が影響を及ぼしているのは明らかなので、 どういった部分がCOOKIEへの値書き込みにこういう影響を及ぼすのか、って聞いてるのに、 ス レ 違 い 違わないでしょう
ここは「Perl関連」のスレではない。 「Perl コ ー デ ィ ン グ 」スレ。 コーディングの問題ではないのだからスレ違いだろう。 >828を読んでCOOKIEの仕様を勉強しなおしてこい。
いや、最初良かったのに途中でコード足していって駄目になったんなら、 原因はコーディングにある(と本人は言っている)のでコーディングに関しての話なんじゃないの? と言うかこのスレのコーディングの定義が最近良く解らない……。
自分を擁護してる暇あったらweb探し回って調べるか、 コードとにらめっこしてなさいよ。
コードと睨めっこしたってわからないだろ。
コーディングスレでスレ違いって言われたってことは、コーディングの問題じゃないって事さ
もうさんざん悩んでWeb探し回って調べて 2週間が経過してるんだが・・・・・ もうだめぽ
それはもうだめかもわからんね
expiresに問題がなければクライアントにCookieファイルが残ってるよね? $ENV{'HTTP_COOKIE'}を疑う前にCookieファイルの中身はちゃんと確認したの? セパレータとかエンコードとか。 コーディングを疑う前にCookieのお作法を理解しないと先にすすめないよ。
844 :
nobodyさん :04/04/01 02:07 ID:OWaSi467
もまいら確かにぴろゆきは3月いっぱいで閉鎖と言ったがもしかしたら3月いっぱいで閉鎖と言うのがエイプリールフールなのかもしれないぞ。
つまり本当は4月1日のどこかで閉鎖するかもしれない。
実際に広告枠の所に「2004年4月1日に何かある」とあるんだしまだ希望はあるんじゃないか。?
2ch閉鎖実況スレ
http://ex2.2ch.net/test/read.cgi/net/ 1080586834/
↑間を消して
まだ1日ありますぞい
↑コピペyoro
>>823 サーバが食べられるクッキーはクライアントが吐いたものだけ。
自分で吐いたクッキーは食えねえぞゴルァ。
の呪文を100回唱えて、もう一回コードを見直しましょう。
846 :
nobodyさん :04/04/01 21:54 ID:Al4MgY0y
Perlで作ったCGIで、ブラウザにキャッシュされるようにするにはどう書けばいいのでしょうか? ブラウザの戻るボタンで戻った時などに、いちいち再読み込みされないようにしたいです。 ヘッダのところに何か追加すればいいのかなというところまでは分かったのですが、 そこから先がどうしても分かりません。 よろしくお願いします。
848 :
nobodyさん :04/04/01 22:11 ID:Al4MgY0y
>>847 キャッシュさせないようにしたいという話は時々見ますが
キャッシュされるようにする方法というのは見つかりませんでした。
でも戻るボタンで戻っても再読み込みされない掲示板とかありますよね。
ああいうのってどうやってるんでしょうか?
すごい初心者ですいませんが、下の例だと何を追加すればいいんでしょう?
#!/usr/local/bin/perl
print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";
(中略)
print "</HTML>\n";
__END__
HTML文書を生成するタイプのやつは キャッシュされるんじゃないかな。
POSTじゃなくてGETにする
851 :
nobodyさん :04/04/01 23:24 ID:Al4MgY0y
表示部分がHTMLでなくてもキャッシュされる掲示板もありますよね。
設置したいCGIがあるのですが、ページ移動のたびに読み込まれるのが嫌で
自分で改造したいと思っています。
.cgiのままでもキャッシュさせる方法はないでしょうか?
>>849 >>850 どこをどう変えたらいいのでしょうか?
>>848 みたいなのでキャッシュさせないのは無理ですか?
853 :
846=851 :04/04/01 23:34 ID:Al4MgY0y
すいません。
>>848 みたいなのでキャッシュさせないのは
↓
>>848 みたいなのでキャッシュさせるのは
の間違いでした。
それってブラウザの仕様じゃないの。
ああ、POSTとGETの話かと思ったらちゃうんだな……まあ何にせよスレ違いかも。 (仮に)何かを追加してできるようになるとしても、 その何かを調べるのは少なくともこのスレじゃない、気がする。
そうですね。スレ違いっぽいので自分で調べてみます。 ありがとうございました。
安全なセッションの作り方ありますか? use Digest::MD5 qw(md5_hex); my $session = md5_hex( time . $$ ); なんかこれじゃ心もとないんですが…
それだけだとセッションではなくセッションID(キー)の生成方法が 心許ないと読めるのでそれ前提で言うと。 渡す前の文字列が time.$$ だけだとちょっとって思うのなら 適当に30桁くらいのランダムな文字列作って md5_hex() に送れば良いんじゃないの。
>>896 その種が time . $$ だったりする罠。
800 :nobodyさん :04/03/26 10:46 ID:???
>>798 ロジックを語るならスレ違い。スレタイ嫁。
802 :nobodyさん :04/03/26 10:51 ID:tN6LIksl
>>800 どこいけばいいですか?
803 :nobodyさん :04/03/26 10:52 ID:???
春休みUZEEEEEEEEEEEE
804 :nobodyさん :04/03/26 10:56 ID:???
>>800 WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。
861 :
nobodyさん :04/04/02 15:14 ID:JAKs1zik
・・質問です・・ 私の環境ではサーバで、cgi-bin以下でしかcgiが置けません。 ブラウザで見るときのパブリックディレクトリはhomeのインデックスです。 user/ 歪gi-bin/ 鷲oge.cgi 鷲ome/ 亙ndex.html 鷲oge.html この環境で、画像リンクなどではなく、 直接hoge.cgiをロードすることは出来ますでしょうか?
手におえんぞ。一切無視だ。
「
>>1 」とか「スレタイ嫁」とか言ってもきっとわからない。
完全スルーでよろ↓
863 :
nobodyさん :04/04/02 15:34 ID:8MGWWqTy
今、一行掲示板を作っていて負荷軽減の為、一定のhtml(index.html)に書き込み表示部を書き込みの度に出力(上書き)しようとしています。 書き込み表示部は予め関数化してあるのですが、この関数によって出力された物をファイルに書き込もうとするにはどうしたら良いのでしょうか? どなたかご教授して頂けると幸いです(_ _)
>>863 800 :nobodyさん :04/03/26 10:46 ID:???
>>798 ロジックを語るならスレ違い。スレタイ嫁。
802 :nobodyさん :04/03/26 10:51 ID:tN6LIksl
>>800 どこいけばいいですか?
803 :nobodyさん :04/03/26 10:52 ID:???
春休みUZEEEEEEEEEEEE
804 :nobodyさん :04/03/26 10:56 ID:???
>>800 WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。
ある意味↑ってテンプレだな。 ってか、のスレの趣旨をわかってないヤシ多すぎ 正しい質問例: これこれの配列にこういう値が入っています。 この配列に対してこういう処理をしたいと思っています。 こういう書き方をしたらこういう結果になりました。 こういう結果ではなくああいう結果を返したいと思っているのですが、 _以下略_ このスレってこういうことっしょ?
866 :
nobodyさん :04/04/02 16:15 ID:8MGWWqTy
>>864-865 ありがとうございます。それを踏まえて書き直してみました。
今、一行掲示板を作っていて負荷軽減の為、一定のhtml($file_html)に書き込み表示部を書き込みの度に出力(上書き)しようとしています。
書き込み表示部は予め関数化(&html)してあるのですが、この関数によって出力された物をファイルに書き込もうとするにはどうしたら良いのでしょうか?
一度、ヒアドキュメントにより関数化した物を代入し、それをファイル出力するという順序で可能かな、とも思い
$html_source = "_EOF_";
${&html}
_EOF_
if (!open(HTML,">$file_html")) { &error(0); }
print HTML $html_source;
close(HTML);
と、してみたのですが何も$file_htmlには書き込まれませんでした。どなたかご教授して頂けると幸いです(_ _)
$html_source = "_EOF_"; test _EOF_ ↑これがめちゃくちゃ。 まず一から勉強し直せ。 もうレスしなくていいから、そんな暇あったら調べろ。
ここは一風変わったヒアドキュメントを流布させるスレですね。
うぁ、すみません。元は$html_source <<"_EOF_";です。 調べるというのはそういうライブラリ等あるのでしょうか? ぐぐってみたのですが、リファレンス等しか見つからないのですが。。。 ご存じでしたら教えて頂けると幸いです。
コピペしたんなら869みたいな間違いはするはずがない。 ていうかその書き方すら間違いなわけだが。 あんた普段から何作ってもバグだらけでしょ。
$html_source = << "_EOF_"; test _EOF_
>うぁ、すみません。元は$html_source <<"_EOF_";です。 >うぁ、すみません。元は$html_source <<"_EOF_";です。 >うぁ、すみません。元は$html_source <<"_EOF_";です。
<<を付けた代わりに今度は=を付け忘れました。 右脳でも鍛えてきます。。。
ヒアドキュメントしか突っ込まれてなくて、肝心の質問には誰もレスしないというのも凄いな。
>>874 そんなに教えてほしいのかい?8MGWWqTyさんよ。
わざわざsageてID隠さなくでもいいんだよ?
もう自分でわかったんじゃないの? あまりにもつまらないミスだし。
次の質問どうぞ。
書く前に
>>1 とスレタイ読んでくらはい。
>if (!open(HTML,">$file_html")) { &error(0); }
>>866 のこういう書き方する人って他にもいるの?
open HTML,">$file_html" or &error(0); 同じ意味だから好みだろ
自分も単一の処理なら and / or を使う。 でもperlをさわりはじめた頃はifでやってたな。
C/C++のほうがなれてるから
>>879 みたいなほうが楽。
効率を求めるのなら、 低コスト← and 、or、 後置 if、ブロック →高コスト と教わった。
884 :
803 :04/04/03 13:26 ID:???
いろいろ試してみたんですがやっぱりファイルは作られてないようです。 windowsでやっててpath表現が微妙に違うのがいけないのでしょうか?
splitで$i(中身は日付で2004/04/03 13:02)をわけたいんですが、 中身がある一つの記号だけで区切られてないので、 どのように分ければいいのか分かりません。。 @ @a = split ('/'or':',$i) とか A @a = split ('/'':',$i) B @a = split (///:/,$i) などためしたんですが、 @だとエラーは起こりませんが表示されず、 ABだとエラーです。 どのような方法があるんでしょうか?
886 :
nobodyさん :04/04/03 16:55 ID:qkOavVtn
$timestamp = "2004/04/03 13:02"; @datetime = split /\/| |:/, $timestamp; print join ' ', @datetime;
split /\D/, $timestamp;
888 :
nobodyさん :04/04/03 17:03 ID:qkOavVtn
参りました。
889 :
nobodyさん :04/04/03 17:08 ID:OcvniKR1
Sendmailを利用したCGIを外部から
<form action="
http://hogehoge./ 〜/〜/mail2manager.cgi">
のように呼び出されたくないのですが、
リファラに異常が発生しやすい鯖(?)なので、
HTTP_REFERERによる判定だけではエラーが発生しがちです。
他に防御策はありますか・・・?
この質問ってコーディングじゃない・・・?
前画面で時刻を絡めたIDをCookieで食わせて、 「60秒以内に発行されたIDなら送信可」などとする。 複数CGIサーバーの場合、時刻が同期がされていないと誤爆するけどね。 REFERERは詐称されるからあまり意味ないよ。
892 :
857 :04/04/03 20:03 ID:???
>>858 結局、md5_hex() に渡す文字列がユニークじゃなきゃ意味ないんで、
time . $$ 以外にユニークな文字列を生成する必要アリですね。
なんかいいのないかなぁ…。
みなさんはどうしてます?
tai64 使ってみる。
useで呼んだ複数のモジュールでもmain::に属する特定のグローバル変数を できるだけ簡単に共有するにはどうしたらよいでしょう。 モジュール内の関数を呼ぶたびに、その変数を渡すのは面倒なので。