トップページ⇒php
1001コメント404KB

Perl コーディング初心者質問コーナー Part33

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/03/01 02:46ID:1GeWO7LH
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0696nobodyさん04/03/23 05:14ID:???
>>695
http://perldoc.com/perl5.8.0/pod/func/sysopen.html
0697nobodyさん04/03/23 05:22ID:???
>>696
前に調べてたときにsysopen知ったんですが
使わないほうがいいみたいなこと書かれてましたけど大丈夫なんでしょうか?
0698nobodyさん04/03/23 06:15ID:???
>>965
FileHandleモジュールか、IO::Fileモジュールでパーミッションの指定ができます。
0699nobodyさん04/03/23 06:22ID:???
>>697
バッファリングするヤツと一緒に使ってはいけない。
umaskとかはどうですか?
0700nobodyさん04/03/23 08:31ID:???
>>694 そう思ったら貴様が作れよ。。なんちて

my @num = qw/1 -1 11 -11 111 1111 11111 111111 -111111/;
my $digit = 2;
foreach my $price (@num) {
my $len = length(my $p_price = abs $price);
$p_price -= $p_price % 10 ** ($len - $digit) if $digit < $len;
$price = $p_price * ($price <=> 0);
print "$price\n";
}
0701nobodyさん04/03/23 14:54ID:???
04とか03とか2桁に整形された形の数字から
0をとり省くのはどのような方法があるでしょうか?
0702nobodyさん04/03/23 14:54ID:awaWqGNM
use strict;

sub hogehoge{
my @myarray;

(中略)

$myarray[5][0] = 'foo';
$myarray[5][1] = 'bar';
$myarray[5][2] = 'hoge'
・
・
・
}

と同じようなことをpushを使ってやりたいのですが、
どうすればいいのでしょう?

試しに
push ($myarray[5] , 'foo');
のようにやると、
「Type of arg 1 to push must be array (not array element) at」
と怒られてしまいます。
0703nobodyさん04/03/23 14:57ID:???
>>701

my $num = '03';
$num = sprintf( "%d", $num );
0704nobodyさん04/03/23 15:00ID:???
>>703 さん
なるほど。有難うございます。

>>702
push (@{$myarray[5]} , 'foo');
0705nobodyさん04/03/23 15:00ID:???
>>702
push @{$myarray[5]}, qw(foo bar hoge);

リファレンスわかってて、なんでデリファレンスわからんかなあ
0706nobodyさん04/03/23 15:01ID:???
>>702

よく意味がわからんけど、
pushの二つ目の引数は配列じゃなきゃだめ
070770604/03/23 15:03ID:???
誤爆。
一つ目の引数
0708nobodyさん04/03/23 15:17ID:???
>>701
整形された数字 *= 1;
0709nobodyさん04/03/23 16:22ID:???
HTML::Templateモジュールでは、
最後に print $template->output;で
ブラウザに表示するのが普通ですが、
これを、HTML全体を変数に格納する方法はないでしょうか?
071070904/03/23 16:39ID:???
自己レス

my $foo = $template->output;
でOKですた。。。
0711nobodyさん04/03/23 17:44ID:???
695です。ちょっと用事でしたスイマセン。
皆さんレス有難うございます。
それで、モジュールは少し理由があって出来れば使いたくないです。
umaskググったんですが説明が、「umask:umaskを設定します」と書いてあり、
だからそのumaskって?感じでした。
で、695で書いたのを、まぁ暴走はしないだろうと思ってレン鯖で実行してみたら、
chmod 0606,OUT;はまぁ無理ですが、

open (OUT,">$num.dat");
chmod 0606,"$num.dat";
print OUT $buffer;
close (OUT);
できちんとパーミッションが606に成ってくれていました。

#因みにchmodをしなければ644でした。

