Perl 初心者コーナー Part21
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
03/03/18 18:47ID:Dujz7IUF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0911nobodyさん
03/04/12 18:59ID:???<LOG> が 0 とか "" とか返したらループから抜けちゃう。
defined でチェックすればファイル末尾に達するまで確実に真値が返る。
0912nobodyさん
03/04/12 19:20ID:???ちょっと気になったので試してみたが、while (defined(my $hoge = <FH>))
while (<FH>) どちらでも "", 0 は出力されたぞ。
0914nobodyさん
03/04/12 19:50ID:???0の行→0\n
空白の行→\n
なわけで、偽にはならんわな。
0916はしのえみ好きー
03/04/12 20:14ID:???0917nobodyさん
03/04/12 20:53ID:???ごめん、while <> の場合は EOF までちゃんとループしてくれるね。
while(defined($var = pop @array)) { ... } てなのが頭にあったのよ。
>>914
$/ の中身が改行とは限らない。
あんまり意味はないけど $/ = \1; で1 byte 単位とか。
0918nobodyさん
03/04/12 21:38ID:???使えない関数がある時evalするべきと聞きますが、そうすると致命的エラーは発生しないものの
当然evalされた関数は実行されないんですよね?
flockとか実行されないとかなりまずいと思うのですがどうなんでしょうか。
evalしたらあとは祈るしかないんですか?
それと使えない関数があるというのはどういうことなんでしょうか。
Perlのバージョンが古いということですか?それともサーバサイドの設定によるものなんですか?
サーバのことは全くと言っていいほど無知なのでわかりません。
だいたい全体の何割ぐらいのサーバが使えないようになっているんでしょうか。
あやしい関数は使うなということなんですかね。
0920nobodyさん
03/04/12 22:25ID:???代替となるロック処理をするのは当然。
evalはエラーを出さなくするための関数じゃないんだから。
truncateとかflockはOSに依存した関数なので、OSがその機能を実装して
いなければ使えない。
0921nobodyさん
03/04/13 00:10ID:???ファイルでやってみたのですが、やはり!? while のループの中に入って
行きました。
while ($line = <FILE>) { ...
と書いたので、読み込まれた文字ゼロ (0x30) だけが $line に代入され、
そのゼロがそのまま while の条件式の値となって、偽と判断されるはず
だと思うのですが、私は何か勘違いをしているのでしょうか。
0923nobodyさん
03/04/13 00:39ID:???失礼しました。誤解を招く書き方でした。
data.txt というファイルを、0x30 という1バイトのみを持つように設定して
プログラムに読み込ませるデータファイルとしました。この 0x30 を、
>>921 の文中の「数字のゼロ」および「文字ゼロ」は、この 0x30 を指す
言葉として使いました。
●data.txt の中身
> hexdump -C data.txt
00000000 30 |0|
00000001
●プログラム
> cat test.pl
#!/usr/bin/perl
open(FILE, "<data.txt");
while ($line=<FILE>) {
print "hoge\n";
}
close(FILE);
●実行の様子
> ./test.pl
hoge
0924はしのえみ好きー
03/04/13 00:54ID:???それは全然意味ないんじゃないのか?普通に0と書くのと変わらないじゃん。
ってことで\x0でやってみた。
$ perl -e 'open(F,">data.txt");print F "\x00";close(F);'
$ dump data.txt
data.txt:
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------
00000000 00 .
$ perl hoge.pl
hoge
入ってる。
0925はしのえみ好きー
03/04/13 00:55ID:???おっと、説明不足だったが、
>バイナリで無理やり数字のゼロ
の意味が分からないってことだよ。
0x30を書くんだったら普通にテキストエディタで"0"って書けばいいんじゃん。
0926nobodyさん
03/04/13 01:13ID:???どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。
行入力演算子が undef 返すのは EOF に達した時だけだから、
ファイルは全部読まれるみたい。
統一感の無さは Perl らしいけど、便利と言えば便利。
0927nobodyさん
03/04/13 01:15ID:???\0x00とかのコードはどう知ればいいんでしょうか。
どこか一覧表とかあるのかな…。
あと、ずっと気になっていた、画像を生成する際の数字の配列は
みなさんどうやって計算?しているのでしょうか。
0928nobodyさん
03/04/13 01:18ID:???0929nobodyさん
03/04/13 01:23ID:???ダミー画像などでよく見かける、テキストだけで生成してるやつです。
別に、画像を読み込んで出力すれば良いんだけど
どうやるのか気になってたもので。
0930nobodyさん
03/04/13 01:48ID:???色数落としていくとそれになるよ。
0931nobodyさん
03/04/13 02:07ID:???早速明日試してみる事にします。
今日は眠いのでもう寝ます…。
0932はしのえみ好きー
03/04/13 02:18ID:???>\0x00とかのコードはどう知ればいいんでしょうか。
>どこか一覧表とかあるのかな…。
http://www.psl.ne.jp/perl/pdojo00b.html
0933nobodyさん
03/04/13 08:46ID:P9fP4Q1N0934nobodyさん
03/04/13 14:30ID:???>>890 の
while (defined(my $article = <LOG>)) {...
の書き方は助長なのか?
0935nobodyさん
03/04/13 14:45ID:???冗長ですな。
でも、私も厳密に考えたら defined を使って書いていたと思う。
>>926 の
「どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。 」
というのはわかったのだけど、なんとなく釈然としない。
マニュアルのどの部分に、そのことが書いてあるんだろう・・・。
0936nobodyさん
03/04/13 14:55ID:???0937nobodyさん
03/04/13 15:00ID:???「どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。 」
は違うみたい。
The defined test avoids problems where line has a string value that would be treated as false by Perl,
for example a "" or a "0" with no trailing newline. If you really mean for such values to terminate the loop, they should be tested for explicitly:
while (($_ = <STDIN>) ne '0') { ... }
0938nobodyさん
03/04/13 16:39ID:???In these loop constructs, the assigned value (whether assignment is automatic or explicit)
is then tested to see whether it is defined.
The defined test avoids problems
where line has a string value that would be treated as false by Perl,
for example a "" or a "0" with no trailing newline.
If you really mean for such values to terminate the loop,
they should be tested for explicitly:
while (($_ = <STDIN>) ne '0') { ... }
while (<STDIN>) { last unless $_; ... }
0939nobodyさん
03/04/13 16:40ID:???while (my $line = <STDIN>) { print $line }
これらのループ構造では、(自動的であれ、明示的であれ)指定された値は
defined されてるか否かテストされます。definedされてるか否かのテストをすると、
次の行を伴わない "", "0" のような、Perlでは 偽 として扱われる文字列が
行中にあったときの問題を避けることができます。
もし、おまいが本当にそれらの値("", "0")でループを終了させるのなら、
明示的に次のようにしる:
while (($_ = <STDIN>) ne '0') { ... }
while (<STDIN>) { last unless $_; ... }
↑↑↑↑↑↑↑ いい加減な訳、ここまで ↑↑↑↑↑↑↑↑↑
ということは、
「どうやら while の条件部は行入力演算子を使った場合に限って、
真偽値ではなく defined か否かで判定されるみたいだね。 」
は正しいのか?間違ってるのか?
誰か正確に訳してください。
0940926
03/04/13 17:45ID:???my $file = './test.txt';
open F, '>' . $file or die;
print F '0';
close F;
open F, '<' . $file or die;
A: { print 'A' while <F>; seek F, 0, 0 }
B: { my $foo; print 'B' while $foo = <F>; seek F, 0, 0 }
C: { my($foo, $bar); print 'C' while $foo = $bar = <F>; seek F, 0, 0 }
D: { my($foo, $bar); print 'D' while defined($foo = $bar = <F>); seek F, 0, 0 }
E: { print 'E' while <F> eq '0'; seek F, 0, 0 }
print "\n";
__END__
> perl test.p
ABDE
B が特別扱いっぽく見えるけど、「while の条件部に行入力演算子
のみを置いた場合はデフォルトで $_ に代入」との兼ね合いだろうね。
つまり while <> は while $_ = <> の文法的略記でしかなく、内部的
には後者で処理されてるんじゃないかな。
だから >>926 を厳密に言うと、「while の条件部は $var = <> ならば
defined か否かで判断、そうでない場合は真偽値で判断」だね。
ドキュメント読んでないけど、挙動を見る限りは。
0941nobodyさん
03/04/13 22:40ID:???$logfile = "./accesslog.dat";
$agent2 = $agent = $ENV{'HTTP_USER_AGENT'};
if ($agent =~ /AOL/) { $agent = 'AOL'; }
略・・・
elsif ($agent =~ /PDXGW/i) { $agent = $os = 'H"'; }
if ($agent2 =~ /win[dows ]*95/i) { $os = 'Windows 95'; }
略・・・
elsif ($agent2 =~ /X11/ || $agent2 =~ /SunOS/i || $agent2 =~ /Linux/i
|| $agent2 =~ /HP-UX/i || $agent2 =~ /FreeBSD/i || $agent2 =~ /NetBSD/i
|| $agent2 =~ /OSF1/i || $agent2 =~ /IRIX/i) { $os = 'UNIX'; }
$referer2 = $ENV{'HTTP_REFERER'}
if ($referer2 =~/\w/){$referer = "$referer2";}
open(FILE, ">> $logfile");
flock(FILE,2);
print(FILE "$ENV{'DATE_LOCAL'},$referer,$agent,$os,$ENV{'REMOTE_HOST'}$ENV{'REMOTE_ADDR'}\n\n");
lock(FILE,8);
close(FILE);
exit;
これが動かないのでチェックにかけると、
if ($referer2 =~/\w/){$referer = "$referer2";}
の;}の近くがおかしいとでました。サッパリわかりません。
ちなみに、ここのリファラーのif文を省いたときは正常に実行できました。
0942nobodyさん
03/04/13 22:42ID:???自分で同じものを書くと、;}の近くがおかしいとでます。
さらに、コピペではelsifはひっかからなかったのに、自分で書くと、
elsifというのはおかしいとか注意されます。もうサッパリです。
0943nobodyさん
03/04/13 22:44ID:???$referer2 = $ENV{'HTTP_REFERER'}
if ($referer2 =~/\w/){$referer = "$referer2";}
else{$referer = 'Direct Access';}
です。
0945nobodyさん
03/04/13 22:47ID:???そうなんですけど、自分で書くと、;}のところや、elsifがひっかかります。
チャックプログラムもKENTさんのところのやつです。
なんでですか?秀丸を使ってるんですけど、なにか関係ありますか?
0946nobodyさん
03/04/13 22:50ID:???ほんとに同じ物を書いたのか?
0947nobodyさん
03/04/13 22:54ID:???あ、ほんとだ。できました。ありがとうございます。
どうやら=文書くときにセミコロンを忘れる癖がついていたようで前にもこのようなことがなったんですね。。。
スレ汚しすいませんでした。
0948nobodyさん
03/04/13 23:18ID:pEN/2OPIこのスレに2度とくるな!
と書かれた者ですが質問しても良いですか?
0949nobodyさん
03/04/13 23:19ID:???もしここで私が「ダメだ」と言ったら
ひろゆきさんに問い合わせるつもりですか?
それともいちいち2ch系サイトに
「あなたのサイトをひろゆきさんにチクリます」
とメールを出したり書き込んだりするつもりですか?
0950nobodyさん
03/04/13 23:21ID:???0951nobodyさん
03/04/13 23:23ID:???>ひろゆき氏よりもエラそうな一言
などと反省の色が見えないことを考えると二度と書き込まないほうがよかれ。
0952nobodyさん
03/04/13 23:27ID:???だんご虫が群がってるよね。
あれみたい・・・。 このスレ。
0954nobodyさん
03/04/13 23:30ID:???自演
0955nobodyさん
03/04/13 23:41ID:pEN/2OPI953番さんここの管理人ですか?
0956nobodyさん
03/04/13 23:41ID:???「<tt>while (defined($line = <FILE>)) { ... }</tt> でdefinedがない場合、ファイル末にある改行なしの"0"が正しく取得できるかどうかの調査。
」
というのがありました。
http://www.hyuki.com/pb/pbmldig.html
0958937
03/04/13 23:54ID:???もういいよ。うざいバカだな。
>>956
なるほど。新しい版になると回避するようになってるってことか。
しかし MacJPerl 5.2.0r4 はわけわからんな。何が影響してるんだろうか。
やっぱ>>937-938の通りだな。心配だったらチェックしろってことか。
まあ俺の周りでは5.6以降しかないから大丈夫だろうな。
情報ありが�d
0959948
03/04/13 23:56ID:???955はもろそうですけど。
0961948
03/04/14 00:10ID:???失礼しました。
0962nobodyさん
03/04/14 01:18ID:oETCFM9h0963nobodyさん
03/04/14 01:22ID:???最後の文字の直前に、ピリオドを突っ込む。
以下独り言。
バイト数をメガバイトや、キロバイトという単位で表示したいのなら、
1024で割れば、キロバイトになる。
さらに1024で割ればメガバイトになる。
コンピュータの世界の数字ではないのなら、1024の代わりに1000を使う。
0967nobodyさん
03/04/14 04:08ID:???use strictだと怒られてしまいます。
何故でしょうか…。
0968はしのえみ好きー
03/04/14 05:13ID:???0969nobodyさん
03/04/14 05:44ID:???use strict;
と書くと、
use strict 'refs';
と、書いてあるときと同じ制限(シンボリックリファレンスの禁止)が効いてくるからじゃないかな。
0970はしのえみ好きー
03/04/14 06:28ID:???0971nobodyさん
03/04/14 09:30ID:???処理を行う文字列内に2バイト文字が含まれている場合、処理を中断させたいのですが
Perl でコレに適した関数が存在しますでしょうか?
関数が存在しない場合、この様な処理を行いたい場合どのような考え方を行えばよいでしょうか?
0972nobodyさん
03/04/14 10:03ID:???0973nobodyさん
03/04/14 10:57ID:???それを利用して正規表現でマッチングすれば実現できそうですね!
因みに、コード S-JIS の場合は同じ様な方法で処理可能でしょうか?
0974nobodyさん
03/04/14 12:44ID:???http://tohoho.wakusei.ne.jp/wwwkanji.htm
まず、ここ↑だけでなく、とほほさんのページWWW入門を端から端までざっと読まれたし。
あと、「2バイト文字」 「判定」 とかでぐぐられたし。
0976nobodyさん
03/04/14 14:53ID:???と書くと変数が空になる場合とそのまま表示される場合があるのはなぜですか?
0977nobodyさん
03/04/14 15:06ID:???言いたい事だけだを言って逃げるような人間は必要ない。
0979nobodyさん
03/04/14 15:19ID:???言いたい事だけだを言って逃げるような人間は必要ない。
0980nobodyさん
03/04/14 16:40ID:???0982nobodyさん
03/04/14 23:20ID:Fu0phwZ60983nobodyさん
03/04/14 23:30ID:???答えられねーくせに常駐してんなよ
0987nobodyさん
03/04/15 01:11ID:GCPlWzzFhttp://f9.aaacafe.ne.jp/~raiha/printenv.cgi
誰かこれと同じようなCGIをくんで、どこかにUPしてもらえないでしょうか?
本っ当にすいません、携帯なんで。。。
0989nobodyさん
03/04/15 01:22ID:iui3dkW8あと、この場合のパーミッションはどうしたらよいか教えて下さい。
もしよろしければ、UPしてもらいたいんですが。。。だめですか?
0990はしのえみ好きー
03/04/15 01:35ID:???別にコードに書くわけじゃないよ。http://fh.aaacafe.ne.jp/ ここで聞いて来い。と思ったがろくな説明書いてないな。
ftpでUpしてるならchmodしろ。FTPクライアントによってやり方は違うからそれに関しての質問はスレ違い。
0991はしのえみ好きー
03/04/15 01:35ID:???正:FTPクライアントによってやり方は違うが、それに関しての質問はスレ違い。
0992nobodyさん
03/04/15 03:05ID:???$b = 3;
$c = $a / $b;
だと $c = 3.3333〜になってしまいますし
int($a / $b) だと $c = 3になってしまいます
少数第2位でそろえるためにはどうすればいいんでしょうか?
一応
$c = (int($a * 100)/$b)/100; っていうのも考えて見たんですが
もっとスマートにやる方法ないでしょうか
表示するわけではないのでprintf()は使えません。
0996nobodyさん
03/04/15 07:22ID:HrV7+0uT0997nobodyさん
03/04/15 10:14ID:???じゃあ、立ててくるから待ってて
0998nobodyさん
03/04/15 10:17ID:???Perl 初心者コーナー Part22
http://pc2.2ch.net/test/read.cgi/php/1050369328/l50
0999nobodyさん
03/04/15 13:57ID:???1000nobodyさん
03/04/15 13:58ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。