トップページ⇒php
981コメント366KB

【Perl 】初心者コーナーPart6

■ このスレッドは過去ログ倉庫に格納されています
0001undefさん2001/07/26(木) 00:40ID:???
初めて来た方、初心者はまずこのスレッドから始めよう。
尋ねる前に同じ質問がないかこのスレや旧スレ、及び>>2のリンクを一通り見てみよう。
案外答えはもう書かれているかもしれない。
0046302001/07/27(金) 19:01ID:OFQPU1uA
>>32さん、>>33さんサンクスです。

まとめるとこんな感じですか?
でも、サイズがでかくなると問題です。

open(IN,"list.txt") or die;
open(OUT,">sort_list.txt") or die;
print OUT sort <IN>;
close IN;
close OUT;

何かいい方法ないですかね?
(DBを使用しないで、、)

system 'sort list.txt > sort.txt';
とかやっても無駄ですか?


> || -> or
この違いって何ですか?
調べたら、優先順位が低くなるってありました。
ただ打ちやすいから、|| をつかってたのですが、、、
0047名無しさん@お腹いっぱい。2001/07/27(金) 22:03ID:???
>46
自分でマージ・ソートでも自分で作ってみたら?
昔からあるソート法だよ。
004882001/07/27(金) 23:31ID:???
>>29さん、レス遅れました。
カコイイやり方有難う御座いますぅ (^ ^ )
何とか上手くいったのでご報告ですぅ、結局最初に読み込まれたcsvファイル
を\nをデリミタにして配列に入れて、その要素をもう一回配列に入れてから
からヘコヘコと加工してpushしました。 50行くらいになっちゃった  ^ ^ )
今>>13さんや>>29さんの カコヨイやり方で挑戦中
0049名無しさん@お腹いっぱい。2001/07/28(土) 00:25ID:???
結構過去のログまで読んだのですが見つからなかったので質問いたします。

プログラムが大きくなったのでソースファイルを分割して、

main.pl
require 'sub1.pl';
require 'sub2.pl';

のようにしたとき、

1.use strict;をmain.plで宣言すると、requireで呼び出した
sub1.pl sub2.plにもその宣言が適用されるのでしょうか?

2.main.plで宣言したグローバル変数はsub1.pl sub2.plでも
適用されるのでしょうか?
0050名無しさん@お腹いっぱい。 2001/07/28(土) 02:01ID:???
米鳥にカウンター設置したいんですけど
誰かご教授してもらえませんか?
<img src="/bin/counter">これをHTML
にくみこむだけでなんとかなると思ってたのですが・・・
0051名無しさん@お腹いっぱい。2001/07/28(土) 02:41ID:???
>>49
結構過去の過去ログを読むのはいい心がけだけどさ、なんで過去ログにないのか考えること。
そのくらい自分でちっちゃいプログラムを書けば簡単に試せるから誰も質問しないんだよ。
0052JAPU@今日も観鈴ちんを探しにマクドナルドへ...2001/07/28(土) 06:25ID:???
>>46

典型的な例:

1. open MOE, "misuzu.txt" || die;
2. open MOE, "misuzu.txt" or die;

ここで、
1. は open MOE, ("misuzu.txt" || die);
2. は (open MOE, "misuzu.txt") or die;
と解釈されるので、おそらく 1. は期待した動作じゃないだろう...
みたいな話。

もちろん、括弧で括れば全く問題ないので、|| で全て書いても良いです。
個人的には or を使うのが好きです。

# The Perl motto is "There's more than one way to do it."
ZZ
0053名無しさん@お腹いっぱい。2001/07/28(土) 07:01ID:???
>>52 個人的には or を使うのが好きです。

同意。

Perlの上級者は極力()や&、$_を書かないでコーディングするから、
Perl初心者からみると訳のわからないスクリプトに見えることがありますよね。
でも、それを自分で考えて解くのも楽しいし勉強になります。