ということなんですが、このままいって大丈夫でしょうか?
いろんなソース見てきましたが、openしてるファイルをchmodしてるのは見たことが無いんですが。
0712nobodyさん04/03/23 20:32ID:???
>>705 たぶんリファレンスわかってないんじゃないかな・・・
0713nobodyさん04/03/23 20:42ID:???
>>711
http://x68000.startshop.co.jp/~68user/unix/pickup?umask
0714nobodyさん04/03/23 22:17ID:???
>>713
わざわざ有難うございます理解できました。これ使って出来ますね。
ところで711は問題ないか解るかたいませんでしょうか。
さっきから検索してるんですが、711のようなのが、いいのかだめなのか解らないです。
とりあえず無理なら教えていただいたumaskを使おうと思っているのですが。

かなりしつこくて申し訳ないです。うざかったら放置してください。
0715nobodyさん04/03/23 23:41ID:???
>>714
なぜcloseした後にchmodせずにopen中にやりたいわけ?
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中に入れたいなと思いました。
0717nobodyさん04/03/24 09:32ID:???
>>716
open が実行されたら0バイトのファイルが作成されるから
その後にchmodしても一応問題はないけど。
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" と表示されてしまいます。
071971804/03/24 16:19ID:???
ぼけてました。
$hash{'a'} = "ABC"; で解決しました。
0720nobodyさん04/03/24 17:41ID:???
>>719
何が解決したのかよくわからないけど、
俺はundef使ってる
0721nobodyさん04/03/24 18:39ID:???
ハッシュは[]じゃなく{}だった、ということだろ
0722nobodyさん04/03/24 18:39ID:???
>>718
%hash = ();
undef %hash;
どちらでもお好きな方で。
0723nobodyさん04/03/24 19:57ID:???
おすすめのDBI関連解説の書籍/サイトを教えてください。
072471804/03/24 19:59ID:???
>>721-722
ありがとうございます。
0725nobodyさん04/03/24 20:39ID:6j96YsNk
すいません、質問です。
Perlで日記を作ってる最中です。
一番下に、1 2 3 ・・・・ 11 12 と月別のリンクを作って、
番号クリックしたらその月の日記を見れる、、、って感じで。
クリックしたらその番号を変数に入れて、日記のログ出力のルーチンに飛ばすみたいな事できますか?
できるならどういうテクを使うんでしょうか?
0726nobodyさん04/03/24 20:43ID:???
>>725
見るだけならCGI不要じゃねぇか。
0727nobodyさん04/03/24 21:21ID:???
>>725
見るだけなら日記帳に書けば?
0728nobodyさん04/03/24 21:39ID:???
>>717
ごめんなさい遅くなりました。
了解です。皆さんどうもありがとうございました。
072972504/03/24 21:48ID:6j96YsNk
いや、見るのも書くのもCGIでしたいんですけど・・・。
ログファイルから、クリックした数字の月だけのログを出力したいんです。
0730nobodyさん04/03/24 21:59ID:???
>725
そこらへんに転がってる日記スクリプトとか、
なんならいわゆる「ページ移動」が可能な掲示板スクリプトでも調べれば
ヒントを得られると思う。
0731nobodyさん04/03/24 22:55ID:???
!@array と @array == 0 は同義なのでしょうか?
!$scr と $scr eq 0 が違うのは文字と数字の判断の違いでnull値が入るのは
わかったのですがよくこういった比較演算子?で混乱してしまいます。
よろしければ教えて頂けないでしょうか?
0732nobodyさん04/03/24 23:01ID:???
>$scr eq 0
正確に書きたいなら $scr == 0 もしくは $scr eq "0" な。
0733nobodyさん04/03/24 23:29ID:???
便乗質問です。

その日記スクリプトにハイパーリンクで月選択ができる場合
href="./diary.cgi?month=1"といったように、GETのみとなるのでしょうか?
0734nobodyさん04/03/24 23:33ID:???
逆に聞くが、選択した月の値をわざわざPOSTすることに意味はあるのか?
リロードとかするたびにダイアログでてウザいだけかと。
0735nobodyさん04/03/25 00:04ID:O9PiycAh
HTML⇒CGI へのデータの受け渡しについて質問があるのですが、
インラインフレーム内にCGIを表示させて、そのCGIのどこかの変数に、値を代入したいんです。

