Perl 初心者コーナー Part21
■ このスレッドは過去ログ倉庫に格納されています
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
0685nobodyさん
03/04/05 19:13ID:???0686nobodyさん
03/04/05 19:15ID:???という配列があって sortすると
1,10,2,22,3となってしまいます。
これを1,2,3,10,22のように実際の大きさ順に
ソートするにはどうすればいいのでしょうか?
0687nobodyさん
03/04/05 19:18ID:???0688nobodyさん
03/04/05 19:20ID:???0691669
03/04/05 19:43ID:???んーよくわからないんですが・・・
>完全エラー無し以外は すべて異常終了扱いにしたほうがいい。
それはわかるんですが、どういう風に書けばそうなりますか?
rename("$logtmp", "$logfile") || unlink("$logtmp");
rename("$dattmp", "$datfile") || unlink("$logtmp","$dattmp");
こういうことですかねぇ?
あと、今まで既にあるデータを読み込まずに
open (DAT,>>$dattmp) || &error("ファイルオープンエラー : $dattmp");
DAT書き込み処理(追加)
close (DAT);
↑こうして追加してたんですけど、
一度テンポラリファイルを作ってリネームとなると、
全て読み込んでから新しいのを足したものを上書き
しないといけなくなりますよね?
処理の重さは変わらないですか?
0692nobodyさん
03/04/05 20:08ID:???でも、やらなきゃならないんなら、しょうがない。
0693nobodyさん
03/04/05 20:16ID:???open (LOG,>>$logfile) || &error("ファイルオープンエラー : $logfile");
$pointer = 0;
$pointer = ファイルポインタを取得する関数
LOG書き込み処理(追加)
close (LOG);
if (!open (DAT,>>$datfile)) {
if ($pointer != 0) {
open (LOG,>>$logfile)
truncate($pointerで切り詰め);
close (LOG);
}
&error("ファイルオープンエラー : $datfile");
else
DAT書き込み処理(追加)
close (DAT);
end
むちゃくちゃだけど、こんなんはどうですか?
0694Perlですが
03/04/05 20:17ID:qMi3a/lAindex.cgiのFORMデータをsubmit.cgiに引き渡して処理させたいのですが、どうやればいいのでしょうか?
親切なアドバイス待ってます。
0695nobodyさん
03/04/05 20:22ID:???http://tohoho.wakusei.ne.jp/wwwxx034.htm
↑ここ見て研究
0696あぼーん
03/04/05 20:36ID:???! i iノノリ)) 〉
i l l.´ヮ`ノリ <先生!こんなのがありました!
l く/_只ヽ
| ̄ ̄ ̄ ̄ ̄|
http://saitama.gasuki.com/mona/
0698Perlですが
03/04/05 20:41ID:qMi3a/lAそれではなくて他に方法はありませんか?
0699nobodyさん
03/04/05 20:55ID:???なんかムカつく。
submit.cgiでおこなう処理をindex.cgiの中から呼べばいいだろ
わざわざ"引き渡す"意味がわからん
0701nobodyさん
03/04/05 21:19ID:???0702nobodyさん
03/04/05 21:48ID:???ちょっと直した
open (LOG,>>$logfile) || &error("ファイルオープンエラー : $logfile");
$pointer = tell(LOG); # ファイルポインタの位置を返す
LOG書き込み処理(追加)
close (LOG);
if (!open (DAT,>>$datfile)) {
open (LOG,>>$logfile) # ←エラーが発生しないことを祈る
truncate(LOG,$pointer);
close (LOG);
&error("ファイルオープンエラー : $datfile");
} else {
DAT書き込み処理(追加)
close (DAT);
}
こんなんでいいのかどうか分からないが・・・
logfileとdatfileの整合性を保つためのもっといい方法があるのだろう・・・
0703nobodyさん
03/04/05 21:51ID:???>>親切なアドバイス待ってます。
>なんかムカつく。
>>694は、あまりにもアレな質問して叩かれたことがあるに1000クックブック
0706nobodyさん
03/04/05 22:28ID:???$pointer = tell (LOG);
windowsじゃtell使えないんでしょうか?
なぜか0を返すんです。
ちゃんとその後printしたものは追加書き込みになってるんですけどねぇ
0707705
03/04/05 22:37ID:???漏れの環境(WinXP+ActivePerl5.6)で
open(FILE,">>test.dat");
$p = tell FILE;
close(FILE);
print "$p\n";
test.datの中身を例えば、
aaa\r\naaa\r\n
として、上のスクリプトを実行すると、
「10」となります。
なんで706さんは0になるのかなぁ。わかんねぇ。
0708nobodyさん
03/04/05 22:42ID:???perl -e open(F,">>hoge");$p=tell(F);close(F);print $p,"\n";
$ wc hoge
1 4 60 hoge
$ perl -e 'open(F,">>hoge");$p=tell(F);close(F);print $p,"\n";'
60
漏れの環境でも正常です。Win2k
$ perl -v
This is perl, v5.6.1 built for cygwin-multi
0709nobodyさん
03/04/05 22:51ID:???調べてきます。
0710
03/04/05 23:10ID:sLGWgkab0711nobodyさん
03/04/05 23:11ID:RuMeXkuC0712nobodyさん
03/04/05 23:27ID:???0713間違えた
03/04/05 23:28ID:???0714nobodyさん
03/04/05 23:30ID:RuMeXkuCありがとうございます.できました!
0715nobodyさん
03/04/06 00:32ID:httIMQcy0716
03/04/06 00:43ID:88ZLH8qE$ENV{'HTTP_COOKIE'}に値がはいっていれば在り、無ければ無し
0717nobodyさん
03/04/06 00:53ID:/U6PDdMCそれは自分のCGIから吐き出されたクッキーなんですか?
0718
03/04/06 01:00ID:88ZLH8qEそれはクッキーの設定次第w
http://www.futomi.com/lecture/cookie/index.html
自分とこのクッキーかどうか確認したい場合は、クッキーの内容を確認してw
http://www.futomi.com/subroutine/getcookie.html
0719nobodyさん
03/04/06 02:34ID:ONKJQ6B10721間違えた
03/04/06 02:58ID:???でいいだろ。
0722nobodyさん
03/04/06 03:07ID:oW/lvYediisを作動させてブラウザからcgiの確認なんかはできるんですけど、
コマンドプロンプトでの動かし方がわかりません。
どこかの説明で「コマンドプロンプトを開いてper-vと打ち込む」
って書いてあったんですけど、
>'perl-v' は内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ってでてきます。
それ以前に最初から、
>C:\Documents and Settings\***>
これが表示されてるんですけど、この後にperl-vって打つのであってますか?
つまり
>C:\Documents and Settings\***>perl-v
こう打つと
>'perl-v' は内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
こうなります。
0723nobodyさん
03/04/06 03:11ID:???まず
C:\Documents and Settings\***>perl -v
と打ってみろ。それでも失敗したら
C:\Documents and Settings\***>PATH
の結果を貼れ
(>>721の名前欄無視して)
0726nobodyさん
03/04/06 03:22ID:???この前見たページ確認しにいってきたらスペース入ってました。
すいませんでした
0727nobodyさん
03/04/06 03:43ID:ONKJQ6B1アクセス解析の入っているページで
use LWP::Simple;
my $url = "http://yahoo.co.jp/";
my $content = get($url);
print $content;
と、ソースを取得した時に
アクセス解析でlwp-trivial/1.35解析されずに
Monazilla/6.00と解析されるようにしたいです。
0729nobodyさん
03/04/06 04:02ID:???$ua->agent(Saitama');
perldocなり、cpan也でもうちょっと調べるべきであるかな
0730nobodyさん
03/04/06 08:03ID:xn7ICdMG.cgiのファイルをいじっていて、その中にメールアドレスを
書こうとしたらエラーになります。
どうも@を書くとエラーになるようですが
cgiの中に@を記入したい場合どうしたらよいのでしょうか?
0731nobodyさん
03/04/06 08:09ID:???書こうとしているのだと想像します。
その場合、@ が配列変数として認識されてしまっているので、
@ の直前に \ をつけて書くことをお勧めします。
あるいは、変数が展開されないシングルクォートで、文字列
をくくるという方法もあります。
今後は、エラーが出たときは、エラーメッセージをここに
貼り付けてご質問されることをお勧めします。
0732nobodyさん
03/04/06 08:09ID:???$email = "foo\@example.com";
$email = q([email protected]):
0733あぼーん
03/04/06 08:37ID:???( ´∀`)/<先生!こんなのがありました!
_ / / / \___________
\⊂ノ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/saitama/
0734nobodyさん
03/04/06 08:41ID:???0735あぼーん
03/04/06 08:42ID:???http://muryou.gasuki.com/moe/jaz04.html
http://muryou.gasuki.com/moe/jaz03.html
http://muryou.gasuki.com/moe/jaz02.html
http://muryou.gasuki.com/moe/jaz01.html
http://muryou.gasuki.com/moe/jaz06.html
http://muryou.gasuki.com/moe/jaz05.html
http://muryou.gasuki.com/moe/jaz08.html
http://muryou.gasuki.com/moe/jaz07.html
http://muryou.gasuki.com/moe/jaz10.html
http://muryou.gasuki.com/moe/jaz09.html
0736nobodyさん
03/04/06 11:52ID:xQ2onnJ6自鯖構築に利用したいのですが、独自ドメインからWebサーバーに飛ばして、
そこで、perlが処理するのですが、
if ($自鯖稼動状態 == 1) {
print "Location: $ZISABAurl\n\n";
} else {
print "Loaction: $WEBSABAurl\n\n"
}
みたいにしたいのですが。
0737bloom
03/04/06 12:25ID:Ne2teiuv0738あぼーん
03/04/06 12:39ID:???/:\.____\
|: ̄\(∩´∀`) \ <先生!こんなのがありました!
|:在 |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/aomori/
0739あぼーん
03/04/06 12:43ID:???! i iノノリ)) 〉
i l l.´ヮ`ノリ <先生!こんなのがありました!
l く/_只ヽ
| ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/koumuin/
0740邪穂
03/04/06 13:36ID:xn7ICdMG(´皿`;)了解しました。どうもありがとうです。
0741nobodyさん
03/04/06 18:25ID:???http://pc2.2ch.net/test/read.cgi/tech/1048519394/l50
0744nobodyさん
03/04/07 12:23ID:???0745nobodyさん
03/04/07 21:42ID:???0746nobodyさん
03/04/08 05:31ID:???0747nobodyさん
03/04/08 07:17ID:???#param.text
$param1 = 'value1';
$param2 = 'value2';
という変数宣言文が有り、これを読み込んで記述された通りの変数に展開
するにはどうすれば良いのでしょうか?
open( FILE , 'param.txt');
@buf = FILE;
close(FILE);
foreach(@buf){
$_;
};
print "param1 = $param1\nparam2 = $param2\n";
という感じにしても駄目でした。
0748nobodyさん
03/04/08 07:27ID:???直接の回答じゃないけど、スカラー変数の名前をtxtファイルで
指定しとくのはやめたほうがいいんじゃないかな。
ハッシュでやりましょう。
0749747
03/04/08 07:41ID:???いや、本当はやりたくないんですが、既存のFileを再利用しつつ
新規のprogramを作れというデムパな指令がおりてきまして・・・
なにやらNTT謹製のcgiがこの方法を使っているとかで、既存のFileを
出来るだけいじらずにProgram側で処理しなくちゃならんという事に
なったので困っている次第なのです。
#やっぱ'$'消して連想配列に突っ込むってのが一番安全な方法かなぁ。
0750nobodyさん
03/04/08 07:52ID:???じゃだめなの?
0751nobodyさん
03/04/08 07:56ID:???perl -e '$a="param1"; $$a="value"; print $param1;'
っていう方法もあるよ。
適当に書くと
foreach(@buf){
my ($var,$val) = split(/=/,$_);
$$var = $val;
};
print $param1;
(合ってるかな?)
0752nobodyさん
03/04/08 08:03ID:???open(FILE , 'param.txt');
@buf = <FILE>;
close(FILE);
foreach (@buf) {
my ($var, $val) = split(/\s*=\s*/,$_);
$var =~ s/^\$//;
$val =~ s/^["']//;
$val =~ s/;\s*$//;
$val =~ s/["']$//;
$$var = $val;
}
print "param1 = $param1\nparam2 = $param2\n";
0753747
03/04/08 08:11ID:???えぇと、元になるparam.txtが複数(別名で)有って、呼び出される時の
パラメータ(formの内容次第)で読み替える様にしなくちゃならんので
requireは使用不可と判断しました。
>>751
なるほど、「可変変数」という手が有ったのですね。
あとは改行と「'」消しだけで問題無く(根本的解決では無いが)出来そう
です。
ありがとうございますです。
0756747
03/04/08 11:02ID:???whichfileが存在しない場合ってエラーになりませんでしたっけ?
・・・という事を考えて敢てFile読み込みの方向で考えていたんですが。
0757nobodyさん
03/04/08 11:05ID:KoNa94bz記事の削除機能、修正機能を加えたいと思っています。
記事ナンバーとパスワードを入力し、該当の記事を引き出す事には成功しましたが、
そこからのログファイルの操作?がよく分かりません。
よろしければご教授下さい。お願いします。。
0758nobodyさん
03/04/08 11:11ID:???それだけでどうやって答えろって(ry
該当レスをテキストエリアにでも表示させて編集後に再書込み
該当レスを削除してログを前につめるか削除メッセージで代替して再書込み
そんなとこじゃないの
0759757
03/04/08 11:33ID:sQEXk45Gすいません、、ありがとうございます。
0761nobodyさん
03/04/08 17:58ID:???ディレクトリを削除ってことはできないですかね?
rmdirじゃあ、中に入ってると消してくれないんで
0763nobodyさん
03/04/08 19:07ID:???思いついたんだけど、同じ事考えた人っている?
0764nobodyさん
03/04/08 19:08ID:???れすどうもです。
これは何でしょう?コマンドかなんかでしたっけ?
んーやっぱりディレクトリの中調べて、全部消してrmdirにしようかな
0765nobodyさん
03/04/08 19:17ID:???http://www.linux.or.jp/JM/html/GNU_fileutils/man1/rm.1.html
0766nobodyさん
03/04/08 19:35ID:???print OUT "$data0\n";
print OUT "$data1\n";
print OUT "$data2\n";
print OUT "$data3\n";
print OUT "$data4\n";
print OUT "$data5\n";
print OUT "$data6\n";
print OUT "$data7\n";
print OUT "$data8\n";
print OUT "$data9\n";
print OUT "$data10\n";
ってやってます。
もっと簡単にできる(書ける)方法を伝授くださいませ。
0768nobodyさん
03/04/08 19:50ID:???$data{$i} = "$i番目の要素";
}
for ($i = 0; $i <= 10; $i++) {
print "$data{$i}\n";
}
こんな感じね。
0773nobodyさん
03/04/08 20:44ID:???0774nobodyさん
03/04/08 21:11ID:???0775nobodyさん
03/04/08 21:12ID:???本当にあった怖い話実況スレと間違えた・・・
0776nobodyさん
03/04/08 21:49ID:???0777nobodyさん
03/04/08 23:02ID:???perldoc File::Path
>>747
my %files = (
foo => 'foo.pl',
bar => 'bar.pl',
foo_alias => 'foo.pl',
);
my $configfile =$files{ $form{wichfile} };
do $configfile if -e $configfile;
0779nobodyさん
03/04/09 00:39ID:XTBH8kIamod_perl でeval ってやっても問題なし?
eval ってその中に書かれた文字列をコードとして認識するってことは
その中の文字列をコンパイル→実行 ってわけだよな?
mod_perl ってコンパイルしたコードをメモリに置いておくもんだが、
eval でコンパイルされたコードはゴミとしてメモリに残ったりしない?
あと、@list = qw(a,b,c,d,e,f,g);
ってのがあるとき
$list[2] は c
$list[5] は f
ってのは当たり前なんだが、
$list[25] ってのを参照しようとしたら
普通は未定義値となると思うんだが、-w スイッチつけると
Use of uninitialized value in concatenation
とかエラー出る。
mod_perl で安定したプログラム作るとき、
こういうのもやめたほうがよい?
0780251
03/04/09 01:41ID:???せめて配列を覚えよーよ・・・
0781nobodyさん
03/04/09 05:00ID:7s8viccHevalの実行結果が残ると思っているならんなことはない
というか、oオプション使ったマッチングで結果が残らないようにわざとevalでくくったりする
evalの中はコンパイルされないのよ。単なる文字列だから。だから実行中にランタイムエラーを拾える。
未定義値の参照は、mod_perlでも問題ないよ。(たしか)
ただ、未定義の領域にアクセスするなんてperlだから許されることで、
お勧めはしない。
(個人的には-wオプションでランタイムで出る警告気にしてたらperl使う意味無いと思うけど。)
0782nobodyさん
03/04/09 05:36ID:???evalは>>781の通りで、mod_perlでの問題はないはず。
蛇足だがグローバル変数のほうを気にしたほうが。
-wでのwarnは、漏れは気にしてしまうほうだが
配列の添字を直接指定して使うことがあまりない。
必要なときはdefinedや要素数で念のためチェックする。
本当にその警告が出ても問題ない場合は、no warnings 'warnings-category';として一時的に警告を無効にすればいいんだし。
0784nobodyさん
03/04/09 13:23ID:azVD19ZGあるでしょうか?
外のサーバにアドレスを吐き出すプログラムを置いて、チェックする方法以外を
教えてください。
■ このスレッドは過去ログ倉庫に格納されています