よく、メールの署名欄に簡単なスクリプトが書いてあって、それを実行すると
結構驚くスクリプトが沢山あります。自分でも書いてみたいけど、スマートな
ものが書けないので未だ署名欄は名前だけ(w
0054492001/07/28(土) 11:53ID:???
>>51
なるほど。
私が試したところによれば、

1.適用されない
2.適用される

と言う結果が得られたような気がするのですが、あっているのでしょうか?
0055名無しさん@お腹いっぱい。2001/07/28(土) 16:42ID:???
randで乱数を作成できますよね?
非常に偏りが大きいのですが、回避方法はありますか?
0056名無しさん@お腹いっぱい。2001/07/28(土) 16:45ID:zGTvO/Jw
 文字列の囲みのクオートってダブルとシングルがありますが、
理論的にはどちらを使ったほうが高速ですか?
 自分のところで試してみたところ、1/10〜1/20程度の差が出、
どちらかが常に速いということはありませんでした。
0057名無しさん@お腹いっぱい。2001/07/28(土) 16:58ID:???
>>55
毎回srandしてない?
0058名無しさん@お腹いっぱい。2001/07/28(土) 17:06ID:m51BRqkY
>>55 種をtimeにしてる?
0059名無しさん@お腹いっぱい。2001/07/28(土) 19:56ID:???
俺の種を使ってくれ。

>>56
変数の判定をやらない分シングルの方が早そうだけど、知らん。
死ぬほど巨大なスクリプトじゃないと差は出ないんじゃないの?
0060552001/07/29(日) 02:15ID:???
プログラムの初めの方で
srand();
としてから使ってます<rand
後はsrandは宣言していません。
種は指定無しでtimeになるようなので指定無しにしています。
0061JAPU@観鈴ちんげっと2001/07/29(日) 02:40ID:???
種を省略した場合、最近のバージョンではもっと良い値が使われるよん。
詳しい話は perldoc 読んでね。
0062名無しさん@お腹いっぱい。2001/07/29(日) 03:45ID:???
あと、最近のバージョンではsrand()自体を省略して構いません。
0063名無しさん@お腹いっぱい。2001/07/29(日) 04:08ID:???
どうして偏りが大きいと思ったんだろうか。
調べ方に偏りがあるとは思わないのかね。
0064名無しさん@お腹いっぱい。2001/07/29(日) 04:57ID:???
>>63
禿同
0065552001/07/29(日) 16:21ID:???
私の調べ方はrand(100)をfor文で10000繰り返し、
エクセルにてその値の分布を表にしました。
その結果、0〜10と90〜100の範囲が他の範囲に比べて2割ほど
大きな値となりました。

・・・・偏り大きい調べ方ですか・・ね?
0066名無しさん@お腹いっぱい。2001/07/29(日) 17:20ID:???
>>65
20,000 回では?50,000 回では?100,000 回では?1,000,000 回では?
という具合に調べればわかると思うんだけど….
0067 2001/07/30(月) 01:43ID:???
perlでエラーが出て、エラーメッセージで何行目に
エラーが出てるよ!と教えてくれる時は間違いが探しやすいんですが、
最終行のみにエラーが出てるよ!と出た時に途方にくれます。
そういう時は文法的には間違ってないけど、処理の流れが
おかしいと言うことなのでしょうか?
また、こういう時にエラーを判断するコツがあれば、アドバイス
いただけないでしょうか?
0068名無しさん@お腹いっぱい。2001/07/30(月) 03:22ID:???
>>67
"や'の閉じ忘れの可能性が高い。
0069名無しさん@お腹いっぱい。2001/07/30(月) 03:45ID:???
Linxu上でのsystem()についてです。

$status = system("$command", "$str");
とすると、$statusに数字が入りますが、
この数字の意味するところがよく分かりません、というか知りません。
成功か失敗かは0と1(256)なので分かりますが、他の値、
2とか9等にはどういう意味があるのか知りたいです。

調べようにも何をきっかけに調べればいいのか思いつかないので
知ってる方、おねげぇします。
0070名無しさん@お腹いっぱい。2001/07/30(月) 03:46ID:???
>>69は
system("$command $str");
のミスです。。。
0071名無しさん@お腹いっぱい。2001/07/30(月) 06:05ID:GER1kc7.
DB_File使用時に最適なロック方法について教えてください。

CGI&PerlポケットリファレンスのdbmopenのTipsを参照すると、
『DBMファイルをロックする機構はDB_Fileモジュールに用意されています』
と書いてあったのですが、なかなか方法がわからないでいます。

今のところ、下記のドキュメントは発見しましたが、
英語がわからない上に、use DB_File::Lockの記述で即エラー(*1)になります。
http://www.perldoc.com/cpan/DB_File/Lock.html
*1) BEGIN failed--compilation aborted