具体的に言うと、
<IFRAME SRC="data.cgi?value">
として、valueをどこかの変数に入れることはできますか?

いろいろなサイトを見て、
read(STDIN, $val, $ENV{'CONTENT_LENGTH'});
こうすれば、$valにvalueが代入されるという話を聞いたんですができませんでした。
(何も代入されていませんでした。)

誰かわかる人がいたら教えてください。
よろしくお願いします。
0736nobodyさん04/03/25 00:16ID:???
>read(STDIN, $val, $ENV{'CONTENT_LENGTH'});
そりゃPOSTの場合だ。
GETとPOSTの違いを勉強汁。
0737nobodyさん04/03/25 01:25ID:???
俺なんかめんどいからpl頼りだぜ。
cgi-lib.pl使ってるよ。
エロイ人たちは容量を最低限に抑えるために中に書き込んでるの?
0738nobodyさん04/03/25 05:23ID:???
ホントはライブラリやモジュール使ったほうがいいと思うよ
でも俺はフォームからの受け取りくらいは
そう面倒でもないし簡単だから大概自前。
0739nobodyさん04/03/25 08:01ID:???
for (0 .. 5) { print;}は当然出来ますが逆に
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:???
>>739-740
for ($start < $end ? $start .. $end : $end .. $start) { ... }
0742nobodyさん04/03/25 09:12ID:???
>>737
フォームのデータ取ってデコードって言っても4、5行っしょ?自分で書こうよ。
0743nobodyさん04/03/25 09:58ID:???
>>741
それだったら全部012345みたいな順になると思うんですが・・・。
0744nobodyさん04/03/25 10:18ID:???
ループの中で 5-$_ みたいにして生成すれば?
ていうか何故そんな値で回したいのかよく分からんのだが。
0745nobodyさん04/03/25 10:33ID:???
( ゚д゚)ポカーン
もういいです。
0746nobodyさん04/03/25 11:06ID:sU+YK1M2
sub hoge{
(中略)
return (%hPGTname2PTCid, %hPGTname2PTTid);
}

my (%hPGTname2PTCid, %hPGTname2PTTid) = &hoge;

として2つのハッシュ配列を取得したいのですが、
前者のハッシュ配列しか取得できていない模様です。

どうすれば2つのハッシュ配列を取得できるのでしょうか?
0747nobodyさん04/03/25 11:09ID:w7s8ctdp
基本的なことで申し訳ないんですが、例えば「CGIのテスト」と表示させて3秒後に「3秒後」と表示させたい場合、

#!/usr/local/bin/perl
print "Content-type:text/plain\n\n";
print "CGIのテスト\n\n";
sleep(3);
print "3秒後";
exit;

