Perl コーディング初心者質問コーナー Part33
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
04/03/01 02:46ID:1GeWO7LH【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0002nobodyさん
04/03/01 02:49ID:1GeWO7LH【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc2.2ch.net/test/read.cgi/php/1077525387/
【 スクリプト改造依頼スレ 】(丸投げ)
http://pc2.2ch.net/test/read.cgi/php/1076831972/
△▲ WebProg 初心者の質問 Part7 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1073460282/
【Perl】ファイルロック(排他処理)について語ろう
http://pc2.2ch.net/test/read.cgi/php/1024795138/
★負荷軽減対策委員会(Perl、PHP)★
http://pc2.2ch.net/test/read.cgi/php/1034645635/
【Perl】掲示板を使ろう!
http://pc2.2ch.net/test/read.cgi/php/988890976/
Perlモジュールについて
http://pc2.2ch.net/test/read.cgi/php/997829243/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
0003nobodyさん
04/03/01 02:49ID:1GeWO7LHPart1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
0004nobodyさん
04/03/01 02:50ID:1GeWO7LHPart16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc2.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc2.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc2.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc2.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc2.2ch.net/test/read.cgi/php/1069846177/
part31 http://pc2.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc2.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記) 前スレ
[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
0005nobodyさん
04/03/01 02:51ID:1GeWO7LH・http://www.excite.co.jp/world/ # 英文のページ多いから一応
・Perl Com: http://www.perl.com/
・CPAN.com: http://search.cpan.org/
・ActivePerl: http://www.activestate.com/
・CGI-ML:http://forest.ne.jp/cgi-ml/
[お薦め]
・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
・Perl Recipes: http://www.effectiveperl.com/recipes/ # 死んでるか?
・Randal's WebTechniques columns: http://www.stonehenge.com/merlyn/WebTechniques/
・Perlの部屋: http://www.cc.rim.or.jp/~midorin/mad-p/perl/index.html
・Perl初心者の部屋:http://www.harukaze.net/~mishima/perl/
・Perlリファレンス:http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
・Perlのページ:http://homepage1.nifty.com/nomenclator/perl/
0006nobodyさん
04/03/01 02:53ID:1GeWO7LH・Home - Japanized Perl Resources Project: http://perldocjp.sourceforge.jp/
・Perl Monks: http://www.perlmonks.org/
・use Perl; : http://use.perl.org/
・Learn Perl - Perl Education: http://www.devdaily.com/perl/edu/index.shtml
・Perldoc.com: http://www.perldoc.com/
・Using Perl5 in Web: http://docs.rinet.ru/Using_Perl5_in_Web/
・Rex Swain's Home Page: http://www.rexswain.com/
・Robert's Perl Tutorial: http://www.netcat.co.uk/rob/perl/win32perltut.html
・Perl Tuts: http://savage.net.au/Perl-tutorials.html
・Beginning Perl Tutorials: http://www.pageresource.com/cgirec/index2.htm
・jcode.pl の私的な解説書: http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
・Logical Choice Software, Home Page: http://www.logsoft.com/perltips/
・Perlfect Solutions: http://perlfect.com/
・The Perl Archive : http://www.perlarchive.com/
・Perl6 & Parrot VM についての情報: http://dev.perl.org/perl6/
・use Object; : http://perl.infoware.ne.jp/
0007nobodyさん
04/03/01 03:36ID:???0008nobodyさん
04/03/01 04:21ID:???0009nobodyさん
04/03/01 04:45ID:???0010nobodyさん
04/03/01 09:06ID:???0011nobodyさん
04/03/01 11:13ID:???0012nobodyさん
04/03/01 15:07ID: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つ上がってしまいます。
どのような記述をすれば回避できますでしょうか?
0013nobodyさん
04/03/01 15:55ID:???0015nobodyさん
04/03/01 16:32ID:???Todayがカウントアップする時にTotalもカウントアップするのは問題ないのでは。
Totalが+1でTodayが+2とか言うのは問題だが。
0017nobodyさん
04/03/01 17:18ID:???>>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に行ったほうがいいですかね。
0018nobodyさん
04/03/01 17:21ID:???>>16氏
>1:全部セットで使うと決めて、Total(today)でのみカウントアップにする
やはりこの方式が一番手っ取り早いでしょうか。
そちらのやり方も検討してみます。
わざわざレス有難うございました。
0019nobodyさん
04/03/01 18:07ID:???0022nobodyさん
04/03/01 19:47ID:???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++, $_;
}
これでどうだ。
002322
04/03/01 19:48ID:???まぁいいや。俺は4、5、6です。
0024nobodyさん
04/03/01 20:10ID:???具体的には、変数に任意の数が入っていて、それを全角にしたいんです。
$data = 1234;
としてここで何か処理をして
$dataの値を"1234"としたいわけです。
自分では
$data =~ s/0/0/g;
$data =~ s/1/1/g;
:
:
$data =~ s/8/8/g;
$data =~ s/9/9/g;
というのを考えたんですがもっとうまい書き方はないかと思い質問してみました。
002522
04/03/01 20:14ID:???ttp://tohoho.wakusei.ne.jp/lng/199911/99110327.htm
こんな感じで検索。
http://www.google.co.jp/search?q=Perl+%E5%85%A8%E8%A7%92%E6%96%87%E5%AD%97+%E5%A4%89%E6%8F%9B&sourceid=opera&num=0&ie=utf-8&oe=utf-8
0026未承諾広告※ ◆TWARamEjuA
04/03/01 21:11ID:???0029nobodyさん
04/03/01 21:31ID:???質問させてください。
「hoge.log」というファイルがあり中身は
3212421321,ほげ,1543443246,ほげ,ほげ
.
.
.
.
3546754134,ほげ,3224654724,ほげ,ほげ
2346567945,ほげ,6735432758,ほげ,ほげ
.
.
.
.
となっています。
つまり、[ランダムな10桁の整数],ほげ,[ランダムな10桁の整数],ほげ,ほげ
って感じのが改行されていっぱいあると思ってください。データはコンマ区切り。
そこで、サブルーチンで引数1「3546754134」と引数2「1234567890」を渡して、
引数1とマッチする行をhoge.logの先頭の行に持ってきて、さらに先頭に持ってきた
行の三番目のランダムな10桁引数2に置換したいのです。
ご理解いただけるでしょうか。
だれかエライ人明解なコードを教えてください。
003029
04/03/01 21:34ID:???訂正
#
そこで、サブルーチンに引数1「3546754134」と引数2「1234567890」を渡して、
引数1とマッチする行をhoge.logの先頭の行に持ってくる。
さらに先頭に持ってきた行の三番目の区切りの「ランダムな10桁の整数」を
引数2に置換したいのです。
#
0031nobodyさん
04/03/01 22:04ID:???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);
}
003231
04/03/01 22:06ID:???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);
}
003329
04/03/01 22:23ID:???すごい・・・。perl初めて一週間なのですが私にはこのような考え方は
一生生まれないのだろうな。配列の使い方ってこんな風に使えるのですね。
いっぱいコード書いて、たくさん練習します。
ちなみにまだよく>>31氏のコードを理解できてません。一生懸命徹夜で理解してみます。
なんでか知らないけど、思うように動いてしまった。
そんな感じの空虚さが頭でグルグル回ってます。あと何年勉強したらこういう
コードがすぐに書けるようになるのだろうか。がんばります。
#私はCの知識もなければperlがはじめての言語なので、プログラムの感覚も
泡を握っているようでむなしいです。#
とにかくありがとうございました。
0034nobodyさん
04/03/01 22:45ID:???my @numbers = qw(0 1 2 3 4 5 6 7 8 9);
$data = join('', map{ $numbers[$_] } split(//, $data));
こんなでもいいんじゃない?
003531
04/03/01 23:02ID:???処理速度・負荷がどうかわからんが、例えばSJISの場合以下のように
したらどう? 実行環境が今ないからベンチ採れないけど
tr/\x30-\x39/\x4f-\x58/;
s/(.)/\x82$1/g;
0036nobodyさん
04/03/01 23:33ID:???複数行の文字列をprintする時、
print ( "hoge\n" );
print ( "hoge2\n" );
print ( "hoge3\n" );
とそのままやるのと、
$buffer .= "hoge\n";
$buffer .= "hoge2\n";
$buffer .= "hoge3\n";
print ( "$buffer" );
と変数に入れて最後にprintするのどっちがいいのですか。
見やすさ、スピード、慣習、などの観点から。
003734
04/03/02 00:00ID:???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% --
# 正規表現の方が速いか。
0038nobodyさん
04/03/02 00:06ID:???Print <<_EOF_;
Content-type:text/html
<html>
......(略)......
<!--#exec cgi="./fSize.cgi"-->
......(略)......
</html>
_EOF_
でやってみたのですが、SSIが単なるコメントとして扱われてしまいました。
0039eaoska047124.adsl.ppp.infoweb.ne.jp
04/03/02 00:12ID:QKupWf2Oリモートホスト?
みたいなものを、取得したいんですが、
$ENV{'REMOTE_ADDR'};
と書いても、数字のIPしか取得できませんでした。
文字列取得するには、どうすればいいですか?
0040nobodyさん
04/03/02 00:13ID:???#define NUMBER
0041nobodyさん
04/03/02 00:14ID:???C言語みたいに
#define NUMBER 200
のように、定数を宣言できませんか?
004342
04/03/02 00:14ID:???0046nobodyさん
04/03/02 00:18ID:???鯖によって、$ENV{'REMOTE_ADDR'}; がホスト返さないこともあるから、その場合は
$addr = $ENV{'REMOTE_ADDR'};
$host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $_;}
って書こうとオモタラ$ENV{'REMOTE_ADDR'};ですか。そりゃとれんよ・・・
$ENV{'REMOTE_HOST'}な
0047nobodyさん
04/03/02 00:20ID:???×$ENV{'REMOTE_ADDR'}; がホスト返さないこともあるから
×$ENV{'REMOTE_HOST'}; がホスト返さないこともあるから
0050nobodyさん
04/03/02 00:24ID:???0051nobodyさん
04/03/02 00:38ID:???これでコンパイラはサブルーチンではなく定数と認識する。
呼び出す時は、「&」とか「()」とか付けずにやる。
でも名前空間はサブルーチンのあれ使ってるからダブルクウォートで展開出来ないよ。
0053nobodyさん
04/03/02 00:57ID:???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]}";
で展開ー。
0054nobodyさん
04/03/02 11:50ID:???0055nobodyさん
04/03/02 12:26ID:???カウンタや掲示板のログを読み出すときの、
open(DATAA,"$log");
この部分の$logの前に>や+<とか色々ありますけど、
この辺を詳しく説明してくださる人いませんか?
どれを使っても読めるんで、違いが良くわからないのですが。
005636
04/03/02 13:09ID:???0057nobodyさん
04/03/02 13:21ID:???文字列連結するほうは、メモリ確保、開放を繰り返し行うが、その程度なら
たいしたことではない、好きにしろ、俺はヒアドキュメント使う。
0058nobodyさん
04/03/02 13:25ID:???先頭に半角のブランクがはいって困っています。連想配列に格納して
参照しようとすると先頭の半角もキーにしているためにマッチしません。
半角を入れずにクッキーを書きこめますか?だめなら、取り込んだ後で
半角を取り去るいい方法がありますか??
書きこんでいるコードはこれだけ :
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の間に半角スペースがはいります。
0059nobodyさん
04/03/02 13:43ID:???1バイト文字では、reverse関数を使えば実装できるのは確認したんですが、
$str = "あいうえお";
print join('' , reverse(split(// , $str)));
とやっても、文字が化けて読めません。
もしかして、できないんでしょうか・・・?
0061nobodyさん
04/03/02 13:54ID:???$cookie_data = "name\:$name\,mail\:$mail";
print "Set-Cookie: hoge=$cookie_data;\n";
こんな感じで一つの変数にまとめて突っ込んで、あとから取り出すのじゃダメなん?
0062nobodyさん
04/03/02 14:03ID:???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));
006362
04/03/02 14:04ID:???http://www.din.or.jp/~ohzaki/perl.htm#JP_Split
006458
04/03/02 14:19ID:???それで全然オッケーです、やってみます。ありがとう。
でも、どうして二番目以降の先頭にブランクがつくのかなあ。
仕様ということにしとこ。
0065nobodyさん
04/03/02 15:55ID:???http://www.rfs.jp/sitebuilder/perl/02/08.html#ファイル入出力記号の一覧
少しは探せよ
0066nobodyさん
04/03/02 23:15ID:???@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE "@chinko";
close FILE;
このようにしてtest.txtを覗くと
しりとり
りんご
ごりら
らっぱ
ぱんつ
つまようじ
このように2行目以降の先頭に半角スペースが入ってしまいます。
だれか原因と対策を教えていただけませんか。
0067nobodyさん
04/03/02 23:19ID:???0069nobodyさん
04/03/02 23:34ID:???0071nobodyさん
04/03/02 23:48ID:???掲示板のログが件名からリモホから本文から全部1行でまとまってると見るに耐えないので。
2行目以降の頭の半角スペースが憎いんです。
ループさせて1行ずつ保存するしかないんですかね。
0073nobodyさん
04/03/02 23:54ID:???0074nobodyさん
04/03/02 23:56ID:???open FILE, "+<test.txt";
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE @chinko;
close FILE;
3行目
print FILE "@chinko";
の@chinkoの
""を取ればok
0075nobodyさん
04/03/02 23:58ID:???まずは単純に配列にデータ突っ込んで、
print @chinko;
とだけやれ。
答えはそこにある。
0076nobodyさん
04/03/03 00:01ID:???print "@chinko\n\n";
としたかったんだけどね。ありがとう。
\n\nは分けてやります。
0079nobodyさん
04/03/03 00:07ID:???0081nobodyさん
04/03/03 00:20ID:???open FILE,"+<test.txt";
@chinko = ("しりとり\n","りんご\n","ごりら\n","らっぱ\n","ぱんつ\n","つまようじ\n");
print FILE @chinko;
print FILE "\n";
close FILE;
こうしれば?
一応期待どうりになるよ
0082nobodyさん
04/03/03 00:23ID:???0083nobodyさん
04/03/03 00:27ID:???新規のログを@new_logにぶっこんでファイルに出力して2行改行いれて
配列に\n\nいれてもいいけどいまさらいじるのめんどくさい。
ぃゃちょっとだけど。
その次の行からあらかじめ保存してある@temp_logをぶっこむ。
最終的に期待道理になればなんでもえーじゃないの。
0084nobodyさん
04/03/03 00:30ID:???0085nobodyさん
04/03/03 00:31ID:???だから、データの後に意味のない改行入れてどういう効果があるんだ?
お前はファイルの中身の最後とエディタの縁の間に空白がないと嫌なのか?
0086nobodyさん
04/03/03 00:36ID:???新規書き込みの時は一番上に今の記事番号が格納されることになるけど、
レスとか含めてログファイルには記事番号の順番にログが格納されるわけじゃないんですよ。
なのでtemp_logの最後においとくとpopで取得して++したらpushで格納できるから便利なのですよ。
ログの続きで改行あけずに格納すると視認性悪そうですしねー。
0087nobodyさん
04/03/03 00:38ID:???0088nobodyさん
04/03/03 00:40ID:???No<>名前<>記事
No<>名前<>記事
No<>名前<>記事
・・
・・
・
って普通にするんじゃいかんのか?
0089nobodyさん
04/03/03 00:48ID:???2. 1
3. 七資産
4. mail@domain.com
5. http://www.unko.cojp/chinchin/
6. 無題テキスト
7. となりの<br>柿は<br>よく<br>客食う<br>柿だ。
8. 何月何日何時何分難病
9. モジラなんとかかんとか
10. リモホ
11. IPアドレス
12. 削除キー
13.
14.
15. res
16. 2
17. 1(親記事番号)
18. 七資産
19. mail@domain.com
20. http://www.unko.cojp/chinchin/
21. タイトル
22. 本文
23. 何月何日何時何分難病
24. モジラとか
25. リモホ
26. IP
27. 削除キー
28.
29.
30. 2
EOF
0090nobodyさん
04/03/03 00:49ID:???0092nobodyさん
04/03/03 00:57ID:???0094nobodyさん
04/03/03 01:00ID:???趣味でやってんだから細部まで凝りに凝りたいじゃん。
0095nobodyさん
04/03/03 01:00ID: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);
としてクローズすること.
どうすればいいのか見当がつきません。お願いします
0096nobodyさん
04/03/03 01:08ID:???@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;
009796
04/03/03 01:12ID:???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;
0098nobodyさん
04/03/03 01:20ID:???open FILE, "+<test.txt";
@unko=<FILE>;
unshift @unko,"\n";
unshift @unko,@chinko;
truncate(FILE,0);
seek(FILE,0,0);
print FILE @unko;
close FILE;
0099nobodyさん
04/03/03 01:30ID:???ラスト4行はこの方がいいんじゃないのか?
seek(FILE, 0, 0);
print FILE @unko;
truncate(FILE, tell(FILE));
close(FILE);
0100nobodyさん
04/03/03 01:43ID:???と言ってみるtest
0102nobodyさん
04/03/03 01:59ID:???サブルーチンにはしてあるけどね。
まだ作ってない機能とかもあるし、最終的にいくつかの機能を別プログラムにしようかなとは考えてる。
最後まで作ったら1000ステップぐらいいきそうな勢いなので。
0104nobodyさん
04/03/03 02:44ID:???入力者に確認メールを送信すると言うプログラムです。
$mailにはフォームの「メールアドレス」の項目の内容が入り、あとは以下のとおりです。
質問は確認メールが送信されたメールを見ると、送信者の欄が
test@localhost.localdomainになっています。サーバのホスト名が入ってしまいます。
これを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);
0105nobodyさん
04/03/03 03:05ID:???$from= "test";
$adrress= "test@mail.not";
print MAIL "From: $from $adrress\n";
だったよな・・・
0107nobodyさん
04/03/03 04:16ID:???!!!!!!!!!!!
この俺に突っ込めと言うのかっ・・・
0108nobodyさん
04/03/03 06:42ID:UA3CbL7u0109nobodyさん
04/03/03 07:27ID:???0110nobodyさん
04/03/03 08:09ID:UA3CbL7uありがとうございます
0113nobodyさん
04/03/03 12:03ID:???こいつの辞書には「効率」って文字はねぇんだよ きっと
どうせどんな助言与えても聞くきねぇんだから、うち等から言える事はもう無いさ
0116nobodyさん
04/03/03 19:17ID:JGcO0sWg$hash{$key}{'このキー'};
上のような連想配列で 'このキー' のキーの一覧を得るには
どうすればよいのでしょうか?
よろしこ おながいします。
0118nobodyさん
04/03/03 19:57ID:???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 <test@example.net>";
0121nobodyさん
04/03/03 21:55ID:???> $from = "test <test@example.net>";
@はエスケープしろよ
$from = "test <test\@example.net>";
0123nobodyさん
04/03/03 22:19ID:???じゃ特別に教えてやるよ。
sendmail -tやめてsendmail -bsでSMTP叩けばFrom: testで出せるよ。
馬鹿には使いこなせないだろうけどな。
0125nobodyさん
04/03/03 22:58ID:???分かんのなら初めっから素直に答えとけや(w
その方法はしらねーけど、設定によってだけどほとんどのとこで使えないぞwww
使えねえ答えでは意味が無い
0130nobodyさん
04/03/04 00:19ID:uAtEzihH>設定によってだけど
何と言うか、頭悪そうな発言だな。
「この鯖にはsendmailを入れてはいけない設定になっております」
こういうのでも納得しそうな>>125を晒しage
0134nobodyさん
04/03/04 02:00ID:WZx4Ntes取得したいと考えています。
どのモジュールを使うのが一番手っ取り早いですか?
一応探してみて、LWPというのがよさそうだと思ってます。
http://member.nifty.ne.jp/hippo2000/perltips/LWP.html
0135nobodyさん
04/03/04 02:13ID:???ReverseAccess
http://saya.kiy.jp/cgi/ftlink.html
このCGIは「CJ-Clubさんの ReverseAccess 」を改造したものを再配布条件に基づき再配布しています。
上記の本家版だとserverステータスで "cgiヘッダーが出力されない" が出ます。
下の改造バージョンだと正常に動作します。
スクリプト構造の一番の違いはjavascriptで外部表示出来るか否かです。
元スクリプトのバージョンも違うので一概に言えません。
環境は
XPpro
04server
perl
です。
本家スクリプトもとりあえず動作はしますが一定時間がたつとログがリセットします。
下の改造版だとすべて正常に動作します。
原因が分からず困っています。
助言をお願いします。
0137nobodyさん
04/03/04 02:23ID:???Can't call method "****" without a package or object reference
と言うエラーが出ますが、どうすれば出なくなるのでしょうか。
0138nobodyさん
04/03/04 02:28ID:SI8u2VDDで?
0139nobodyさん
04/03/04 02:38ID:???君の言う通りなら以下のスクリプトでエラーが再現する筈だが。
#!/usr/local/bin/perl
sub read_data { print <DATA> }
read_data();
__DATA__
foo bar baz
エラーメッセージをよく読もう。
0141nobodyさん
04/03/04 03:02ID:???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 です。
0142nobodyさん
04/03/04 03:09ID:???sub output {}
#書き込み時ミス
0143nobodyさん
04/03/04 03:11ID:???お騒がせしました……。
#まさかポカミスで一日悩むとは。
0144nobodyさん
04/03/04 03:30ID:???この書き方に一体何の意味があるのだ?
print <DATA>;だけと同じだろうよ
まあ質問用に書いたのかもしれないが
0145nobodyさん
04/03/04 03:47ID:???defined(<DATA>) ? print <DATA> : print '';
はバグっぽいが、わかってないのはバカっぽいな。
0146nobodyさん
04/03/04 03:53ID:???ここに書く時直前では
(略):print 'nodata';
とか書いてたので中を消してそのまま出してしまいました。
0147nobodyさん
04/03/04 04:10ID:???書きミスじゃなくて、バグっぽい。
$/ = undef; なんてやってたら、はまりそ。
0148nobodyさん
04/03/04 04:23ID:???実は __END_ _直下の行が消えるのは何故だろうかと疑問に思いつつ
そう言うものなのだと思ってました。
と言う事は、__END__ 以下があるか無いか調べるにはどうしたら良いのでしょうか。
0149nobodyさん
04/03/04 05:16ID:???__END__ 以下に何が書いてあるかプログラマが把握できない
状況というのは健全でない気がするが。
単純にやるなら
if (my @data = <DATA>) { ... } else { ... }
なり
local $/ = undef;
if (length(my $data = <DATA>)) { ... } else { ... }
なりご自由に。
0150nobodyさん
04/03/04 11:13ID:???0151nobodyさん
04/03/04 12:42ID:FGoSTbqMperlをインストールしてソースを書いてブラウザに表示させたところ
ソースコードがすべて出てきてしまいました。#!usr/local/bin〜__END__まで
すべて表示されました。
単刀直入にいってどの部分がおかしいとこういう現象になるんですか?自分ではどこがわるいのかわかりません
0153nobodyさん
04/03/04 12:49ID:???ローカルで動かせる環境ってことだよな。
OSがMIMEタイプを誤認識してtext/plainになってるとか。
もしくは、ちゃんとttp://localhost/とかでアクセスしてる?
まずインスコはちゃんとできてるかを確認するために、
コマンドラインを叩いてみることを勧める。
0154151
04/03/04 12:54ID:???どうもありがとうございます。その解説部分の#はちゃんとはずしてあります。
>>153
私にはちょっとむずかしそうですが、パソコンはいじってないのでtext/plainとかには
なっていないように思います。localhost/sample.cgiとしてアクセスしていますし、ドキュメントルートにちゃんとファイルは置いています。
コマンドラインでも確かめてみようと思います。親切にありがとうございました。
0155nobodyさん
04/03/04 13:23ID:???readdirでファイル名一覧を取得した場合、
必ず「.」「..」は最初の二つに出てくるものなんですか?
例えば、取得したファイル名を配列に突っ込んだ後でファイル名を取り出そうとする場合、
配列の添え字は[2]からアクセスすれば問題無いですか?
自分の環境では問題無いのかもしれませんが、
他の環境でもこのような「.」「..」のものも必ず取得するのでしょうか?
0156nobodyさん
04/03/04 13:54ID:???サブディレクトリには必ず存在するもの。(ファイルシステムによるが)
ファイル名を取得する際、「.」と「..」なら無視するようにしてみては。
0157151
04/03/04 14:02ID:???ダメでした。パールのパスはインストール時にちゃんととおってました。
windows2000を使っているんですが、インストーラをヴァージョン2にしてから、
パールをインストールしたんですが、やたらインストールに時間がかかったので、
うまくインストールできてないんでしょうか?
だれか分かる人がいたら教えてください。よろしくお願いします。
0158nobodyさん
04/03/04 14:05ID:???ドキュメントルートのOptionに+ExecCGIがないとかでは?
>>155
先頭が「.」なファイルも除外していいんなら
my @filelist = grep( /^[^.]/, readdir(DIR) );
とか。ディレクトリを省きたいっつーんなら
my @filelist = readdir(DIR);
foreach (@filelist){
next if( -d );
#処理
}
とかがお手軽。
0159nobodyさん
04/03/04 14:07ID:???「 perl[半角スペース]-v 」だぞ?
まず入れたPerlの入手先とかはどこだ?
Activestate?
コーディングスレだとスレ違いっぽくなってきたのだが。
△▲ WebProg 初心者の質問 Part7 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1073460282/
こっちに移動しとくと叩かれないかも。
0160nobodyさん
04/03/04 14:18ID:???>>155です。
ファイルテスト演算子の-dを忘れていました。
next if (-d);
を利用しようと思います。
ご親切に有難う御座いました。
0162nobodyさん
04/03/04 20:05ID:???ありがとうございます。
外のファイルに出してる方が確かに良いのですが、
どうせ数行程度の文しか使わないような感じなので
態々外のファイルを読むよりも中に書いて置こうという事になったのです。
0164nobodyさん
04/03/05 00:13ID:???>>163
情報ありがとうございます。
開発環境がWin2000と2003 Serverなので、当分問題は無いでしょうけど、
その辺も考慮してコーディングしていきたいと思います。
わざわざレス感謝です。
0165nobodyさん
04/03/05 01:12ID:???win98でActivePerl使ってて、ダブルクリックでpl動かしてるんだけど、
コンパイルエラー行を出す時、
他のファイルに
open FILE, 'エラーファイル名';
while(<FILE>){
$aaa .= $_;
}
eval $aaa;
print "$@ \n";
sleep(10);
ってな記述してエラーメッセージ出してんだけど、
これって非常識?
もっと手っ取り早いやりかたあんのかな?
0166nobodyさん
04/03/05 03:00ID:???エディタで起動させて同時にカレントディレクトリを移動させたりすれば便利
0167nobodyさん
04/03/05 03:04ID:ReR1r8Jbいまいちなにがしたいのかよくわからないけど、
スクリプトの文法チェックならperl -c hoge.plで可能。
0168nobodyさん
04/03/05 03:41ID:???俺の根性がびーーーん。
エディタで起動ってなんのエディタだろう??
無知ですんません。
>>167
>いまいちなにがしたいのかよくわからないけど、
単にダブルクリックしたいだけです。エッヘン!
0169168
04/03/05 03:48ID:???あ。意味分かった。
今までperlをエディタから起動した事なかったf(^_^;)
0170nobodyさん
04/03/05 03:59ID:ReR1r8Jb俺はEmEditor使ってるけど、エディタから直接ボタン一個でプロンプト起動して
自動で走らせるようにしてある。この方法だとdieで終了しても閉じないから
エラー内容もちゃんと見れる。
0171nobodyさん
04/03/05 04:27ID:???ありがd!
俺も秀丸からボタン一つで新規秀丸ファイルに出力されるようにしてきた。
evalしてた俺ってなんて馬鹿MAXなんだろう。。。_| ̄|○
0172nobodyさん
04/03/05 07:21ID:???0173nobodyさん
04/03/05 13:13ID:???0174nobodyさん
04/03/05 23:51ID:yEaLcmjc$test=1
だったら、
$hoge{'test'}=1
にしたいのです。「test」の部分は未知の場合にどうやったらいいかわかりません。
よろしくです。
0175nobodyさん
04/03/05 23:59ID:???Perlソースは読めるから 未知な場合がどういう場合なのか・・・
0176nobodyさん
04/03/06 01:52ID:???@pairs = split (/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$FORM{"$name"} = $value;
}
0177nobodyさん
04/03/06 01:57ID:???0178nobodyさん
04/03/06 09:33ID:???次のステップとして
たとえば、発言一覧などをいちいちアクセスされるたびにCGIがHTMLソースを吐くようではサーバに負担が掛かるので
発言一覧のような閲覧頻度の高いものはHTMLファイルに出力して変更があった場合更新するようにすれば負荷が軽減されるように思うのですが
他のスレで
146 名前:nobodyさん 投稿日:2004/03/04(木) 01:31 ID:???
なんでHTMLへ書き出したいんだ?
メリットだけじゃなくてデメリットもあることを承知の上でか?
と言うような書き込みを見つけました
具体的にデメリットとしてはどのようなことが挙げられるでしょうか
0179nobodyさん
04/03/06 09:43ID:???cookieとか使ってた場合、HTMLにすると意味がなくなるからな。
JavaScript使えばできないことはないが、切られるとどうしようもないしな。
0180nobodyさん
04/03/06 10:16ID:???次のステップとして自力で作った掲示板スクリプトを他人に評価してもらうのがいいぞ。
もう廃れてしまったスレだがな。
自作CGIを評価するスレ
http://pc2.2ch.net/test/read.cgi/php/1049514428/l50
0181未承諾広告※ ◆TWARamEjuA
04/03/06 11:14ID:???1 行にしてみるてすと
%FORM = map { (split /=/)[0,1] } split /&/, $buffer;
0182nobodyさん
04/03/06 14:15ID:???HTML書き出しのデメリット
設置できる条件が厳しくなる(CGIディレクトリに置いたHTMLへアクセスできないとダメ。とかね)
リアルタイムに更新されない(だれかが書き込むまでずっと「最新」マークが表示されっぱなし。とかね)
まぁ、掲示板の場合はそれ以上にメリットはあるよ。
全部HTMLな掲示板つくってみたけど、表示負荷をあまり考慮しなくて済むからかなり無茶ができる。
0183nobodyさん
04/03/06 14:35ID:???というか、ファイルが既に開かれているかいないか、の方が
自分の考えてる事にニュアンスが近いです。
0184nobodyさん
04/03/06 15:56ID:???これで
0185nobodyさん
04/03/06 19:36ID:???%FORM = split /[&=]/, $buffer;
まぁ実用的なコードほどこんなハッタリじみた事はせず、
堅実にサニタイズしているもんだがな。
>>183
http://perldoc.com/perl5.8.0/pod/func/fileno.html
0186nobodyさん
04/03/06 22:13ID:???my変数を使うことのメリットって何ですか?
グローバル変数だけだと不具合とかってあるんですか?
0187nobodyさん
04/03/06 22:16ID:???複数人での開発になったら必須。
最大のメリットは保守性。
0190nobodyさん
04/03/06 22:56ID:???あまり大きくなく保守が楽な規模のものでも、
例えばブロック毎に変数名使い回せるとかいうのは
日曜すくりぷたな人にとっても結構嬉しい事なんじゃないだろうか。
まあ使って損は無いし(あっても得の方が大きい)
特に理由が無い限りmy宣言はした方が良いと思うよ。
0191nobodyさん
04/03/06 23:01ID:???あ、use strictと組み合わせること前提ね。
0192nobodyさん
04/03/06 23:57ID:???0194nobodyさん
04/03/07 01:08ID:???ディレクトリのリネームをしたいんですが、CGIを実行するディレクトリのリネームってできないんでしょうか?
例えば
http://hoge.com/aaa/rename.cgi
というのを実行して
http://hoge.com/bbb/rename.cgi
といったようなリネームがしたいんですが・・・
rename関数でもFile:copy moveでも無理でした
何かいい方法があればお願いします
0195nobodyさん
04/03/07 01:16ID:???useしないようにするという場合もありそうな気がしますが、
チェック時だけではなく常にuse strictする理由って何かありますか。
例えば、局所変数のチェックをするついでに何かしらのエラーチェックをしてくれるとか。
0197nobodyさん
04/03/07 02:15ID:???#!/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
0198nobodyさん
04/03/07 02:36ID:???どうも素早い返信ありがとうございます〜
さっそく試してみたいと思います
それにしてもchdir使えばいけるとは・・・思いもつきませんでした
危うくcpでフォルダ全コピーして削除する方法をするとこだったし
0199nobodyさん
04/03/07 05:46ID:???例えば、JcodeのOOは
Jcode->new(\$str)->utf8;
の様にすれば良く、これは
$char = 'utf8';
Jcode->new(\$str)->$char;
でも良いようなのですが、
%char(UTF-8 => 'utf8');
Jcode->new(\$str)->$char{'UTF-8'};
のようにハッシュを使うと構文エラーと言われます。
ハッシュを使うにはどうすれば良いのでしょうか。
0200nobodyさん
04/03/07 10:57ID:???実行時チェックはシンボリックリファレンス(${'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'})とするのが普通だと思うぞ。
0202nobodyさん
04/03/07 11:50ID:???HTMLで出力している意味をわざわざ遠回りしてまで殺して何の意味が?
0203182
04/03/07 13:04ID:???リアルタイムに更新されない。と考えるとデメリットだけど、
リアルタイムに更新されなくて済む。と考えるとメリットになる。
メリットとして生かせるつくりにすることが重要。
0204nobodyさん
04/03/07 15:18ID:hh7UC8WbWin2000に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効くのでしょうか?
0205nobodyさん
04/03/07 15:43ID:???>200
そうだったのですか。
Jcodeのマニュアルに Jcode->new(\$str)->euc; のやり方のほうが良い、
みたいな事を書いてあったので変更しようとしていたのです。
0206こば
04/03/07 16:33ID:E9jZV2PD以下の二つの違いを教えて頂けないでしょうか?
print "<FONT size=\"5\">\n"; #ダブルクオート入り
print "<FONT size=5>\n"; #ダブルクオートなし
0207nobodyさん
04/03/07 16:36ID:???HTMLの事をなぜここで聞く?
0208nobodyさん
04/03/07 16:37ID:???極めてスレ違いでござる。
0209nobodyさん
04/03/07 16:39ID:???0210こば
04/03/07 16:49ID:E9jZV2PD0213nobodyさん
04/03/07 19:18ID:???どうしてもサーバエラーになってしまいます(デバッガで見ると
「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モードで動くでしょうか?
0214nobodyさん
04/03/07 20:04ID:hh7UC8Wb鯖として運営してるマシンで、いまどきflockを効かせないようにしてる鯖ってあるんか。
0216nobodyさん
04/03/07 21:48ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsec.html
0217194
04/03/07 22:03ID:???いろいろ変数かえたりしたんだが全くダメだ
UNIX系のサーバーで試しにやったら動いたんだけど
Windowsで動かしたいんだけどなぁ
やっぱフォルダ全コピーしかないのか_| ̄|○
0219nobodyさん
04/03/07 23:25ID:???こうしたとかも書かずにただダメなのかとだけ言ってる連中って、
何の意味があって書き込んでるんだ?
同情して欲しいのか?
0220nobodyさん
04/03/07 23:41ID:???それがわかれば他の解決法もあるかもしれないのに。
0221nobodyさん
04/03/08 02:04ID:???($id,$name,$value,$other) = split(/\,/,$line);
if($name =~ /$search/ or $value =~ /$search/) {
という具合に、「名前」か「本文」に、「検索用の単語」が含まれていれば、という仕組みを作ってみたんですが、
検索用単語がエスケープする必要のある文字(表示とか)だと、エスケープしないと検索結果に出ません(表\示で検索しなければならない)。
どうしたらいいんでしょうか? そもそも間違ってますか?
0222nobodyさん
04/03/08 02:12ID:???0223221
04/03/08 02:16ID:???$nameや$valueの中身が「表\示」になっている、というわけではない、ということですかね。
0224nobodyさん
04/03/08 02:31ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0226225
04/03/08 03:48ID:???0227221
04/03/08 06:25ID:???有難う御座います。
$name =~ s/\\//g;
$value =~ s/\\//g;
とやって、該当部分の\を無くす、でマッチさせるやりかたで出来ました。
ただ、そうすると、
$name =~ s/$search/<em>$search<\/em>/g;
$value =~ s/$search/<em>$search<\/em>/g;
で強調してる部分が適応されません。
$valueの中の$search(表示)に該当する部分、ってのは実質(表\示)なわけですからマッチされない、ってわけですよね。
また詰まりましたです。
0228221
04/03/08 06:37ID:???$value =~ s/$search/<em>$search<\/em>/g;
の直前にも、
$name =~ s/\\//g;
$value =~ s/\\//g;
入れたら解決しました。
ただ、本文の\が全部消えてしまいますけどいいんですかね。
0229221
04/03/08 08:17ID:???$name(\を抜いたもの)と$search(\がないもの)がマッチするか確認する、ってするよりも、
$searchがエスケープシーケンス込み、になるようにした方が、em要素も適応できてよさげな気がするんですが、
$searchにどういう処理を加えたら「表\示」のような中身になるんでしょうか?
0230nobodyさん
04/03/08 08:20ID:???0234nobodyさん
04/03/08 10:50ID:???0235221
04/03/08 11:09ID:???0236nobodyさん
04/03/08 11:24ID:???0238nobodyさん
04/03/08 23:19ID:???# ランダムで数字を表示
$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>";
というプログラムを作りましたが、この「今回の数字」という部分の
文字の色を変えるにはどのように修正したらよいでしょうか?
0240nobodyさん
04/03/08 23:34ID:???(・∀・)カエレ!!
0241nobodyさん
04/03/09 03:37ID:???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";
0242nobodyさん
04/03/09 03:39ID:???と言うのなら答えてもいいが…
0243238
04/03/09 09:30ID:???それなのに丁寧な回答ありがとうございます。
昨夜、ヒアドキュメントを使う事で簡単に解決出来ました。
タグは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_?の中からまたランダムに選び出すという
プログラムを作りたいのですが、これにはどうしたらよいでしょうか?
0245nobodyさん
04/03/09 10:14ID:???モマエは質問の前にもうちょっとドキュメント読んだ方がいい
新しい事やる度に質問する事になる
あーやべ俺ちょうしんせつ涙が出てくるワ
0246nobodyさん
04/03/09 10:28ID:???0247nobodyさん
04/03/09 11:46ID:???ハードリファレンスよりもシンボリックリファレンスの方が
直感的にわかりやすいらしい。
>>243
真面目に答えると、二次元配列などを使うのが普通の発想だと思う。
%abc = (A=>['Apple','Age','And','Angry'],B=>[頭文字Bの単語],C=>[頭文字Cの単語]);
とかそんな感じ。これだと例えば $abc{A}->[2] が 'AND' になる。
ラクダ本だと「リファレンスとネストされたデータ構造」の章あたりを読むとよい。
0248nobodyさん
04/03/09 11:47ID:???%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勉強せい
0251nobodyさん
04/03/09 14:49ID:???ShiftJISに含まれていない文字(半角カナなど)だけを実態参照に変換したいのですが,
どうしたらいいのでしょうか。
0252nobodyさん
04/03/09 14:59ID:???validatorには注意されるけど「HTML的」にはstrict(validではなく)。
詳しい事は製作板で識者にでも教えて貰って下せえ。
0253nobodyさん
04/03/09 15:00ID:???0255nobodyさん
04/03/09 16:42ID:???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>
みたいな使い方したいのですが…いったい何が悪いのやらさっぱりです。
0257>>251 1/2
04/03/09 17:01ID:???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 みたいにわざと文字化けさせた状態にする事
0258255
04/03/09 17:07ID:???使えます。
普通にgzip圧縮転送は
ヘッダーに Content-Encoding: gzip と
if (-d "\\") { open(STDOUT,"| gzip.exe -1 -c"); } #ローカルテスト用
else { open(STDOUT,"| /bin/gzip/ -1 -c"); }
こんなんでうまく動きます。
gzipで圧縮済みのファイルをcgiから送るのがうまくいかなくて悩んでるんですけど。
0261nobodyさん
04/03/09 18:31ID:???あぁ そういうことか
ごめん勘違いしてた
単なるgzファイルをCGIから吐かせたいのね
それって根本的にContent-type: text/htmlじゃなくないか?
0262255
04/03/09 19:20ID:???自動広告挿入無効の"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>
一つのファイルで表示用とダウソ用を兼ねる→(゚д゚)ウマー を狙ったんですよ。
0263へたれ
04/03/09 21:51ID:vgAvuUAX掲示板を設置して、そこにアクセスしている端末のUSER_AGENTやアクセス数を解析したなぁ…って
思ったんですがCGIからCGIを呼び出すことって出来るんでしょうか?
掲示板のCGIの中で、端末解析用のCGI(手元にあるのはSSI動作のです)を呼べばいいんだろうと思うんですが
やり方がわからないんでうまくいかないんです。どうやったらいいんでしょう??
よろしくおねがいします。
0264nobodyさん
04/03/09 21:52ID:vgAvuUAX掲示板を設置して、そこにアクセスしている端末のUSER_AGENTやアクセス数を解析したなぁ…って
思ったんですがCGIからCGIを呼び出すことって出来るんでしょうか?
掲示板のCGIの中で、端末解析用のCGI(手元にあるのはSSI動作のです)を呼べばいいんだろうと思うんですが
やり方がわからないんでうまくいかないんです。どうやったらいいんでしょう??
よろしくおねがいします。
0265nobodyさん
04/03/09 21:55ID:vgAvuUAX掲示板を設置して、そこにアクセスしている端末のUSER_AGENTやアクセス数を解析したなぁ…って
思ったんですがCGIからCGIを呼び出すことって出来るんでしょうか?
掲示板のCGIの中で、端末解析用のCGIを呼べばいいんだろうと思うんですが
やり方がわからないんでうまくいかないんです。どうやったらいいんでしょう??
0266へたれ
04/03/09 21:57ID:vgAvuUAX表示されなくて何回も…やっぱりヘタレです
0267nobodyさん
04/03/09 22:07ID:???0268nobodyさん
04/03/09 22:21ID:???あるフォルダに、.htaccessと.htpasswdによるアクセス制限を
掛けています。アクセスすると、認証ダイアログが立ち上がることになるのですが・・・。
これを、フォームか何かで入力して、cgiで受け取って処理して認証画面が
出ないようにすることは可能なんでしょうか?
ご存知の方おられましたら、よろしくお願いします。
0269nobodyさん
04/03/09 22:47ID: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--
教えて下さい。
0270nobodyさん
04/03/09 23:05ID:???例えば同じディレクトリに hetare.cgi があったとして、
$a = `hetare.cgi`;
と書けば、一応 hetare.cgi を実行できんこともない。
いろいろ細かい制約もあるので、常に期待した通りに動くとは限らんが。
>>268
必ずしも質問の意図を正しく捉えていないかもしれないが、
「.htaccess で制限かけたディレクトリがあって、普段だとBASIC認証しないとアクセス不可だが、
あるフォームからCGIにID/パスワードを送ると、BASIC認証に成功した状態になって、
例のダイアログを経なくてもそのディレクトリ内のファイルにアクセスできるようになる」
ということをしたいのだったら、不可能だろう。
付け加えると、この質問は「WebProg 初心者の質問」スレの方がふさわしかった。Perl と関係ないから。
>>269
なにをしたいかよくわからないが、少なくともこのスレの範疇では無さそうだな。
なにをしたいかよくわからないので、どのスレに誘導していいかもわからん。すまん。
0271nobodyさん
04/03/09 23:27ID:???http://id:password@servername/
0272268
04/03/09 23:34ID:???ありがとうございます。やはり不可能ですよね・・。
>>271
先日までは、それでOKだったんですが、IEの2/2のパッチを当てると
URLを使った、BASIC認証が不可能になってしまったので・・・。
0273nobodyさん
04/03/09 23:57ID:???今、アクセスカウンターを作っています。
カウント数のみ表示されるのはうまくいったのですが、
「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>" ;
}
0274nobodyさん
04/03/10 00:02ID:???まずはそこから勉強した方がいいと思うぞ。
0275nobodyさん
04/03/10 00:44ID:qF7ZudiB$|=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;が作成されません。
なぜなのでしょうか・・・。凡ミスだとは思うのですが、数時間考えても分からず。。。
0276nobodyさん
04/03/10 00:50ID:???0277nobodyさん
04/03/10 01:00ID:???ファイルが読み込めないのは単にファイル名が違うだけとかだったりしないか。
下(元)の奴だと0.gif〜9.gifを読み込むようになってるが
上(改造後)の奴だと000000.gif〜000009.gifを読み込むようになってるし。
0278275
04/03/10 01:17ID:qF7ZudiBあれ・・・おはずかしい。ありがとうございます。
しかし、これでも500エラーにはならないんだ。。。
0279nobodyさん
04/03/10 04:10ID:???まずコマンドからコンパイルエラーメッセージと変な記述の警告をあてにしようよ。
0280nobodyさん
04/03/10 04:45ID:???エラーログ見るとかCGI::Carp使うとか、とにかくPerl自体のエラーを見られる環境を
作ってからいじるべし。できれば use strict; と -w オプションも使うのが望ましい。
数時間考える暇があるんならこっちに時間をかけれ。
0281nobodyさん
04/03/10 10:09ID:???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>" ;
}
0282nobodyさん
04/03/10 10:14ID:SqQ9bd0u下のプログラムは、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;
}
0283ヘタレ
04/03/10 10:50ID:huq9wT6Vありがとうございます、でも$a = `hetare.cgi`;としてどうするんでしょうか?
変数に設定したあとどんなスクリプトを書けばいいんでしょうか?
また、制限ってどんな事があるんでしょうか?
もし参考になる文献とかありましたら調べてみますんで教えていただけないでしょうか
質問ばっかりで申し訳ありません。
0284nobodyさん
04/03/10 12:13ID:???`hetare.cgi`; と書くだけで hetare.cgi が実行される。
$a = `hetare.cgi`; とすると、hetare.cgi を実行した出力結果が $a に入る。
ポイントは、' (シングルクォート) でなく ` (バッククォート) を使うところにある。
「perl バッククォート」で google 検索かけてみそ。
制限だが、今回はアクセス解析CGIだということなので、たぶん問題は無い。
しかし、環境変数やカレントディレクトリは呼び出し元プロセスのがそのまま使われるとか、
CGI引数を渡したい場合にはちょっと知恵がいるとか、
そういうことがあるので、便利だからと言ってほいほい使っていると後でハマる。
0285nobodyさん
04/03/10 12:27ID:???動かない→悩む→ココで質問な人が多いようですね。
チェックの仕方知らない人も結構いるんじゃないかな?
自分がやってるチェック法を紹介しておきます。
−−以下−−
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 |");
なんて事やってるだけだけど。
0286ヘタレ
04/03/10 13:31ID:huq9wT6Vありがとうございますm(_ _)m実は簡単に出来るんですね、
print"<!--#include ....とか、変な事やってました、恥ずかしいです。
ありがとうございました。
0287nobodyさん
04/03/10 15:29ID:???$input = 10;
としまして、
@dataに1,2,3,4,5・・・と数字が入っていまして、
$inputの値がこの配列の中に入っているかどうかを調べるのはどのようにすればいいのでしょうか?
配列に対してindexは使えないですよね?
0290nobodyさん
04/03/10 15:42ID:???>何と言っても最大の誤りは、さまざまなエラーを指摘してくれる -w スイッチを
>指定し忘れるというものである。
>2番目に大きな誤りは、use strict を使うべきところで使わないというものである。
とにかく、error.log(デフォルト設定)に出されたエラーの内容を把握する事が、
バグを取り除く為に最も効率の良い手段。
もしエラーの内容がわからなければ、らくだ本の9章に載せられている解説を読めば良い。
らくだ本を持っていなければ、エラーの一部分で検索してみるとか、
或はここで聞けば誰かが教えてくれるかも知れない。
0291nobodyさん
04/03/10 15:58ID:???0292nobodyさん
04/03/10 15:58ID:???grepだと、上の例なら
配列内に1 ・・・ 100ってあって、
$inputが1だったら、凄まじい量が出てくると思われ。
0293287
04/03/10 15:59ID:???すいません、grepを今使ってみたのですが、
$input = 5;
@match = grep (/$input/,@data);
foreach (@match) {
print "$_ ";
}
@dataが1から30までなのですが、
5だけでなく、15や25も出てきてしまうようです。
この場合ですと5だけを取り出したいのです。
0294nobodyさん
04/03/10 16:20ID:???@match = grep{$input eq $_}(@data)#数値比較なら ==
0295nobodyさん
04/03/10 16:23ID:fPcyCnVNくどく言ってる香具師がいるけど、初心者は、そんな
ことより、正確なコーディングに集中すべし。
例えば、>>293のだって、いちいちそんなことしている
必要はないだろ。strict厨、my厨引っ込め!
0296nobodyさん
04/03/10 16:30ID:???(grep{$input eq $_}(@data))? print 'match': print 'unmatch';
で良い気がs
>295
煽りなのかネタなのか、単に勘違いしてるのか良く判らんが、
「正確なコーディングに集中す」るのに my や use strict はこれ以上なく有効だぞ。
そもそも、何故相手を厨と罵ってまでこれらを使いたくないかの方が意味不明(´ω`)
0297nobodyさん
04/03/10 16:45ID:fPcyCnVNはぁ?
普通の入門書の最初のほうには、strictやmyを
使ったスクリプトは出さないのだが、それだけのことが
分からず、まだ、stりctやmyにこだわってるから
厨になるんだよ。
0299nobodyさん
04/03/10 17:01ID:???それでもやはり特殊な事情が無い限り use strict を使う事を奨める。
と言うかこのスレでも使った方が良いと言う理由は出てるんだけどな。
初心者にとって、むしろ初心者であればあるほど、
正確な、バグの無いスクリプトを書く手段として
最もお手軽で良い方法が use strict だと言う事だ。
#勿論、my 変数についての理解はある程度必要だが
#これは現在の Perl の基本中の基本の一つなので早めに学習しておく事
もし俺みたいな匿名が言うのが気に食わないのならば、
Larry が使った方が良いと言っているよと教えておこう。
0300nobodyさん
04/03/10 17:03ID:???やさしくするためだよ。無駄な負担を減らすために名。
stりctやmyはずっと後で出てくる。
最初からstりctやmyを使えって主張を取り消しますか?
0301nobodyさん
04/03/10 17:05ID:???0302nobodyさん
04/03/10 17:26ID:fPcyCnVN>Larry が使った方が良いと言っているよと教えておこう。
問題は、どの段階かからだ。
さぁ、Larryがc言語の知識もプログラミングの知識もない
まっさらな素人に最初からmyやstrictを使えって言っている
箇所を引用してもらいましょうか。
0303nobodyさん
04/03/10 17:42ID:???Larryはstrictを知らない人にまでstrictを強要しないということなのかもしれない。
0304nobodyさん
04/03/10 17:45ID:???何行目のどの辺がおかしいか出てくるんだよ。最初は、それで
十分。
0305nobodyさん
04/03/10 17:54ID:???と書いてあります。
0306nobodyさん
04/03/10 18:26ID:XGcN6IuW$title='掲示板';
1;
等と書いた設定用plなどを
requireしてやるとうまく読み込めないんですけど、
読めるようにする事はできますでしょうか?
0307nobodyさん
04/03/10 18:31ID:???0309306
04/03/10 18:43ID:???返答ありがとう御座います。
解除すると問題なく動作するのですが、
strictしたままでの方法は無いものかと疑問になりまして。
>>308
試してみましたけどダメでした_| ̄|=○
0310nobodyさん
04/03/10 19:05ID:???>302
なんで、そう極端な例を出すのかわからない。
少なくとも、初心者の誤りとして Larry は>290が引用したところの文を挙げている。
「使うべきところで」使わないのは誤りだと。
そして、Perl ではつまらないエラーをなくし、正しいプログラミングをする為に
use strict は「特殊な事情が無い限り使うべき」。
余談だが、俺の言ってる初心者の定義は少し広いかもしれない。
言葉ではやや説明し難いが、貴方の言っている完全な素人の範囲には留まらない。
もし、最初からそのような完全な素人の事だけを初心者と言っていたのであれば、
こちらの言っている事はある程度撤回しよう。
それでも、出来る限り早い段階からレキシカル、グローバルを意識したプログラミングを
覚えて置くべきだとは主張する。
#因みに、Larry もラクダ本ではループ等と同じくらいの章(2.6)と比較的早い段階で教えている
0311nobodyさん
04/03/10 19:13ID:???それだけなら
設定ファイル
package MyConfig;
$title = '掲示板';
1
本体
use strict;
print (HTTPへっだ);
print $MyConfig::title;
でやれないかな。
0313nobodyさん
04/03/10 19:44ID:???俺は、結構大きなもの作る(といってもたかがしれてる)。
今までで一番時間かけたのは、DBを使った成績の管理かな。
成績入力、平均算出、順位順に並び替え、などなど。
全部グローバル変数でやりましたよ。
一人でやるなら、全体が把握できてるから構わないけど、チームでプロジェクトをやるときにはmyで局所化したほうがいいってことだ、と思い、毎日グローバル変数でがんばっております。
0314nobodyさん
04/03/10 19:58ID:???殆どの人は使うべきとか使った方が良いとは言ってるが、
何が何でも使えと言ってる人は逆に少数だろう。
要は、さまざまな利点が自分にとって意味がない思うのならば使う必要はないし、
そうでなければ使った方が良いんじゃない? 程度の事を主張しているに過ぎないのだと思う。
0315nobodyさん
04/03/10 20:38ID:???でも、そのうち気づくさ。
0316nobodyさん
04/03/10 20:42ID:???0317nobodyさん
04/03/10 20:46ID:???0318nobodyさん
04/03/10 20:56ID:???俺はTransitionalで妥協。
0319未承諾広告※ ◆TWARamEjuA
04/03/10 21:35ID:???慣れれば簡単。tu-ka、文章の意味づけが理解できるようになる。
SEO 対策にも使えるんだけどねぇ(哀)@相変わらずtable厨不思議マークアップな職場
0320nobodyさん
04/03/10 21:46ID:???0321nobodyさん
04/03/10 22:00ID:???$QUERY_STRING = $ENV{'QUERY_STRING'}
のように代入してるスクリプトを良く見かけるのですが、
単に読み込むだけなら代入する必要はありませんか?
0322へたれ
04/03/10 22:03ID:huq9wT6VにCGIの中でCGIを呼び出すのはバッククォートで出来るって教えていただいたんですが
実際にbbsのCGIからアクセス解析のCGIをにやってみたらダメでした、同じディレクトリに呼ぶCGIを
おいてやってもダメでした。dopvCOMETを`dcw.cgi?md=s&&pg=indexx`;
ってやって呼んだんですがウンともスンとも…やり方が間違ってるんでしょうか?
ご存知の方居られましたらお助けください。
0323nobodyさん
04/03/10 22:40ID:QACy8cAZ0324nobodyさん
04/03/10 23:39ID:???それだとアクセス解析にならんぢゃろな。アクセス元とかrefererとか集計したいんだろうし。
>>322
えーと
>CGI引数を渡したい場合にはちょっと知恵がいるとか、
の制限に引っかかっちょるんぢゃよ。
バッククォートでやる場合は、?以降の引数をそのまま引き渡すことはできない。
環境変数を使って渡さなきゃいかんのだが、ちょっと修行がいる。
0325nobodyさん
04/03/11 00:03ID:???フォームからCGIにパスワード渡したらCGIがアクセス制限掛かってるフォルダの
ファイルと等価の内容を吐く用にするじゃ駄目?
0326nobodyさん
04/03/11 02:35ID:YAYdGisPhttp://XXX/test.cgi
とアドレスバーに入れたときに「ファイルのダウンロード」となるときがあるのですが
どうしてでしょうか?本当に分かりません。
0327へたれ
04/03/11 02:45ID:X5d27yF/その修行ってどうやればいいでしょうか?
いい参考書みたいなのってあるんでしょうか?
0330nobodyさん
04/03/11 04:22ID:???正確には%8b%43ですよね?以下がコードです。おかしなところは無いと思うのですが、
&url_encode("気");
sub url_encode{
$str = shift;
$str =~ s/(\W)/'%'.unpack("H2", $1)/eg;
$str =~ tr/ /+/;
print $str;
}
0331nobodyさん
04/03/11 04:41ID:???\W は [^0-9A-Z_a-z]
'C' (\x43) はこの正規表現にマッチしない。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlre.html
0332nobodyさん
04/03/11 11:20ID:rL/aIPwV自宅サーバ設営のため、Kent Webさまよりyybbsをダウンロードしました。参考書
(Mac OSX Unix的活用講座)の指示通りperlの居場所を指定し直し、アクセス権を
設定しましたが、「Internal Server Error」となって動きません。KentさまのFAQ
をみてチェックしましたが、いちおう問題なく設定されているようにおもえます。
いったいなにがダメなのでしょうか?Askaのほうはうごくのですが・・・
環境はサーバもクライアントもMac OS X 10.3.2です。
0333nobodyさん
04/03/11 11:26ID:???* こ こ は コ ー デ ィ ン グ の ス レ で あ り 、 設 置 云 々 は ス レ 違 い な の で 悪 し か ら ず *
0334nobodyさん
04/03/11 11:30ID:???>Kent Webさまよりyybbsをダウンロードしました
これはどーでもいい。
perlpass->perlのコンパル->httpd->実行の確認
の順番で確認しろ。
あと完全にスレ違いだから。これ。
0337nobodyさん
04/03/11 13:32ID: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して処理する方法以外でよい方法は
ない?設定ファイルは簡潔にしたいので。。
0338nobodyさん
04/03/11 13:34ID:???http://pc2.2ch.net/test/read.cgi/tech/1074151549/
こちらでどうぞ
0341nobodyさん
04/03/11 15:39ID:???0342nobodyさん
04/03/11 15:47ID:???しかも、パスなんざ環境でいくらでも変わるっちゅーに。
・・・。
そんな餌でオレ様がクマー(
0343nobodyさん
04/03/11 16:57ID:GX3EcYk6などでアクセスした場合の$ENV{"PATH_INFO"}の先頭のスラッシュを取り除きたいのですが、
$file=$ENV{"PATH_INFO"};
$file =~ s/^\///;
これだけでいいのでしょうか?
0344nobodyさん
04/03/11 17:54ID:???QUERY_STRINGが必要な部分のエラー項目を-wで見ようとすると、
?mode=などがオプション扱いされて、参照できないのですが、
他にエラー項目を参照する方法ってありますか?
0345nobodyさん
04/03/11 18:33ID:Jy84bKJOそれとも各処理毎に分けたほうがいいかな?
$name = 'ほげ';
print "名前$name"; # $name = 'ほげ'; は以後不要
$name = 0;
if (〜eq〜) { $name = 1; }
みたいな感じで
0346nobodyさん
04/03/11 18:54ID:???$ENV{"PATH_INFO"}の内容が / で始まるならそれで良いと言うか
試せば直ぐ判りそうな気が。
>344
良く解らんかった……。
>345
普通、同一ブロック内なら変数名は処理毎に変える方が良いと思う。
0347nobodyさん
04/03/11 18:55ID:???http://altba.com/bakera/hatomaru.aspx/glossary/004300470049
a. 先にシェル上で環境変数 QUERY_STRING を定義してから
スクリプトを実行する。
b. QUERY_STRING と引数 (@ARGV) の両方でパラメータを
受け取れるようにスクリプトを改造する。
c. 実験用の Web サーバで実際に CGI プログラムとして動かし
デバッグする。
お好きな方法を。
>>345
{
my $name = 'ほげ';
print ...
}
{
my $name = 0;
...
}
0348nobodyさん
04/03/11 18:59ID:???今は
@temp = %hash;
push @temp, @_; #@_内は key1,value1,key2,value2 以下略
%hash = @temp;
undef(@temp); #気分的に
とやっているのですが、これを余分な変数を介さず
直接追加する方法は無いのでしょうか。
%hash .= @_;
とかやってみたのですが駄目でした。
0351nobodyさん
04/03/11 21:24ID:AiFNJNW+sendmailを使って、特定のアドレスにフォームの内容を送信したい。
2: それでこんな風にやってみたが・・・
CDRにあったスクリプトを、パスを適正にかえて用いた。
3: こんなエラーが出て上手く行かなかった。
メアドによっては成功する。メアドに'ne'を含むものは、演算子とみられるせいかダメ。\n\eとしてもダメ。
変数にいれてみてもダメでした。
成功するメアドは、変数操作でもうまくいきます。この板に来たのは初めてですが、失礼なことがあったらすいません。
よろしくおねがいします。
0352nobodyさん
04/03/11 22:07ID:???人の書いたやつを意味も分からずいじっただけなら、改造スレにでも行ってくれ。
0354nobodyさん
04/03/11 22:57ID:???くだー?
0355353
04/03/11 22:57ID:AiFNJNW+意味もわからずにいじってるわけではありません。じゃヒアドキュメントのところを。
$message = <<END_OF_MAIL;
To: *****.home.ne.jp
Subject:テスト
Reply-To: $in{"mail"}
<名前>
$in{"name"}
<アドレス>
$in{"mail"}
<感想>
$in{"comment"}
END_OF_MAIL
0356nobodyさん
04/03/11 22:59ID:???とりあえず「メアドによっては成功する」のなら"ne"が演算子と見られているという可能性はない。
もし以下のようにしているのなら、"@"をエスケープしていないのが原因かもしれない。
$mailaddress = "foo@bar.com"; # -> "foo\@bar.com" or 'foo@bar.com'
>>351の文面から*推測*できることはこのくらいだ。
>>353
消えろ
0358nobodyさん
04/03/11 23:05ID:???えーとですね、
「3:こんなエラーが出て上手く行かなかった」というのは、
「ダメだった」と書かれてもそれじゃどうしようもなく、
ダメだったときのエラーメッセージなりログなりを提出せよ、
と、そういうことなんです。
それがないと、何が起きているかわからない。
会社の後輩でも、毎回「まず error_log を見てから俺に相談しろ」と口を酸っぱくして言ってるのに
全然憶えないやつがいるんだけど、なんでみんなああなのかね。
0359353
04/03/11 23:08ID:AiFNJNW+おそれいります。
文字列'ne'を含まないアドレスについては、うまくいくという意味です。
@のエスケープに関しては、すべて行っています。
0361351
04/03/11 23:23ID:AiFNJNW+すいません。
言い忘れましたが、Tera Padというテキストエディタでみると、
'ne'のぶぶんがprintと同じようにボールド体で表示されるのです。
そこで、\n\eとしてみたところ、ボールド体ではなくなりましたが、それで実行すると、
文字列'ne'以下が省略されたかたちでメールが送られた、というメッセージがでました。
どう考えたらいいのでしょうか。
0362353
04/03/11 23:43ID:???0364nobodyさん
04/03/12 04:58ID:SsTHKK/b以下のようなときにもっといい方法無いでしょうか。
$str = '200402';
($year,$month) = (substr ($str,0,4),substr ($str,4,2));
0365nobodyさん
04/03/12 05:03ID:???Tera Pad云々ということはソースに直接メアド入れてるんでしょ?
その付近のソースを貼ったらわかるんじゃないの?
てかそのアドレスを代入した変数を正規表現でチェックしてる?
だとしたらそこがあやしいよーな
0367nobodyさん
04/03/12 05:26ID:???$str = '200402';
$str =~ /^(\d{4})(\d{2})$/;
print $y = $1;
print $m = $2;
0368nobodyさん
04/03/12 05:31ID:???>>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;
0370369
04/03/12 05:33ID:???0371364
04/03/12 05:36ID:???それだと弄る箇所がかなり多くなってしまうんで、
スマートに切り分ける方法があるのならな。と思って質問してみました。
やっぱり_で区切っておいてsplitの方がよさげなんで、そっちで行きます。
わざわざ有難うございました。
0373351
04/03/12 08:25ID:J1fEY9awmailtoに代入されたアドレスのうち、****\@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);
0374nobodyさん
04/03/12 09:21ID:???#$mailto = "****\@$jcom"; とかでも無理?
0375nobodyさん
04/03/12 11:25ID:S7woz7f4出したいのですが情報操作目的の、普通ではあり得ない価格報告を
平均価格を計算する時に使ってしまうと平均価格が狂ってしまうのでそれを避けたい
のですが良い計算方法が浮かびません。
10 + 20 + 20 + 30 / 4 = 20 #正常
10 + 20 + 20 + 3000 / 4 = 762.5 #異常
こういう事態を避けたいのです。
perlコーディングというより数学計算式の問題のような気もするのですが
該当スレが見つからなかったのでここに書かせて頂きました。
どなたかよいアドバイス頂けないでしょうか?
0376nobodyさん
04/03/12 11:46ID:???perlのコーディングの話ではないですね。
標準偏差使えばいいんじゃないかと思うけど、この板で話続けるなら
△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1078568723/
0379nobodyさん
04/03/12 12:14ID:???小数点第一位で四捨五入を行なうときには、
$hoge = int($hoge + 0.5);
とすれば整数部分のみが取得できますが、
小数点第二位で四捨五入を行なうときには、
($hoge + 0.05);
の他に、どのような記述を追加すればいいのでしょうか。
0380nobodyさん
04/03/12 12:47ID:???# パーセンテージを算出する
$percent = ($count / $total * 100);
print <<"EOF";
<IMG src="グラフ.gif" width="グラフの長さ" height="10"> $percent</TD>
EOF
こうある場合で、小数点第二位で四捨五入した値を$percentに表示したいのです。
0381nobodyさん
04/03/12 13:12ID:???0382nobodyさん
04/03/12 14:27ID:???再帰とかいろいろ調べてるのですが、いまいちでして。。
0383遙皇 ◆HEHARUKAoo
04/03/12 14:55ID:???皆さんが普段使っているものやおすすめのものを教えてください。
socketから書くの('A`)ノ マンドクセ
0385nobodyさん
04/03/12 15:19ID:???http://pc2.2ch.net/test/read.cgi/php/997829243/ あたりが妥当だろう
0387nobodyさん
04/03/12 16:38ID:???0388nobodyさん
04/03/12 16:54ID:???【PHP】質問スレッド Part15
http://pc2.2ch.net/test/read.cgi/php/1078592587/ あたりが妥当だろう
0389nobodyさん
04/03/12 17:13ID:???$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が代入されないようなのです。
何が悪いのでしょうか。
0390nobodyさん
04/03/12 17:24ID:???0392nobodyさん
04/03/12 19:48ID:???こんなでも動くけど。
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;
こうするのがいいっしょ。
0393nobodyさん
04/03/12 20:12ID:hneCqJMtWindows XPの場合cookieファイルはどこにあるんでしょうか?
98SEのときと保存の仕方が違うようなのです。
0394330
04/03/12 20:50ID:???いろいろ検索してみたのですが、'C'にも対応したコードがわかりません。
上記のコードはperlメモの写しなのですが、世間じゃ大概urlエンコードには
この方式を利用していますよね?手持ちの本も見てみたのですが、
これも'C'にはマッチしないものでした。
ということは大半のperlスクリプトに'気'を渡したら誤動作を起こすということでしょうか?
0395nobodyさん
04/03/12 21:03ID:???もうperlコーディングの話題じゃないわけだ。
お前は2chにアクセスするとき
http://%32%63%68%2e%6e%65%74/%32%63%68%2e%68%74%6d%6c
でアクセスする気か?
0397nobodyさん
04/03/12 21:32ID:???この書き方って、あんまり印象良くないね。
周知の事実なんだが、自分が、さも今発見したっていうか。
そんなもん、知らない方がおかしいっての。
98SEからPC触ってるんだったら、この何年、何やってたんだって話だよ。
少しは自分で調べることを覚えないとな。
いつまでたっても、初心者じゃカコワルイ。
0398nobodyさん
04/03/12 21:52ID:???-------------------------------------------------------
こ こ ま で 釣 り 堀
0399nobodyさん
04/03/12 22:00ID:???Perlコーディングと関係ない質問はスレ違いということで。
△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1078568723/l50
へどうぞ。
0400393
04/03/12 22:01ID:???そのクッキーファイルの保存状況を確認しようとしたら見つからなかったんです。
とりあえずcookieでCドライブに検索かけて
cookieがあるフォルダまでは到達して探してたんだけど
目的のファイルが見つからなくてもしかしたら別のフォルダもしくは
特殊な方法で保存してあるのかと思ったけどようやく発見しました。
0401nobodyさん
04/03/13 01:09ID:i+mpAF5R$logno = 1
$num = 2
$ext = ".txt"
だとして、$temp = "$logno_$num$ext" とすると 2.txt と帰ってきてしまいます。
手持ちの入門書(CGI&Perlポケットリファレンス)で見る限りはアンダーハイフンを
エスケープする必要があるという記述は見つけられないのですが、
$temp = "$logno\_$num$ext" としたらきちんと 1_2.txt と帰ってきました。
これはどういう理屈なのでしょうか。
0402nobodyさん
04/03/13 01:23ID:???0403nobodyさん
04/03/13 01:26ID:???${logno}_$num$ext
0405393
04/03/13 12:47ID:???0406nobodyさん
04/03/13 17:17ID:0t1k16srmy %NEW;
my $maxno
だと正常動作するのですが、
my %NEW,$maxno;
だと正常動作しません。
こういうもんなんでしょうか?
どっかで、こういう例を見たような気がするのですが・・・。
0409nobodyさん
04/03/13 20:27ID: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)ございます。
リスト希望の方は「リスト希望」のタイトルでメールください。
ご注文はここ→ chuumon@swissinfo.org
広告希望はコチラ kyohi@starline.ee
メール専門広告代理店 本気と書いて大マジっス!広告
0410nobodyさん
04/03/14 10:20ID:YQY2sb9a書いてみたのですが疑問があります。
use strict;
print "content-type: text/html\n\n";
print $a;
exit;
$aは宣言されていないのになぜかエラーがでません。
$abに変えるとエラーがでました。これはなぜなのでしょうか?
0411nobodyさん
04/03/14 10:23ID:???0412nobodyさん
04/03/14 10:30ID:YQY2sb9a0413nobodyさん
04/03/14 12:54ID:YQY2sb9a今作ってるBBSのタイトルや文字色などの設定はsetting.cgi
というものに書かれています。
$title = 'BBS';
$color = '#555555';
のように
それを呼び出して変数をセットしていたのですが、use strictを
使った場合はmainパッケージを指定して
$main::title
のようにしないとだめなのでしょうか?
使うたびにいちいち$main::
と記述するのが面倒なのですが・・・
0414nobodyさん
04/03/14 12:57ID:2Zg8YvJb>122 :root ★ :04/03/13 21:30 ID:???
>こっちにも貼っておこう。
>916 名前:root ★[sage] 投稿日:04/03/13 21:28 ID:???
>・同時に動くread.cgi数を制限するディレクティブorモジュール
>・負荷(LA)を見てCGI起動を制限するディレクティブモジュール
>
>があったら、誰か教えてください。
http://qb3.2ch.net/test/read.cgi/operate/1078921755/829
http://qb3.2ch.net/test/read.cgi/operate/1078921755/831
http://qb3.2ch.net/test/read.cgi/operate/1078921755/916
0418die($/);
04/03/14 14:24ID:ntUNbT3i気になって朝も起きれません
0419nobodyさん
04/03/14 14:43ID:???0420die($/)
04/03/14 14:48ID:ntUNbT3i0421nobodyさん
04/03/14 17:11ID:???0422nobodyさん
04/03/14 18:06ID:???既存のスクリプトを改造しているのですが、以下のようなことをしようと
思っています。
1)フォームより***.txtといったようなファイルを送信する
2)入力されたファイルを解析して結果を表示する
・・・というものです。
フォームにテキストそのものを書き込む方法ならその値を読み込む
方法なら簡単だと思うのですが・・・
フォーム入力から例えば***.txtというファイルを送信した場合に
これを一旦任意のディレクトリにアップロードして、スクリプト内で
ファイルをopenして処理する以外に方法はないのでしょうか?
0423413
04/03/14 19:33ID:MYhrucqause strict;
としたあとに、
my $val = 10;
print "Content-type: text/html\n\n";
print $val;
exit;
としたところ動きました。どうもありがとうございました。
0424nobodyさん
04/03/14 19:42ID:???>これを一旦任意のディレクトリにアップロードして、スクリプト内で
>ファイルをopenして処理する以外に方法はないのでしょうか?
どうもないらしい。少なくとも俺は知らん。
CGI.pmのドキュメントを読めばわかると思うが、
同じように一時ファイルに保存する分、それがセキュリティの穴になりうる可能性があるとのこと。
まあ、さっと保存してさっと処理してさっと消して、穴になる確率を極力減らす努力をしよう。
0425nobodyさん
04/03/14 19:45ID:wZU93kf10427422
04/03/14 20:14ID:???ありがとうございます。
必死にぐぐってみているのですが、どうもそれらしい資料が見当たらない
のはそういう理由なのでしょうね。
>>424さんいアドバイスいただいたようにセキュリティの穴を作らないよう
素直にテンポラリファイルを作って対処したいと思います。
何分perlの勉強を始めたばかりでわからないことばかりですがひとつひとつ
問題を乗り越えていきたいと思います。
どうもありがとうございました。
0428422
04/03/14 20:21ID:???考えていたのは送信したpostで受けたファイルをいちいち保存しないでそのまま
メモリ上に展開して解析、値を返す、、、ようなことを考えていました。
もっと精進します。
0429nobodyさん
04/03/14 22:25ID:???multipart を自力でデコードすれば原理的に不可能な話じゃないだろう
CGI.pm の man に書いてあるのは、
「CGI.pm はテンポラリファイルを作るので盗聴の恐れもあるんだよ」ということで、
本来はテンポラリファイルを作らず自力でデコードする方がセキュリティは高い。
なんだが、自力でデコードするのがめんどいので、
たいていみんな「盗聴されてもいいやー、どーせuploaderだしぃ」とか妥協して
CGI.pm に頼ってしまうわけだ。
自力でデコードするなら、
ttp://www.hk.airnet.ne.jp/~ahero/cgi/cgiex11.html
あたりを参考にしてみては。
0431nobodyさん
04/03/15 00:31ID:???それはともかく、アップローダーとかなら見られても問題ないが、
そうでないなら自力でデコードするべきということだな。
つーか何でCGI.pmが危険を承知でそんな設計になってるんだ?
0433nobodyさん
04/03/15 01:07ID:???0434nobodyさん
04/03/15 01:15ID:???外から不可視のディレクトリ内に作らせるようには出来ないのかい。
0435nobodyさん
04/03/15 01:37ID:???できるんだけど、その場合でも CGI プロセス自身からは見えないとまずいので、
そういうパーミッションのディレクトリにせざるを得ない。
で、suexec 使ってない apache だと、全ての CGI プロセスから丸見えってことだよね、
とかそういう話。
man CGI にも 「suexec にしる」 と書いてあるんだが、
mod_perl な人とかは suexec できないので辛いよな。
0436nobodyさん
04/03/15 02:14ID:???ファイルに書き込むときには使ったほうがいいんですかね?
いまいち必要かがわからないので誰か教えて…
0437nobodyさん
04/03/15 02:32ID:L0Oup+5/# 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ですが。。
0438422
04/03/15 02:40ID:???お礼が遅くなってスマソです。教えていただいたリンク先ですが。。。
当方にはまだまだ敷居が高そうですが、今後の参考にさせていただきます。
>>436
未熟者が語るようなことではありませんが、例えば1つのファイルに複数の
書き込みがあったとしたらどうなると思います?
何らかの制御をして順番を決めないと競合してファイルが壊れてしまうはずです。
そのためにロックして1つの書き込みを処理している間は他の書き込みをロック
して防ぐことでファイルの破損を防ぐ。。。ということだと解釈していますが。
諸先輩方、いかがでしょうか?
0440nobodyさん
04/03/15 02:55ID:???ファイルロックは書き込み処理の寸前にするのでしょうか?
またflock($fp,LOCK_UN);といった感じでロックを開放する処理も書き込み後行った方がいいのでしょうか?
0441422
04/03/15 03:17ID:???ありがとうございます。
>>440
ファイルをopenする前にロック、closeしてから開放しないと
ロックする意味がないと思われますが?
http://www.google.com/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E3%83%AD%E3%83%83%E3%82%AF+%E3%81%A8%E3%81%AF&sourceid=opera&num=0&ie=utf-8&oe=utf-8
で
http://216.239.53.104/search?q=cache:JjxLPe-vA5IJ:tohoho.wakusei.ne.jp/wwwcgi8.htm+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E3%83%AD%E3%83%83%E3%82%AF+%E3%81%A8%E3%81%AF&hl=ja&ie=UTF-8
のような感じでしょうか。
0443nobodyさん
04/03/15 04:19ID:???>440-441
基本的には「ロック > 処理 > アンロック」、
例えば一つのファイルを更新する場合は「ロック > 読み > 書き > アンロック」
の順番が守られていれば、open() はロックの先でも後でも良い。
#ロックの方法論は別の話
現に、flock() は以下のようにして使う。
open(FILE, 'file.dat');
flock(FILE, 2); # ロックは open() の後
..
#読み書き等の処理
..
flock(FILE, 8); # アンロック
close FILE; # そして close()
ロックスレは途中荒れてるが読んでみると良い。
0444nobodyさん
04/03/15 04:23ID:???0445nobodyさん
04/03/15 04:39ID:???ブラウザ依存だけどこんな感じのを吐けばいい。IEなら動く
Content-Type: application/octed-stream
Content-disposition: attachment; filename=xxx
0447nobodyさん
04/03/15 09:46ID:???同じ時間になってしまうことはあるのでしょうか。
$key = time(); こんな感じで。
0448nobodyさん
04/03/15 09:56ID:???0450nobodyさん
04/03/15 11:59ID:???line 27のハッシュの使い方がまずいようなのですが、いまいちわからず何が悪いのかわかりません。
環境はWinXP + Active Perl 5.6 + An HTTPDです。
0451nobodyさん
04/03/15 12:01ID:???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("ファイルサイズが大きすぎます"); }
}
0452nobodyさん
04/03/15 12:02ID:???$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;
0453450
04/03/15 12:24ID:???このソ−スではファイルの入力部分のhtmlが不足していました。
書き足したところ上手くできました。お騒がせしました
0454nobodyさん
04/03/15 13:47ID:L0Oup+5/おおお。うまくいました。ありがとうございます!
0455nobodyさん
04/03/15 15:01ID:gPR3Vlyr@number=("1","3","7","16",,,);
のように、まったく規則性が無い数値が大量に入っている配列があるのですが、
この中から最大値および最小値を取り出す場合、何かいい方法は無いでしょうか?
0457T.K
04/03/15 16:03ID:???sortを使う。
-----------
sort @number; #@numuberを並び替える
$max = $number[0];
$min = $number[$#number];
0458nobodyさん
04/03/15 16:20ID:???> 質問です。
> @number=("1","3","7","16");
> のように、まったく規則性が無い数値が
クオートしてたら文字列だろ、
@number=("1","3","7","16");
print ((sort@number)[-1]);# 7、と表示する。
0459458
04/03/15 16:31ID:???> >>455
> > 質問です。
> > @number=("1","3","7","16");
> > のように、まったく規則性が無い数値が
@number=("1","3","7","16");
print ((sort{$a <=> $b}@number)[-1]);# 16 と表示する
# 明示的に数値として比較する必要がある
0460nobodyさん
04/03/15 16:32ID:???sort{$a <=> $b}(@number);
0461450
04/03/15 16:41ID:???で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" を使用して下さい。
ということが書かれてありました。
原因はどうやらエンコードに問題があるようなのですが、この矛盾した状態でどうやったらファイルを
アップロードが正しくできるのでしょうか?
0462450
04/03/15 16:43ID:???multipart/form-data ではバイナリデータしか送れないことがわかったので、
application/x-www-form-urlencoded と変えました。
抜けていましたが、htmlファイルのフォームの記述のことです。
<FORM ACTION="./upload.cgi" ENCTYPE="application/x-www-form-urlencoded" METHOD="POST">
0463nobodyさん
04/03/15 17:00ID:???アップローダースレ
http://pc2.2ch.net/test/read.cgi/php/1022299892/
0464458
04/03/15 17:03ID:???LFなファイルをそんまま送ればいいじゃねえの?
俺なんかEUC-JP LFで作ってそんまま生で送ってるよ
asciiモードなんか使わない、めんどくさいし間違いの元
0465450
04/03/15 17:07ID:???CGI.pmに関することだからと思ってこちらに書き込ませてもらいましたが、
仰るとおりですね。スレ違い失礼しました。
>>464
どうもありがとうございます。試してみます。
0466nobodyさん
04/03/15 17:08ID:???0468nobodyさん
04/03/15 20:00ID:???use List::Util qw(max min);
...
my ($min, $max) = (min(@number), max(@number));
0469nobodyさん
04/03/15 21:41ID:???$url = 'ココ';
if ($url =~ m|http://*******.***/****/***/|) { print "含まれています"; }
else { print "含まれていません"; }
で出来るかなと思ったんですが、「ココ」を『今いるページのURI』という指定にしたいんですが、
どういう指定をすればいいんですか?
ちなみに、ここを参考にしました。
→ http://www.kent-web.com/perl/chap7.html
0470nobodyさん
04/03/15 22:11ID:???意味がわかんねえよ。
「今いるページのURI」ってなんなんだよ。
CGIでやってるなら、それはCGIを設置してるURIに固定だろ。
それともローカルで実行させるスクリプトのことか?
IEと連動させて、IEのアドレスバーの内容を読み取りたいってことか?
0471nobodyさん
04/03/15 22:16ID:???0472nobodyさん
04/03/15 22:25ID:???……そうなの?
"http://$ENV{HTTP_HOST}$ENV{REQUEST_URI}"
で、確かにリクエストされたCGIのURIになるけど、けどしかし、それがどうしたんだろうか、と。
0473nobodyさん
04/03/15 22:33ID:c+xa9RILs/[0-9]*.[0-9]*.[0-9]*.[0-9]\/[0-9]*/置換したい文字列 と書きました。しかし一部
134.置換した文字列 という風にアドレスが一部残ってしまいます。
色々正規表現を変えてみたのですが、うまくいかず困ってます。
というか、やはり上の書き方がわるいのでしょうか・・・?
0474469
04/03/15 22:38ID:???if ($url =~ m|http://**********.net/|) {
print "含まれています";
} else {
print "含まれていません";
}
これで出来ました!
>>470さん>>471さん>>472さんありがとうございました!
0475nobodyさん
04/03/15 22:39ID:???$ip =~ s/\d+\.\d+\.\d+\.\d+\/?\d*/$replace/;
こうじゃねえの?
[0-9]とするよりは、\dを使った方が専用の仕組みを使っている分速い(らしい。ベンチとったことない)
*だと、直前の文字が0個でも引っかかる。ので、必ず数値があるのがわかっている場合は、+を使う。これなら1文字以上の意味になる。
.は「任意の文字」つまり「なんでもいいから一文字」の意味になるので、ドットの意味で使う時はエスケープ(\.)する。
つか、正規表現を勉強しなおすか、正規表現スレに行ってくれんか?
0478nobodyさん
04/03/16 00:15ID:???ええ、負け惜しみですよ
0479nobodyさん
04/03/16 01:03ID:N9sS5GGBtaro<>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でソートしてファイルを書き換えたいのですが、
簡単にできる関数ってありませんか?
自分で作るしかない?
0480nobodyさん
04/03/16 01:17ID:???0481nobodyさん
04/03/16 01:17ID:???データの持ち方が変、だと思う。
そのデータなら、
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";
}
現在のデータ形式にこだわりたいのならば、色々方法は思いつくけど、
面倒臭くてバグが入り込みやすいのでオススメできない。
0482479
04/03/16 01:21ID:???丁寧にありがとうごじゃいます。
ご指導の通りその方法でやってみます!thx!
(´-`).。oO(コードの他のところに影響出るんだろうなぁ。。。
0483nobodyさん
04/03/16 01:28ID:???$query =~ tr/&=/\0/;
$query =~ s/%([a-fA-F0-9]{2})/pack("C", hex($1))/eg;
%in = split(/\0/,$query);
じゃ駄目ですか?
0484nobodyさん
04/03/16 01:37ID:???あー。7行プログラミングスレで出てきたねー、それ。
その方法だと、
<input type="text" name="name">
<input type="text" name="name">
このように同じname属性を持つフォームが複数あった場合、
競合してどれか一つの値のみになってしまう。
それを覚悟の上ならば、別に問題はないと思う。
0485481
04/03/16 01:39ID:???foreach $user ( @user ) {
print FILEHANDLE join(/<>/, map { $user->{$_} } qw ( name pts memo ));
print FILEHANDLE "\n";
}
# split と join じゃ正反対だっての……_| ̄|○
0486479
04/03/16 02:01ID:???ノ|)
_| ̄|○ <し
0488nobodyさん
04/03/16 09:11ID:???ログからデータを読み出すときに、
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]";
以下処理
}
のように配列に突っ込んでその中身を見るほうが速かったりしますか?
0490nobodyさん
04/03/16 11:04ID:???Googleで
Perl ベンチ
とかで調べてみたのですけど、よくわかりません。
0492nobodyさん
04/03/16 11:32ID:???普通に考えて
わざわざ配列にsplitで切って突っ込んで
また配列から切り読みするよりかは
変数決めた方が早いっしょ?
しかし、100万ループくらいさせて
微妙にベンチに差が出る程度かと
0494nobodyさん
04/03/16 11:55ID:bxdLayrhmy @aParamlist = &get_aParamlist($hoge);
sub get_aParamlist{
my $strhtmlbody = shift;
(中略)
return @aParamlist;
}
配列の変数@hogeを渡すときはどのようにすればいいのでしょうか?
my @aParamlist = &get_aParamlist(\@hoge);
のように参照渡しというのをやることはわかったのですが、
my $strhtmlbody = shift;
に該当する、変数@hogeを受け取る部分の書き方がわかりません。
どなたか教えていただければ幸いです。
0495494
04/03/16 12:01ID:bxdLayrhmy @$aParamlist = shift;
とやることはわかったのですが、
この配列の最後の要素はどうやって取得するのでしょうか?
(普通なら$#ARRAYとやるところ)
0496458
04/03/16 12:13ID:???> すいません。
> my @$aParamlist = shift;
>
> とやることはわかったのですが、
> この配列の最後の要素はどうやって取得するのでしょうか?
> (普通なら$#ARRAYとやるところ)
普通に考えてやってみれ
0497494
04/03/16 12:19ID:bxdLayrhmy $aParamlist = shift;
print $#$aParamlist;
0498nobodyさん
04/03/16 12:23ID:???単に最後の要素を取得したいだけだったら
$$aParamlist[-1] でも良いような。
0499nobodyさん
04/03/16 12:29ID:???もうそういう質問はスルーでいんじゃね?
0500nobodyさん
04/03/16 13:07ID:???0501nobodyさん
04/03/16 13:57ID:cS+tmipmあるモジュールをインストールして上記の行でエラーが出ます。
perlのバージョンが古い為にqr<>記法に対応していない為と思われますが、
どんな書き方に改めれば大丈夫ですか?
またそれに伴って$Addr_spec_reを使ってる正規表現の箇所にも変更必要なら
教えていただけませんか?
いろいろ調べたのですがよくわかりませんでした。
0502501
04/03/16 14:11ID:???普通に
$Addr_spec_re = qq<$local_part\@$domain>;
ってクオートしちゃいました。
コンパイル済みにならない、ってだけですよね。
0503nobodyさん
04/03/16 14:36ID:DnhEtv1I( 人____)
|ミ/ ー◎-◎-)
(6 (_ _) )
_|/ ∴ ノ 3 ノ
(__/\_____ノ_←クソスレ立てた>>1
/ (__)) ))| |
[]__ | | 鋼錬命ヽ | |
|] | |______)_)
\_.(__)三三三[国])
/(_)\::::::::::::::::::::|
|Sofmap..|:::::::::/:::::/
|____|;;;;;;/;;;;;/.
(___|)__|)
0504nobodyさん
04/03/16 14:37ID:DnhEtv1I/::::::::スーパーアニオタ\〜プーン
|::::::::::::::::::| 持た猿|〜プーン ←>>1
|;;;;;;;;;;ノ∪ \,) ,,/ ヽ〜
|::( 6∪ ー─◎─◎ )〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|ノ (∵∴ ( o o)∴)〜 < PERLPERL!!
| ∪< ∵∵ 3 ∵> ムッキー! \___________
\ ⌒ ノ_____
\_____/ | | ̄ ̄\ \
___/ \ | | | ̄ ̄|
|:::::::/ \___ | \| | |__|
|:::::::| \____|つ⊂|__|__/ /
|:::::/ | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
カタカタカタカタ
0505nobodyさん
04/03/16 14:37ID: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
0506nobodyさん
04/03/16 14:38ID:DnhEtv1I/( / ( /i / ̄ ̄ ̄ ̄ ̄
( ヽ、 { ∧__∧ ( ( < キック2分の1に勝てるとでも?
)ヽ`ー、 \ ( ´_ゝ`) ノ ) \_____
( \ ) ) / <__イ //⌒,フ
/⌒`ヽ、`( ( ⌒ヽヘ、フへ' /~ ,、
i/⌒\ ヽ ヽ \ヘしヘ_ノ ノ/ ⌒`ー' )
ヽ `〜⌒> ゝ--イ⌒ /⌒`ー'~
八 `フ⌒ヘ/ |へイ
( `ー'~ ,へ{ _ノ |ヘ、 ヽ _ノ )
`ー―'' ~ | / / ヽ_ノ
| / /
( ) )
| | イ
| |. |
/ |ヘ\
∠/  ̄
0507nobodyさん
04/03/16 14:39ID:DnhEtv1I/ミミミヾヾヽ、_
∠ヾヾヾヾヾヾjj┴彡ニヽ
/ , -ー‐'"´´´ ヾ.三ヽ
,' / ヾ三ヽ
j | スミス / }ミ i
| | / /ミ !
} | r、 l ゙iミ __」 何か不愉快か?アソダーンソ君
|]ムヽ、_ __∠二、__,ィ|/ ィ }
| ◎  ̄`ミl==r'´ ◎ / |lぅ lj
「!ヽ、_____j ヽ、_ -' レ'r'/
`! j ヽ j_ノ
', ヽU_ U┘ ,i
ヽ ___'...__ i ハ__
ヽ ゙二二 ` ,' // 八
ヽ /'´ / ヽ
|ヽ、__, '´ / / \
0508nobodyさん
04/03/16 14:40ID:DnhEtv1I( ⌒) ∩_ _ /
\ /,. ノ i .,,E) /
\ / @@@ / /" /
\ / / _、_ @ / ノ' /
\\ あんたら\ (. ノ` )/ /.|@@@
\\\ @@@ \.∧∧∧∧/ |#_、_ @
(⌒\@# _、_@ < 母 > | ノ` ) PERLばっか
\ ヽヽ( ノ`) < 者 > |. ^ やってないで
(mJ ^ ⌒\ < の > と )
─────────< 予 >───────────
@@@ < 感 > @@@ OK。,;⌒⌒i.
@#_、_ @ < !!! > @#_、_ @⌒ヽ( ;;;;;)
( ノ`) /∨∨∨∨\ ( ノ`) と)
/|| ^ ||\. / @@@ \ /⌒ ^ | |.| |/ |;,ノ
〈|゚ ̄ ゚̄| トントン./ @ _、_ @. \ イ ( )| / .,i
ヽii__リ / / ( ノ` ) 私の \ / V ̄V | | ,,i;
._ヽ||)とノ ̄/ / ^ \ 時代が \ \,,,丶, | |,,,;
.ililili二l/ / / ̄ ̄ ̄ ̄/ .\ \ ,,
__(__ニつ/ FMV /__
\/____/
0509nobodyさん
04/03/16 14:41ID: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:.:./ /、| |:.::',
0510nobodyさん
04/03/16 14:42ID:DnhEtv1I___
/ \ ________
/ ∧ ∧ \ /
| ・ ・ | < さぁてパソコンしか脳のないPERLでも作るか
| )●( | \________
\ ー ノ
\____/
/ \
| \ ____
| \ \ // //
| \ \ // //
| \ \ // //
| \ ○―――――)
| | ̄ ̄ ̄ ̄匚 ̄ ̄ ̄ ̄ ̄|
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄
0511nobodyさん
04/03/16 14:43ID:DnhEtv1I/ ヾ''" ~`ヽ
/ _,,,... ヽ;: /""ヽ ヽ
/ ;'" "\ l /;:;;:::-'''ヽ, i
/ /::::::::-'''''"~ ヽ, .|
/ /;:;;:::''' ヽ ヽ
| | ヽ |
/ ;/ 、 ,/ ヽ i,
/ ;:;:ヽ \, / ヽ i,
i / )( \, 、 ,/ , ヽ ヽ
| | ⌒ ,,___\l,::,l/___| |
| |. ー-ゞ'-'">><ー-ゞ'-'"'| |
| ;:| '""^ 、 | |
| ヽ. ゝ( ,-、 ,:‐、) | |
| /ヾ.. / ヽ | |
| | ./ゝ二ニニニニ二、 | |
.. | `、ヽ へ"\┼┼┼ノ/ / |
| ヽ\ `\ ̄ ̄ ̄ノ / |
| l `ー-::、_ " ̄ ̄" ,,..'|ヽ./
ヽ. :人 /`ー――''''' /
/;:;:;:;;:;:;: _/
わ し の パンチ5分の2をくらっておい で
何 さ ら し と ん じ ゃ キ サ マ ラ
0512nobodyさん
04/03/16 14:46ID:???0513nobodyさん
04/03/16 15:35ID:???0514nobodyさん
04/03/16 15:41ID:???0516nobodyさん
04/03/16 16:45ID:VuQW4BOKHP宣伝掲示板を設置しているのですが、
何度もしつこく投稿してくるサイトのURLを
拒否設定にして、「そのURLは投稿できませんよ」
と、表示させているのですがしつこく登録を試みてきます。
で、拒否表示ではなく、ロケーションなどを使って
空白のページに飛ばすか、500エラーを返すか
どっちが効果的か悩んでいるのですが、
皆さんはこういう場合、どうされますか?
0517487
04/03/16 17:24ID:???$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倍以上早かった。
日本語だったりするともっと差が出そうだ。
データの取り方はこんな感じでいいですか。
0521517
04/03/16 20:10ID:???データはたくさん取りましたが。
0523nobodyさん
04/03/16 22:15ID:???SDBM, GDBM など色々あって正直何を使えばいいのかわかりません…。
それぞれのメリットデメリットは何があるのでしょうか?
試しに、SDBM, GDBM を使ってみたところ、
SDBM は pag と dir ファイルが生成されて、ファイルサイズは 1024 バイト。
GDBM は、ファイル名を指定できて、ファイルサイズは何もデータが入っていなくても 12288 バイトのものができました。
GDBM についてはデータを増やすと、それに比例してファイルサイズも増えていくみたいです。(12288バイト以下には絶対ならない)
これって、ちょっとしたデータに使う場合は、GDBMだと毎回10Kくらいのファイルが作られちゃうってことなのでしょうか?
また、SDBMは、1KB以上のデータは扱えないのでしょうか?扱うとどうなるのでしょうか?
Perl のバージョンは5.6、OSはLinuxです。
0524nobodyさん
04/03/16 22:41ID:???http://perldoc.com/perl5.8.0/lib/AnyDBM_File.html
http://perldoc.jp/docs/modules/BerkeleyDB-0.20/BerkeleyDB.pod
個人的には、多機能で制限の少ない DB_File をよく使う。
レコードサイズが 1KB で充分で、どんなサーバで使うか
分からないような時は使える可能性が高い SDBM を選ぶ。
0525523
04/03/16 22:53ID:GOniTDMIレスありがとう。
DB_File がなんとなくよさそうな気がしてきました。
(比較表が抽象的でいまいちわかりませんでした…)
それと、DBMファイルは全部ロック機能はサポートしているのでしょうか?
GDBM は自動で flock がかかると聞いたことがありますが。。。
0526nobodyさん
04/03/17 04:19ID:???ご存じの方がいましたら教えていただきたいのですが。
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に対してどう初期化を
行えば良いのか、解決策を探すことができませんでした。
この問題の解決方法をどなかたご教授下さい。
0527nobodyさん
04/03/17 06:34ID:???if (defined $ENV{REQUEST_METHOD} && $ENV{REQUEST_METHOD} eq 'POST'){
0528nobodyさん
04/03/17 08:37ID:???perlのソートを使おうとしているんですが、微妙に意味が分からない事になりました。
sort {$a <=> $b} @aaa;
数字を並べる時、この書きかたが一般的だと思うのですが、
$aと$bってなんでしょう。
「イツのまに、なにが代入されたのでしょうか?」←これが質問1。
で、実際のソートは、返ってくる数字「-1」「0」「1」の三種類によってsortが返すリストの順番だと思ったのですが、
「それは正解ですか?」←質問2
もし、正解ならば「-1」「0」「1」の三種類が発生する形式ならば可能ですか?
それとも、必ず「$a」「$b」を使うような形式にする必要がありますか?←質問3
詰まる所、$aと$bの中身がよく分からないので、sort自体がよく分からない物になってしまってます。
m(__)m
0529nobodyさん
04/03/17 08:49ID:???@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
としたいのですが可能でしょうか。
0530nobodyさん
04/03/17 09:29ID:???書籍やインターネットでやり方を調べていく中で、次のような
注意事項が記載しているものを見つけました。
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にする)というものです。
自分の環境下の簡単なプログラム中では問題なく
動いているのですが、本当に注意すべき内容なのでしょうか?
0531nobodyさん
04/03/17 10:03ID:???こっちはあんたの質問がよく分からんよ…
物凄く簡単に言うと、リストから2つ取り出して$a、$bに代入されて { } 内を呼び出すというのを
何回も繰り返すのがsortの基本動作。
$a、$bってのはこの名前で決まってるから変更できない。
{ } 内では -1、0、1 のどれかを返しさえすればどんな式だっていい。
$a、$bを参照しなくてもかまわないけど、それじゃソートを使う意味がまったくない。
0532nobodyさん
04/03/17 10:20ID:???http://perldoc.com/perl5.8.0/pod/func/sort.html
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_sort_SUBNAME_LIST
>>529
http://perldoc.com/perl5.8.0/pod/func/split.html
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_split__PATTERN__EXPR_LIMIT
>>530
http://pc2.2ch.net/test/read.cgi/php/1015943725/
0534199☆
04/03/17 11:00ID:???エラー、ファイルが開けませんって出ます。
助けてください
0535nobodyさん
04/03/17 11:13ID:???@list = (A,B,C,D,E,F);
ってのがあって
EとFだけ取り出して別の配列に入れたい
場合ってのはどうやってやればいいんでしょうか
0536nobodyさん
04/03/17 11:16ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/3.htm
0537nobodyさん
04/03/17 11:27ID:???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) の部分はどうやって書くもんなのでしょうか?
0538nobodyさん
04/03/17 11:35ID:8yt30+/4foreach(@data) {
if($_ eq ("E" || "F")) {
push(@tmp,$_); next;
}
push(@new,$_);
}
print @tmp;
print @new;
0539501
04/03/17 11:39ID:???> てっいうスクリプトがあるんですが、
ホントか?あるのか?
@hash{"element1"}って何表わしてる?
ホント動いた?
> $i<= (@hash{"element1"} -1) の部分はどうやって書くもんなのでしょうか?
$i < @{$hash{"element1"}}
0540nobodyさん
04/03/17 11:39ID:8yt30+/4foreach(@list) {
if(($_ eq "E") || ($_ eq "F")) {
push(@tmp,$_); next;
}
push(@new,$_);
}
0541nobodyさん
04/03/17 11:41ID:8yt30+/4$_の値がEもしくはFだったら
というifの書き方だけど
if(($_ eq "E") || ($_ eq "F"))
以外にいい方法ない?
0542nobodyさん
04/03/17 11:44ID:???亀レスでスマソ
http://216.239.53.104/search?q=cache:xeL-yvLnImUJ:member.nifty.ne.jp/hippo2000/perltips/Cgi.htm+cgi.pm+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%80%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA&hl=ja&ie=UTF-8
-private_tempfiles
CGI.pmはアップロードされたファイルを処理することができます。
通常、アップロードされたファイルはテンポラリ・ディレクトリに
スプールされ、処理が終ると削除されます。
しかし、これには「ファイル・アップロード」セクションでも説明
しているように盗聴の危険性があります。
それが秘密の情報であっても、アップロードの途中に他のCGIスクリプト
の作者が覗き見ることができます。
UNIXシステムでは、-private_tempfilesプラグマは、テンポラリ・ファイル
を開かれると、何かデータが書込まれる前に、すぐに削除されるようにします。
これにより盗聴の危険性を減らしますが、完全ではなりません。
(まだ潜在的に可能な状態です)アタッカーに厳しく対応するためには、
プログラムは一時ファイル名をやって来たHTTTPヘッダの32ビットチェックサム
を計算することで選択します。
0543nobodyさん
04/03/17 11:45ID:???続き〜
一時ファイルが他のCGIスクリプトが読むことが出来ないことを保証するには、
スクリプトを実行するためにsuEXEC または CGI ラッパを使ってください。
一時ファイルはモード 0600(ワールドもグループも読むことが出来ない)で
作成されます。
一時ディレクトリは以下のアルゴリズムを使って選択されます:
1. 現在のユーザ(例えば"nobody")がホーム・ディレクトリに"tmp"と
いうディレクトリを持っていれば、それを使います(Unixシステムのみ)
2. 環境変数TMPDIRがあれば、示された場所を使います
3. そうでなければ、以下の場所を当たります /usr/tmp, /var/tmp, C:\temp,
/tmp, /temp, ::Temporary Items, and \WWW_ROOT.
それぞれの場所はそれがディレクトリであるか、書きこみ可能かをチェックされます。そうでなければアルゴリズムは次の選択を挑戦します。
0544nobodyさん
04/03/17 11:46ID:???> if(($_ eq "E") || ($_ eq "F"))
foreach $list(@list) {
if(grep{$list eq $_ }qw(E F)) {
push(@tmp,); next;
}
push(@new,$list);
}
比較対照を動的にできる
0546nobodyさん
04/03/17 11:48ID:???0547nobodyさん
04/03/17 12:00ID:???($values[0], $values[1], ・・・・ $values[8]) = split(/■/, $aiueo);
0548nobodyさん
04/03/17 12:05ID:???についてお聞きしていいでしょうか。
一方は自分の所有するレンタルサーバーで、すでに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が受け取り、表示する
という流れなのですが・・・・・・
0549548
04/03/17 12:05ID:???上のAの所が方法がわからず、
readdat.cgi内で
open(LDAT, "<http://rentalhost/showlog.cgi") || die "file open error!";
while(my $line = <LDAT>) {
print $line;
}
close(LDAT);
としてみたのですがうまくいきませんでした。外部のサーバーのものに限らず、
「CGI内でCGIにアクセス」というのはどう実現するものなのでしょうか?
質問が長くなって申し訳ないのですが、ヒントだけでもよいのでどなたかお願いします。
0550nobodyさん
04/03/17 12:06ID:???0551nobodyさん
04/03/17 12:13ID:???@iswebのreaddat.cgiにアクセス
Aiswebのreaddat.cgiがshowdat.cgiを叩く
Bレンタル鯖のshowdat.cgiがlog.datの内容を整形してそいつをGET/POSTでreaddat.cgiを叩く
Cパラメータ受け取ってiswebのreaddat.cgiが表示する
だろな
0552nobodyさん
04/03/17 12:32ID:???0553548
04/03/17 12:39ID:???まさにそれです、
>GET/POSTでreaddat.cgiを叩く
この部分が方法がわからず困っています・・・
iswebのフォームからaction=http://rentalhost/showlog.cgiとする手もあるのですが、
一度isweb内の独自のCGIに通して追加処理をしてから表示させたいのです。。
使う関数名だけでもいいので、教えていただけないでしょうか。
>>550552
ネタではないです・・・。
0554nobodyさん
04/03/17 12:39ID:???0555nobodyさん
04/03/17 12:40ID:???0556nobodyさん
04/03/17 12:45ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o
0557nobodyさん
04/03/17 12:55ID:???実際に動かせる鯖はかなり限られると言うのに。
0558nobodyさん
04/03/17 13:06ID:???@iswebのreaddat.cgiにアクセス
Aiswebのreaddat.cgiが空フレームを作りそこにshowdat.cgiを表示
どだ?
あ、という事はreaddat.htmlでいいじゃん
0559548
04/03/17 13:41ID:???どうもです。しかしフレーム内に表示させるだけでなく、
受け取ったデータをisweb側のCGIで追加処理させたいのです。。
>>555
LWPはソケット通信のモジュールだったでしょうか。
POST/GETについて調べていて今、
ttp://tohoho.wakusei.ne.jp/lng/200003/00030338.htm
というのを見つけたのですが、>>551にあるGET/POSTもソケットが前提だとすると、
方法はソケットに限るという事になるでしょうか・・・
0560nobodyさん
04/03/17 14:04ID:???0561t
04/03/17 14:09ID:???0562nobodyさん
04/03/17 14:44ID:???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;
}
0563nobodyさん
04/03/17 15:33ID:???else { print_error($!); }
#perlって括弧なしで書けたっけ?
0564nobodyさん
04/03/17 15:46ID:???そう書くならmyopenでtrueなりfalseなりを返さないといかんのでは?
0565nobodyさん
04/03/17 16:50ID: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/
でアクセスするとクッキー及びセッションが発行されません。
これは、パスの設定の仕方が悪いのでしょうか?
0567965
04/03/17 18:35ID:???うう・・すみません
混乱から醒めて、冷静に見たら関係ないですね。。
よく見たら初心者質問スレってのがあったので、移動します。
失礼しました。
0568nobodyさん
04/03/17 20:20ID:???>>534
放置されてるのはわかってるんだが、一言だけ。
「二度と来るな」
まあ、それだけじゃアレなんで。
「作った奴に聞け」
0569nobodyさん
04/03/17 23:23ID:???@values = grep{ $_ ne '■' } split(/(■)/, $aiueo);
>>541
(・ε・)キニシナイ!!
0574nobodyさん
04/03/18 10:13ID:imQmJK7bnumber<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でチェックすると怒られます。
こういう場合はどのように記述したらいいのでしょうか?
0575nobodyさん
04/03/18 10:23ID:???でよろし
0578nobodyさん
04/03/18 11:46ID:DQQyLTpV($num, undef, undef, undef) = split...
でもok
0579nobodyさん
04/03/18 12:39ID:???ご親切に有難うございます。
$mail = (split(/\t/,$temp))[2];
($num, undef, undef, undef) = split...
どちらも便利そうな使い方なので、よく覚えておきます。
0581nobodyさん
04/03/18 14:01ID:???0582nobodyさん
04/03/18 14:05ID:???0583nobodyさん
04/03/18 14:43ID:???こ こ ま で 春
--------------------------
0585nobodyさん
04/03/18 16:36ID:imQmJK7bプププププ
0586nobodyさん
04/03/18 19:10ID:LItTEfZFプププププヴァーカ
0587nobodyさん
04/03/18 20:03ID:msXg0fxAプゲラゲラッチョ( ´,_ゝ`)
0588nobodyさん
04/03/18 20:57ID:???0589nobodyさん
04/03/18 21:09ID:???splitの第3引数をきちんと設定すると余計な処理が減るからサーバーに優しい。
数が明確なら第3引数をしっかり渡す事を勧める。
0590nobodyさん
04/03/18 21:17ID:???>余計な処理が減るから
すまん、解説キボンヌ。
$mail = (split(/\t/,$temp))[2];
(undef, undef, $mail, undef) = split(/\t/,$temp);
これでも下のコードのほうがいいってこと?
0591nobodyさん
04/03/18 21:25ID:???なんのこっちゃ。
$mail = (split(/\t/, $temp, 4))[2];
の様にすれば良いってだけかと。
第三引数に最大分割数を指定できるって話ね。
0592577
04/03/18 21:26ID:???> これでも下のコードのほうがいいってこと?
splitの第三引数、って言ってるじゃん
$mail = (split(/\t/,$temp,4))[2];
(undef, undef, $mail, undef) = split(/\t/,$temp,4);
だよ
分けるのは四つだ、と明示できるなら明示せよ、ということ
0593nobodyさん
04/03/18 21:26ID:???第「3」引数。
$mail = (split(/\t/,$temp,4))[2];
こうすると、splitは4分割で処理を終了する。
全ての場合で早くなるとは限らないが、ほぼ全ての状況で早くなる。
まぁ>574みたいに確実に行の戦闘にあるなら、substringとindex使った方が速いんだろうが。
0594nobodyさん
04/03/18 21:36ID:???0595nobodyさん
04/03/18 21:42ID:???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;
}
0596nobodyさん
04/03/18 21:42ID:???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)
正規表現も使い方次第で速くなるのな。
0597nobodyさん
04/03/18 22:25ID:???今自分がやっているのはログをsplitで分割するだけなので、
「この行を全部タブがある部分で区切れ」よりも、
一行に存在するタブで区切られたデータの個数はわかっているので、
「この行にはタブで区切られたデータが4つあるから4つに区切れ」というように、
指定可能ならばsplitの第三引数を渡した方がいいということですね。
0598nobodyさん
04/03/18 22:47ID:???貴殿には「詳説 正規表現 (オライリー)」を薦める
0600nobodyさん
04/03/18 22:52ID:???そのままhoge.txtにprintするのって危ないですか?
ファイル名は time() の値にする予定です。
0602nobodyさん
04/03/18 23:34ID:???フォームから入力した文字列をjcode.plでsjisに変換したものを
$text として、
$file = time().'.txt';
open(FILE, ">$file") || error('open error');
print FILE $text;
close(FILE);
とする予定です。
ファイル名を決める部分を'.html'にするとブラクラやウイルスなどの危険性があるので
'.txt'としたのですが、'.txt'にしてもやはりウイルスなどの危険性があるのでしょうか。
0603nobodyさん
04/03/18 23:40ID:v217X1kZ0604nobodyさん
04/03/18 23:45ID:???0605nobodyさん
04/03/18 23:47ID:???サニタイズの話なのか、ファイル名の話なのか。
HTMLを解釈するブラウザでそのまま開くつもりなら、
<と>を実体参照に置き換えるのが手軽。
コーディング方法としては単純で、単純にs///で置き換えれば良い。
ファイル名なんてのはそんなの好きにすれば良いと思うってかここで聞く事じゃない。
拡張子なんてどうでも良い。ファイルの中身が問題だろう。
#質問内容とは違うけどtime()だと同時投稿されるとファイル名が被るという問題が
公開しない、自分が読むためだけのコメント投稿フォームでも作ってるのか?
0607nobodyさん
04/03/18 23:58ID:???HTMLタグが含まれるだけで、HTMLとして表示してくれるよ。
0608nobodyさん
04/03/18 23:59ID:???テキスト投稿CGIを作ろうとしています。
投稿者がテキストを投稿したら、time().txtで保存、
同時にindex.htmlにテキストへのリンクを付け足す、という流れです。
普通の掲示板の場合<と>の置換をしていたのですが、
txtの場合実体参照などがそのまま>などと表示されるので、
置換作業は一切行わないことにしました。
ですが、やはりtxtを表示するのもブラウザである以上、
悪意を持った何者かが何か細工すればブラクラ程度に機能してしまうのでは、
と不安になり質問しました。
0609nobodyさん
04/03/19 00:11ID:???ということはブラクラなどを仕込もうと思えば幾らでも仕込めちゃうってことですね……。
なんとかhtmlで保存してみます。
#なかなか書き込めない…´Д`ナジェディス
0610nobodyさん
04/03/19 01:04ID:koDF+TRW郵便番号の - を除くプログラムが出てきますた
$_ = "123-1234";
s/(\d\d\d)-?(\d\d\d\d)/$1$2/;
?の意味って何ですか?
?がなくとも同じ結果が得られると思うのですが。
0613nobodyさん
04/03/19 03:57ID:KxdLBMtCサンクス
0614nobodyさん
04/03/19 08:52ID:???0615nobodyさん
04/03/19 13:29ID:3UeG122v検索結果を表示するときに、Googleみたく検索キーワードを強調表示し、
さらにその前後の文字列を含めて切り抜いているのを実装したいのですが、
どのようにすればよいでしょうか。
たとえば、
「私はりんごが好きで、あなたはみかんが好きで、二人はバナナが好きです」
を「りんご バナナ」で検索した際、検索結果には
「私は<em>りんご</em>が好きで、あ...で、二人は<em>バナナ</em>が好きです」
という感じにしたいです。前後五文字を切り抜いています。
これだけならなんとかなりそうですが、「あなた みかん」で検索したときに
「...が好きで、<em>あなた</em>は<em>みかん</em>が好きで、二...」というように
切り抜き範囲に別なキーワードがさらに見つかった場合などを考えるといい方法が浮かびません。
0616615
04/03/19 13:36ID:???検索して見つかった文章は$textに入っていて、検索キーワードは@keywordsに配列で入っています。
foreach $keyword(@keywords){
$text =~ s/(.*)($keyword)(.*)/substr($1,-10)<em>$2<\/em>substr($1,10)/eg;
}
こんな感じのを考えていましたが、いろんな場合を考えるとイマイチなのは先ほど書いたとおりです。
0617nobodyさん
04/03/19 14:32ID:???ここはコーディングスレ。
>「...が好きで、<em>あなた</em>は<em>みかん</em>が好きで、二...」
これの何がイヤなのか知らんが、どうしたいか仕様ぐらい考えてから来い。
0618615
04/03/19 15:37ID:???すいません、イヤなんじゃなく、むしろそうしたいんです・・・。
基本的には、前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;
それっぽいだけで、これではあちこち不備があるようです。
文章内で複数ヒットしたときにキーワードより前が切り抜かれなかったりしてます。
0619nobodyさん
04/03/19 16:16ID:???「アルゴリズム+データ構造=プログラミング」という古い格言に従って、
コードを書く前にまずどういうアルゴリズムで実現するか考えてみるべきだろう。
一例だが、以下のようなアルゴリズムが考えられる。
1. ヒットした文字列の部分にマークをつける
2. その前後5文字にもマークをつける
3. 非マーク部分を削除しつつ、マーク/非マークの境界に "..." を挿入
これをコードに落とすときはどうするかと言うと、
配列をマーク用に用意し、文字と配列要素を1対1に対応させて、
キーワードの出現位置を index で検出し、その前後の配列要素を1にして、
全部検出終わったら、次は配列を前から舐めてって1のところと0のところを…
みたいな感じ。
0620615
04/03/19 17:14ID:???行数制限に引っかかるので省略記法で書いてます。
あとは半角文字が含まれた場合の対応と、この強引なコーディングをもう少しスマートにしたいです。
ポイントをご教授いただければ幸いです。
$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;
}
0621nobodyさん
04/03/19 17:16ID:???キーワードに<em></em>を付けた後、
</em>(もしくは文頭)〜<em>(もしくは文末)の〜が11文字以上あった場合間を...に置換、
ではどうだろうか?
0622615
04/03/19 17:40ID:???書いてみたら意外に難しかったです。
しかも正しく動いてないっぽい・・・。
</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/;
}
}
0623nobodyさん
04/03/19 19:34ID:???$diary{"order"} = "nm";
$diary{"order"} =~ s/$writer//e;
この様なスクリプトを書きました。
ローカルで実行すると
$diary{"order"} = "m";
と意図した動作をしたのですが,サーバにアップするとこのような動作をしません。
これは何でなのでしょうか
0624623
04/03/19 19:37ID:???$diary{"order"} = "mmn";
となります
0626621
04/03/19 22:20ID:???$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;
0627623
04/03/19 23:28ID:???多分これが原因ですね…
ありがとうございました
0628nobodyさん
04/03/20 10:10ID:pZHNeEFdメールアドレスがある場合は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はしっかり分岐して動いてます。
どのように修正したらいいんでしょうか?
0629nobodyさん
04/03/20 10:25ID:???$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"; }
0632nobodyさん
04/03/20 13:19ID: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か何かでできたような気がするのですが方法を見つけることができませんでした。
よろしければアドバイス頂けないでしょうか?
0633nobodyさん
04/03/20 13:34ID:???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つ置こう。
0634nobodyさん
04/03/20 13:35ID:???これ消し忘れ。スマソ。
0637nobodyさん
04/03/20 18:17ID:???>pushを使えば@array1 = (1,2,3,[4,5,6]);
……そんなんなるかなあ。
リファレンス見たら、第二引数は配列でいいことになってるぞ。
push @array1, @array2;
他にもあるんなら、
push @array1, ( @array2, @array3, @array4 ... );
でいいんじゃねえか。
push @array1, [@array2];
とか、
push @array1, \@array2;
とか変なことやってんじゃねえのか?
もしくは、@array2自体におかしな代入しているとか。
0638nobodyさん
04/03/20 20:29ID:bXEf4bM+以下のようなスクリプトだと、何も 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 です)
どうすればいいのでしょうか???
0639nobodyさん
04/03/20 21:05ID:???>$main::{$key} = $hash{$key};
>print $main::name1;
なにをやってるのかよく考えて見れ。
>更にできれば $main::name1 ではなく $name1 で取得したいんですが、
これもめっちゃイミフ。
0640639
04/03/20 21:07ID:???>何も print してくれません。
俺のperlではちゃんとエラーメッセージをprintしてくれたけど。
Name "main::name1" used only once: possible typo at - line 9.
Use of uninitialized value in print at - line 9.
0641638
04/03/20 21:11ID:bXEf4bM+すんません。。。
分かりにくかったですね。 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 した場合に同じことをする方法が思い当たらなかったので。。。
0642nobodyさん
04/03/20 21:12ID:???シンボリックリファレンス。
strictな記述ではスカラー変数の自動生成出来ない。
あと、ourがサポートされてるperlでもシンボリックに対してourは認識されない(と思った記憶)
0643nobodyさん
04/03/20 21:15ID:???そんな設計が駄目設計だという事に気付け。
0644639
04/03/20 21:18ID:???strictした時はおそらく自動生成出来ないと思われ。
no strictすれば?
あと、俺もあまりそれ良い設計とは思えない。
0645638
04/03/20 21:21ID:???変数の自動生成が出来ないとは知りませんでした。。
ご指摘有難うございます。
>>643
ダメ設計かどうかもわからなかったです。。(初心者丸出しだ…
もっと勉強します。
変数の動的生成は個人的に結構使いそうだと思っていたんですが、
普通にperl自体では避けた方がいいのでしょうか???
0646nobodyさん
04/03/20 21:22ID:???http://www.perldoc.com/perl5.005_03/lib/strict.html
ループ括弧内で、no strict "refs";使うしか。
どんな変数を展開するか知らないけど、
外部から入力された値をmainパッケージで展開するとなると、
セキュリティホールになるかも。
(PHPのregister_globals問題と同じ。)
0647638
04/03/20 21:25ID:???CGIで、フォームからのクエリを %form に入れて、
%form のキーから変数を自動生成しようと思ってました。
素直に
my $name1 = $form{name1};
とするしかないですよね。。(汗
0648nobodyさん
04/03/20 21:26ID:???>普通にperl自体では避けた方がいいのでしょうか???
普通は同じ事が出来て、見やすくて、記述が綺麗になって、速度も速い方法が他に用意されてるから。
それと、ハッシュのまま使うのが一番柔軟で使いやすくもある。スカラーにしたい理由が見つからない。
0651648
04/03/20 21:36ID:???長い変数名書きたくないって理由だったらお断りだよ。
ただ、キミがちゃんとことごとく局所化する記述書けてるなら、
sub age{
my $age = $form{'age'}; #この関数ではこの値を使う。
#処理
}
みたいな記述はお勧めできる
0652nobodyさん
04/03/20 21:40ID:???フォームからのクエリを %form に取得した後に、
スカラー変数を自動生成して、
スクリプトの記述量($form{})を減らしたかったのが主な理由です。
0654648
04/03/20 21:44ID:???減らさんくて良し。
スカラーにしたら汚くなる&処理の柔軟さを捨てるだけだから。
どーしても自動生成したいなら、>>646のヤツ使うよろし。
誉められた記述じゃないけど、自動生成の中ではそれが一番マシ。
0655638
04/03/20 21:46ID:???今までは
my $name1 = $form{name1};
my $name2 = $form{name2};
…
と記述していたところを、
もっと簡単に定義できないかというのが今回の発端でした。
651さん、、親切に有難うございました。。。
0656nobodyさん
04/03/20 21:52ID:???後で見たとき間違いなく意味不明になるが。
0658未承諾広告※ ◆TWARamEjuA
04/03/20 23:34ID:???0660nobodyさん
04/03/21 02:34ID:???$type eq 'A' or $type eq 'B' or $type eq 'C' or $type eq 'D';
上記の記述なんですが、もうちょい短くならないでしょうか?
$typeと4回書かれているのはなんか俺の感性に反するんですが…。
それだけの理由です。
0661nobodyさん
04/03/21 02:39ID:???感性よりも知識を付けろハゲ
0662660
04/03/21 02:52ID:???scalar grep {$type eq $_} (A, B, C, D);
コスト高いけどこれで(・∀・)
0663nobodyさん
04/03/21 02:55ID:???0664660
04/03/21 02:58ID:???ありがd。
0665628
04/03/21 11:31ID:???動きますた(=゚ω゚)ノ
他の方々も貴重な情報さんくすこでした(*´Д`)ハァハァ
0666nobodyさん
04/03/21 11:36ID:???何度もチェックする、チェック対象が複雑、などの場合はハッシュを使ってチェックするのが最速。
my %valid_types = map{ $_ => 1 } qw(A B C D foo bar baz);
if($valid_types{ $type }){
# ...
}
0667nobodyさん
04/03/21 15:06ID:???C#の方がいいじゃん。
0670nobodyさん
04/03/21 19:39ID:Bb+Pz/Rr簡単なCGI(例えばHello World等)でテストを行いましたが、エラーの解決法がよくわかりません。
UTF-8(Unicode)以外の文字コードにするとプログラムは正常に動きます。
PerlではUTF-8は一応サポートされていて実際使っている方もいるようですが、
何かうまくいくコツなどありましたらどうかご指南ください。
0672nobodyさん
04/03/21 20:08ID:???「ぱーる」って読むのか「ぴーる」って読むのかわかりにくいってんだろ。
「しーしゃーぷ」は見たまんまだもんな。
0673T.K
04/03/21 20:55ID:???$key に name1 が、 $valに中身があるとして
クエリを分解して読み込むときに
${$key} = $val;
ってやってforeachでループさせれば君のやりたいことはできるよ。
実は俺も長くなるからそうやってたんだけど
やっぱあとあと大変だということがわかった。
PHPに乗り換えようとしたときも変数の取り扱いがちょっと違うだけで
違和感感じてなじめなかった。
おとなしく$form{}でやってたほうがよいよ。
0674nobodyさん
04/03/21 20:56ID:???しーどんぶり、じゃねえの?
0675nobodyさん
04/03/21 21:10ID:???url は うるる、
ってのは、もはや常識ですね
0676T.K
04/03/21 22:36ID:???0678nobodyさん
04/03/21 22:46ID:???0679T.K
04/03/21 22:57ID:???/ ̄ ( ・∀・)⌒\ 待ちくたびれたぞ
__ / _| | |
ヽヽ / / \ | | ,,,,,,,iiiiillllll!!!!!!!lllllliiiii,,,,,,,
\\| |____| .| | .,llll゙゙゙゙゙ ゙゙゙゙゙lllll,
\/ \ | | .|!!!!,,,,,,,, ,,,,,,,,,!!!!|
| ヽ_「\ | |、 | ゙゙゙゙!!!!llllliiiiiiiiiilllll!!!!゙゙゙゙ .|
| \ \――、. | | ヽ .| .゙゙゙゙゙゙゙゙゙゙ |
| / \ "-、, `| | ヽ | |
_/ / "-, "' (_ ヽ ヽ .| |
/ __ノ "'m__`\ヽ_,,,, ヽ | |
`ー― ̄ ヽ、__`/ー_,,,, ゙゙゙゙!!!!!!!lllllllliii| |
\゙゙゙゙゙゙゙!!!!!lllllllliiiii| |
\ ヽ | |
ヽ \ | |
| \.| |
`ヽ、,,_ノ| |
゙゙!!!,,,,,,,, ,,,,,,,,,!!!゙゙
゙゙゙゙!!!!llllliiiiiiiiiilllll!!!!゙゙゙゙
/.// ・l|∵ ヽ\
0680nobodyさん
04/03/22 02:26ID:???ことをしたいので無い知恵絞って以下のような事を考えてみたのですが
これだと予想していないような桁には対応できませんしやり方が不細工かなと思いまして。
いつもは動けばいいが信条なのですがもう少しスマートに書けないか悩んでいます。
数字桁数を操作する関数などがあればいいのですが。お知恵を拝借できないでしょうか?
if ($price <= 999){
$tempPrice = (int($price / 10)) * 10;
}elsif($price > 999 && $price <= 9999){
$tempPrice = (int($price / 100)) * 100;
}
0681nobodyさん
04/03/22 02:32ID:???0683nobodyさん
04/03/22 03:28ID:???$d = 2;
foreach (@n) {
s/(?<=.{$d}).+/'0' x length $&/eg;
print "$_\n";
}
0684nobodyさん
04/03/22 03:29ID:???$1 . ('0' x length $2);
今すごく適当に思いついて作っただけ。
0685nobodyさん
04/03/22 06:57ID:???my $mask = 10**(length($price)-$position);
$price = int($price/$mask)*$mask if ($mask > 0);
0686nobodyさん
04/03/22 08:04ID:???0688nobodyさん
04/03/22 08:43ID:???my $digit = 2;
foreach my $price (@num) {
my $len = length $price;
$price -= $price % (10 ** ($len - $digit)) if $digit < $len;
print "$price\n";
}
>>685
if に頼らずコンピュータの演算誤差なんかで丸めることって出来ませんかね?
0689nobodyさん
04/03/22 09:48ID:UDEoFMoyuse 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内の全ての半角を全角にしたいです(記号・カタカナ等も)。
そういった処理を一発でできる関数ってのは無いですよね?
0690685
04/03/22 10:41ID:???$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);
0691nobodyさん
04/03/22 10:43ID:???> $a = Jcode->new('abc')->tr('0-9A-Za-z', $replacement);
$a = Jcode->new('abc')->tr('0-9A-Za-z', '0-9A-Za-z');
でした。
0692689
04/03/22 11:36ID:???# 半角を全角に(英字はさらに大文字に)変換
$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を参考にして、関数にしてみました。
オブジェクト指向な書き方をしないとだめなんですね。
これですべて全角になるでしょうか?記号を変換しているところは思いつく記号('と"以外)を
やみくもに列挙しただけで、足りないものがあるかも知れず不安です。
ハイフンは最後にかかなきゃいけないのに気づくのに苦労しました(今後のためのメモ)
また、最後の一行で半角カナを全角にしてるんですが、
「ダ」は「タ゛」になっちゃいますか?と思って実験したら、
ちゃんと「ダ」になりました(今後のためのメモ)。
0693680
04/03/22 12:24ID:fR/XRXq7>>685
なるほど!こういうやり方もあるんですね。悩んでいただけに目からウロコと言うか。
ありがとうございました。スマートだなぁ。
0695nobodyさん
04/03/23 05:07ID:???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を渡せたと思うのですが、
ファイルは出来ないようでちょっと困ってます。
0696nobodyさん
04/03/23 05:14ID:???http://perldoc.com/perl5.8.0/pod/func/sysopen.html
0700nobodyさん
04/03/23 08:31ID:???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";
}
0701nobodyさん
04/03/23 14:54ID:???0をとり省くのはどのような方法があるでしょうか?
0702nobodyさん
04/03/23 14:54ID:awaWqGNMsub 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」
と怒られてしまいます。
0705nobodyさん
04/03/23 15:00ID:???push @{$myarray[5]}, qw(foo bar hoge);
リファレンスわかってて、なんでデリファレンスわからんかなあ
0707706
04/03/23 15:03ID:???一つ目の引数
0709nobodyさん
04/03/23 16:22ID:???最後に print $template->output;で
ブラウザに表示するのが普通ですが、
これを、HTML全体を変数に格納する方法はないでしょうか?
0710709
04/03/23 16:39ID:???my $foo = $template->output;
でOKですた。。。
0711nobodyさん
04/03/23 17:44ID:???皆さんレス有難うございます。
それで、モジュールは少し理由があって出来れば使いたくないです。
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してるのは見たことが無いんですが。
0713nobodyさん
04/03/23 20:42ID:???http://x68000.startshop.co.jp/~68user/unix/pickup?umask
0714nobodyさん
04/03/23 22:17ID:???わざわざ有難うございます理解できました。これ使って出来ますね。
ところで711は問題ないか解るかたいませんでしょうか。
さっきから検索してるんですが、711のようなのが、いいのかだめなのか解らないです。
とりあえず無理なら教えていただいたumaskを使おうと思っているのですが。
かなりしつこくて申し訳ないです。うざかったら放置してください。
0716695,714,....
04/03/24 06:05ID:???んっとややこしいと思ったんで書かなかったんですが、
解りにくいかもですが簡単に書くと、条件分岐して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中に入れたいなと思いました。
0718nobodyさん
04/03/24 16:17ID:???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" と表示されてしまいます。
0719718
04/03/24 16:19ID:???$hash{'a'} = "ABC"; で解決しました。
0721nobodyさん
04/03/24 18:39ID:???0723nobodyさん
04/03/24 19:57ID:???0725nobodyさん
04/03/24 20:39ID:6j96YsNkPerlで日記を作ってる最中です。
一番下に、1 2 3 ・・・・ 11 12 と月別のリンクを作って、
番号クリックしたらその月の日記を見れる、、、って感じで。
クリックしたらその番号を変数に入れて、日記のログ出力のルーチンに飛ばすみたいな事できますか?
できるならどういうテクを使うんでしょうか?
0729725
04/03/24 21:48ID:6j96YsNkログファイルから、クリックした数字の月だけのログを出力したいんです。
0730nobodyさん
04/03/24 21:59ID:???そこらへんに転がってる日記スクリプトとか、
なんならいわゆる「ページ移動」が可能な掲示板スクリプトでも調べれば
ヒントを得られると思う。
0731nobodyさん
04/03/24 22:55ID:???!$scr と $scr eq 0 が違うのは文字と数字の判断の違いでnull値が入るのは
わかったのですがよくこういった比較演算子?で混乱してしまいます。
よろしければ教えて頂けないでしょうか?
0732nobodyさん
04/03/24 23:01ID:???正確に書きたいなら $scr == 0 もしくは $scr eq "0" な。
0733nobodyさん
04/03/24 23:29ID:???その日記スクリプトにハイパーリンクで月選択ができる場合
href="./diary.cgi?month=1"といったように、GETのみとなるのでしょうか?
0734nobodyさん
04/03/24 23:33ID:???リロードとかするたびにダイアログでてウザいだけかと。
0735nobodyさん
04/03/25 00:04ID:O9PiycAhインラインフレーム内にCGIを表示させて、そのCGIのどこかの変数に、値を代入したいんです。
具体的に言うと、
<IFRAME SRC="data.cgi?value">
として、valueをどこかの変数に入れることはできますか?
いろいろなサイトを見て、
read(STDIN, $val, $ENV{'CONTENT_LENGTH'});
こうすれば、$valにvalueが代入されるという話を聞いたんですができませんでした。
(何も代入されていませんでした。)
誰かわかる人がいたら教えてください。
よろしくお願いします。
0736nobodyさん
04/03/25 00:16ID:???そりゃPOSTの場合だ。
GETとPOSTの違いを勉強汁。
0737nobodyさん
04/03/25 01:25ID:???cgi-lib.pl使ってるよ。
エロイ人たちは容量を最低限に抑えるために中に書き込んでるの?
0738nobodyさん
04/03/25 05:23ID:???でも俺はフォームからの受け取りくらいは
そう面倒でもないし簡単だから大概自前。
0739nobodyさん
04/03/25 08:01ID:???for (5 .. 0) { print;}とするとダメですよね
で
reverseをつかって
for (reverse 5 .. 0) { print;}
なら出来ると思うんですが、この方法は妥当でしょうか
0740nobodyさん
04/03/25 08:24ID:???for (reverse 5 .. 0) { print;}
↓
for (reverse 0 .. 5) { print;}
0741nobodyさん
04/03/25 09:02ID:???for ($start < $end ? $start .. $end : $end .. $start) { ... }
0744nobodyさん
04/03/25 10:18ID:???ていうか何故そんな値で回したいのかよく分からんのだが。
0745nobodyさん
04/03/25 10:33ID:???もういいです。
0746nobodyさん
04/03/25 11:06ID:sU+YK1M2(中略)
return (%hPGTname2PTCid, %hPGTname2PTTid);
}
my (%hPGTname2PTCid, %hPGTname2PTTid) = &hoge;
として2つのハッシュ配列を取得したいのですが、
前者のハッシュ配列しか取得できていない模様です。
どうすれば2つのハッシュ配列を取得できるのでしょうか?
0747nobodyさん
04/03/25 11:09ID:w7s8ctdp#!/usr/local/bin/perl
print "Content-type:text/plain\n\n";
print "CGIのテスト\n\n";
sleep(3);
print "3秒後";
exit;
と、書くと「CGIのテスト」と「3秒後」が実行後3秒してから同時に表示されてしまいます。
色々見てみましたがよく理解できません。
命令はプログラムの上から順に実行されると思い込んでいたんですがそうではないんですかね。
こうゆう基本的なことを自分で解決するのに良いウェブサイトや本はありますか?
よろしくお願いします。
0748nobodyさん
04/03/25 11:18ID:???でいいだろ。
for (my $i = 5; $i >= 0; $i--) {print;}
とか。
0751nobodyさん
04/03/25 11:21ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsub.html#Pass_by_Reference
>>747
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_do_I_flush_unbuffer_an_outpu
0752nobodyさん
04/03/25 11:22ID:???return ([\%hPGTname2PTCid, \%hPGTname2PTTid]);
my ($hPGTname2PTCid, $hPGTname2PTTid) = @{&hoge};
「$hPGTname2PTCid->{キー}」の形式で参照する。
適当に書いたんでなんか変かもしれないが。
0753nobodyさん
04/03/25 11:24ID:???my ($hPGTname2PTCid, $hPGTname2PTTid) = &hoge;
return (\%hPGTname2PTCid, \%hPGTname2PTTid);
0754nobodyさん
04/03/25 11:27ID:???なんでわざわざ無名配列に入れる?
return (\%hPGTname2PTCid, \%hPGTname2PTTid);
my( $...., $..... ) = hoge();
でいいじゃん。
0755nobodyさん
04/03/25 11:27ID:???0759747
04/03/25 12:13ID:w7s8ctdpHow can I read in a file by paragraphs? あたりを読めということですかね。さぱりわかんないんですけど頑張ってみます。
0760749
04/03/25 12:19ID:???0761nobodyさん
04/03/25 12:50ID:???<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;
0762nobodyさん
04/03/25 13:08ID:???0763nobodyさん
04/03/25 13:20ID:???ハッシュってどういう風に変数名をつければいいのでしょうか?
0764nobodyさん
04/03/25 13:37ID:???0766nobodyさん
04/03/29 06:30ID:???>>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の前にいかなる場所にも見つけることができません。
0767nobodyさん
04/03/29 06:32ID:???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
あーあ
0768nobodyさん
04/03/29 06:33ID:???>>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 ペリカ。
0769nobodyさん
04/03/29 06:33ID:???以下のようにするときちんと表示されました。
何故だろう??
【コード】
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
0770nobodyさん
04/03/29 06:34ID:???現在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行目に何の意味が?
0771nobodyさん
04/03/29 06:35ID:???>>781
ごめんなさいね^^^^;;
783 :nobodyさん :04/03/25 18:48 ID:???
>>779
open に渡している変数の中身と、open する時点のカレント
ディレクトリを調べる。
784 :nobodyさん :04/03/25 21:23 ID:???
>>739
> for (reverse 0 .. 5) {
リストが作られるから、
0..10000なんてやると、かなりメモリ食うと思う。
785 :nobodyさん :04/03/25 22:30 ID:???
>>783
変数の中身というかopenするファイル名を直接指定しても駄目なのです。
open(<FILE>, "< ./foo.dat") or die $!;
のように。
カレントディレクトリの調べ方はどうすれば良いのでしょう。
786 :nobodyさん :04/03/25 22:58 ID:???
>>785
http://perldoc.com/perl5.8.0/lib/Cwd.html
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_open_FILEHANDLE_MODE_LIST
0772nobodyさん
04/03/29 06:35ID:???>>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
マジレスすると、変数に付いている%や$や@は何のためにあるのかと。
0773nobodyさん
04/03/29 06:36ID:???>>773
print <<"EOL";
にしたらどうよ。
796 :nobodyさん :04/03/26 09:48 ID:???
( ゚д゚)ポカーン
797 :nobodyさん :04/03/26 10:00 ID:???
遅レス(・∀・)カコイイ!!
0774nobodyさん
04/03/29 06:37ID:???ある会員リストを登録更新表示するCGIなのですが、
更新作業で、
1)更新を受け付ける
2)データベースを更新
3)一つ目の関連するファイルの更新
4)二つ目の関連するファイルの更新
5)最新リストを表示
としているのですが、3,4の作業の負荷が高く5の最新リスト表示まで
時間がかかります。
実際5の最新リスト表示には2のデータベース更新が終わっていれば
問題ないので例えば
1)更新を受け付ける
2)データベースを更新
5)最新リストを表示
として
3)一つ目の関連するファイルの更新
4)二つ目の関連するファイルの更新
は別プロセスとかでバックグラウンドでやらせたいのですが
方法がわかりません。
基本的にどんな風にすればいいですか?
0775nobodyさん
04/03/29 06:39ID:???友人と二人で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("重複投稿のため処理を中断しました"); }
0776nobodyさん
04/03/29 06:40ID:???>>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の順番で処理すりゃいいぢゃん?」
という気がするのだが、
まあここはコーディングスレなので、ロジックについては語らないことにしよう。
0777nobodyさん
04/03/29 06:41ID:???>>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:???
生まれてきたのも勘違いであって欲しい
0778nobodyさん
04/03/29 06:42ID:???>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
0779nobodyさん
04/03/29 06:43ID:???>>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 };
}
}
0780nobodyさん
04/03/29 06:43ID:???>>791
正直読み難い上に意味も無いのでお勧めできないが、下記のような感じかな。
DBD::Excelの作者である川合氏はこの命名法を使っているね。
しかしPerlでハンガリアンしてどういうつもりなのかマジで謎。特に@aXxxと%hXxx。「馬から落馬しました」みたいな。
そりゃまぁ、リファレンスだけなら俺も$sref_xxx,$aref_xxx,$href_xxxとかする事もあるがね。
$sString
$iInteger
$nNumeric
$oObject
$hHandle
$rsRefToScalar
$raRefToArray
$rhRefToHash
%hHash
@aArray
0781nobodyさん
04/03/29 09:10ID:WLF8C9h80782nobodyさん
04/03/29 10:14ID:???$retry = 5;
while (!mkdir ($lockdir, 0755)) {
if (--$retry <= 0) {
&error("BUSY");
}
sleep(1);
}
#一連の処理
rmdir($lockdir);
このようなファイルロックをよくみかけるのですが、
何故ディレクトリを作る事によって、ログなどの対象ファイルがロックされるのですか?
0783nobodyさん
04/03/29 10:19ID:???http://www.bayashi.net/st/pdmemo/filelock.html
0784漏れはこれだけ補完できる
04/03/29 13:17ID:???>>739
> for (reverse 0 .. 5) {
リストが作られるから、
0..10000なんてやると、かなりメモリ食うと思う。
0785漏れはこれだけ補完できる
04/03/29 13:18ID:???既に張っている人、乙!
0786nobodyさん
04/03/29 14:51ID:???http:\/\/\w+(\.2ch\.net\|\.bbspink\.com)\/\w+\/
であってますか?
0788nobodyさん
04/03/29 16:28ID:???localとmyの使い分けについてなのですが、
どちらを使っても厳密な違いはないのでしょうか?
localはPerl4、myはPerl5以降という話を見たことがあるのですが、
環境を選ばずに正確に動作させるのならば、
myではなくlocalで統一したほうがいいのでしょうか。
0791nobodyさん
04/03/29 20:16ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq7.html#What_s_the_difference_between_dy
0792nobodyさん
04/03/29 21:54ID:???意味を結果ファイルに書き出していくスクリプトを作ったのですが、うまくいきません。
動作自体には問題はないのですが、結果ファイルに照合した単語を書きこむと、
一部の文字が化けてしまいます。
例えば阿諛追従という文字列を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 "#!";
0793nobodyさん
04/03/29 21:56ID:???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/ /+/;
}
よろしくお願いします。
0795792
04/03/29 23:06ID:???見てみました。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
として認識されてしまうのでしょうか?
文字コードに関する認識不足が多分にあると思われますが、
なにとぞご容赦下さい。
0796nobodyさん
04/03/29 23:07ID:???検索キーワードは>>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は関数呼び出し前の値が復帰する
0797nobodyさん
04/03/29 23:41ID:???非常に有用なのでぜひ参照したいのですが、
どうにかならんのでしょうか?
0798nobodyさん
04/03/29 23:50ID:???pc5鯖に復旧した時に一日分消えてしまったよ事件」のログなら
>>766-780
もともとのレス番は766から814らすぃな
0799nobodyさん
04/03/30 00:17ID:???CGI.pmを使ったサンプルコードをいくつかみたところ、
while ($bytesread = read($fh,$buffer,1024)) {
print OUT $buffer;
}
といった風になってます。
$bytesreadはなんなのでしょうか。
とりあえずその部分を削って
while (read($fh,$buffer,1024)) {
としたところでエラーは出なかったのですが(win)
意図的にスカラーコンテキストにしているんでしょうか?
あるいは特殊な変数なのでしょうか?
また、もし前者ならmy宣言した方が軽くなるような気がするのですが、
どのコードもしてません。
その辺教えていただけませんでしょうか?
参考↓
http://www.google.co.jp/search?num=50&hl=ja&inlang=ja&ie=Shift_JIS&c2coff=1&q=perl+while+bytesread+read+buffer&lr=lang_ja
0800nobodyさん
04/03/30 00:18ID:???0801779
04/03/30 00:22ID:???「perl while read buffer」
$bytesread抜きの、つまり>>799で書いた
>while (read($fh,$buffer,1024)) {
のような形で書かれたページも見つかりますね。
いらないのかな。何の意味があるんでしょう。
0802nobodyさん
04/03/30 01:06ID:???http://perldoc.com/perl5.8.0/pod/func/read.html
http://perldoc.jp/docs/perl/5.6.1/perlvar.pod
君が参考にしたページの作者も、君と同じくコピペプログラマなんだろう。
意味の有無は判断材料を集めて自力で考えてみなさい。
0803nobodyさん
04/03/30 01:14ID:???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に指定したファイル?もどこにあるかわからないし、、、
わからないことずくしです。
0804nobodyさん
04/03/30 01:58ID:???有難うございます。
サンプルとなるコードを検索してそれを理解する。わからなければ時には弄くり倒しながら。
そして理解できたら自分なりの方法でコーディングする。
これがコピペプログラマーでしょうか?
bytesreadが定義済み変数なのかは調べた。しかし探してもそのような記述は見当たらない。
英語は苦手だから日本語texinfoのttp://flex.ee.uec.ac.jp/texi/perl/perl_90.html
だって見た。それでも解決しない。
ところがbytesreadという変数を使ったコードを紹介するサイトが山のようにある。
・・・私には理解できない。
しかし言われてみて思った。
while内で$bytesreadを参照し処理をしていたスクリプトがあった。
そのソースからコピペして$bytesreadは使わないのに残したままである。
そんなコードを参考にしてしまった。
こんなところですか?
0805nobodyさん
04/03/30 07:09ID:???結果を書き出すのにEUC-JPかShift_JISかに統一しる。
# 私のところでは、そんな化け方しないけど。
>>797
HTML版はあるけど、2chブラウザ用のが無いのかも。
>>803
$session_dirディレクトリの中にファイルが作られる。
まずはそこから確認。
0806nobodyさん
04/03/30 07:29ID:???> HTML版はあるけど、2chブラウザ用のが無いのかも。
ありました。
リンクをhttp://pc5.2ch.net/にしないとだめなのね(そりゃそうか)。
0807nobodyさん
04/03/30 10:54ID:???>while内で$bytesreadを参照し処理をしていたスクリプトがあった。
>そのソースからコピペして$bytesreadは使わないのに残したままである。
>そんなコードを参考にしてしまった
恐らくそういうこと。というか、>>5-6あたりを参照するのは基本だが底から少しでも探した?
世の中のコピペプログラマがいかにダメコード汚染を撒き散らすかということがよくわかるよ。
とはいうものの、readに関していうなら、C言語では極めて重要なreadの戻り値がPerlでは意味が薄れている為、
マニュアルを読んだだけではその意味するところを理解し難いというのはあると思うけどね。
0808nobodyさん
04/03/30 12:24ID:???0809nobodyさん
04/03/30 13:18ID:???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/;
どうでもいいか・・・
0811nobodyさん
04/03/31 06:09ID:???>Windowsがテキストファイルの文字コードをどのように判別しているか定かではないのですが
Windows 自体は文字コードの判別など「しない」。
ブラウザかテキストエディタか知らんが判別しているのはアプリ側。
つまり自動判別に頼る場合(ロジックが異なる可能性があるから)、
開くアプリによって結果が異なることもある。
先頭数文字で判別するアプリもあれば、どちらかのコードで解釈できなくなった時点で
コードを決定するアプリもあるだろう。
>阿諛追従は文字化けしましたがその他の大半の単語はそうは
>なりませんでした。
「その他の大半の単語」の方は本文(意味)の方もちゃんと読めるのか?
結論としては >>805 の通り、文字コードを統一してから書き込めってことだが。
ActivePerl 最新版(5.8系列)なら use Encode すれば文字コード変換を使えるはず。
0812nobodyさん
04/03/31 08:34ID:???変数の型(HASHやARRAY)を返す関数があったと思うんですが
忘れてしまいました、誰か助けてぇ〜
0813nobodyさん
04/03/31 10:07ID:???0814792
04/03/31 10:48ID:???>>811
どうもありがとうございました。
Encodeではありませんが、jocde.plでEUCJPに統一することで解決しました。
>「その他の大半の単語」の方は本文(意味)の方もちゃんと読めるのか?
はい、何故か本文の方は全く文字化けしませんでした。
0815nobodyさん
04/03/31 11:35ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perldata.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html
0817nobodyさん
04/03/31 16:37ID:msaZKwhoこうじゃなくて
sub hoge{
}
こう書くのが正しいのですか。
sub hoge
{
}
0818nobodyさん
04/03/31 16:53ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlstyle.html
0820nobodyさん
04/03/31 22:18ID:???0823820
04/03/31 22:33ID:???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'}};
後略
0824nobodyさん
04/03/31 22:34ID:fllGa8Oy%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;
}
}
0825nobodyさん
04/03/31 22:35ID:fllGa8Oyforeach ( @_ ){
($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;
0826nobodyさん
04/03/31 22:52ID:???0827nobodyさん
04/03/31 22:56ID:fllGa8Oy0828nobodyさん
04/03/31 23:13ID:???スレ違いだから答えない。
0829nobodyさん
04/03/31 23:18ID:???取り合えずここじゃないとなると初心者スレなんかなあ……。
0830nobodyさん
04/03/31 23:38ID:???0831nobodyさん
04/03/31 23:44ID:???0832nobodyさん
04/03/31 23:45ID:???0833nobodyさん
04/03/31 23:51ID:fllGa8OyCOOKIE関連のまともなスレなんてWebProg板に無いんですが
0834nobodyさん
04/03/31 23:54ID:fllGa8Oyどこで聞けば分かるんだ
0835nobodyさん
04/04/01 00:01ID:f/d+tf5t単純にCOOKIEに値を書き込んで、それを読み出すくらいは出来てるんです。
ただ、それに肉付けしていったときに読み込めなくなったりしたので、他の部分が影響を及ぼしているのは明らかなので、
どういった部分がCOOKIEへの値書き込みにこういう影響を及ぼすのか、って聞いてるのに、
ス レ 違 い
違わないでしょう
0836nobodyさん
04/04/01 00:07ID:???「Perl コ ー デ ィ ン グ 」スレ。
コーディングの問題ではないのだからスレ違いだろう。
>828を読んでCOOKIEの仕様を勉強しなおしてこい。
0837nobodyさん
04/04/01 00:12ID:???原因はコーディングにある(と本人は言っている)のでコーディングに関しての話なんじゃないの?
と言うかこのスレのコーディングの定義が最近良く解らない……。
0838nobodyさん
04/04/01 00:23ID:???コードとにらめっこしてなさいよ。
0839nobodyさん
04/04/01 00:28ID:???0840nobodyさん
04/04/01 00:29ID:???0841nobodyさん
04/04/01 00:43ID:???2週間が経過してるんだが・・・・・
もうだめぽ
0842nobodyさん
04/04/01 01:00ID:???0843nobodyさん
04/04/01 01:17ID:???$ENV{'HTTP_COOKIE'}を疑う前にCookieファイルの中身はちゃんと確認したの?
セパレータとかエンコードとか。
コーディングを疑う前にCookieのお作法を理解しないと先にすすめないよ。
0844nobodyさん
04/04/01 02:07ID:OWaSi467つまり本当は4月1日のどこかで閉鎖するかもしれない。
実際に広告枠の所に「2004年4月1日に何かある」とあるんだしまだ希望はあるんじゃないか。?
2ch閉鎖実況スレ
http://ex2.2ch.net/test/read.cgi/net/ 1080586834/
↑間を消して
まだ1日ありますぞい
↑コピペyoro
0845nobodyさん
04/04/01 02:34ID:???サーバが食べられるクッキーはクライアントが吐いたものだけ。
自分で吐いたクッキーは食えねえぞゴルァ。
の呪文を100回唱えて、もう一回コードを見直しましょう。
0846nobodyさん
04/04/01 21:54ID:Al4MgY0yブラウザの戻るボタンで戻った時などに、いちいち再読み込みされないようにしたいです。
ヘッダのところに何か追加すればいいのかなというところまでは分かったのですが、
そこから先がどうしても分かりません。
よろしくお願いします。
0847nobodyさん
04/04/01 21:55ID:???△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1078568723/
CGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
まずは過去ログを全部読め
0848nobodyさん
04/04/01 22:11ID:Al4MgY0yキャッシュさせないようにしたいという話は時々見ますが
キャッシュされるようにする方法というのは見つかりませんでした。
でも戻るボタンで戻っても再読み込みされない掲示板とかありますよね。
ああいうのってどうやってるんでしょうか?
すごい初心者ですいませんが、下の例だと何を追加すればいいんでしょう?
#!/usr/local/bin/perl
print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";
(中略)
print "</HTML>\n";
__END__
0849nobodyさん
04/04/01 22:50ID:???キャッシュされるんじゃないかな。
0850nobodyさん
04/04/01 22:53ID:???0851nobodyさん
04/04/01 23:24ID:Al4MgY0y設置したいCGIがあるのですが、ページ移動のたびに読み込まれるのが嫌で
自分で改造したいと思っています。
.cgiのままでもキャッシュさせる方法はないでしょうか?
>>849>>850
どこをどう変えたらいいのでしょうか?
>>848みたいなのでキャッシュさせないのは無理ですか?
0854nobodyさん
04/04/02 00:00ID:???0855nobodyさん
04/04/02 00:02ID:???(仮に)何かを追加してできるようになるとしても、
その何かを調べるのは少なくともこのスレじゃない、気がする。
0856846=851
04/04/02 00:35ID:???ありがとうございました。
0857nobodyさん
04/04/02 11:45ID:???use Digest::MD5 qw(md5_hex);
my $session = md5_hex( time . $$ );
なんかこれじゃ心もとないんですが…
0858nobodyさん
04/04/02 13:14ID:???心許ないと読めるのでそれ前提で言うと。
渡す前の文字列が time.$$ だけだとちょっとって思うのなら
適当に30桁くらいのランダムな文字列作って md5_hex() に送れば良いんじゃないの。
0860nobodyさん
04/04/02 13:30ID:???>>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%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。
0861nobodyさん
04/04/02 15:14ID:JAKs1zik私の環境ではサーバで、cgi-bin以下でしかcgiが置けません。
ブラウザで見るときのパブリックディレクトリはhomeのインデックスです。
user/
歪gi-bin/
鷲oge.cgi
鷲ome/
亙ndex.html
鷲oge.html
この環境で、画像リンクなどではなく、
直接hoge.cgiをロードすることは出来ますでしょうか?
0863nobodyさん
04/04/02 15:34ID:8MGWWqTy書き込み表示部は予め関数化してあるのですが、この関数によって出力された物をファイルに書き込もうとするにはどうしたら良いのでしょうか?
どなたかご教授して頂けると幸いです(_ _)
0864nobodyさん
04/04/02 15:58ID:???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%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。
0865nobodyさん
04/04/02 16:05ID:???ってか、のスレの趣旨をわかってないヤシ多すぎ
正しい質問例:
これこれの配列にこういう値が入っています。
この配列に対してこういう処理をしたいと思っています。
こういう書き方をしたらこういう結果になりました。
こういう結果ではなくああいう結果を返したいと思っているのですが、
_以下略_
このスレってこういうことっしょ?
0866nobodyさん
04/04/02 16:15ID:8MGWWqTyありがとうございます。それを踏まえて書き直してみました。
今、一行掲示板を作っていて負荷軽減の為、一定のhtml($file_html)に書き込み表示部を書き込みの度に出力(上書き)しようとしています。
書き込み表示部は予め関数化(&html)してあるのですが、この関数によって出力された物をファイルに書き込もうとするにはどうしたら良いのでしょうか?
一度、ヒアドキュメントにより関数化した物を代入し、それをファイル出力するという順序で可能かな、とも思い
$html_source = "_EOF_";
${&html}
_EOF_
if (!open(HTML,">$file_html")) { &error(0); }
print HTML $html_source;
close(HTML);
と、してみたのですが何も$file_htmlには書き込まれませんでした。どなたかご教授して頂けると幸いです(_ _)
0867nobodyさん
04/04/02 16:38ID:???test
_EOF_
↑これがめちゃくちゃ。
まず一から勉強し直せ。
もうレスしなくていいから、そんな暇あったら調べろ。
0868nobodyさん
04/04/02 16:43ID:???0869nobodyさん
04/04/02 16:44ID:???調べるというのはそういうライブラリ等あるのでしょうか?
ぐぐってみたのですが、リファレンス等しか見つからないのですが。。。
ご存じでしたら教えて頂けると幸いです。
0870nobodyさん
04/04/02 16:57ID:???ていうかその書き方すら間違いなわけだが。
あんた普段から何作ってもバグだらけでしょ。
0871nobodyさん
04/04/02 16:57ID:???test
_EOF_
0872nobodyさん
04/04/02 17:00ID:???>うぁ、すみません。元は$html_source <<"_EOF_";です。
>うぁ、すみません。元は$html_source <<"_EOF_";です。
0873nobodyさん
04/04/02 17:04ID:???右脳でも鍛えてきます。。。
0874nobodyさん
04/04/02 17:08ID:???0876nobodyさん
04/04/02 17:44ID:???あまりにもつまらないミスだし。
0879nobodyさん
04/04/03 00:08ID:???>>866のこういう書き方する人って他にもいるの?
0880nobodyさん
04/04/03 00:30ID:???同じ意味だから好みだろ
0881nobodyさん
04/04/03 02:51ID:???でもperlをさわりはじめた頃はifでやってたな。
0883未承諾広告※ ◆TWARamEjuA
04/04/03 11:19ID:???低コスト← and 、or、 後置 if、ブロック →高コスト
と教わった。
0884803
04/04/03 13:26ID:???windowsでやっててpath表現が微妙に違うのがいけないのでしょうか?
0885nobodyさん
04/04/03 16:41ID:???中身がある一つの記号だけで区切られてないので、
どのように分ければいいのか分かりません。。
@ @a = split ('/'or':',$i) とか
A @a = split ('/'':',$i)
B @a = split (///:/,$i)
などためしたんですが、
@だとエラーは起こりませんが表示されず、
ABだとエラーです。
どのような方法があるんでしょうか?
0886nobodyさん
04/04/03 16:55ID:qkOavVtn@datetime = split /\/| |:/, $timestamp;
print join ' ', @datetime;
0887nobodyさん
04/04/03 16:58ID:???0888nobodyさん
04/04/03 17:03ID:qkOavVtn0889nobodyさん
04/04/03 17:08ID:OcvniKR1<form action="http://hogehoge./〜/〜/mail2manager.cgi">
のように呼び出されたくないのですが、
リファラに異常が発生しやすい鯖(?)なので、
HTTP_REFERERによる判定だけではエラーが発生しがちです。
他に防御策はありますか・・・?
この質問ってコーディングじゃない・・・?
0891nobodyさん
04/04/03 17:20ID:???「60秒以内に発行されたIDなら送信可」などとする。
複数CGIサーバーの場合、時刻が同期がされていないと誤爆するけどね。
REFERERは詐称されるからあまり意味ないよ。
0892857
04/04/03 20:03ID:???結局、md5_hex() に渡す文字列がユニークじゃなきゃ意味ないんで、
time . $$ 以外にユニークな文字列を生成する必要アリですね。
なんかいいのないかなぁ…。
みなさんはどうしてます?
0893nobodyさん
04/04/03 20:52ID:???0894nobodyさん
04/04/03 20:56ID:???http://search.cpan.org/src/JBAKER/Apache-Session-1.6/Session/Generate/MD5.pm
0895nobodyさん
04/04/03 22:08ID:???session
>>892
これはどう?
http://search.cpan.org/~mwx/Data-Uniqid-0.11/Uniqid.pm
0896nobodyさん
04/04/04 00:50ID:???できるだけ簡単に共有するにはどうしたらよいでしょう。
モジュール内の関数を呼ぶたびに、その変数を渡すのは面倒なので。
0897nobodyさん
04/04/04 05:30ID:movQ3eovそのファイルを変数$aに入れ、"05"が入っている別の変数$bとの比較を行いました。
if($a eq $b)と言う感じなのですが、真の場合の処理が実行されません。
printしてみると、$aと$bにはちゃんと"05"が入っています。
ファイルにも改行を含まずに"05"とだけ入っているのですが...
ファイルの読み書きを勉強したばかり何ですけど、何が悪いのでしょうか?
0898nobodyさん
04/04/04 05:36ID:???0899nobodyさん
04/04/04 06:17ID:???chompもやってみました。
その前にsplitでも改行コードを削除してみたのですが、やはり元々入っていません。
何か初歩的なミスだとは思うのですが....
0900nobodyさん
04/04/04 06:27ID:qQjuTTgf0901nobodyさん
04/04/04 07:15ID:???my $a = '05';
my $b = 05;
debug_dump("a" => $a);
debug_dump("b" => $b);
exit;
sub debug_dump
{
my ($name, $value) = @_;
print $name, ' = ', join(' ', map{ unpack('H2', $_) } split(//, $value)), "\n";
}
こんな感じでヘキサダンプとってみそ。
0902初心者
04/04/04 10:42ID:dd7frEOF$date = '2004/3/24 13:43:18'
という日付の文字列から年・月・日を 2004、3、24 というように分解して、それぞれを
変数($year、$month、$day)に代入したいのですが、どうすればいいのかご教授
お願いします。
0903nobodyさん
04/04/04 10:46ID:???>885-887
0905nobodyさん
04/04/04 10:50ID:PukJ0Xr/CGIを置いてるサーバーから別のFTPが動いてるサーバーへFTPを使って
ファイルをアップロードするCGI(Perl)を
tp://x68000.startshop.co.jp/~68user/net/ftp-1.html
を参考にして作ってます。
FTPサーバー$ftp_hostに接続し、$local_dirにある$local_fileを
ファイル名はそのままでFTPサーバー上の$ftp_dir上にアップロード
するために以下のようなスクリプトを組んだのですが、うまくアップロードされません。
アップロードできるようにするにはどうしたらよいのでしょうか?
そもそも、CGIスクリプトが置いてあるディレクトリとは違うディレクトリ$local_dir
においてあるファイルをアップロードする方法がよくわかりません。
ちなみに設置しているサーバーではrootでなく一般のユーザーアカウントしか
使えないので、モジュールは標準で組み込まれてるようなものしか使えません。
ご教授願います。
use Socket;
$local_dir = "for_upload"; # 転送元ファイルが置いてあるディレクトリ
$local_file = "test.txt"; # 転送元ファイル名
$ftp_host = "aaa.bbb.com"; # 転送先サーバー
$local_ip = "local.xxx.com"; # 転送元サーバー
$ftp_dir = "/home/hoge/test"; # アップロード先のディレクトリ
$ftp_user = "user"; # 転送先サーバーのアカウント名
$ftp_passwd = "password"; # パスワード
(つづく)
0906905
04/04/04 10:51ID:PukJ0Xr/$port = getservbyname('ftp', 'tcp');
$addr = inet_aton($ftp_host);
$sock_addr = pack_sockaddr_in($port, $addr);
socket(COMMAND, PF_INET, SOCK_STREAM, 0);
connect(COMMAND, $sock_addr);
select(COMMAND); $|=1; select(STDOUT);
print COMMAND "USER $ftp_user\r\n";
print COMMAND "PASS $ftp_passwd\r\n";
for ( $data_port=5000 ; $data_port<65536 ; $data_port++ ){
socket(DATA_WAITING, PF_INET, SOCK_STREAM, 0);
setsockopt(DATA_WAITING, SOL_SOCKET, SO_REUSEADDR, 1);
if ( bind(DATA_WAITING, pack_sockaddr_in($data_port, INADDR_ANY)) ){
last;
}
}
listen(DATA_WAITING, SOMAXCONN);
$local_sock_addr = getsockname(COMMAND);
($local_port, $local_addr) = unpack_sockaddr_in($local_sock_addr);
$local_ip = inet_ntoa($local_addr);
$local_ip =~ s/\./,/g;
printf COMMAND "PORT $local_ip,%d,%d\r\n",$data_port/256,$data_port%256;
print COMMAND "CWD $ftp_dir\r\n";
print COMMAND "STOR $local_file\r\n"; # 問題の箇所?
close(COMMAND);
0907nobodyさん
04/04/04 16:13ID:???その変数が変更される場合があるのかどうかで考え方が変わってくるような気もするが。
とりあえず、$main::hoge で直接アクセスするのはあかんの?
もしくは一度各パッケージの変数にコピーしておくか。
というか、
>モジュール内の関数を呼ぶたびに、その変数を渡すのは面倒なので。
本当に渡すたびに必要なら OO インタフェースにして、オブジェクトが
持つべきだと思うんだがね。
FOO::func1($bar);
FOO::func2($bar);
の代わりに、
$obj = new FOO $bar;
$obj->func1();
$obj->func2();
0908nobodyさん
04/04/04 16:14ID:OYMBylAsCGIを作っていただいたのですが、うまく動かなくなってしまいました。
YYYYMMWというファイル名(2004年4月の第2週の場合は2004042.html)に飛ぶようになっていて
毎週月曜日の午前3時に切り替わるようにしてもらいました。
今日の場合は、2004041.htmlに飛ぶはずが、2004040に飛んでしまいます。
どこを直せばいいか教えてください。以下がソースです。
0909908
04/04/04 16:15ID:???$uri = 'http://www.hoge.com/';
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$mon++;
$weekth = int($mday / 7);
$weekth++;
$weekth-- if ($wday == 0);
$weekth-- if ($hour < 3 && $wday == 1);
$weekth = 1 if($mday == 1);
$mon = sprintf("%02d", $mon);
$year += 1900;
print "Location: $uri$year$mon$weekth.html\n\n";
exit;
0910908
04/04/04 16:18ID:???0911nobodyさん
04/04/04 16:29ID:???ちゃんとそのページを読みましょう。
とくに「FTP クライアントはクライアント兼サーバ」の部分を
理解していますか?
ファイル名を指定しても勝手にファイルが送られるわけじゃありません。
肝心のデータの受け渡し部分(DATA_WAITINGによる通信)がごっそり抜けてます。
そもそも、STOR で指定するファイル名はサーバ側で保存するための
ファイル名でローカルのファイル名じゃないです。
ttp://x68000.startshop.co.jp/~68user/net/ftp-5.html
までしっかり読んで理解するべきでしょう。
これ以上は FTP プロトコルの話になるので、コーディングスレだとスレ違いと
言われるような気がします。
0912908
04/04/04 16:36ID:???0913nobodyさん
04/04/04 17:17ID:???一週目の日曜と月曜朝三時までは前の週になるので[0]になっているので
これを[1]にするとか前の月にするとかしたらいいだけ
0915nobodyさん
04/04/04 18:25ID:???> $weekth = int($mday / 7);
ここを
$weekth = int(($mday-1+($wday-($mday-1)%7)%7)/7);
> $weekth = 1 if($mday == 1);
ここを
$weekth = 1 unless($weekth); # 一週目月曜日午前三時以前の対策
0916908
04/04/04 18:26ID:???またまたお助けを。
$weekth = 1 if($mday == 1); を以下のように書き換え。
if($weekth < 1) #第0週 = 前月最終週
{
$weekth = 5; #第五週=28日から31日
if(--$month < 1) #0月=前年最終月
{
$year--; $month=12;
}
}
0918nobodyさん
04/04/04 18:30ID:???Internal Server Error なんていう原因の特定もできないメッセージじゃなくて、
ちゃんとPerlの出すエラーメッセージを読むべし。
0919nobodyさん
04/04/04 18:32ID:???とりあえず、x月1日が月曜日である場合の午前3時までの処理が曖昧だが。
とりあえず前月最終日扱いとしてあんまり自信がないがこんな感じ。
$time = time;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time);
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time-24*60*60) if ($hour < 3); # 午前3時前は前日扱い
$mday += 12 - (($mday +6 -$wday) % 7); # 第1日曜が 13 になるよう補正
$weekth = int($mday/7);
$mon = sprintf("%02d", $mon+1);
$year += 1900;
print "Location: $uri$year$mon$weekth.html\n\n";
>>913
>これを[1]にするとか
これやると第1週が7日以上になるわけで。
0920nobodyさん
04/04/04 18:41ID:???>>916
コピペして全角空白が入ってるに 1 票。
>>913
>>919 を補足しとく。
×これやると第1週が7日以上になるわけで。
○これやると第1週が8日以上になるわけで。
そもそも、>>909 のコードでも 4/1 は第 1 週になってたと思われるので、
ことはそう単純ではないのです。
0921908
04/04/04 18:44ID:???すみません、エラーメッセージの出し方がわからなくて。
ちょっとググってみましたが、わかんらなくて。
>>919
ありがとうございます。これも試させていただきます。
とりあえず>>915さんのようにしたら、今のところ普通に動いてます。
いろいろとアドバイスをいただけて、大変ありがたいんですが、
最終的にどうするのがベストなのかわからなくなってしまいました。
0922908
04/04/04 19:02ID:???これは元のファイルの$uriの下の行〜printまでを置き換えればいいんですよね?
どうもエラーになってしまいます。
>>920
おっしゃるとおり全角スペースでした。で、動いたんですが、
なぜか2003045.htmlに飛んでしまいました。
0923nobodyさん
04/04/04 19:04ID:???my $uri = 'http://www.hoge.com/';
my ($hour, $mday, $mon, $year, $wday) = (localtime(time()-60*60*27))[2..6];
my $weekth = int(($mday-1+($wday-($mday-1)%7)%7)/7);
printf("Location: %s%04d%02d%1d.html\n\n", $uri, $year+1900, $mon+1, $weekth+1);
exit;
# 一週目月曜日午前三時以前は前の週に入れる場合。
0924923
04/04/04 19:07ID:???URIの例示には、rfc2606に従いhttp://www.example.com/等を使いませう。
0925908
04/04/04 19:12ID:???ありがとうございます。これまたエラーになってしまいました。
なんででしょう?
どうしたらいいかますますわかんなくなってきました。
今のところ、最初のものを>>915さん修正したものが正常に動作しているので
それを使わせてもらおうと思ってます。
0926919, 920
04/04/04 19:15ID:???違った。日数の問題じゃないや。
各週の日曜で後戻りしておかしくなるので 1 箇所だけ対応しても駄目ってことね。
>>921
> すみません、エラーメッセージの出し方がわからなくて。
ぐぐってみた。
↓「evalとdieを使って例外処理をしよう」
ttp://www.mellowtone.org/perltip1.html
> 最終的にどうするのがベストなのかわからなくなってしまいました。
んー、別に正しく動くならどれ使ってもいいと思うけど、
> とりあえず>>915さんのようにしたら、今のところ普通に動いてます。
今日だけ、じゃなくて自分の望む挙動かいろんなパターンで確認しておくべきだと思う。
1 日が日曜の場合に、1 日も 2 日も第 1 週になってるっぽいけど?
>>922
>これは元のファイルの$uriの下の行〜printまでを置き換えればいいんですよね?
そう。Perl の吐くエラーが欲しいところ。
とりあえず↑やるか、ローカルにも Perl 入れてそこで試してみない?
あと、>>916 のコードは多分おまいさんの望む挙動をしない。
0927nobodyさん
04/04/04 19:16ID:???エラーの理由が全角スペースとかだったとしたら、アドバイスくれた人に失礼だよ。
0928nobodyさん
04/04/04 19:31ID:???0929nobodyさん
04/04/04 19:34ID:???0930908
04/04/04 19:40ID:???会社の鯖でやってます、ごめんなさい。
Macなんですが、ローカルに入れるというのがわからなくて。
実はHTMLさえもそんなに知らない状態です。
0931908
04/04/04 19:52ID:???動きました。本当に失礼しました。
原因は、MacOSXで半角のエンマークがバックスラッシュに化けることがあって
それをそのまま最後の行でコピペしていたためでした。
本当に申し訳ありませんでした。
仕事関係のアドレスでここには晒せないのですが、きちんとお礼をいい、
どこで使っているのか報告したいので、
>>926さん、よろしければメールください。
本当にありがとうございました。
0932nobodyさん
04/04/04 19:54ID:???管理者からゴルァされる前にさっさとやめたほうがいいよ。
ていうか、ローカルでの動かし方も分からん奴がCGIに手を出すんじゃない。
0934919=920=926
04/04/04 20:09ID:???こりゃどうもご丁寧に。
一応 >>923 をぱくりつつ最終版をさらしてみるよ。
#!/usr/bin/perl
my $uri = 'http://example.com/';
my ($mday, $mon, $year, $wday) = (localtime(time() - 3*60*60))[3..6];
my $week = int(($mday+12-(($mday+6-$wday)%7))/7);
printf "Location: %s%04d%02d%1d.html\n\n", $uri, $year+1900, $mon+1, $week;
>>932 は確かに正論だし、今回はネタが面白そうだったからやってみたけど
本来は↓のスレの方がふさわしいかもね。
【 スクリプト改造依頼スレ 】(丸投げ)
ttp://pc5.2ch.net/test/read.cgi/php/1076831972/
0935885
04/04/04 20:27ID:???無事できました。どうもです。
引き続き質問すいません。
以下の書き方、まちがってます? エラーはでないんですが
画像が全部に表示されてしまう・・。
if ($n == 55) {$icon = 1 ;}
else {$icon = 0 ;}
この間にprintで文字記述後。
if ($icon = 1) {print "<IMG src=\"./img/icon.gif\">" ;}
else {print " " ;}
0937935
04/04/04 20:32ID:???すいません。ほんとーですね。
申し訳なさ杉です。
(´Д`)
0938nobodyさん
04/04/04 20:32ID:???$icon == 1 が正解。
$icon = 1 では、1を代入してそれを評価してしまう。(1なので必ず真になる)
もうちょい基礎をしっかりな。
0939935
04/04/05 00:27ID:???0940nobodyさん
04/04/05 00:29ID:???0941935
04/04/05 00:30ID:???0942本物935
04/04/05 01:05ID:???煽りどぉもです。
いや、まじで単純にミスってました。
936・938さん、感謝です。
(´Д`)ウヘェ・・
0944935
04/04/05 03:23ID:???つーか、インタプリタは糞
これ、周知の事実ね
0946nobodyさん
04/04/05 15:42ID:???0947nobodyさん
04/04/05 15:42ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。