Perl コーディング初心者質問コーナー Part33
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/03/01 02:46ID:1GeWO7LH【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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. [email protected]
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. [email protected]
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にはフォームの「メールアドレス」の項目の内容が入り、あとは以下のとおりです。
質問は確認メールが送信されたメールを見ると、送信者の欄が
[email protected]になっています。サーバのホスト名が入ってしまいます。
これをtestだけにしたいのですが、どうしたらいいのでしょうか?
$from= "test";
$subject "アンケート";
## 入力者に確認メールを送信
open (MAIL,"| /usr/sbin/sendmail -t");
print MAIL "To: $mail\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "Content-type:text/plain\n\n";
print MAIL "送信しました。\n\n";
close(MAIL);
0105nobodyさん
04/03/03 03:05ID:???$from= "test";
$adrress= "[email protected]";
print MAIL "From: $from $adrress\n";
だったよな・・・
0106104
04/03/03 03:15ID:???それでは無理でした。。↓になります。
[email protected]
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}{'このキー'};
上のような連想配列で 'このキー' のキーの一覧を得るには
どうすればよいのでしょうか?
よろしこ おながいします。
■ このスレッドは過去ログ倉庫に格納されています