と、書くと「CGIのテスト」と「3秒後」が実行後3秒してから同時に表示されてしまいます。
色々見てみましたがよく理解できません。
命令はプログラムの上から順に実行されると思い込んでいたんですがそうではないんですかね。
こうゆう基本的なことを自分で解決するのに良いウェブサイトや本はありますか?
よろしくお願いします。
0748nobodyさん04/03/25 11:18ID:???
for (reverse 5 .. 0) { print;}
でいいだろ。
for (my $i = 5; $i >= 0; $i--) {print;}
とか。
0749nobodyさん04/03/25 11:20ID:???
>>746
リファレンスで返す。
0750nobodyさん04/03/25 11:21ID:???
>>747
クライアントサイドでどーぞ。javascriptとか。
0751nobodyさん04/03/25 11:21ID:???
>>746
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:???
>>746
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:???
>>752
なんでわざわざ無名配列に入れる?
return (\%hPGTname2PTCid, \%hPGTname2PTTid);
my( $...., $..... ) = hoge();
でいいじゃん。
0755nobodyさん04/03/25 11:27ID:???
っと、書いてる間に訂正された・・・。
075675204/03/25 11:32ID:???
>>755
アリガトン
075774604/03/25 11:39ID:???
えーなんで無名配列?と一瞬悩んでしまった。
>>752さん >>755さん ありがとうございます。
075874604/03/25 11:50ID:???
>>751さんもありがとうございます。勉強します。
075974704/03/25 12:13ID:w7s8ctdp
>>750さん>>751さんありがとう。
How can I read in a file by paragraphs? あたりを読めということですかね。さぱりわかんないんですけど頑張ってみます。
076074904/03/25 12:19ID:???
俺は・・・・・。
0761nobodyさん04/03/25 12:50ID:???
CGI.pmを使用して下記のスクリプトを実行すると
<input type="hidden" name=".cgifields" value="ItemNum">
というタグが自動的に追加されます。
-nostickyを使用すると出ないのは分かってるのですが、
どのような原理で、scrolling_listのname属性が、hiddenのvalue値に設定されるのでしょうか?

print start_form(),
hidden('ItemId',"id"),
scrolling_list('ItemNum',['1','2','3','4','5'],['1'],1),"個",
submit('','購入'),
end_form;
0762nobodyさん04/03/25 13:08ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
0763nobodyさん04/03/25 13:20ID:???
ハンガリアン記法に基づくと、
ハッシュってどういう風に変数名をつければいいのでしょうか?
0764nobodyさん04/03/25 13:37ID:???
花子とか愛とか、かわいらしい名をつけてあげてください。
0765nobodyさん04/03/25 13:42ID:???
>>761
> どのような原理で

CGI.pm をテキストエディタで開いてソースコードを追ってくれ。
0766nobodyさん04/03/29 06:30ID:???
766 :nobodyさん :04/03/25 16:07 ID:???
>>765
やってみます、分からないと思うけど・・・・

767 :761 :04/03/25 16:34 ID:???
register_parameter が関係ありますか・・?


768 :nobodyさん :04/03/25 17:28 ID:xE36oyJb
今日からperlをやろうと思ったのですが、いきなりエラーが出ました。
でもどこを修正すればいいのか分かりません。
どうかご教授してください。

【OS】Win98SE
【perl】perl, v5.6.1 built for MSWin32-x86-multi-thread

【コード】
print <<EOL;
<html>
<body>
<p>Hello perl world</p>
</body>
</html>
EOL

【エラー】
Can't find string terminator "EOL" anywhere before EOF
at test.cgi line 1.

769 :nobodyさん :04/03/25 17:30 ID:???
test.cgi 1行でストリング・ターミネーター「EOL」をEOFの前にいかなる場所にも見つけることができません。
0767nobodyさん04/03/29 06:32ID:???
770 :nobodyさん :04/03/25 17:37 ID:???
use strict;
eval{
my $htmlPTC = &get_htmlPTC('hoge');
};

のあとに、

$htmlPTCの値を取り出したいのですが、
どうすればいいのでしょうか?
use vars qw($htmlPTC);
とやってもとりだせませんでした。

771 :nobodyさん :04/03/25 17:46 ID:???
>>768
Content-type: text/html;