ローカル環境はmac OS X perl v5.6.0 built for darwin
公開用サーバーはlinux
使えるモジュールはこんな感じだそうです。(モジュールについての知識はあまりないです・・)
http://web.arena.ne.jp/suite/support/manual/cgi-cgi/perlmodule/index.html

よろしくお願いします。
足りない情報があれば追記します。
0072名無しさん@お腹いっぱい。2001/07/30(月) 06:46ID:???
>>71
> use DB_File::Lockの記述で即エラー
DB_File::Lockがインストールされていないからでしょう。
別のロック機構を試すべきかと。
007312001/07/30(月) 09:43ID:Aj8f98qc
>>72
レスありがとうです。
根本的な認識ミスってことですか?(恥)
DB_File::Lockって、DB_Fileモジュールさえあれば使えるのかと思っていました・・
リファレンスに書いてあったのと上記のLock機構が
同じものを指してるのかは不明ですが、
DB_Fileを使うなら、これがおすすめ!っていう方法があったらよろしくお願いします〜

やっぱり普通にflockとか・・なオチになりそうですが(泣)
0074712001/07/30(月) 09:45ID:Aj8f98qc
名前入力ミスりました〜!^^;
71==73です、よろしくです。
0075722001/07/30(月) 09:47ID:???
>>71
DB_Fileのドキュメントを見ると、flockを使用しているようですね。
DB_Fileを使ったことがないので、オススメとかはないのですが、
自分はファイルロックの必要がある時は、renameを使った方法を用いてます。
これだと環境に依存しないので。
0076JAPU@オートレスポンダの作者をいじめるのはやめよう (笑)2001/07/30(月) 11:16ID:???
> Linxu上でのsystem()についてです。

惜しい。

> $status = system("$command", "$str");
> とすると、$statusに数字が入りますが、
> この数字の意味するところがよく分かりません、というか知りません。

system の返り値、すなわち $? の値は wait(2) が返す値なので、
$? >> 8 が exit value
$? & 127 がどのシグナルで殺されたか、
$? & 128 がコアダンプしたかどうか
を表す。

perldoc -f system
perldoc perlvar
man 2 wait
って感じ?
0077名無しさん@お腹いっぱい2001/07/30(月) 12:02ID:???
$i = 3;

という風に、変数に数字が入っていて、
この数字が奇数か偶数かを判断するには、
どうしたらいいでしょうか?
0078名無しさん@お腹いっぱい。2001/07/30(月) 12:06ID:???
$i % 2
0079hage2001/07/30(月) 14:49ID:???
if($i & 1) {
print "odd\n"
} else {
print "even\n";
}
0080名無しさん@お腹いっぱい。2001/07/30(月) 17:09ID:312.Yf8o
rmdirでやるとどんな感じ?<DBファイルロック機構
0081名無しさん@お腹いっぱい。2001/07/30(月) 19:26ID:t7BVDL/M
前スレ見ましたが載ってないみたいなので質問します。
"ー"が入ってる文字列をgrepかけるとエラーが表示されます。
対処法はありますか?

@a=("あ","あー","あーー");
@b=grep('ー',@a);
0082812001/07/30(月) 19:28ID:t7BVDL/M
@b=grep(/'ー'/,@a);
0083712001/07/30(月) 20:55ID:Ydf2hNHw
■DB_Fileのロックについて
>>75
renameですか!使った事ないです〜。
・・・flockが使える環境だとしたら、実際どちらがおすすめでしょうか?

>>80
おお、rmdirもはじめて聞きました(恥)
ちょっと調べてきますね。もっかい質問するかもしれません。。
0084T女の竹田2001/07/30(月) 21:00ID:???
>>81
うーん、ログ見てもわかりにくいけど、やっぱりFAQ。

「正規表現の中でシフトJISを使うときは、m/\Qマッチさせたい文字列\E/
のように\Qと\Eではさむ」
シフトJISは2バイト目にメタ文字(正規表現で特別な意味を持つ文字、
この場合は'[')が含まれることがあるので\Qでエスケープするわけ。
(\Eはその終わり)

