【Perl】初心者コーナーPart9
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
01/12/28 23:21ID:SPLRvqQi1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0756名無しさん@お腹いっぱい。
02/02/13 21:34ID:xqc5dBTwやっぱり,分からん
もう,泣きそう
0757名無しさん@お腹いっぱい。
02/02/13 22:46ID:???>>755の言っている事をもっと穿って考えよう。(w
ホントだよ?
0758名無しさん@お腹いっぱい。
02/02/13 22:49ID:???簡単に言うと「Perlは人と同じように数値を理解しているわけではない」ってこと。
これは仕様なんで注意して扱うしかない。
どうしても高精度な計算がしたいならモジュールを使う事。
#!/usr/bin/perl
use Math::BigFloat;
my $num = new Math::BIgFloat('18.9');
print int($num * 100);
__END__
0759名無しさん@お腹いっぱい。
02/02/13 22:51ID:???<my $num = new Math::BIgFloat('18.9');
>my $num = new Math::BigFloat('18.9');
0760名無しさん@お腹いっぱい。
02/02/13 22:54ID:???「難しく」言うと、どのような理屈になるのでしょうか?
できるだけ付いてこられるように頑張ります。
0761名無しさん@お腹いっぱい。
02/02/13 23:10ID:???とりあえず、Perlが数値を表現するのに確保しているメモリの量では、
18.9を正確に表現することは出来ない、ってことです。
これ以上詳しく言うと長くなりすぎるんで「浮動小数点 内部表現」とか「浮動小数点 フォーマット」
とかで検索すると多分ずらずら出ます。
(でも大抵はその仕様について書かれてるだけなんでイメージしづらいんだよな)
0762753
02/02/13 23:23ID:???精度(?)云々というのはなんとなく頭の片隅にはあるんだけど
int( 18.9 * 10 )=189
int( 18.9 * 100 )=1889
int( 18.9 * 1000 )=18900
なんで,*100 の時だけ?というのが腑に落ちないんだな,これが
0763名無しさん@お腹いっぱい。
02/02/13 23:27ID:???で、浮動小数点については調べてきたのか?
0764名無しさん@お腹いっぱい。
02/02/13 23:30ID:???そこはそれ>>755ということ。
具体的に何やってるのかは知らんが、善処した結果なんだろうね。
まぁ俺も妙だとは思う。int()を外すと1890になるのも不可解だし。
0765名無しさん@お腹いっぱい。
02/02/13 23:31ID:???0766名無しさん@お腹いっぱい。
02/02/13 23:31ID:???構造知らずして結果の食い違いは理解できないぞ。
0767名無しさん@お腹いっぱい。
02/02/13 23:32ID:???>>765ということで>>766も忘れてね。
0768名無しさん@お腹いっぱい。
02/02/14 02:16ID:???0769名無しさん@お腹いっぱい。
02/02/14 02:46ID:???うろ覚えだけど,
2進数では
整数部分は 1, 2, 4, 8, 16, 32, 64...と位が上がっていって
小数部分は 1/2, 1/4, 1/8, 1/16, 1/32...と位取りされている
んじゃなかったかな。
0770名無しさん@お腹いっぱい。
02/02/14 08:31ID:???調べろ。と言ったはずだが?
勉強しないプログラマに明日はないぞ。
>>769
正解。
0771名無しさん@お腹いっぱい。
02/02/14 12:48ID:???Perlのprint()関数は、C言語のprintf()、
またはそれに準ずるフォーマットルーチンを使って実装されていて、
不動小数点数はある桁数(これは自由に設定可能である)で繰り上がる仕様になっている。
この現象は "print 2/3" 等とした時にも見られる。
ところが、int()というのは小数点以下を黙って全て切り捨てる。
これにより、答えが整数であるべき時でも"print int $n"と"print $n"に差が生じる事があるのだ。
0772名無しさん@お腹いっぱい。
02/02/14 14:10ID:???53bit同士の計算で, 結果の54bit目が1だと切り上げされるからじゃない?
18.9 ≒
10010.111001100110011001100110011001100110011001100110
10 = 1010
100 = 1100100
1000 = 1111101000
10000 = 10011100010000
100000 = 11000011010100000
18.9*10 ≒
10111100.1111111111111111111111111111111111111111111111
->10111101
18.9*100≒
11101100001.1111111111111111111111111111111111111111110
18.9*1000≒
100100111010011.111111111111111111111111111111111111111
->100100111010100
18.9*10000≒
101110001001000111.111111111111111111111111111111111111
->101110001001001000
18.9*100000≒
111001101011011001111.111111111111111111111111111111110
0773名無しさん@お腹いっぱい。
02/02/14 14:21ID:+0g/R+F6同じクラスのインスタンスを複数作った場合、インスタンス間でファイルハンドルを別々に持つようにできますでしょうか?
$file1=new FileClass('read.txt');
$file2=new FileClass('write.txt');
$string=$file1->getLine(1);
$file2->insert($string);
$file1->close();
$file2->close();
みたいな。
ファイルハンドルに参照とか無名配列みたいのがあれば自分で解決できそうだけど聞いたこと無いので。
0774名無しさん@お腹いっぱい。
02/02/14 14:23ID:X8oQt8gzどうすればいいのでしょう・・・。
(結果として、以下のようになる)
<h1>ああ</h1>
<h2>いい</h2>
<h3>うう</h3>
<h2>いい</h2>
0775名無しさん@お腹いっぱい。
02/02/14 14:34ID:0AhamLLI0776774
02/02/14 16:11ID:peM7yPQ9でも、
$filename = "test.html";
open(IN, $filename) || die "$filename: $!";
open(OUT,">result.html") || die "result.html: $!";
while(<IN>){
chomp:
print OUT $1 if m|(<([hH][1-6])[^>]*>[^<]*</\1>)|o;
}
close(IN);
close(OUT);
で、結果が0k。。。。なぜ?
test.htmlの中身は、以下の通り
aaaa<H2>えいちに</H2>bbb
<h1>えいちわん</h1>
0777774
02/02/14 16:18ID:peM7yPQ90778名無しさん@お腹いっぱい。
02/02/14 16:21ID:???使用法なんてどうでも良いから実装を見せろよ。
多分 "open HANDLE" とかしてるんだろうけど。
とりあえず標準ライブラリの Symbol と IO::Handle および IO::File のソースを読めば幸せになれるかもな。
関係ないが、クラスの名前に"Class"をつけるのはアホらしいと思うのは俺だけか。
0779名無しさん@お腹いっぱい。
02/02/14 16:35ID:???としてみたらいけた。()のネストってこうなるのか。
0780773
02/02/14 17:07ID:???非常にありが�d。ついでにスマソ。
で、ご指摘どおりsymbolを読んで、とりあえず幸せになれた。
ファイルハンドルにスカラー変数が使えるとは。
クラスの名前にClassなんて、いつもは付けてないけど今回は念のため。
0781名無しさん@お腹いっぱい。
02/02/14 22:58ID:oPnLkVh5掲示板で書きこみ者の任意の回数だけ要素(例えばアイコンとか)を
繰り返し表示させるスクリプトを組み多淫です。
うんこのアイコンを選んで「10」とエリアに入れてpostしたら
うんこアイコンが10個出る、見たいな感じで。
この繰り返させるスクリプトの書き方がわからんのです
どなたかわかる方いたら教えてください。
0782名無しさん@お腹いっぱい。
02/02/14 23:33ID:7pMXJhas0783名無しさん@お腹いっぱい。
02/02/14 23:38ID:???0784名無しさん@お腹いっぱい。
02/02/14 23:40ID:???を変換しようとするとき
どうすれ売淫ですか
になって、よく困るな。そういえば。
こういうことやるから、また売淫ででるな。
0785名無しさん@お腹いっぱい。
02/02/14 23:44ID:???アイコン<select name="icon">
回数<input name="kaisu">
-------------------
for (1..$in{'kaisu'}) {
$icon.="<img src=$in{'icon'}>";
}
-------------------
0786名無しさん@お腹いっぱい。
02/02/14 23:56ID:???こんな基本的なコードでも人のコードは勉強になる。
なるほど,すごくシンプルだ。おれなら"i="云々書いてるとこだった。
0787名無しさん@お腹いっぱい。
02/02/15 00:04ID:???0788781
02/02/15 00:55ID:LCJ4YCpt>>787
THANXです!
今スクリプトをこねくり回してますがうまいこといかないです。
成功したら完成形を報告します。うー…
0789名無しさん@お腹いっぱい。
02/02/15 06:20ID:WCBRMEef0790名無しさん@お腹いっぱい。
02/02/15 06:20ID:oL67ZYlw0791名無しさん@お腹いっぱい。
02/02/15 06:30ID:???汚染チェックと上限チェックを忘れないようにな。頑張れ。
0792賛成の反対の反対ナノだ!
02/02/15 06:30ID:???>
$in{'icon'}の値が「xxx.gif" onLoad="JavaScript:ウケケ」に書き替え
られて送信されてきたらどうする?チェックはキッチリやっておこうネ!
そうしないとセキュリティホールになったりして。
0793名無しさん@お腹いっぱい。
02/02/15 13:10ID:???とほほみたいなこと言うなよ・・・
0794♀
02/02/15 16:07ID:???したらばの「管理人メニュー」に意味不明のものがありました。
FAQにも書いてありませんでしたし、
サポート掲示板に書いても反応がありませんのでこちらでお願いします。
>Getによる投稿を認める
Getってなんですか?
0795名無しさん@お腹いっぱい。
02/02/15 16:19ID:???まじで大切だと思うけど。
0796名無しさん@お腹いっぱい。
02/02/15 16:47ID:???CGI側:データ受け取りに環境変数を使うか標準入力を使うか。
ブラウザ/サーバ側:HTTP0.9でも動くか否か。
0797名無しさん@お腹いっぱい。
02/02/15 16:59ID:???だからなGETだと,「<A href="http://www.aaaa.com/boke.cgi?name=荒らしだよ〜ん&naiyou=死ね死ね死ね">僕のホームページはここです!</A>」なんてことができるってこと。
そのかわり「boke.cgi?Logview」とかアドレスで直接モードへの移行はできなくなる。
まぁPOSTにしとけ。
0798名無しさん@お腹いっぱい。
02/02/15 17:20ID:???open(FILE,'>text.txt')
print FILE 'abcd';
close FILE;
の代わりに
$file=1;
open($file,'text.txt');
print $file 'abcd';
close($file);
とやるとprintで死ぬのですが。<>でくくってもだめだったです。
0799名無しさん@お腹いっぱい。
02/02/15 17:22ID:???セキュリティホールに気を配るのは基本だと思われ
0800名無しさん@お腹いっぱい。
02/02/15 18:04ID:???ちょっと気になったもので。
0801名無しさん@お腹いっぱい。
02/02/15 18:12ID:???@a[1]は有効か?
0802名無しさん@お腹いっぱい。
02/02/15 18:13ID:???「1」はダメだろ。
0803名無しさん@お腹いっぱい。
02/02/15 18:17ID:???読む時もロックしといたほうがいい?
0804名無しさん@お腹いっぱい。
02/02/15 18:17ID:???読み込んでる最中にロックされると困りませんか?
0805798
02/02/15 18:19ID:???中身のないスカラーはFH代わりに使えないけど、なにか代入したら使えましたよ。
もっとも、私は標準ライブラリsymbolの
$sym = gensym;
open($sym, "filename");
のgensymの意味がわからないのでテケトーにやってみた、というだけの話ですけど…。
まぁ、モジュール化とかの理由で通常のファイルハンドルが使えない状況なので無理にスカラーをば。
で、1じゃだめですか?
0806名無しさん@お腹いっぱい。
02/02/15 19:17ID:???なるほど。つまりやめとけって意味ですか?
レスの意味はよく考えたんだがちょっと想像できない・・・。
人が読み込んでるときに自分が読み込めないのは無駄で遅くなる原因になるっぽいけど・・・
0807名無しさん@お腹いっぱい。
02/02/15 19:33ID:u5RDXGaqopen($file,'text.txt');
print $file 'abcd';
close($file);
これは、やっていることは以下といっしょ。
open(1,'text.txt');
print 1 'abcd';
close(1);
よって、君がいう「通常のファイルハンドル」となんら代わり無い。
そんなことより、open($file ,'> text.txt') でしたという落ちはなしにしてくれ。
0808名無しさん@お腹いっぱい。
02/02/15 20:14ID:???@hoge[] はスライス、($hoge[])はスカラーが一個のリスト。
>>803
読むときもファイルロックすべき。
読むときにロックしないで、読んでる最中にいきなりロックかけられたら困るでしょ?
>>804の答えはそういうこと。
> 人が読み込んでるときに自分が読み込めない
いいえ、これはLOCK_EXでなくLOCK_SHを使えばいいだけの事。
この辺り、過去ログでJAPUさんが詳しく述べているとこあり。
過去ログ閲覧をお勧めする。
0809名無しさん@お腹いっぱい。
02/02/15 20:34ID:???2ちゃんねるの過去ログなんて、これほどあさりにくいものはないっすよ
横やり失敬しました(笑)
0811名無しさん@お腹いっぱい。
02/02/15 23:19ID:???あ る に 決 ま っ て る だ ろ !
0812名無しさん@お腹いっぱい。
02/02/16 01:38ID:???2_45_5_74
4_36_3_53
8_83_2_27
こんな感じのデータがある時、12_45_5_74 の
1番目の12と3番目の5を足してその値を大きい順に
並ばせるにはどうしたらいいでしょうか?
データを開いて、whileで各、足していって、
データ保存
保存したデータを大きい順に並べていって、
データ保存
こんな感じを感じを考えているのですが、
一つにまとめる方法とかありますか?
おねがいします。
0813名無しさん@お腹いっぱい。
02/02/16 01:41ID:???数値の大きさ比べるだけなら実装も楽でしょう。
0814名無しさん@お腹いっぱい。
02/02/16 01:42ID:???0815名無しさん@お腹いっぱい。
02/02/16 01:44ID:???計算後のデータを記憶する際に大きい順になるように記憶させれば。
0816断罪!断罪!また断罪!!
02/02/16 01:54ID:???open(READ, $readFile);
while(<READ>){
if ( /^(\d+)_\d+_(\d+)/ ){
$sort{$1+$2}++;
}
}
close(READ);
open(WRITE, ">$writeFile");
for ( reverse sort keys %sort ){
print WRITE "$_\n";
}
close(WRITE);
0817名無しさん@お腹いっぱい。
02/02/16 01:57ID:???いちいちソートするのって効率悪くないですか?
0818断罪!断罪!また断罪!!
02/02/16 02:14ID:???>
ソートだけにそーっとすればOK (ヮ
0819名無しさん@お腹いっぱい。
02/02/16 02:21ID:smdGl30Bとなっているのをs//やtr//などを使って
$moji = "a\'a\'a\'a\'";
という結果にしたいのですが、どうしたらいいでしょうか?
0820断罪!断罪!また断罪!!
02/02/16 02:22ID:???>
$moji=~ s/'/\\\'/g;
0821賛成の反対の反対ナノだ!
02/02/16 02:25ID:???0822名無しさん@お腹いっぱい。
02/02/16 02:27ID:smdGl30Bそれはやってみました。以下のエラーがでます。
syntax error at test.cgi line 6, near "$moji~"
Execution of test.cgi aborted due to compilation errors.
0823名無しさん@お腹いっぱい。
02/02/16 02:34ID:???=~じゃなくて ~= にしてない?
0824賛成の反対の反対ナノだ!
02/02/16 02:35ID:???>
$mojiに 漢字コードが入っているのでは?
0825名無しさん@お腹いっぱい。
02/02/16 02:37ID:smdGl30Bありがとう!!
自分のぼんくらミスに気付きませんでした。(感謝)
0826名無しさん@お腹いっぱい。
02/02/16 02:39ID:???それじゃ予め \' となっているものも置き換わので、後読みするのが吉。
s/(?<!\\)'/\\'/g;
0827名無しさん@お腹いっぱい。
02/02/16 02:54ID:smdGl30Bありがとう。(感謝)
0828名無しさん@お腹いっぱい。
02/02/16 03:26ID:hJTYeQVWuse IO::File;
my $fh = new IO::File "text.txt", "w";
die "なんか開けませんでした:$!" unless $fh;
print $fh "abcd";
$fh->close;
0829名無しさん@お腹いっぱい。
02/02/16 04:12ID:???IO::Fileみたく型グロブを使うとか。
open HANDLE, 'hoge.txt';
$fh = *HANDLE{FILEHANDLE}; #$fh = \*HANDLE;
print $fh 'HOGE';
0830名無しさん@お腹いっぱい。
02/02/16 04:28ID:???0831名無しさん@お腹いっぱい。
02/02/16 05:38ID:???>808
なるほど分かりました。そうします。
0832名無しさん@お腹いっぱい。
02/02/17 03:46ID:???スクリプトを分割するってのは意味あるんでしょうか?
0833名無しさん@お腹いっぱい。
02/02/17 12:39ID:???例えば1〜10を足すとき、
for($i=1;$i != 10;$i++)
{
$sum += $i;
}
と、
$sum (10 * 9) / 2;
の2種類がある。
まぁ、こんなそのものズバリの公式がある場合は少ない。
基本的にはその処理をいかに少ない命令で実現するか。
sprintfとかは重いらしいwからそう言うのも考慮して。
ループの外でもできる処理はループの外に出すとか。
ループ内でうまくnext;last;を使うとか。
なお、分割したところでコード量は減らない。
むしろ各種オーバーヘッドがかかったり。
なぜ分けるかと言えばその方がわかりやすいから。
関連の機能をまとめてモジュール化しているわけです。
0834名無しさん@お腹いっぱい。
02/02/17 12:42ID:jcHWzcYr誰のソースは勉強になる、誰のはやめとけっていうのは
やっぱりありますか??
全然perl初心者なので、そのへんの区別がつきにくいです、、
0835名無しさん@お腹いっぱい。
02/02/17 12:44ID:???初心者ならどれ読んでも参考にはなるかな?
と、言うか読めるのか??大変だぞ。人のソース。
0836名無しさん@お腹いっぱい。
02/02/17 14:10ID:???応、簡単な入門書などを読んで、すげー単純な掲示板などは
作れるようになったくらいのレベルです。
やっぱりもっと本などで十分に勉強してからのほうがいいのかも、、、
0837名無しさん@お腹いっぱい。
02/02/17 14:14ID:???おもしろいと思った処理を自分の書き方でパクればいい。
まぁ、クイックソートとかリストとかデータ構造とアルゴリズムは知って置いて良いかも。
0838名無しさん@お腹いっぱい。
02/02/17 17:08ID:???なるほど,意味ないんですか。
まぁできるだけ意味のないこと(アクセスログ採取とか)はやめとけってことですね。
>834(>836)
そのくらいのレベルならここに定着したら良いかと。
0839名無しさん@お腹いっぱい。
02/02/18 02:04ID:???Perlを実行する時は、コマンドプロンプトからですか?
ダブルクリックでは実行できますか?
あと、Perlの拡張子は何ですか?
0840名無しさん@お腹いっぱい。
02/02/18 02:12ID:FZ6+Jcwo0841
02/02/18 02:22ID:g517xzDH0842名無しさん@お腹いっぱい。
02/02/18 03:17ID:???人によって変数の書き方や改行の仕方の癖があるので
色々みてみて、自分の書き方に近い人、読みやすいものを
さがすといいのでは。
Perlだと、人によってはすごくトリッキーな、
もはや芸術的なコードを書く人がいますんで。
いいんだか悪いんだか最初はわからないかもだけど。
0843この子の七つのお祝いに
02/02/18 03:25ID:???DOS窓から次を実行。
% perl test.pl
--- 拡張子はなんでもOKだが、一般には.plを使う。---
> 841
ファイルとお話するためです。しゃべり専門と聞き専門がいますが、
しゃべり専門は、考えたことを一気にしゃべり倒すのか少しずつしゃべって
いくのかタイプが分かれますが、途中で切り替えることもできる器用な人です。
聞き専門の人は話が今どこまで進んでいるかを憶えておかないといけない。
0844名無しさん@お腹いっぱい。
02/02/18 05:23ID:???@zzz = ("a","b","c","d","e","f","g","h","i","j","k");
$xxx = 3;
表示
abc<br>def<br>ghi<br>jk<br>
「@zzzを$xxx回ごとに<br>で区切って表記」
と、いう処理をしたいんですが、どうしたらいいでしょうか?
0845名無しさん@お腹いっぱい。
02/02/18 09:33ID:9k5avLiX同時に開くファイルが、1つであるとは限らないからです。
2枚以上のファイルを開いているときに、FHをつかって、
どっちに仕事させたいのか指定するのです。
0846名無しさん@お腹いっぱい。
02/02/18 21:03ID:Lwlv3uzpBBS作って、書き込みがあったら管理人のメアドに書き込み内容を自動送信するようにしたんです(sendmailで)。
自動送信するのとしないのとでは30秒程度のタイムラグがあります。sendmailの設定が悪いの?
0847名無しさん@お腹いっぱい。
02/02/18 21:06ID:???処理時間が増えたんだろ?
0848名無しさん@お腹いっぱい。
02/02/18 21:07ID:???その質問内容で、君の相談内容が理解できたやつは神。
0849名無しさん@お腹いっぱい。
02/02/18 21:12ID:???MZ-80じゃあるまいし、書き込み変数をそのままsendmailに投げて送信するだけで30秒も掛からないっすよ。
0850名無しさん@お腹いっぱい。
02/02/18 21:12ID:???タイムラグの使い方変。
08518484
02/02/18 21:20ID:zt3xmvgw『ハッキングのわざが手に取るようにわかる本』に書かれている内容を
実践・計画をした場合、以下の罪・違反・侵害に問われる可能性アリ。
どうかご注意して頂きたい。
http://www.puchiwara.com/hacking/
0852名無しさん@お腹いっぱい。
02/02/18 21:25ID:???0853名無しさん@お腹いっぱい。
02/02/18 21:28ID:???0854名無しさん@お腹いっぱい。
02/02/18 23:54ID:???こんな感じ?
;# 設定
my( @zzz )= ('a'..'k');
my( $xxx )= 3;
my( $cat );
;# 処理
for ($i=$[; $i<=$#zzz; $i+=$xxx){
$cat.="$zzz[$i]$zzz[$i+1]$zzz[$i+2]<br>";
}
print $cat,"\n";
0855844
02/02/19 00:16ID:???うひゃー(;д:)
出来ました。ありがとうございましたぁ(;_;)
あぁ、しかし、凄い初心者な質問だったということが
解答から見て取れる・・・ 鬱だ。(2週間目で初心者そのものですが)
■ このスレッドは過去ログ倉庫に格納されています