772 :nobodyさん :04/03/25 17:50 ID:???
>>771
あーあ
0768nobodyさん04/03/29 06:33ID:???
773 :768 :04/03/25 17:56 ID:xE36oyJb
>>771
レス、ありがとうございます。
でも、同じエラーが出てしまいました。(´・ω・`)ショボーン

【コード】
print "Content-type: text/html; charset=Shift_JIS\n\n";

print <<EOL;
<html>
<body>
<p>Hello perl world</p>
</body>
</html>
EOL

【エラー】
Can't find string terminator "EOL" anywhere before EOF
at test.cgi line 3.

774 :nobodyさん :04/03/25 18:00 ID:???
>>767
Yes.

>>770
my $htmlPTC = eval { get_htmlPTC('hoge') };
$@ and error();

>>773
EOL の後ろに空白が付いているか改行していないに 300 ペリカ。
0769nobodyさん04/03/29 06:33ID:???
775 :768 :04/03/25 18:00 ID:???
以下のようにするときちんと表示されました。
何故だろう??

【コード】
print "Content-type: text/html; charset=Shift_JIS\n\n";

print "<html>";
print "<body>";
print "<p>Hello perl world</p>";
print "<html>";
print "<body>";

776 :nobodyさん :04/03/25 18:01 ID:???
>>773
最後のEOLの後ろにちゃんと改行入れてる?

777 :768 :04/03/25 18:02 ID:???
>>774
空白がついてました。ヽ(´ー`)ノ
ありがとうございます。

778 :768 :04/03/25 18:04 ID:???
>>776
空白でした。
すみません。m(_ _)m
0770nobodyさん04/03/29 06:34ID:???
779 :nobodyさん :04/03/25 18:27 ID:???
現在open()しているファイルのパスを調べるにはどうすれば良いのでしょうか。

指定したファイルを開かずに他のファイルを開いているというとんでもない事が起こっていて、
しかもその開いているファイルが見付からないのです。
#絶対パス、相対パス共に調べた

なので現在のファイルハンドルがどのファイルに関連付けられているかを
知ることが出来たら良いのですが。


780 :nobodyさん :04/03/25 18:30 ID:7rJYuY6t
配布CGIを設置する際の質問はここでよろしいのでしょうか?

KENTのyybbsをiswebに設置したいのですが404が出てしまいます。
その前に1998特報倶楽部の画像掲示板を/cgi-binの中に設置しました。
その画像掲示板は無事動くのですがyybbsが動きません。

http://www.kent-web.com/bbs/yybbs.html
FTPで上にあるようにまず一番上(index.htmlやcgi-binがある場所)にyybbsフォルダを作りました。
そしてパーミッションとかを設定したあとhttp://アドレス/yybbs/yybbs.cgiと入れたのですが404でした。
yybbs.cgiはまだいじってません(パスはそのままで大丈夫です)ので壊れたって事は無いと思います。
もしかしたらcgi-binの中にyybbsディレクトリを作らなくてはならないのですか?

781 :nobodyさん :04/03/25 18:36 ID:???
>>780
>配布CGIを設置する際の質問はここでよろしいのでしょうか?
よろしくない。
そして誰もよろしいなんていってないのに質問するな。それなら1行目に何の意味が?
0771nobodyさん04/03/29 06:35ID:???
782 :nobodyさん :04/03/25 18:42 ID:???
>>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:???
787 :746 :04/03/25 23:36 ID:???
>>749=>>760
ご、ごめんなさい、_| ̄|○
ありがとうございました。

788 :763 :04/03/25 23:37 ID:???
>>764
まじれすキボンヌ。(まじれすだった?)

789 :nobodyさん :04/03/25 23:40 ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

790 :nobodyさん :04/03/25 23:43 ID:???
>>788
あ男の子でしたか
じゃあ最近は翔とかそういう所謂男らしい名がいいかと思います。
元気に育つといいですね。

791 :763 :04/03/25 23:55 ID:???
みんなはハンガリアン記法の場合、ハッシュはどう書いてるんだろか

792 :nobodyさん :04/03/26 00:14 ID:???
perlとどう関係があるのかと…

793 :nobodyさん :04/03/26 00:18 ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

794 :nobodyさん :04/03/26 02:51 ID:???
>>791
マジレスすると、変数に付いている%や$や@は何のためにあるのかと。
0773nobodyさん04/03/29 06:36ID:???
795 :nobodyさん :04/03/26 09:34 ID:???
>>773
print <<"EOL";
にしたらどうよ。

796 :nobodyさん :04/03/26 09:48 ID:???
( ゚д゚)ポカーン

