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

Perl 初心者コーナー Part21

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

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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:???
1つ目のrenameが成功して2つ目のrenameが失敗すると困りませんか
0686nobodyさん03/04/05 19:15ID:???
1,2,3,10,22
という配列があって sortすると
1,10,2,22,3となってしまいます。
これを1,2,3,10,22のように実際の大きさ順に
ソートするにはどうすればいいのでしょうか?
0687nobodyさん03/04/05 19:18ID:???
sort {$a <=> $b}
0688nobodyさん03/04/05 19:20ID:???
renameは失敗しないことにする。
0689nobodyさん03/04/05 19:27ID:???
>>688
それでは最終的に元ファイルが更新される保証がない。

0690nobodyさん03/04/05 19:31ID:???
>>689
「元ファイルが更新される保証」はいらないだろ。
「$logfileと$datfileの整合性が保たれる保証」が必要。
069166903/04/05 19:43ID:???
>>684
んーよくわからないんですが・・・
>完全エラー無し以外は すべて異常終了扱いにしたほうがいい。
それはわかるんですが、どういう風に書けばそうなりますか?
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:???
>>669
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/lA
ファイルをアップロードするシステムを構築していますがわからないことだらけです。
index.cgiのFORMデータをsubmit.cgiに引き渡して処理させたいのですが、どうやればいいのでしょうか?
親切なアドバイス待ってます。
0695nobodyさん03/04/05 20:22ID:???
>>694
http://tohoho.wakusei.ne.jp/wwwxx034.htm
↑ここ見て研究
0696あぼーん03/04/05 20:36ID:???
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://saitama.gasuki.com/mona/
069766903/04/05 20:41ID:???
>>693
わざわざ有難うございます。
ちょっとわからない事だらけなんで調べてきます。
0698Perlですが03/04/05 20:41ID:qMi3a/lA
>>695
それではなくて他に方法はありませんか?
0699nobodyさん03/04/05 20:55ID:???
>親切なアドバイス待ってます。
なんかムカつく。

submit.cgiでおこなう処理をindex.cgiの中から呼べばいいだろ
わざわざ"引き渡す"意味がわからん
0700nobodyさん03/04/05 21:14ID:???
>>693
if ($pointer != 0)
の条件判断は不要な気がする。
0701nobodyさん03/04/05 21:19ID:???
ファイルポインタ?
0702nobodyさん03/04/05 21:48ID:???
>>669
ちょっと直した

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:???
>>699
>>親切なアドバイス待ってます。
>なんかムカつく。
>>694は、あまりにもアレな質問して叩かれたことがあるに1000クックブック
0704nobodyさん03/04/05 22:14ID:???
>>702
tell(LOG);で0を返すんですが・・・
0705nobodyさん03/04/05 22:18ID:???
>>704
「>>」でopenすれば、ファイルの末尾の位置を返すよ。
0706nobodyさん03/04/05 22:28ID:???
>>705
$pointer = tell (LOG);