ちなみに似たような問題で、'―'とかは'―\'にしないとダメ(この場合は
2バイト目が'\')。

自分は昔二つともつまずきました^^;
FAQスレとかあったほうがいいかな?
0085T女の竹田2001/07/30(月) 21:07ID:???
余談だけど、昔書いたスクリプトを見ると
s/\+|\\|\(|\)|\[|\]|\{|\}|\^|\$|\*|\?|\./\\$&/g;
みたいなのがあったり(恥)
0086692001/07/30(月) 21:33ID:CEolkqW6
>>76
なるほどです。
$? だったんですね。
perldoc perlvar 初めて使いました。てへ。

でも"$? & 127"のANDしてる値自体の
一覧みたいのはあるんしょうか?

例えばPerlがuseやrequireで
外部ファイルを取り込めなかった場合(等?)は512とか。
0087722001/07/30(月) 22:27ID:???
>>71
flockが良いかどうかという話は、今までにもいろんなところで議論されていて、
結局は本人の好みの問題になると思います。
が、あえて自分の意見を述べさせていただくと、
自分の場合flockだと失敗することが多かったと思うので、rename使ってます。
その辺の話はPerlメモがオススメです。
0088712001/07/31(火) 01:38ID:???
>>80
調べました〜!・・テストはまだです。
せっかくなので、いろいろ試しにやってみようと思います^^
>>72
なるほど。しっかり動作確認してから運用した方がいいですね。
Perlメモみてきます!

うう、いろいろ見てまわってるうちに、どんどん分らない事が増えてます。
そもそも、DB_FileとバークレーDBの関係がよくわかっていません。
DB_FileさえあればバークレーDBも使えちゃうってことなんでしょうか。
それとも、またそれ専用のモジュール等が必要とか・・?
ttp://member.nifty.ne.jp/hippo2000/perltips/db_file.htm
[$X =] tie %hash, 'DB_File', [$filename, $flags, $mode, $DB_HASH] ;
この先頭の [$X =] もあるとどういう利点があるのか不明なのです。

こんなわたしに丁度いいリファレンスサイトとか解説書がありましたら
どうか教えてくださいませ。。
0089JAPU@腹痛2001/07/31(火) 04:13ID:???
> でも"$? & 127"のANDしてる値自体の
> 一覧みたいのはあるんしょうか?

use POSIX; すると、この辺の定数使えるようになるみたいだ。
SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK
SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM
SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT
SIGKILL SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM
SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2 SIG_BLOCK
SIG_DFL SIG_ERR SIG_IGN SIG_SETMASK SIG_UNBLOCK

あとは、man 2 signal とか、/usr/include/sys/signal.h とか参照?

> 例えばPerlがuseやrequireで
> 外部ファイルを取り込めなかった場合(等?)は512とか。

なにか勘違いしている?
0090692001/07/31(火) 04:52ID:zN5/REcM
>>89
またしてもありがとうございます。
ここら辺あたれば何か分かりそうな気配・・・