797 :nobodyさん :04/03/26 10:00 ID:???
遅レス(・∀・)カコイイ!!
0774nobodyさん04/03/29 06:37ID:???
798 :nobodyさん :04/03/26 10:27 ID:tN6LIksl
ある会員リストを登録更新表示するCGIなのですが、
更新作業で、
1)更新を受け付ける
2)データベースを更新
3)一つ目の関連するファイルの更新
4)二つ目の関連するファイルの更新
5)最新リストを表示

としているのですが、3,4の作業の負荷が高く5の最新リスト表示まで
時間がかかります。
実際5の最新リスト表示には2のデータベース更新が終わっていれば
問題ないので例えば

1)更新を受け付ける
2)データベースを更新
5)最新リストを表示

として
3)一つ目の関連するファイルの更新
4)二つ目の関連するファイルの更新
は別プロセスとかでバックグラウンドでやらせたいのですが
方法がわかりません。
基本的にどんな風にすればいいですか?
0775nobodyさん04/03/29 06:39ID:???
799 :nobodyさん :04/03/26 10:36 ID:7ogawnvX
友人と二人でjoyful2chという画像掲示板を使っているのですが
連続投稿の時間規制と同じ文字数のレスを直後に書けない規制が
やっかいなのでなくしたいのですが、設定でオンオフできないので
その部分に関するスクリプトを削ってしまえば、
機能は停止するのでしょうか?

その部分に関するスクリプトは以下のようなところだとあたりを付けました。

# 連続投稿チェック
if ($addr eq $ip && $wait > $times - $time2)
{ &error("連続投稿はもうしばらく時間をおいて下さい"); }

# 重複チェック
$flag=0;
foreach (@lines) {
($no2,$reno2,$date2,$name2,$mail2,$sub2,$com2) = split(/<>/);

if ($in{'name'} eq $name2 && $in{'comment'} eq $com2) {
$flag=1; last;
}
}
if ($flag) { &error("重複投稿のため処理を中断しました"); }
0776nobodyさん04/03/29 06:40ID:???
800 :nobodyさん :04/03/26 10:46 ID:???
>>798
ロジックを語るならスレ違い。スレタイ嫁。

801 :nobodyさん :04/03/26 10:47 ID:???
>>799
試してから質問したんだよな?
試した結果はどうだったよ?
まさか試さずにどうなるかの結果だけを教えてくれなんて都合のいいことは言わないよな?

802 :nobodyさん :04/03/26 10:51 ID:tN6LIksl
>>800
どこいけばいいですか?

803 :nobodyさん :04/03/26 10:52 ID:???
春休みUZEEEEEEEEEEEE

804 :nobodyさん :04/03/26 10:56 ID:???
>>800
WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
という気が前々からしている。

>>798
「別プロセスを作りたいのでコーディング方法教えて」という話なら
fork 関数の説明嫁、で終わりだが、率直な疑問として、
「別プロセス作らなくても1->2->5->3->4の順番で処理すりゃいいぢゃん?」
という気がするのだが、
まあここはコーディングスレなので、ロジックについては語らないことにしよう。
0777nobodyさん04/03/29 06:41ID:???
805 :nobodyさん :04/03/26 11:16 ID:???
>>804
> >>800
> WebProg板の住人の大半、あるいはCGI設置して喜んでる日本人の95%以上は、
> ロジック/アルゴリズムとコーディングの区別がついていないんじゃないか、
> という気が前々からしている。

スレ違い。スレタイ嫁。ニッキはニッキスレ

806 :798 :04/03/26 11:21 ID:???
>>804
「別プロセス作らなくても1->2->5->3->4の順番で処理すりゃいいぢゃん?」
という気がするのだが、

そうですよね、処理順変えればいいだけですよね。
なんか勘違いしてました。
どうもありがとうございました。

807 :nobodyさん :04/03/26 11:48 ID:???
生まれてきたのも勘違いであって欲しい
0778nobodyさん04/03/29 06:42ID:???
808 :nobodyさん :04/03/26 13:39 ID:???
>804
ロジック自体の意味が検索で見付からなかった
(ロジックボードとかばかり出てくる)のですが、
ロジック = 手順、アルゴリズム = 方法とかいう認識で良いのですか。