windowsじゃtell使えないんでしょうか?
なぜか0を返すんです。
ちゃんとその後printしたものは追加書き込みになってるんですけどねぇ
070770503/04/05 22:37ID:???
>>706
漏れの環境(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:???
$ cat hoge
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:sLGWgkab
PerlでGUID取得する方法ないっすかね?
0711nobodyさん03/04/05 23:11ID:RuMeXkuC
ハッシュの値で並び替えを行いキーと値を表示したいのですがどうすればいいでしょうか
0712nobodyさん03/04/05 23:27ID:???
sort {$hash->{$a} cmp $hash->{$b}} keys(%hash)
0713間違えた03/04/05 23:28ID:???
sort {$hash{$a} cmp $hash{$b}} keys(%hash);
0714nobodyさん03/04/05 23:30ID:RuMeXkuC
>>713
ありがとうございます.できました!
0715nobodyさん03/04/06 00:32ID:httIMQcy
クッキーがあるかどうか確認する方法を教えてください。
0716 03/04/06 00:43ID:88ZLH8qE
>>715
$ENV{'HTTP_COOKIE'}に値がはいっていれば在り、無ければ無し
0717nobodyさん03/04/06 00:53ID:/U6PDdMC
>>716サソ
それは自分のCGIから吐き出されたクッキーなんですか?
0718 03/04/06 01:00ID:88ZLH8qE
>>717
それはクッキーの設定次第w
http://www.futomi.com/lecture/cookie/index.html

自分とこのクッキーかどうか確認したい場合は、クッキーの内容を確認してw
http://www.futomi.com/subroutine/getcookie.html
0719nobodyさん03/04/06 02:34ID:ONKJQ6B1
PerlでUserAgentを書き換えるにはどうすればいいんですか?
0720nobodyさん03/04/06 02:37ID:???
>>719
「何の」UserAgentを書き換えたいのか?
0721間違えた03/04/06 02:58ID:???
$ENV{'HTTP_USER_AGENT'} = "もじら Version 2.3";
でいいだろ。
0722nobodyさん03/04/06 03:07ID:oW/lvYed
xpで、active perlが入ってて、
iisを作動させてブラウザから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の名前欄無視して)
0724nobodyさん03/04/06 03:11ID:???
>>722
PATHが通っていないのでは?
0725nobodyさん03/04/06 03:14ID:???
>>723
有難うございます。いけました>perl -v
でもなぜですか?
0726nobodyさん03/04/06 03:22ID:???
ってゆうか、perl -v って打つのが普通なんですね。
この前見たページ確認しにいってきたらスペース入ってました。
すいませんでした
0727nobodyさん03/04/06 03:43ID:ONKJQ6B1
>>720
アクセス解析の入っているページで
use LWP::Simple;
my $url = "http://yahoo.co.jp/";
my $content = get($url);
print $content;
と、ソースを取得した時に
アクセス解析でlwp-trivial/1.35解析されずに
Monazilla/6.00と解析されるようにしたいです。