>なにか勘違いしている?
いえ、勘違いではないです。
やってることが簡易shellみたいなもので
実行後、エラーの返値を見ても実際は何が起きたのか
さっぱり分からないので何とかしたいなぁ、と。
故に返値一覧があったら楽でいいなぁと思った次第です。
0091812001/07/31(火) 05:48ID:q2wDcpy6
>>84
竹田様
お手数おかけしました。お忙しい所ありがとうございます。
本当に嬉しいです。ありがとうございました。
0092JAPU@夏ですねぇ...2001/07/31(火) 14:02ID:???
何をやりたいのかさっぱり理解できん...
もうちょっと整理して質問しよう。
0093名無しさん@お腹いっぱい。2001/07/31(火) 14:54ID:???
Perl では EUC を使おうよ ヽ( ´ー`)ノ
0094名無しさん@お腹いっぱい。2001/07/31(火) 17:31ID:???
>>69
絶対勘違いしていると思われ。
JAPUたんに一票。
0095692001/07/31(火) 23:11ID:???
そう言われると勘違いしているのかもしれないに一票。
0096名無しさん@お腹いっぱい。2001/08/01(水) 00:48ID:???
あはは、、もうちょっと出来たら書き込んでね ^_^
0097名無しさん@お腹いっぱい。2001/08/01(水) 07:50ID:kOCX6RGE
FTPで削除できないファイルが生成されてしまったのですが、(人様のCGI使用)
unlinkで削除出来ますでしょjか?
0098名無しさん@お腹いっぱい。2001/08/01(水) 09:06ID:???
>>97
削除できます。
0099JAPU@千影たん2001/08/01(水) 18:58ID:???
別に69たんを責めているわけじゃないので、勘違い無きよう...

とりあえず質問するときは、「具体的な目的」も併記すると吉かもしれない。
「○○をしたときに、云々...」という質問の仕方でも悪くはないけど、
実はそれよりもうまい方法を教えてもらえるかもしれないぞ。
0100名無しさん@お腹いっぱい。2001/08/02(木) 00:28ID:DguDE1y6
キャストのやり方おしえろやゴルァ!
0101 2001/08/02(木) 00:46ID:8xHqzTcA
/usr/libディレクトリと/usr/site/libは何を基準に分かれてるんですか?
0102名無しさん@お腹いっぱい。2001/08/02(木) 02:08ID:???
/usr/binと/usr/local/binが分かれてるようなもの
0103名無しさん@お腹いっぱい。 2001/08/02(木) 03:43ID:GB8M4TIE
2つの同じフォーマットのファイルAからBへのバックアップを考えています。
ファイルA,B共

postday#sing#cast#part#add
postday#sing#cast#part#add

と言った形式なのですが、無差別に追記して行くと内容が重複してしまうので
postdayをキーにして、ファイルBの最後の要素のpostdayとファイルA
のpostdayを比較、一致しなければそのままファイルBに追記、
一致する要素が有ればそこまでをpopして、ファイルBに追記したいのです。

バックアップの参考になりそうなスクリプトを見てみたのですが、
アレンジする事が出来ないでいます。
0104名無しさん@お腹いっぱい。2001/08/02(木) 03:50ID:???
>>103
単純にバックアップを取るのであれば、File::Copyでも使えばいいかと思いますが。
01051032001/08/02(木) 03:58ID:GB8M4TIE
>>104さん
レス有難う御座います。掲示板のログのような(実際は少し異なります)
小さなログファイルAを大きなファイルBにバックアップしたいのです。
ファイルAは保存期間や容量が小さい為に効率的にファイルBに保存したい
と考えています。
01061032001/08/02(木) 04:06ID:GB8M4TIE
やっぱり自分で考えなきゃ駄目ですね、
ファイルBを読み出して最後のエントリの日付"postday"を"$saisyuu"で得る。
ファイルAを読み出す。
$saisyuuとファイルAの"postday"を比較
重複しなければそのままファイルBに追記。
$saisyuuと一致する行がファイルAにあればそこまでを削除して、ファイルBに追記。

これで上手く行かないか挑戦してみます。 有難うございます
01071042001/08/02(木) 04:34ID:???
>>103
一例として。
statでファイル更新時間を取って、異なれば書き込み、とか。

my @file = qw(A B);
if ((stat $file[0])[9] != (stat $file[1])[9]) {
#...
}
0108名無しさん@お腹いっぱい。2001/08/02(木) 04:38ID:???
#!/usr/bin/perl
http://www.megabbs.com/program/index.html
0109>>1032001/08/02(木) 04:40ID:P5Z/J3iM
効率悪いけどこれじゃダメ?何MBもあるわけじゃないんでしょ?

# A を読み込み
open A,"a";
@aaa=<A>;
close A;

# B を読み込み
open B,"b";
@bbb=<B>;
close B;

# @aaa と @bbb の非共通部分を @ccc へ
for(@bbb){
@ccc=grep(!/$_/,@aaa);
}

# @bbb と @ccc の共通部分を @ddd へ
for(@bbb){
@ddd=grep(/$_/,@ccc);
}

# @aaa と @ddd を書き込み
open C,">a";
print C @aaa , @ddd;
close C;
0110名無しさん@お腹いっぱい。2001/08/02(木) 14:11ID:RSuVRy4c
えー、ちょっと訊きたいんですが、

サブルーチンの中でサブルーチンを実行し、
そのサブルーチンの中でも別のサブルーチンを呼んで…

という風にサブルーチンを入れ子にしていくと内側の階層の深いサブルーチンの
挙動がおかしくなっていくというか、時には動かないなんてことはあるんでしょうか?

ためしにある処理をそのまま書いてちゃんと動いたものを
サブルーチンとして{}で囲んで書いただけでおかしくなりました。

環境はWin+ANHTTPDなのですが、もしやWinPerlだけの症状なのでしょうか?
どなたかご存知の方いらっしゃいましたらお願いします。
0111名無しさん@お腹いっぱい。2001/08/02(木) 14:17ID:???
>>110
多分サブルーチンの書き方に問題があると思われ。
0112名無しさん@お腹いっぱい。2001/08/02(木) 14:17ID:???
>>110
そのスクリプトを出してくれ。
ありがちなものとしては、同じ名前のサブルーチンが他に存在してるとかかな?
w2k+ANHTTPDだけど、普通に動いてるよ。
01131102001/08/02(木) 14:23ID:VO0DTrjQ
すばやいレス感謝です。

>>111
各サブルーチン単体では全て期待通りに動作します。
入れ子にしていった場合にのみおかしくなるんです。

>>112
全部出すと相当長いのでちょっとここに出すのは勘弁です。
改めて確認してみたらおかしくなってるところは3重くらいになっているだけでした。

簡略化した形で書けたらあとで貼ります。

ありがとうございます。
0114名無しさん@お腹いっぱい。2001/08/02(木) 14:28ID:???
>>113
myのせいでサブルーチンの結果が外に出てないというオチもないよね?
01151102001/08/02(木) 14:36ID:VO0DTrjQ
>>114
いや、全部returnで明に結果を返してます。
#そういうことですよね?
01161102001/08/02(木) 14:53ID:???
んー。いろいろ削ってみたんですが、
関係するサブルーチンは6個ほど、200行くらいになってしまいます。
ここに晒すのはちとためらわれます。。。。

うーむ。。
0117名無しさん@お腹いっぱい。2001/08/02(木) 15:00ID:???
>>116
どっかにアップしてURL出せば?
0118名無しさん@お腹いっぱい。2001/08/02(木) 15:00ID:???
>>110
推測でしかないが。
引数渡しに失敗している可能性。
01191102001/08/02(木) 15:11ID:VCBoAI72
皆さんレスいただいて本当にありがとうございます。

例えばですね。

print $hoge;
print &Foo;

これで正常の出力が得られるのですが、これを

&Hoge;

sub Hoge{
    print $hoge;
    print &Foo;
}

と書くと何も出力されないのです。
こんなのってありなんでしょうか?

&Foo;の中でも複数のサブルーチンを呼んでます。
0120名無しさん@お腹いっぱい。2001/08/02(木) 15:32ID:???
>>119
それで挙動がおかしくなるなんて聞いた事無いが。
0121名無しさん@お腹いっぱい。2001/08/02(木) 16:01ID:IfHUjzJo
あまりにも初心者すぎて書き込むのに気が引けるのですが・・・

カタカナの語尾の長音を取るように置換したいのですが
(「コンピューター」→「コンピュータ」)
どのようにしたら良いでしょうか?
0122 2001/08/02(木) 16:02ID:8xHqzTcA
多分、死にたくなるような単純なミスでは?
01231102001/08/02(木) 16:23ID:???
>>120
だから困っているのでつ。
実は最初の状態でも
内側で呼んでいるサブルーチンの挙動が微妙に変なのだが…

>>122
そうなのかなあ…。

おれ、この間もそれやったんだよな…
そうだとしたらつくづくヴォケ野郎だな、、俺…。
0124名無しさん@お腹いっぱい。2001/08/02(木) 16:45ID:mjquR9Og
ラージオブジェクトの説明が詳しくのってる
ところありますかね。
実際の使用例とか・・・。
PHPとPostgresqlで・・。
0125名無しさん@お腹いっぱい。2001/08/02(木) 16:57ID:???
>110
出来ればサブルーチンを見せて欲しいが。
というかuse strictで引数渡しもちゃんとして書こうよ。
0126ちんちんの長さ12.5cm2001/08/02(木) 23:08ID:8xHqzTcA
------
use strict;
my $key;
foreach $key (keys(%ENV)) {
#処理...
}
------
と
---
use strict;
foreach my $key (keys(%ENV)) {
#処理...
}
------
では、体感できない範囲でも速度違いますか?
0127名無しさん@お腹いっぱい。2001/08/02(木) 23:09ID:SuLp4aV6
jcode.plの使い方で分からないことがあり、投稿することにします。

#!/usr/bin/perl -w

require 'jcode.pl';

$text = "あいうえお";

$code = &jcode::getcode(*text);

print "$code\n";

こういうスクリプトを作って実行すると、以下のようなエラーが出てしまいます。

[madjack@cluster /home/madjack]% ./perltest.pl
Can't locate jcode.pl in @INC (@INC contains:
/usr/lib/perl5/5.00503/ppc-linux /usr/lib/perl5/5.00503
/usr/lib/perl5/site_perl/5.005/ppc-linux
/usr/lib/perl5/site_perl/5.005) at ./perltest.pl line 3.

何がおかしいのでしょうか?
0128名無しさん@お腹いっぱい。2001/08/02(木) 23:37ID:I9vB6MGk
110ではないです。
use strictってどういった使い方をするんですか?
シェルでやってみたら、今まで動いてたスクリプトにエラーチェック(?)
が沢山でてきてしまいました。
125さんの引数渡しって言葉にも混乱してるんです。
すみません、余裕のある方教えて下さい。
0129名無しさん@お腹いっぱい。2001/08/03(金) 00:14ID:eb2ym/zs
POP3サーバから「ウィークリーまぐまぐ」の重たいメールだけを削除
したいですが、何か簡単なスクリプトありませんか?
0130名無しさん@お腹いっぱい。2001/08/03(金) 00:15ID:eb2ym/zs
>>129
サブジェクトにWeekly Mag2が入ってるのを削除
0131名無しさん@お腹いっぱい。2001/08/03(金) 00:44ID:???
>>126
違うよ。上のほうが速い。

>>127
@INCにjcode.plが無いと言われてる。
エラーメッセージは英語だから読まないというのは止めましょう。
これくらい調べれば読める範囲なので。
で、requireに問題が。
パス無しで指定すると@INCを探しに行くので、
'./jcode.pl'等と実際に置かれている場所を指定しましょう。
0132名無しさん@お腹いっぱい。2001/08/03(金) 00:48ID:???
>>128
use strictと宣言することによって、
コンパイル時にレキシカル宣言されていない変数があると、エラーになります。
グローバル変数が使えなくなるというわけで。

引数渡しってのは、&sub_routine($hoge, $fuga);
みたいにサブルーチンに引数を明示的に渡すのです。
これで、サブルーチンには2つの引数しか行かないことになります。

# 日本語的におかしいかもしれないが、ご容赦。
01331282001/08/03(金) 01:05ID:ldQ3DQJ.
>>132
ありがとうございます!
>グローバル変数が使えなくなる
だ・・だからあんなにエラーが出たのか・・・
それでもきちんと動作することがいいスクリプトってことですかね
なんでこんなやっかいなものを皆さんお使いに・・・?
素朴な疑問でした。^ ^;
01341322001/08/03(金) 01:37ID:???
>>128
「自分しかそのスクリプトを見ない」
「どこかでエラーが起こっても、自分はすぐわかる」
「自分は絶対typoしない」
このあたりの条件を兼ね備えているのなら、全部グローバルでもいいのかもね。

私はいつもuse strictしてます。

# ちなみに、my宣言した変数のほうが、グローバルより若干速い。
0135名無しさん@お腹いっぱい。2001/08/03(金) 01:52ID:???
グローバル変数が使えなくなる訳では無いですよ。
Perl5.6以降ならmy($var)同様の使い方でour($var)が、
それ以前のVersionならuse vars qw/$foo @bar/;とし、
宣言したグローバル変数を使用可能に出来ます。

私も初心者の頃はuse strictなど煩わしいだけ、と思っていましたが、
今では反射的にuse strictを書くようになりました。
慣れるまで色々面倒でしょうが、
黙って使っていると後々幸せになれるはずです。
01361322001/08/03(金) 01:57ID:???
>>135
詳しいフォロー、ありがとう。
01371282001/08/03(金) 03:04ID:ldQ3DQJ.
>>134 ,135
詳しい説明ありがとうございました!
むぅ。凄く勉強になります。
わたしの持っている本にはこんな事全く書いていなかったので・・
今後少しずつ規模の大きいスクリプトを組んでいくのなら、
今のうちに慣れてきちんと書けるようにした方がいいですよね。
しかし組み方を1から考えなおさなくちゃ難しそうですが(泣)
がんばってみます!
0138名無しさん@お腹いっぱい。2001/08/03(金) 04:24ID:???
win98のHTTPDでチョコチョコプログラム組んでるんですが、
丁度良いネタがでたので質問します。

ローカルで
for(my $i=1;$i<100;++$i){
##処理##
}

というプログラムを走らせると$iが0から始まってしまいます。
if文などでも同様です。
サーバにアップロードするときちんと動作するんですが、
やはり使用環境がいけないのでしょうか?

ちなみに
my $i;
for($i=1;$i<100;++$i)

だとローカルでもきちんと1から動いてくれます。
0139名無しさん@お腹いっぱい。2001/08/03(金) 04:40ID:???
>>138
for (my $i = 1; $i < 100; ++$i) { print $i,"\n" }
# 1
# 2
# ..
# 99
きちんと出ましたよん。
ちなみに当方ローカル環境、Win2k + Apache1.3.20 + ActivePerl623
0140名無しさん@お腹いっぱい。2001/08/03(金) 05:22ID:???
>やはり使用環境がいけないのでしょうか?

君の使用環境がわからなくては誰にも判断しようがないと思うが。
ネタですか?
0141うん2001/08/03(金) 06:21ID:wwW.OFoE
うん
0142名無しさん@お腹いっぱい。2001/08/03(金) 06:28ID:???
>>141
子供は早く寝なさい(藁
0143103 2001/08/03(金) 07:53ID:aOu/LdE6
>>107
>>109
レスが遅れてしまいました。お二方のアドバイスが参考になって色々なアプローチ
が有るのが分かりました。
一応、一日格闘した挙句(^^) ファイルAのサイズは比較的小さくファイルBはなるべく
大きなサイズを確保したかったので、perlメモさんで
http://www.din.or.jp/~ohzaki/perl.htm#File_Tail
を頂いて来まして、これでファイルBの最後の一行を得る→
$saisyuuとファイルAのpostdayを比較→一致する行が出現すればそれ以降を破棄
→ファイルBに追記モードで書き込み、と言う感じになりました。

今ローカルでとろとろと動いています(^^)
grepとか回した事が無かったので新鮮でした、色んな考えかたが有るんですね。
ありがとう御座いました。
01441272001/08/03(金) 11:50ID:dhEi2JqU
>>131
ありがとうございます。
できました。
0145名無しさん@お腹いっぱい。2001/08/03(金) 14:24ID:02P8SgLY
以下のcgiファイルと、htmlファイルを使って入力したものをファイルに書き込
み、ブラウザにも表示させるというプログラムを作っています。しかしながらブ
ラウザに表示することはできるのに、それをファイルに書き込むことができませ
ん。スクリプトをどう見直しても分からないので、ここの方に頼ることにしまし
た。

ちなみに『print <<"HERE";』以下を削って実行するとInternal Server Error
となってしまいます。

cgiファイル

#!/usr/bin/perl -w

$file = "log.txt";

read(STDIN, $in, $ENV{'CONTENT_LENGTH'});

open(OUT, ">$file");

print OUT $in;

close OUT;


print <<"HERE";
Content-Type: text/html

<html><body>
$in
</body></html>

HERE

__END__

htmlファイル
<form method="POST" action="cgi-bin/prot3.cgi">
<html><head><title>
テスト
</title></head><body bgcolor="#000000">
<font color="#ffffff">
名前:<input type="text" name="name"><br>
パス: <input type="password" name="pass"><br>

<input type="submit" value="OK"><input type="reset" value="reset">
</font>
</body></html>
0146名無しさん@お腹いっぱい。2001/08/03(金) 14:50ID:???
>>145 ソースは見てないが
scriptじゃなくて、実行ユーザーとディレクトリのパーミッションだろ
■ このスレッドは過去ログ倉庫に格納されています