809 :nobodyさん :04/03/26 14:01 ID:???
my $flag = 1;
if ( $flag ) {
use constant HOGE => 1;
} else {
use constant HOGE => 2;
}

これで、HOGE が 1 になるかと思いきや、
なぜか 2 になる。
最後に指定したやつがセットされるのはなぜ?

810 :nobodyさん :04/03/26 14:24 ID:???
>>809
use は実行時でなくコンパイル時に処理されます

811 :nobodyさん :04/03/26 14:36 ID:???
>>808
ロジックやアルゴリズムの話はスレ違い。

812 :809 :04/03/26 15:18 ID:???
>>810
なるほど。
ありが�d
0779nobodyさん04/03/29 06:43ID:???
813 :nobodyさん :04/03/26 16:03 ID:???
>>812
BEGIN
{
require constant;
if(...){
import constant FOO => 1;
}else{
import constant FOO => 2;
}
}
# or
my $flag;
BEGIN{ $flag = 1 } # $flagはコンパイル時に決定している必要がある

use constant FOO => $flag ? 1 : 2;

# or いっそconstantを使わない
BEGIN{
if(...){
*FOO = sub(){ 1 };
}else{
*FOO = sub(){ 2 };
}
}
0780nobodyさん04/03/29 06:43ID:???
814 :nobodyさん :04/03/26 16:11 ID:???
>>791

正直読み難い上に意味も無いのでお勧めできないが、下記のような感じかな。
DBD::Excelの作者である川合氏はこの命名法を使っているね。
しかしPerlでハンガリアンしてどういうつもりなのかマジで謎。特に@aXxxと%hXxx。「馬から落馬しました」みたいな。
そりゃまぁ、リファレンスだけなら俺も$sref_xxx,$aref_xxx,$href_xxxとかする事もあるがね。

$sString
$iInteger
$nNumeric
$oObject
$hHandle
$rsRefToScalar
$raRefToArray
$rhRefToHash

%hHash