0728nobodyさん03/04/06 04:01ID:???
>>727
はyahooがアクセス解析してると仮定してます。
0729nobodyさん 03/04/06 04:02ID:???
my $ua = LWP::UserAgent->new;
$ua->agent(Saitama');

perldocなり、cpan也でもうちょっと調べるべきであるかな
0730nobodyさん03/04/06 08:03ID:xn7ICdMG
CGIを設置しているのですが
.cgiのファイルをいじっていて、その中にメールアドレスを
書こうとしたらエラーになります。

どうも@を書くとエラーになるようですが
cgiの中に@を記入したい場合どうしたらよいのでしょうか?
0731nobodyさん03/04/06 08:09ID:???
ダブルクォートでくくられた文字列の中にメールアドレスを
書こうとしているのだと想像します。

その場合、@ が配列変数として認識されてしまっているので、
@ の直前に \ をつけて書くことをお勧めします。

あるいは、変数が展開されないシングルクォートで、文字列
をくくるという方法もあります。

今後は、エラーが出たときは、エラーメッセージをここに
貼り付けてご質問されることをお勧めします。
0732nobodyさん03/04/06 08:09ID:???
$email = '[email protected]';
$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:???
packageってC++のnamespaceみたいなもの?
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
perlで指定したサーバーが稼動しているか倒れているか調べる関数か何かありますか?
自鯖構築に利用したいのですが、独自ドメインからWebサーバーに飛ばして、
そこで、perlが処理するのですが、

if ($自鯖稼動状態 == 1) {
  print "Location: $ZISABAurl\n\n";
} else {
  print "Loaction: $WEBSABAurl\n\n"
}

みたいにしたいのですが。
0737bloom03/04/06 12:25ID:Ne2teiuv
http://www.agemasukudasai.com/bloom/
0738あぼーん03/04/06 12:39ID:???
   ______________
 /:\.____\
 |: ̄\(∩´∀`) \  <先生!こんなのがありました!
 |:在  |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/aomori/
0739あぼーん03/04/06 12:43ID:???
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/koumuin/
0740邪穂03/04/06 13:36ID:xn7ICdMG
>>731-732
(´皿`;)了解しました。どうもありがとうです。
0741nobodyさん03/04/06 18:25ID:???
Perlについての質問箱 4箱目
http://pc2.2ch.net/test/read.cgi/tech/1048519394/l50
0742nobodyさん03/04/07 04:20ID:???
>>741
厨が迷い込んでくるから貼らないでくれよ…
0743nobodyさん03/04/07 10:56ID:???
>>742
プッ
0744nobodyさん03/04/07 12:23ID:???
早いな。
0745nobodyさん03/04/07 21:42ID:???
春休みが終わった途端に加速していたスレが止まりましたね。
0746nobodyさん03/04/08 05:31ID:???
花見で忙しいんだ罠
0747nobodyさん03/04/08 07:17ID:???
外部に置いた設定File"param.txt"に

#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:???
>>747
直接の回答じゃないけど、スカラー変数の名前をtxtファイルで
指定しとくのはやめたほうがいいんじゃないかな。
ハッシュでやりましょう。
074974703/04/08 07:41ID:???
>>748
いや、本当はやりたくないんですが、既存のFileを再利用しつつ
新規のprogramを作れというデムパな指令がおりてきまして・・・

なにやらNTT謹製のcgiがこの方法を使っているとかで、既存のFileを
出来るだけいじらずにProgram側で処理しなくちゃならんという事に
なったので困っている次第なのです。

#やっぱ'$'消して連想配列に突っ込むってのが一番安全な方法かなぁ。
0750nobodyさん03/04/08 07:52ID:???
require "param.txt";
じゃだめなの?
0751nobodyさん03/04/08 07:56ID:???
requireが駄目なら、
perl -e '$a="param1"; $$a="value"; print $param1;'
っていう方法もあるよ。
適当に書くと
foreach(@buf){
 my ($var,$val) = split(/=/,$_);
 $$var = $val;
};

print $param1;

(合ってるかな?)
0752nobodyさん03/04/08 08:03ID:???
ちょっとだけちゃんと書いてみた。スカラーだけ。その他param.txtの書き方に制限有り
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";
075374703/04/08 08:11ID:???
>>750
えぇと、元になるparam.txtが複数(別名で)有って、呼び出される時の
パラメータ(formの内容次第)で読み替える様にしなくちゃならんので
requireは使用不可と判断しました。

>>751
なるほど、「可変変数」という手が有ったのですね。
あとは改行と「'」消しだけで問題無く(根本的解決では無いが)出来そう
です。

ありがとうございますです。
075474703/04/08 08:17ID:???
>>752
あ、入れ違いで、、、
意図した通りに動作しました。
ありがとうございます。
0755nobodyさん03/04/08 08:53ID:???
>>753
%form = フォーム;
require $form{'whichfile'};
じゃだめなの?
075674703/04/08 11:02ID:???
>>755
whichfileが存在しない場合ってエラーになりませんでしたっけ?
・・・という事を考えて敢てFile読み込みの方向で考えていたんですが。
0757nobodyさん03/04/08 11:05ID:KoNa94bz
掲示板作ってます。
記事の削除機能、修正機能を加えたいと思っています。
記事ナンバーとパスワードを入力し、該当の記事を引き出す事には成功しましたが、
そこからのログファイルの操作?がよく分かりません。
よろしければご教授下さい。お願いします。。
0758nobodyさん03/04/08 11:11ID:???
>>757
それだけでどうやって答えろって(ry

該当レスをテキストエリアにでも表示させて編集後に再書込み
該当レスを削除してログを前につめるか削除メッセージで代替して再書込み

そんなとこじゃないの
075975703/04/08 11:33ID:sQEXk45G
>758

すいません、、ありがとうございます。
0760nobodyさん03/04/08 11:50ID:???
>>756
-f で確認したらいいだろ?
0761nobodyさん03/04/08 17:58ID:???
中にファイルが入ってようが無かろうが関係なしに
ディレクトリを削除ってことはできないですかね?
rmdirじゃあ、中に入ってると消してくれないんで
0762nobodyさん03/04/08 18:14ID:???
>>761
Linux だったら
rm -rf /
0763nobodyさん03/04/08 19:07ID:???
今日、STDOUTをtieしてContent-Lengthを出すっていうのを
思いついたんだけど、同じ事考えた人っている?
0764nobodyさん03/04/08 19:08ID:???
>>762
れすどうもです。
これは何でしょう?コマンドかなんかでしたっけ?
んーやっぱりディレクトリの中調べて、全部消してrmdirにしようかな
0765nobodyさん03/04/08 19:17ID:???
>>764
http://www.linux.or.jp/JM/html/GNU_fileutils/man1/rm.1.html
0766nobodyさん03/04/08 19:35ID:???
$data1 〜 $data10って言う変数の値を1行ごとファイルに書き出すのですが、
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";
ってやってます。
もっと簡単にできる(書ける)方法を伝授くださいませ。
0767nobodyさん03/04/08 19:46ID:???
>>766
ハッシュにすれば?
0768nobodyさん03/04/08 19:50ID:???
for ($i = 0; $i <= 10; $i++) {
$data{$i} = "$i番目の要素";
}
for ($i = 0; $i <= 10; $i++) {
print "$data{$i}\n";
}
こんな感じね。
0769nobodyさん03/04/08 20:12ID:???
>>766-768
んなことせんでいい。

foreach (0..10) {
  print ${"data$_"};
}
0770nobodyさん03/04/08 20:28ID:???
>>769
わかってるが
$data1〜$data10 っていうのはみると気持ち悪いんだYO!
0771766でつ03/04/08 20:28ID:???
>>769
すっきりでつ!
改行が入ってなかったんでちょっと悩みました。
0772766でつ03/04/08 20:29ID:???
>>770
何で〜?
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:???
禿藁
0778 ◆hMJAPH9PWA 03/04/08 23:29ID:???
>>764
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:XTBH8kIa
ちょいと質問。

mod_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 で安定したプログラム作るとき、
こういうのもやめたほうがよい?
078025103/04/09 01:41ID:???
シンボリックリファレンスは使わぬほうがいいんだけどなぅ・・・
せめて配列を覚えよーよ・・・
0781nobodyさん03/04/09 05:00ID:7s8viccH
>>779
evalの実行結果が残ると思っているならんなことはない
というか、oオプション使ったマッチングで結果が残らないようにわざとevalでくくったりする
evalの中はコンパイルされないのよ。単なる文字列だから。だから実行中にランタイムエラーを拾える。

未定義値の参照は、mod_perlでも問題ないよ。(たしか)
ただ、未定義の領域にアクセスするなんてperlだから許されることで、
お勧めはしない。
(個人的には-wオプションでランタイムで出る警告気にしてたらperl使う意味無いと思うけど。)
0782nobodyさん03/04/09 05:36ID:???
>>779
evalは>>781の通りで、mod_perlでの問題はないはず。
蛇足だがグローバル変数のほうを気にしたほうが。

-wでのwarnは、漏れは気にしてしまうほうだが
配列の添字を直接指定して使うことがあまりない。
必要なときはdefinedや要素数で念のためチェックする。
0783 ◆hMJAPH9PWA 03/04/09 11:32ID:???
-wの警告は気にするな。
本当にその警告が出ても問題ない場合は、no warnings 'warnings-category';として一時的に警告を無効にすればいいんだし。
0784nobodyさん03/04/09 13:23ID:azVD19ZG
lanにあたっているグローバルアドレスを、取得するにはどのような方法が
あるでしょうか?
外のサーバにアドレスを吐き出すプログラムを置いて、チェックする方法以外を
教えてください。
■ このスレッドは過去ログ倉庫に格納されています