@aArray
0781nobodyさん04/03/29 09:10ID:WLF8C9h8
ログコピペ乙age
0782nobodyさん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:???
>>782
http://www.bayashi.net/st/pdmemo/filelock.html
0784漏れはこれだけ補完できる04/03/29 13:17ID:???
784 名前: nobodyさん :sage 投稿日: 04/03/25 (木) 21:23 ID:???
>>739
> for (reverse 0 .. 5) {
リストが作られるから、
0..10000なんてやると、かなりメモリ食うと思う。
0785漏れはこれだけ補完できる04/03/29 13:18ID:???
悪い、レス番号にだまされて連続で張るつもりだった。

既に張っている人、乙!
0786nobodyさん04/03/29 14:51ID:???
2chの板にマッチさせるには
http:\/\/\w+(\.2ch\.net\|\.bbspink\.com)\/\w+\/
であってますか?
0787nobodyさん04/03/29 14:57ID:???
>>786
>>1
&
正規表現道場
0788nobodyさん04/03/29 16:28ID:???
質問です。
localとmyの使い分けについてなのですが、
どちらを使っても厳密な違いはないのでしょうか?
localはPerl4、myはPerl5以降という話を見たことがあるのですが、
環境を選ばずに正確に動作させるのならば、
myではなくlocalで統一したほうがいいのでしょうか。
0789nobodyさん04/03/29 16:39ID:???
>>788
これを検索汁

レキシカルスコープ変数
ダイナミックスコープ変数
0790nobodyさん04/03/29 17:21ID:???
>>789
あいよー、dmds
0791nobodyさん04/03/29 20:16ID:???
>>788
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq7.html#What_s_the_difference_between_dy
0792nobodyさん04/03/29 21:54ID:???
改行で区切った単語リストを読みこみ、それぞれについてgooの辞書に照合し、
意味を結果ファイルに書き出していくスクリプトを作ったのですが、うまくいきません。
動作自体には問題はないのですが、結果ファイルに照合した単語を書きこむと、
一部の文字が化けてしまいます。
例えば阿諛追従という文字列をgooの辞書で検索し、結果を書き出すと、
�艸追従
となってしまいます。検索結果は問題なく書き込まれています。
単純に阿諛追従とテキストに書き出すスクリプトで試してみましたが、文字化けは
起こりませんでした。ちなみにスクリプトはShiftjisで書かれています。
実行環境はWindowsMe+ActivePerl最新版です。
いくら考えてもどこがおかしいのか分からないので、申し訳ないのですが、
短いコードですので全部載せさせて下さい。
---------------------------------------
#!/etc/env perl

use strict;
use LWP::Simple;
use Win32::FileOp;

my $file="a.html";
my $meanfile = "mean.txt";#結果ファイル
my $str;
my $wordfile = "word.txt";#単語リスト
my $mflag = 0;
open IN, "$wordfile" or die "$!";
my @wordlist = <IN>;
close IN;
open OUT, ">>$meanfile" or die "#!";
0793nobodyさん04/03/29 21:56ID:???
foreach (@wordlist) {
my $word = $_;
&url_encode($word);
my $url="http://dictionary.goo.ne.jp/search.php?MT=" . "$str" . "&kind=jn";
print $url;
if (is_success(getstore($url,$file)))
{
open IN, "$file" or die "$!";
print "$word\n";
while (my $data = <IN>) {
if ($data =~ m/<!--meaning_body-->/) {
$mflag = 1;
chomp($word);
print OUT "<title>$word</title>\n";
next;}
if ($data =~ m/<!--\/meaning_body-->/) {
$mflag = 0;}
if ($mflag == 1) {
$data =~ s/<br>/\n/g;
$data =~ s/<small>|<\/small>|<b>|<\/b>//g;
if ( ! ($data eq "\n") ) {
print OUT "<contents>$data</contents>\n";}}}
close IN;}}}
close OUT;
ShellExecute 'open' => $meanfile;
sub url_encode{
$str = shift;
$str =~ s/(\W)/'%'.unpack("H2", $1)/eg;
$str =~ tr/ /+/;
}
よろしくお願いします。
0794nobodyさん04/03/29 22:11ID:???
>>792
gooの文字コードを見てみれ
079579204/03/29 23:06ID:???
>>794さん、ありがとうございます。
見てみました。gooはEUC-JPでした。
で、ますます混乱してしまいました。
単語リストはSJIS、照合結果のhtmlファイルはEUCJP,
単語リストから抜き出した単語と照合結果のhtmlファイルから
抜き出した意味のデータを組み合わせて結果ファイルに書き
込むと結果ファイルはEUCJP・・・・・
EUCJPと認識されているテキストにSJISのコードを書きこむと
化けるのは分かります。でもそれならSJISで書きこんだコード
全てが化けるのではないのですか?
阿諛追従は文字化けしましたがその他の大半の単語はそうは
なりませんでした。どうしてこのようなことになるのでしょうか?
それと、Windowsの基本文字コードはSJISですよね?なのに
どうして<title>SJISの文字列</title><contents>EUCJPの文字列</contents>
とprintで書きこんだテキストファイルがEUCJPとして認識され
てしまうのでしょうか?Windowsがテキストファイルの文字コード
をどのように判別しているか定かではないのですが、もし先頭の
何文字かをもとに判定しているとしたら、
Windowsにおいてperlから特に処理を
施さずに生成した文字列はSJISのはずでそれがファイルの先頭に
書きこまれているにもかかわらずなぜテキストファイルがEUCJP
として認識されてしまうのでしょうか?
文字コードに関する認識不足が多分にあると思われますが、
なにとぞご容赦下さい。
■ このスレッドは過去ログ倉庫に格納されています