1 :
デフォルトの名無しさん :
2005/07/20(水) 05:15:36 "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2005/03/17現在の最新版: 5.8.7
● 2005/03/17現在の開発版: 5.9.2
2 :
デフォルトの名無しさん :2005/07/20(水) 05:23:09
3 :
デフォルトの名無しさん :2005/07/20(水) 05:24:24
ASP.Net、PHP、Ruby、Pythonの連合軍にやられて死滅寸前のPerl公国
perl5はもはやsedやawkと同じぐらいUNI*Xの底辺まで沈みつつある。 あと10年もすれば流行りの言語を尻目に枯れ果てて/binにまで落ち、 ニッポンの勘定系のバッチでも使えるようになっているだろうさ。
$a="\x83\x40"; これにインクリメントして$a="\x83\x41"にしたいのですができません。 どうすればいいのでしょうか? ちなみに $x="\x83";$y="\x40";$a=$x.$y; はうまくいきますが $x="\x83";$y="\x";$z="40";$a=$x.$y.$z; はだめです。シングルクオーテーションや.を+にしたりしましたがだめでした。
open(FH,"sample.txt"); $test = <FH>; @test = <FH>; close(FH); $test=<FH>は最初の一行だけ読み込み、@test = <FH>は全行読み込むと知ったのですが、 "sample.txt"が同じ文字列が10万行であると仮定して、$test = <FH>とtest =<FH>の負荷は10万倍になるのでしょうか?
>>9 (1)
unpack/pack または ord/chr
(2)
unpack/pack または ord/chr&hex
>>10 「負荷」が何を指すのか不明だが、
メモリ消費はは10万倍になるな。当然だが。
>>12 ありがとうございます。
趣味のプログラムなのでよい言葉が浮かばなかったのであやふやな表現になりました。
CPU使用率の意味で使ったつもりです。
15 :
デフォルトの名無しさん :2005/07/21(木) 01:34:02
質問です。 Perlメモには srand; open(FILE, "< $file"); rand($.) < 1 and $line = $_ while <FILE>; close(FILE); print $line; でファイルからランダムに1行選択できる、とありましたが 10行選択したい場合はどのように記述すればよいのでしょうか。
>>15 >このスクリプトではファイル全体をメモリに読み込まないので
>少ないメモリで実行させることができます.
>また,ファイルの行数があらかじめわかっている必要もありません.
Perlメモのこの考え方だとこう?自信ナサス
識者の方々採点おながいします
$hoge=10;
@array=();
srand;
open(FILE, "< $file");
while (<FILE>) {
if ( rand($.) < $hoge ) {
if ( $. <= $hoge ) {
push @array, $_;
}
else {
$array[int(rand($hoge))] = $_;
}
}
}
close(FILE);
print @array;
たぶん考え方はそれでいいんじゃないかと。 行の前後関係を保とうとするとさらに一工夫 必要かな。
行の前後関係も保つとなると、 @array = (); $max = 10; $n = 0; srand; open(FILE, "< $file"); rand($.) < 1 and $array[($n <= $max) ? $n++ : int(rand $max)] = [$_, $.] while <FILE>; close(FILE); @array = map { $_->[0] } sort { $a->[1] <=> $b->[1] } @array; print @array; て感じかな(未確認)。
すまん $n < $max だな。
数十から100程度のthread内で他のコマンド(catとか、findとか)をopenで 呼び出すperlスクリプトがあります。solaris9だと上手く動いている (ように見える)のですが、FreeBSD5.4だと時々thread内で無限ループ らしき状況に陥ります(ちゃんと動くときもあります) かたっぱしからprintfを入れてどこで止まってるかを調べてみると、 open文の個所でコマンドを呼び出し中(コマンドは実行されていない) で止まっています。 単純な for($i=0;$i<1000;$i++) { threads->new(\&a,"foo"); }; foreach (threads->list) { $_->join; } sub a { open(FILE,"echo @_|"); } だと問題なく動作します。 両OSともperl5.8.7、thread関連はperl -Vの出力では usethreads=define use5005threads=undef useithreads=define となっています。 スクリプトの問題なのか、perlの問題なのか、FreeBSDの問題なのか切り分け ようと思うのですが、どこから手を付けたらよいのでしょうか。
>>20 ユーザ当たりのプロセス数制限やファイルディスクリプタ数制限に
引っかかってるのかも知れず。そうだとしたら OS 側の設定の問題。
多少面倒でも外部コマンドを使わず組込関数で処理した方がいい
かもね。
22 :
18 :2005/07/21(木) 15:54:27
たびたびすまん ($n < $max or rand($.) < 1) and $array[($n < $max) ? $n++ : int(rand $max)] = [$_, $.] while <FILE>; じゃないといかんな。
sortするのも手ではあるが、spliceでランダムに一つ落として 新しいのをpushするという方法もありそうだ。
24 :
20 :2005/07/21(木) 20:08:40
>>20 独自プロトコルのTCP通信もやっている関係上、組み込み関数だとsocketから作らなきゃならないので
処理能力的にハードルが高いのです(送受信はそうでもないのですが、メッセージの構築に時間が掛かるので)
OS側の制限ならopen時にerrorで終了してもよさそうなんですが、無限ループ状態(もしかしたら
数時間待てば返ってくるのかも)のままなんですよね。
perlスクリプト内でカーネル内メモリを読み出す、なんて出来るんでしょうか?
外部プログラムから読むのであれば、またopenしなきゃなりませんし。。。
Perlでthreadを使うのが間違いの元 Perlのライブラリやモジュールなんてthreadのこと 考慮してないのがほとんどだろ
無限ループって具体的にどんな状態なのかとか fork(2) のコストだってかなりのもんなのではないかとか
>>20 openでパイプが開いて、処理がPerl側に戻ってくる前に、
プロセスが一杯になってるのでは。
それだとopenはエラーを返さない可能性があると思うけど。
21の言っているように、開けるプロセス数を増やしてみては。
あとは同時に動かすthread数を制限するとか、 eval, die, alart 使ってtimeoutしたら例外飛ばすとか。 とにかくまずはプロセス数の設定を確認・増やしてみて 様子を見るのが一番だと思うけど。
29 :
デフォルトの名無しさん :2005/07/21(木) 22:01:43
前スレが落ちたのでもう一度質問させていただきます。 use constantによる定数定義をまとめたファイルがあって それを一度だけrequireして使いたいのですが、 useの有効期限がファイルの終わりまでなので、 requireする側のファイルでは無効になってしまいます。 ファイル間を越えてグローバルに定数を扱うにはどうしたら 良いでしょうか?識者のご意見をお聞かせください!
>>29 > useの有効期限がファイルの終わりまでなので
これがあるから釣りだと思われたんじゃないか?
BEGIN{
require 'constants.pl';
}
Exporter使え、とゆーのがあったと思うのだが。 [Hoge.pm] package Hoge; use base qw(Exporter); our @EXPORT = qw(HOGE HIGE HAGE); use constant HOGE => "a"; use constant HIGE => "b"; use constant HAGE => "c"; 1; --- use Hoge; print HOGE, HIGE, HAGE, "\n";
32 :
15 :2005/07/21(木) 22:28:30
>>16-23 回答ありがとうございます。
実は時間が差し迫っていたこともあり、実際に書いたコードは
全部ロードしてから n 回選択、と適当な処理にしてしまいました。(趣味のコードです)
最初、私も配列に push していくことを考えていたのですが、
同じ変数に代入し続けないと“結果として確率が均等”が再現できない、と感じて
#open my $fh, "> test"; print $fh join "\n", (1 .. 1000); close $fh;
my @array = ();
my $max = 10;
srand;
open my $fh, "< test";
while (my $line = <$fh>) {
for (my $i = 0; $i < $max; ++$i) {
$array[$i] = $line if rand $. < 1;
}
}
close $fh;
print join "", @array;
こんな風に考えていました。バラバラに代入していく方法でも確率は均等になるのでしょうか。
33 :
15 :2005/07/21(木) 22:31:23
ここに書き込むにあたり、こんなのも考えてみました。 my @array = ([0=>0]); my $max = 10; my $n = 0; my $rand; srand; open my $fh, "< test"; while (my $line = <$fh>) { $rand = rand; if ($rand > $array[$#array]->[0]) { push @array, [$rand, $line]; @array = sort { $b->[0] <=> $a->[0] } @array; pop @array if ++$n >= $max; } } close $fh; print join "", map { $_->[1] } @array;
>>31 俺もExporter使えと誰かが答えていたのを見たような覚えがある。
ところで、ourで@EXPORTなら、pakcage無しで main に入れて
>>30 みたいにするのと変わりが無いかも…。
Perlのconstantって、確か関数呼び出しみたいな感じだったような。。 擬似的に定数っぽく見せてるだけなんだよね(あってる?)。
>>35 基本的には sub NAME { 'value' } というのを作るだけ。> constant
但しこういう中身が一つのリテラルだけのサブルーチンはコンパイル時に
最適化され、関数を呼び出してる部分に値がインライン展開されるので、
実行時には最初から定数を書いてるのと同じになる。
perl -MO=Deparse script として、どういう風に最適化されるか調べてみ。
>>36 やっぱそうか。
もともと同じ名前で関数実装する以外、定数定義する方法が無かったもんね。
そんな実行オプションがあるとは知らなかった。感謝。
なんか use base Exporter; にしても constant にしても、
Perl の歴史(というのか、微妙な努力というか…)を見るようだ。
そーゆー意味では、eval {...} if ($@) {...}は最凶だと思ふ。 # もーちょっとやりよーはなかったのかよ……。
前スレでExporterでぶち込めと書いたものですが。 レス見てたら use base 'constants.pl'; で逝けそうな気がしてきた。 どうしてもrequireしたい(条件によってファイルを変えるなど)のなら require 'constants.pl'; @ISA = qw( constants.pl ); じゃ? また試せる環境にないから投げっぱなしジャーマンスープレックス的レスなんだが。
>>39 …おまえ、Perlの継承システムを全然理解して無いだろ。
>>38 禿同
ブロックのeval、もうメチャクチャ。
Error.pm も微妙だけど、そのうちこういうのも吸収されていくのかね。
42 :
39 :2005/07/22(金) 00:39:22
あれれ、一応OOPで継承構造使ってるんだけどな。 OOPでもそうでなくてもuse base か@ISA指定でサブルーチンが継承されるのは確認してるよ。 それが正しいかどうかは脇に置くけどね。Exporter自体好きじゃない。
>>42 …何言ってんだか。
>>38 ははっきり言って無茶苦茶だぞ。
1.baseプラグマへの引数はファイル名ではなくパッケージ名
2.@ISAへ入れる文字列はファイル名ではなくパッケージ名
3.継承されるのは「メソッド」である。(*)
* 実体はサブルーチンだが、呼び出される過程が全く違うため区別して考える必要がある。
具体的には、継承したメソッドは必ず$class->method()としなければならなず、
「継承」であるため定数サブルーチンであっても「インライン展開」はされない。
定数サブルーチンの場合は結果は同じだが、引数を取る「非メソッドサブルーチン」を
継承しても、メソッドコール構文で呼び出すことは出来ない。
(というか、呼び出しても意味のある結果は得られない。)
>>42 俺は一応40ではないが。
>>39 を推測。
ひょっとして他の人のレス読んで、constantがサブルーチンなら
use base で呼び出し元のクラスの上(かmain::)に入れようと思ったとか?
ただしpackageは切っといて、Exporter使わない方向で
(rubyのmoduleみたいなもんかな)。
継承させる意味は無いけどな。
ただそれだとmainパッケージに入っていても、main->Const みたいにしか呼べないぞ。
一応、試してはみたが。
45 :
39 :2005/07/22(金) 02:33:49
ごめんね、不用意すぎた。 継承がパッケージ単位であることはさすがに知ってるよ。 みんな".pl"って時点でpackage化されていない外部ファイルって言う理解なのね? use base 'constants.pl'; @ISA = qw( constants.pl ); この辺りはファイル名変えるのだりぃから違和感感じながら適当にコピペした。 言いたいことだけ伝わると思ったのよぉ
>>38 >>41 C++/Javaのtry-catchだって
「やってみてだめなら例外投げるから受けとれ」
なんだから、ブロックのeval+$@そのものじゃないか。
入力値のバリデーションの定型句、型キャストに失敗したら
エラーだねって処理なんかスゲー乱暴で好きになれん。
# あくまで好みの問題なんだけどね。
# オフショアで隣国に投げるとき(時間も予算も限られてて
# コーダーに余計なこと考えてほしくない時)なんかは
# try-catchのほうが楽だよな
47 :
20 :2005/07/22(金) 13:58:49
下記のスクリプトなら問題なく動きますので、プロセス数制限は 問題ないのかと思います。 --- #!/usr/bin/perl -w use threads; for ($i=0;$i<1000;$i++) { threads->new(\&a,$i); } foreach (threads->list) { $_->join; } sub a { open(FILE,"(sleep 20;echo @_;sleep 20)|"); @a=<FILE>; close(FILE); } ---
48 :
20 :2005/07/22(金) 14:00:37
limitの結果は --- cputime unlimited filesize unlimited datasize 524288 kbytes stacksize 65536 kbytes coredumpsize unlimited memoryuse unlimited vmemoryuse unlimited descriptors 39146 memorylocked unlimited maxproc 19573 sbsize unlimited --- openで止まっているのは分かったので open(FILE,"/usr/local/bin/hoge $_|)||return -1; を print LOG "opening $thread_id\n"; open(FILE,"/usr/local/bin/hoge.sh $_|)||return -1; hoge.sh #!/bin/sh echo $@ >>/tmp/log exec /usr/local/bin/hoge $@ と変更し無限ループに見える状況が発生すると、perl側のlogにはopen直前まで来た記録が在りますが、hoge.sh側のlogには記録がありませんので、open文の中身が実行されてないように見えます。 perl側でshellを起動したあとに固まっているのか、shellを起動しようとして固まっているのか、 どうやって調べましょう????
49 :
20 :2005/07/22(金) 14:02:27
>>25 元組込屋なせいかthread safeかどうかは信用できない(w
ので、threads以外はモジュールは使ってません。
#なので、外部プログラムに任せようとしてはまっている、と
新たに言語を覚えるのはきついけど、半端にperlと組み合わせる
よりも全部C++で書き直すほうが早いのかな。。。
>>26 topだと
23526 user 114 0 18100K 16312K CPU1 1 6:15 99.02% 99.02% perl
23472 user 20 0 37156K 33748K kserel 0 2:43 0.00% 0.00% perl
という感じになってます。これがずーっとCPUを占有し続けます。
>>27 上記のようにパイプが開けてないように見えるのです。
プロセス数的には問題ないので(上のサンプルでも動くくらいですし)
どこが悪いんだか?
>>28 thread数の制限は考えたのですが、ちょっと勉強中でして。
socketみたいにselectすればいいのは分かるんですが、
joinするとthreadが終わるまで待ち続けてしまうし。。。
#detachして終わったら共有メモリにでもflagを立てればいいのかな?
50 :
デフォルトの名無しさん :2005/07/22(金) 14:11:01
>>48 > perl側でshellを起動したあとに固まっているのか、shellを起動しようとして固まっているのか、
> どうやって調べましょう????
lastcommを有効にすれば一発。
thread全く使わずにベタで動かしてみるとか。
>>46 たぶん
・evalの使い方が本来と違っているので違和感がありすぎる
・飛んでくる例外が$@のメッセージというのが気に入らない
という事でしょう。
まぁ eval, $@で例外処理ができるというのは、代替案が無いよりマシ。
eval $strとeval{ code }の意味が違うってのがもにょるな。 try{ code }でよかったのに。
>>53 > eval EXPR と eval BLOCK
その辺のコンテキスト判断がどの言語より人間の意識に近い
(期待通りになる)んでPerlはすごく気持ち良いんだな~。
$count = @array;
とか。ほかの言語から入ったときまず面食らうのがここなんだが。
>>54 > どの言語より人間の意識に近い
そうかな~?
>>54 趣味で書いてるなら別にどうなってても良いんだけどねぇ。
仕事のはそうはいかない。
新人実戦投入で教えなきゃいけない時とか、他の人のコード読む時に、
いかにもPerlな「こんなのもできるぜコード」があるとすごく困る。
自然言語に近いってのは賛成だな。 だからスラングみたいなのがあるのは仕方ない。
Windowsで拡張子を.plにして起動したときに コンソールを非表示とか最小化状態で起動するにはどうすればいいですか?
>>56 chomp (my $dummy = $q->param('content') );
とかな。(´ー`)
そこでコーディング規約なんだが、
強制で規約守らせちまうツールがないんだよな。
EclipseのEPICがもうちょっと良くなってくれれば
いいんだが。。。
>58 BEGIN { if ( $^O eq 'MSWin32' ) { require Win32::Console; Win32::Console::Free(); } }
62 :
デフォルトの名無しさん :2005/07/23(土) 19:05:10
すいません質問です。 use strictとかuse warningsを使う場合、 モジュールの呼び出し元のファイルで一回記述しておけば 呼び出し側ではやらなくても良いのでしょうか? それともファイル毎に記述すべきですか?
63 :
62 :2005/07/23(土) 19:07:27
日本語が変でした。ちょっと訂正します。 すいません質問です。 use strictとかuse warningsを使う場合、 モジュールの呼び出し元のファイルで一回記述しておけば モジュール側では記述しなくても良いのでしょうか? それともファイル毎に記述すべきですか?
>>63 strict/warningsの有効範囲はプログラム全体でもファイル全体でもなく「ブロック」。
そのくらい試せよ。
65 :
62 :2005/07/23(土) 20:06:26
>>64 ありがとうございます。
プログラム全体で有効にさせたい場合は全てのファイルで
先頭にでも記述しとけばいいということですね。
warningsはperl -wで全体で有効に出来る
Apatch&Active Perlをインストールしたのですが、テストで良くあるHello表示スクリプトを実行させてみても、CGIとしての動作では無く、テキストファイルを読むようにソースがずらっとブラウザに表示されてしまいます。 インストールし直して見てもダメだったのですが、お知恵をお借りできませんか? WinXPにActivePerl-5.8.7.813-MSWin32-x86-148120.msiとapache_1.3.33-win32-x86-no_src.msiをインストールしました。 DOS窓でPerl -vした場合も、ちゃんとメッセージが返ってきます。
>>68 ヒント。
・httpd.confの設定
・+ExecCGI
・ScriptAlias
あとはWebProg板のほうが適切と思われ。
>>68 それはおそらく、Perlの問題ではなくApatchの設定の問題だと思われます。
また、
>>1 をご覧になるとわかる通りCGIに関する質問は板違いになるので
Webプログラム板でされた方が回答が得易いかと思われます。
71 :
68 :2005/07/24(日) 09:53:48
>・httpd.confの設定 ↑これでした。 ありがとう。 板違いだったようで、失礼しました。
ちなみに、"Apache"が正しい綴りだから覚えておくといい。
継ぎ接ぎのwebサーバーってのが語源だっけ。
パッチだらけ
>>73 味噌糞ぐちゃぐちゃ病気言語を自認するPerlとの相性はぴったりだな
NCSA httpへのパッチの集合体から始まった。
dが抜けてた orz NCSA httpd
78 :
デフォルトの名無しさん :2005/07/24(日) 19:07:32
何か引数を必要とするサブルーチンを用意し、そのサブルーチンの名称が hogeだったとしてスカラー変数$tmpに'hoge($arg)'と代入して、その後 eva $tmp とすると、Too many argumentsがでます。evalで使用しない場合はでないの ですが・・・ あとサブルーチンのプロトタイプ宣言をするとToo many argumentsはでなく なりますね。 これはどういう理屈なのでしょうか?
逃げちゃ駄目だ逃げちゃ駄目だ逃げちゃ駄目だ
この場合数行でそのエラーの出るコードを書くことが できるだろうからそれをきっちりさらしてもらった ほうがいいな。
さてコードを貼り付けようとコードを整理したらちょっと 気づいたことがあったので、ぷろPでちょろっと調べたら 事故解決しますたw
m9(^Д^) プギャー 二度とくるな
検索文字列をURLエンコードされたGoogleのURIとして出力する Perlスクリプトhoge.plを書きまして Linuxのシェル上から $ w3m `hoge.pl うんこ` みたいにすれば文字列「うんこ」の検索結果が表示できるようにしたのですが、 hoge.pl内部にて system "w3m $uri"; #$uriは作成されたURIの文字列 みたいにして $hoge.pl うんこ だけで同様の動作を得ようとすると Error occured while reset 800b: errno=5 と表示されまともに動作しないのです。アレならhoge.plの中身書きますが、 とりあえずどういう不具合が考えられるでしょうか?
85 :
84 :2005/07/25(月) 12:59:21
あー分かりました。シェル上のワイルドカードってやつですね。 大変失礼しました。
関数を変数として扱うにはどうしたらよいですか?
夏だなあ
>>86 ・現在のコード
・その「関数を変数として扱った」場合の呼び出しコード(希望でよいので)
・どうしてそのように扱いたいのか
を列挙してみましょう。
これらを整理すると、整理中に自己解決したり、検索すべきキーワードが
浮かんだりしますよ。
>>87 こういう人を見るとホント夏を実感するねえ。
バカだなー、まあ子供だからしょうがないかって。
最後が文章変。
Solaris 付属の perl で perl -V とやると、以下のように Locally applied patches がずらずらでてくるのですが、このようなパッチってどこから入手で きるのでしょうか? Locally applied patches: 9676 Port the OpenBSD glob() security patch 9678 Addendum to #9676: some missing changes from OpenBSD glob.c 9679 Up $File::Glob::VERSION, add OpenBSD glob version note 9693 $VERSION and Version() on same line provokes CPAN.pm warning 9706 #7210 broke .packlist generation 9707 ExtUtils::Installed doesn't quote regex metacharacters in paths 9775 Typo in utf8.h 9950 Revert integration of #8254,#8255 in #8620 (causes coredump)
Perlコーディング初心者質問スレ Part 42 にて質問したのですが回答を得られなかったためこちらでも質問させて下さいm(_ _)m ---- ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが 持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを 組み合わせるような方法がベターなのでしょうか。 mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは 限らないので無理そうです。 listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり する事は出来ますか?
Perlコーディング初心者質問スレ Part 42 にて質問したのですが回答を得られなかったためこちらでも質問させて下さいm(_ _)m ---- ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが 持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを 組み合わせるような方法がベターなのでしょうか。 mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは 限らないので無理そうです。 listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり する事は出来ますか?
Perlコーディング初心者質問スレ Part 42 にて質問したのですが回答を得られなかったためこちらでも質問させて下さいm(_ _)m ---- ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが 持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを 組み合わせるような方法がベターなのでしょうか。 mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは 限らないので無理そうです。 listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり する事は出来ますか?
Perlコーディング初心者質問スレ Part 42 にて質問したのですが回答を得られなかったためこちらでも質問させて下さいm(_ _)m ---- ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが 持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを 組み合わせるような方法がベターなのでしょうか。 mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは 限らないので無理そうです。 listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり する事は出来ますか?
Perlコーディング初心者質問スレ Part 42 にて質問したのですが回答を得られなかったためこちらでも質問させて下さいm(_ _)m ---- ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが 持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを 組み合わせるような方法がベターなのでしょうか。 mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは 限らないので無理そうです。 listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり する事は出来ますか?
キテガイ来た
Perlコーディング初心者質問スレ Part 42 にて質問したのですが回答を得られなかったためこちらでも質問させて下さいm(_ _)m ---- ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが 持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを 組み合わせるような方法がベターなのでしょうか。 mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは 限らないので無理そうです。 listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり する事は出来ますか?
>>93-96 連投いい加減にせいよ(゚Д゚)ゴルァ!!
原因と再発防止策をここに書け。
>>93-97 ,99
連投いい加減にせいよ(゚Д゚)ゴルァ!!
原因と再発防止策をここに書け。
>>93-97 ,99
いい加減にせいよ(゚Д゚)ゴルァ!!
原因と再発防止策をここに書け。
書き込み失敗の時にボタン連打する人っているよね
人大杉のせいだな。
人大杉のせいだな。 もうおさまったか?
なにこの糞ども
最初のほうはちょっとだけ面白かったよ
いいから質問に答えろよ まさか回答する能力も無いのに偉そうにスレッド批評なんか してたんじゃあるまいな?
>>93 コネクションを継続させなくて環境変数とカレントディレクトリを保持すれば
Web Telnetもどきは実現できますよ。
最初にフォームで受取った文字列を `` または open'コマンド|' に渡して
コマンドを実行したら出力結果を標準出力に出力。
コマンド実行後、現在の%ENVの中身とカレントディレクトリを
セッションファイルなり、input hiddenなりで保持。
次回以降の接続毎に保持していた環境変数の内容を%ENVにコピーして
保持していたカレントディレクトリにchdirして、
最初を繰り返せば前回の作業の続きができます。
93です
連続投稿になってしまい誠に申し訳ありませんでした。
故意ではありませんが確認を怠った手前のミスとして逝ってきます。
>>111 さま
telnet.cgiという名前で似た機能のがwebで落ちてますね。
当方、会社先でセキュリティが厳しくまともに通してくれるのは
25,80,110portぐらいなんです。なのでhttp経由で任意のホストへ接続出来れば
内職がしやすいかなって思いまして。
結局適当なPORTにlistenしてクライアント管理プログラムから
socketでやり取りするプログラムで期待の動作をするサンプル
プログラムが書けました。
所々でブロックしてしまう等、多々問題はありますが1つ1つ改善していきます。
怖ろしい……怖ろし過ぎる……
>>112 中途半端な知識しか無いのにモラルは最低の厨房
会社から見ると癌以外の何者でもないですね
仕事もできなさそう
うはw
他のアプリが開いてるソケットをモニタして, そこを流れてるパケットを条件が一致したものだけログに取るというスクリプトを Perlで作ろうとしてるのですが,他のアプリが開いてるソケットのIDを取得するには どうすればいいのでしょうか?
環境非依存な方法でそんなことはできない せめてOSを書きなさい
119 :
117 :2005/07/28(木) 21:15:33
大変失礼しました OSはwindows2000SP4,それにActivePerl5.8を入れて使ってます。
>>112 >>115 紹介の企業ページ注意文を抜粋
> SoftEther を使用すると、会社内のネットワークと外部ネットワークやコンピュータ同士を、
> ネットワーク管理者の許諾を一切得ること無く、無断で接続することができてしまいます。
> ネットワークに関する知識の少ない人がこのような接続を行うと、自分の PC だけではなく、
> LAN に接続された他のすべての PC にも重大な影響が出る場合があります。
>
> また、SoftEther を使用して構築した仮想ネットワーク上のパケットは、会社内 LAN に設置されたファイアウォールや
> ウイルス検出システムは絶対に検知することができません。そのため、社内 LAN のシステム管理者が外部からの攻撃や
> ウイルス感染を防ぐようにシステムを構成していても、SoftEther 仮想ネットワーク経由で社内 LAN にウイルスが
> 感染したり、攻撃の対象となっていまうことがあります。
>
> これらの危険性があるため、SoftEther の使用については、SoftEther の仕組みや各種ネットワーク・プロトコルに
> 関する十分な知識を習得した上で行うようにしてください。特に、社内 LAN などのプライベートネットワークの
> ユーザーは、SoftEther を使用する前に必ずシステム管理者・ネットワーク管理者に対して許可を得てください。
> SoftEther の開発者・配布者は、SoftEther によって引き起こされたすべての損害について一切責任を
> 負いかねますので、ご注意ください。
つまり、
>>112 のような人は、使わないでねと言ってる。
>>112 みたいな人って、一般的に、会社で懲罰の対象になったりするの?
ああいうことをやって、会社のシステムに侵入されて、懲戒免職になった
という人は知っているけどさ。
つか、ネットワークとか関係なく勤務時間中に内職 やってる時点でダメだろ
123 :
デフォルトの名無しさん :2005/07/30(土) 01:36:10
ここできいていいのかわかりませんが、DBIについて質問です。 PerlのDBIモジュールでDBD::ODBCを使用して DB(RedBrick)からデータをSELECTすると -1超0未満の小数点値がおかしくなってしまうのです (-0.1が-.1になる)。 ちなみにおかしくなってしまう項目の方はDECIMALです。 DOUBLEやFLOAT、CHARなどのデータ型ではおかしくなりません。 しかし、どうしてもDECIMALでなくてはいけなく、困っております。 Perlで置換してしまえばいいのですが、根本的な解決にはならないので お尋ねした次第であります。 どなたか解決策がわかる方がいましたら教えてください。 もしくは、この質問に適切な板やスレッドがあれば誘導お願いします。 なお、環境は以下のとおりです。 現在手元にか環境がないためうろ覚えです。 Redhat ES3 DBI 1.4くらい DBD::ODBC 1.13 unixODBC 2.2.6くらい
if ($a =~ /$b/)で、マッチさせたい$bの中に括弧が入っていると、エラーが出てしまいます。 $bの中の文字列はコロコロ変わるので、エスケープは出来ないんですが、 どうすればマッチさせられますか?
>>123 my $num1 = '-0.1';
my $num2 = '-.1';
print "$num1 == $num2\n" if $num1 == $num2;
my $num3 = sprintf '%f', $num2;
print "$num1 == $num3\n" if $num1 == $num3;
$num2 =~ s/-\./-0./;
print "$num1 == $num2\n" if $num1 == $num2;
>>124 /\Q$b\E/
Linuxに詳しくないんですが質問させて下さい。 cronの使えない環境で定期的にCGIを動かすにはどうすればいいでしょうか? 全然アクセス数がないのでimgタグとかで動かすってのはできないです。 cronの使えるサーバを別で借りてwgetしても動くんでしょうか?
>>127 大きな声ではいえないが、ある勘定系システムでは夜間バッチを
なぜかWebAppで作って、wgetで叩いていることを俺は知っている。
おまけにパラメタはget渡しで、サニタイズなし。(-Д-)サムイネェ
だから君の場合cron+wgetでオケーだ。
130 :
デフォルトの名無しさん :2005/08/01(月) 01:15:55
日付を取得して、その日付の二日前を取得したいのですが、 たとえば8/1だとして、 $foo = sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday-2); とすると 200508-1となってしまいます。 これを20050730とすることはできるのでしょうか?
131 :
デフォルトの名無しさん :2005/08/01(月) 01:24:25
かいkりゅv
2日前にしてから time - 60 * 60 * 24 * 2 日付取得すりゃいいんだよ
use Time::Local; $t = timelocal(0,0,0,$mday,$mon,$year); $t -= 2 * (60*60*24); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t); $foo = sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday-2);
134 :
デフォルトの名無しさん :2005/08/01(月) 03:19:22
PerlでMSNメッセンジャークライアントスクリプトを作ってるんですが、 メッセンジャーのオンライン状態を継続するにはプロセスを維持する必要があります。 while(1){ }のループでソケットの監視を続けたいと考えていますが、 while構文は時間経過によって負荷が増大したりしますか? ループ内においてメモリを消費し続ける処理はありません。 (もちろん、一定時間によるタイムアウトやリモート操作はできるようにします。)
135 :
デフォルトの名無しさん :2005/08/01(月) 03:29:57
>127 毎日決まった時間になったら、コンソールから動かしたいプログラムの 名前をタイプしてエンターキーを押す。
136 :
134 :2005/08/01(月) 03:52:27
ちと間抜けな質問だったので補足します。 レンタルWebサーバでの運用を考えており、 ローカル(Windows2000+ActivePerl)でのテストは実施。 タスクマネージャでプロセスの状態とパフォーマンスの変化を 確認したところ、メモリ・CPUいずれにおいても 時間経過(30分程度)による状態の変化は特にありませんでした。 そこで、実際に運用したいレンタルサーバにおいてはどうか、 テスト環境と異なるOSにおいては負荷が増大する可能性が あり得るのかを知りたかったというわけです。 もちろん、プロセスが長く残ること自体の是非もあると思いますけど。 実際に運用したいサーバはValue Domainのレンタルサーバ。 仕様は特に明記してあるところが見つからなかったので不明です。 HTTPヘッダにも Server: Apache としか無かったので... どうぞ皆さまよろすく(゚Д゚)ノ
知らんけど、irc proxyのpircだのmadokaだのを 年がら年中起動しっぱなしの人はよくいるね。
xreaの鯖はCGIプロセスが何秒か走ってると殺されたような希ガス
localtime() 使って +1900 とかするの面倒なら use POSIX(strftime); すると幸せになれるよ。
140 :
134 :2005/08/01(月) 11:30:24
>>138 試してみたら、おっしゃる通り8分程度で切られますた。
やっぱり自分のサーバでないとだめかぁ(´・ェ・`)
常駐デーモン可の間借り鯖なんて殆どないでしょ
二重forkしてこっそり走らせることもできなくはないんじゃないの
144 :
◆TWARamEjuA :2005/08/01(月) 22:25:02 BE:654023-##
二重fork? 詳細キボンヌ
145 :
デフォルトの名無しさん :2005/08/01(月) 22:36:51
>>143 察知されて対策されるだけ。
おまけにペナルティも食らうかも。
146 :
134 :2005/08/02(火) 01:05:02
>>142 今のスクリプトは最新のコマンドをモニタして、
それに合わせてMSN.pmを少々書き換えながら使ってます。
けどMSN2.pmは知らなかった。ちと見てみる!サンクス
実はAjaxで(関係無いけど)チャットスクリプトを作っていて、
部屋に誰かがログインしたときや特定のコマンドを使ったときに
MSNのメンバリストに登録されている人に通知を送るような仕組みを作ってます。
現段階で一応ひととおりのことは出来ていて、
あとはクライアントのオンライン状態維持が課題だったわけです。
結局、都度プロセス起動→通知処理→終了という動きにせざるを得ないようです。
しかしMSNはアドレス指定でインスタントメッセージの投げっぱなしができるのかと思っていたら、
SwitchBoardのコネクションをユーザごとに確立しなければならないようで...
この構想自体、なんだかわずらわしい仕組みに思えてきたトコです。合掌。
>>145 5分程度で次々に再起動するのはどうだ。
勿論冗談だ。
メインループの中に fork && exit を 入れると消されなくなるよ。 あ、XCPUをignoreするの忘れずに。 例えば $SIG{'XCPU'}='IGNORE'; while (1) { fork && exit; } みたいに。
xreaに通報していい?
150 :
デフォルトの名無しさん :2005/08/02(火) 20:34:33
redhat9でperl5を使っています サブクラス MIME::Parser を使ってメール受信をしていますが 添付ファイル名が同一のメールが来た場合に、添付ファイルが上書きされるために、 これを別ファイル名で保存する サブクラス MIME::KbParser を作成してMIME::Parseと同一のディレクトリに 保存しました。しかし、 このパッケージを使っている プログラム の文法チェック perl -wc abc.pl をかけると、下記のようにエラーになってしまいます。 原因がわかるかたお願いします。 Can't locate MIME/kbParser.pm in @INC (@INC contains: /usr/lib/perl5/5.8.0/i386- linux-thread-multi /usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linu x-thread-multi /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/ perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.0/i386-linux-thread-multi /usr/li b/perl5/5.8.0 .) at preg.pl line 27.
>>150 情報が少なすぎて何ともいえないが、ファイル名じゃないか?
KbParser.pm <-> kbParser.pm
152 :
デフォルトの名無しさん :2005/08/02(火) 22:29:30
>>151 回答ありがとう
書き間違えです、ファイル名はあっています・・
パッケージを追加した場合、なにかperlに対して設定変更が必要なのでしょうか?
>>148 止まらなくなった…どうやって止めたらいいの?
killしようにもpidがコロコロ変わるのでkillできない!!!
あーあ・・・本当にやっちゃたじゃんか かわいそ
155 :
デフォルトの名無しさん :2005/08/02(火) 23:19:24
150 ですが、自己解決しますた サンクス
157 :
デフォルトの名無しさん :2005/08/03(水) 00:18:54
>>157 何かを勘違いしている可能性あり。
コード晒せ。
%7Eって '~' だよね。
>>153 PGIDしらべてプロセスグループを殺すとか、
調べるのめんどくさければ他のも巻き添え
食うの覚悟でkill -1という手もある。
>>160 >kill -1
ドラえもんが、ネズミを駆除するのに「地球破壊ばくだん」を使おうとした話を
思い出したw いや確かに、繁殖力の強いネスミを絶滅させるにはそれしかないん
だろうけどw
>>163 サンクスコ
% → %25 で直りマスタ
165 :
デフォルトの名無しさん :2005/08/03(水) 02:07:47
166 :
デフォルトの名無しさん :2005/08/03(水) 09:52:58
パスワードをGETデータで扱うのはやめたほうがいいでしょうか。 HTTP_REFERERでパスが漏れるのが心配なんですが 他のサイトへのリンクを貼らなければ大丈夫ですか?
仕事でPerlのソース読んでるんですが、以下の関数の結果は違うのでしょうか。 &jcode'convert() &jcode::convert() (引数省略) エディタの色分けがおかしくなってしまうので、「::」の形式に統一したいのですが 問題ないでしょうか?
>>167 その糞エディタを(ry
他人のコードを読むにあたってエディタの都合で
コード改変というのは発想が間違っている。
そもそも質問にあるようなコードぐらい自分で検証できんのかと。
>>161 > 地球破壊ばくだん
正確には「地球はかい爆弾」。
・・・恐ろしくどうでもいい指摘だなw
>>167 perlmodによれば
古いパッケージ区切り子はシングルクォートでしたが、
現在はダブルコロンを使うのが推奨されています。
なぜなら、この方が人間が読みやすいということと、emacsで読みやすいからです。
これはまた、 C++プログラマーに自分が知っていることのように思わせるようにもします。
それは以前のシングルクォートがAdaプログラマに馴染みのものでであったことと同じです。
>>168 >>170 レスありがとうございます。
コード改変についてはそれが許されている状況だったもので。
検証はしてみたのですが、違いが無かったので心配したわけです。
ありがとうございました。
>>166 そのパスワードが漏れてもいいようなどうでもいいものならそれでいいんじゃね?
>>171 168は許されている許されていないの問題ではなく、
エディタの都合でソースを弄るということが
決定的な間違いだと言っておると思うのだが。
>173 Perl4時代の古い習慣だし、直していいんじゃね? コロン2つになった理由の一つもコレだし↓ >なぜなら、この方が人間が読みやすいということと、emacsで読みやすいからです。 ~~~~~~ ついでに言うと、古い*.plライブラリを*.pmモジュールに変換する pl2pmなるユーティリティがPerlディストリビューションに含まれている。 つまり、これは非常識でもなんでもない。
ってかいちいち独りよがりの妄想で自分で自分を縛ってたら、 仕事が遅くなるだけじゃねーかw そんな考え、誰も評価しませんから~。!残念!
今時ギター侍・・・
外界との接触が少ないんだろ
しかも句点の後ろにエクスクラメーションマークだもんな。
179 :
デフォルトの名無しさん :2005/08/04(木) 13:20:27
GDをインストールしようとした。 makeは成功したが、make testで $ make test PERL_DL_NONLAZY=1 /usr/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t t/GD..........Can't load './blib/arch/auto/GD/GD.so' for module GD: dlopen: libgd.so: symbol "iconv_open" unresolved at /usr/local/lib/perl5/5.8.0/alpha-dec_osf/DynaLoader.pm line 229. at t/GD.t line 13 と出てテストが失敗してしまう
180 :
デフォルトの名無しさん :2005/08/04(木) 16:35:08
こんにちは。質問です。 cのgetprognameみたいなものってありますでしょうか? $0を自分で整形するのが普通なんでしょうか?
181 :
デフォルトの名無しさん :2005/08/04(木) 18:17:33
基本的な質問で、すいません。 パールは、クライアントの入力情報を反映させて、 HTMLソースを生成できますが、 HTMLソースにパールを埋め込んで?(そのページが「○○○.cgi]ではなく「○○○.htm」の形で) クライアント(HP閲覧者)の環境変数を取得することは可能でしょうか? 他に環境変数を取得できる方法とその言語、そのサーバーの環境を教えてください。 よろしくお願いします。
182 :
181 :2005/08/04(木) 18:20:08
ずれてますね。失礼しました。
Cにgetprogname()なんて無かったと思うが
>>183 それが最近はあるんだな。オレはFreeBSDしか知らんが
HISTORY
These functions first appeared in NetBSD 1.6, and made their way into
FreeBSD 4.4.
だそうだ。
で、回答としては$0を自分で整形しろでいいのかね? File::Basenameあたりは使えると思うけど、もっと これ専用のものってなんかあるっけ?
OSによって違うけど、少くともBSDじゃ $0に代入するとperlの中の人がsetprogname()を呼んでいる。
というか何をしたいのかがわからん。
あ、ごめん、設定したいじゃなくて参照したいのか。 それならプログラム先頭で (my $__progname = $0) =~ s,.*/,,; で十分だろ。 Cのgetprogname()もやってることは同じだ。
というか → ていうか
192 :
デフォルトの名無しさん :2005/08/05(金) 11:08:49
193 :
134 :2005/08/05(金) 11:35:29
>>148 そんなワザがあるのかぁ…勉強になります。
とりあえず今回は穏便に、毎回プロセスを終了するようにしますた。
カネ払ってしまったからリスクのあることは出来ないのでね…
Aug 5 12:21:42 mew sm-mta[24903]: [ID 801593 mail.info] j753LgZN024903: from=<info@mail.tank-gt.com>, size=2096, class=0, nrcpts=1, msgid=<20050804161041.18803.qmail@mail.tank-gt.com>, proto=SMTP, daemon=MTA, relay=[211.112.50.123] こういうログがあるときに、 perl -ne 'if(/from=<info@mail.[^>]+\.(com|net)>.*msgid=<[^>]+qmail@mail.*relay=\[([0-9]+(\.[0-9]+){3})]/) { print "$2\n" }' /var/log/syslog だとマッチするのに perl -ne 'if(/from=<info@mail\.[^>]+\.(com|net)>.*msgid=<[^>]+qmail@mail.*relay=\[([0-9]+(\.[0-9]+){3})]/) { print "$2\n" }' /var/log/syslog だとマッチしないのはなぜですか?
>>193 > そんなワザがあるのかぁ…勉強になります。
×ワザ
○ワナ
>>194 @mailが展開されてたぶん空文字列になってるから。
>>194 Sendmailなんて化石のようはソフトを使ってるから
ようは
>>198 え? SenderID とか Domainkeys とかの最新技術にまともに対応してんのって、
sendmail くらいしか無いじゃん。どこが化石よ。
>>200 >>198 をよく見ればわかるけど初心者を相手にしてどうする?
そのうち彼はperlのことも化石にしてしまうと思うぞ。
perlは既に化石だから心配無用かと
s/Ⅸ/IX/g; ということをやらせたいのですが、sjisで書くと通りません 全角文字部分をヒアドキュメントにするにはどうすればいいですか
require 5.8.1; use encoding "cp932";
chomp($pat = <<'EOF'); Ⅸ EOF s/$pat/IX/g; のようにすると、 Trailing \ in regex m/Ⅸ/ at xxx というエラーになります chomp($pat = <<EOF); Ⅸ EOF s/$pat/IX/g; とすると、IXではなくIX\になります よく判りません
わからないなら辞めちまえ
v5.6.1 で使う限り、有効な解決方法が存在しないまたは誰もしらない ということですね
いえ、あなたが開発者である限り無理ってことです
ⅨをⅨ\と書いて直接埋め込むことで解決はします ヒアドキュメントを使った方法は不可能です
2バイト文字をコードに直接書くことに起因する問題の多くは
ヒアドキュメントを使うことで回避できるけれど、
この場合はパターンマッチの中に使おうとしており、
どうせ文字列の評価が発生するので避けられない
何か方法がありそうな口ぶりの
>>208 や
>>210 は
ただの知ったかぶり
1: use Tk; 2: my $mw = new MainWindow(); 3: my $img = $mw->Photo(...); これの3行目の処理をCから行いたいのですが、 どうすればいいのでしょうか? Tk_CreatePhotoImageFormat を使う方法は出来たのですが、 これではPerl側が画像を作るのを待つしかありません。 そうじゃなくて、Cから画像を作りたいのですが、どうすればいいのでしょう。
妙に実行に時間がかかるPerlスクリプトがあるんだけどお手軽に各サブルーチンの実行時間を計測するような 方法ってある?
use Benchmark;
220 :
216 :2005/08/07(日) 01:53:14
thx やってみます
221 :
デフォルトの名無しさん :2005/08/07(日) 03:10:48
誰か助けてください
#!C:/perl/bin/perl
open(IN, "./001.gif");
binmode(IN);
read(IN, $image, -s "./001.gif");
close(IN)
binmode(STDOUT);
print "Content-type: image/gif\n";
print $image;
exit;
上のcgiをローカルのテストサーバー(
http://127.0.0.1/001.cgi )で表示させようとしても
Internal Server Errorと表示されます
どこが間違っているのでしょうか?
HTTPヘッダが終わってない。
223 :
デフォルトの名無しさん :2005/08/07(日) 03:37:09
>>222 OK、ジョニー、ICIC
;が抜けてるのと
./が余計だったんだな
一番の間違いはエラーログ見てないことだろ
225 :
デフォルトの名無しさん :2005/08/07(日) 04:12:22
パール難しすぎ、っていうかややこしい Cのほうがやりやすいわ
はいはい
そんな分かりきったことを何故ageで。
Perlの複雑さは並じゃない。更に不条理(ry
>>215 サンクスです。
Perlのいいところはとっつきやすいところだと思う。 なんたって print "Hello world."; でOKだからな。
p "Hello world."
230 :
デフォルトの名無しさん :2005/08/07(日) 12:13:56
>>228 むしろそういうところがややこしい
Cなら関数にかならず()をつけるのだが、こっちは省略OKなんだろ
、がくるのかスペースがくるのかが曖昧なんだよ
そういう点ではCに慣れた人にはとっつきにくい
231 :
デフォルトの名無しさん :2005/08/07(日) 12:19:47
perlの文法は慣れるまで大変だったけどなれたらすごい便利 Spidering Hacksでライブラリの使い方知ってから奥深さに気がついた
>>230 省略 OK だが、省略しなければいけないワケではない。
嫌なら自分で () 付ける癖を付ければいいだろう。
読む時はほとんど問題にならないし。
233 :
デフォルトの名無しさん :2005/08/07(日) 13:18:45
スペースやタブ(または特定の区切り文字)で区切られた文字データから、 一つ一つの要素を取り出すときに、よく使われる表現や関数などは どのような物がありますか? 文字コードをチェックしていくのは効率が悪いと思うので。
split
236 :
デフォルトの名無しさん :2005/08/07(日) 14:03:20
PerlIOって一言でいって、libcのバッファリングする入出力関数に依存しないってことなに?
237 :
デフォルトの名無しさん :2005/08/07(日) 14:26:54
238 :
デフォルトの名無しさん :2005/08/07(日) 15:46:18
>>232 まあ自分でプログラム組むときはそれでいいけど
他人のソースを解読するときに$_とかそういうのが出てくると一瞬戸惑う
ここには趣味プログラマしかいないので 他人が読むときに大変だとか考える必要はありません
sub XXX ($) { my $file = shift; my $openmode = O_WRONLY|O_CREAT; $openmode |= O_EXCL if !$cfg->{overwrite}; sysopen my $fh, $file, $openmode or die "Error: $!\n"; binmode $fh, ':raw'; flock $fh, LOCK_EX or die "Error: $!\n"; seek $fh, 0, 0 or die "Error: $!\n"; truncate $fh, 0 or die "Error: $!\n"; return $fh; } ファイル名を引数にとって、ファイハンドルを返すんだけど、このコードでなにか問題点あったら指摘してくれ。 sysopen使ったことないからよくわからん。 (サブルーチン名は適当)
読みにくい
>>240 <q cite="
http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod ">
変数のスコープや性質を表現するのに、大文字小文字を使うと便利でしょう。
</q>
if ! なんて書くなら unless にするとか、なぜ %cfg じゃなくわざわざ
ハッシュリファレンスなのよとか、こんな限定された開き方をサブ
ルーチン化する必要があるほど頻繁にやるのかとか、どうせなら
クラス書けよとか、サブルーチンの最後で値を返す時は陽に return
しない方が速いとか、嗜好の違いからくる指摘は色々できるな。
俺もハッシュはわざわざリファレンスで使う癖があるな
上書きopenしたあとにflockして何の意味があるのやら
>>244 よくそれ聞くんだが、そう言う場合って完全にflockは使えないの?
お気に入りの方法あったら教えてくだはい。。
>>244 O_TRUNCみたいなファイルをいじってしまうオプションつけてない
からそれ自体は別に問題ないと思う。
むしろ問題なのは何をやるつもりなのかが明確に示されてない
ことだ。それがないとこれでいいのかどうかはなんとも言えない。
「ファイル名を引数にとって、ファイハンドルを返す」もの
ではあるようだが。
truncateの前のseekはあきらかに無駄だと思うけどね。
PerlScriptをWindows実行ファイルにするにはどうすればいいですか?
100Mのテキストファイルを処理したいんですが ふつうにopenで読み込むとメモリが大量に食われてしまいます どのようにすれば回避できますか? ちなみに処理の内容は、改行ありのテキストを配列に読み込んで 一行ずつ特定の文字を置き換えるだけです。
>>250 ふつうにopenすりゃ良いんだけど、配列に読み込まず一行ずつ読み込んで処理汁
ファイルに書き出す必要があるならテンポラリファイルに書き込む。
で、その後リネーム
252 :
250 :2005/08/08(月) 21:50:49
出来ました ありがとうございます
253 :
デフォルトの名無しさん :2005/08/09(火) 00:07:59
$_ に文字列が入っている場合に 末尾が英小文字.xxx.yyy だったらTrue を返す正規表現って どう書けばいい? 例:'abc.xxx.yyy' True 'abc.xxx.yyy' False ([a-z]+\.)+(?!xxx\.yyy)$ と書いたけど、ねらったようにTrue にならない。 「(?!xxx.yyy)」と「$」を組み合わせると うまくいかないみたいだけど。 誰か正規表現のプロいない?
\.xxx\.yyy$ でいいんじゃないのか?
ああ、すまん。英小文字からか。 [a-z]\.xxx\.yyy$ かな。 てか2つの例の違いがわからんのだが。
>>253 ごめん、例を間違えたorz
書き直し。
$_ に文字列が入っている場合に
末尾が英小文字.xxx.yyy 以外だったらTrue を返す正規表現って
どう書けばいい?
例:'abc.xxx.yyy' False
'abc.xxx.yyy.zzz' True
([a-z]+\.)+(?!xxx\.yyy)$
と書いたけど、ねらったようにTrue にならない。
「(?!xxx.yyy)」と「$」を組み合わせると
うまくいかないみたいだけど。
誰か正規表現のプロいない?
>>256 >
>>253 ごめん、質問も訂正してあります。
末尾が英小文字.xxx.yyy だったらTrue を返す正規表現って
↓
末尾が英小文字.xxx.yyy 以外だったらTrue を返す正規表現って
「以外」の文字が増えています。
>>256 !/[a-z]\.xxx\.yyy$/
>>256 末尾の$との組み合わせでは、(?!pattern) がゼロ幅という事をお忘れなく。
see also "perlre" man page.
がんばって全部を1本の正規表現だけで記述するよりも、
unless 使ったり複数の簡単な正規表現に分けたほうが良い。
オートマトンが短くなれば処理コストも少なくて済む。
260 :
デフォルトの名無しさん :2005/08/09(火) 02:51:43
>>260 Perlってスレッド毎にシンボルテーブルをコピーして分けてるらしいよ。
んで、スレッドの機能を使うモジュール(threads::shared等)を使わない限り、
別のスレッドのシンボルテーブルにはアクセス出来ない仕様。
だからPurePerlのモジュールは全てスレッドセーフ。
ただ、オブジェクトをスレッド間で共有して使いたいのなら、呼び出す側で同期を取らないと。
>>261 書いているのは、スレッドを何本も立ち上げて、でもってそれらが
終了するのを待つってだけの単純なもの。
スレッド内では
HTTP::Liteでウェブサーバにアクセスして 、取得した
データを加工してる。
デフォルトで非共有なのは知っていて、だからこそスレッド内の変数は
全てmyで一切共有しないようにしてるんだが、実際のところはスレッド間で
HTTP::Liteの戻り値 (=取得したhtml)がかぶる。これは本来ならば
毎回違う値が帰ってくるはずなのですが。。。
263 :
デフォルトの名無しさん :2005/08/09(火) 05:34:06
Perlから2ch内のスレッドに書き込むにはどうすればいいのでしょうか?age2ch.plのソースを読もうとしましたが、さっぱりです。 実際に適当な文字列を書き込むスクリプトを書いてくれると幸いです。 また、2chのbeにログインして書き込む場合のスクリプトも書いてくれれば幸いです。
どうして被ったかが分かるんですか? 目で確かめたのなら兎も角(それも問題だが…) 取得したデータの比較の処理を見直した方がいいかもしれないですね。
割り込みか。orz
>>264 は
>>262 へのレス。
>>263 トーク2ちゃんねるってサイトがあったと思うんだけど、
確か分かりやすい説明があったと思うよ。
>トーク2ちゃんねるってサイトがあったと思うんだけど、 見つかりません。
>>264 デバッグ用にSTDERRに出力しています。
つーか、考えていてもらちがあかないので、Socket使って自力でHTTPを喋ることにする。
車輪の再発明だが仕方ない。
>>258 うん、これを「!」なしの正規表現だけで表したいのです。
>>259 perlre 読み直します。
プログラムで記述したいのですが、
それができないところで使いたいのです。
Perl の正規表現と同じ構文を使って
True かFalse を判定し、
その後の処理を変えるというシステムがあります。
そのシステムで利用する正規表現が必要なのです。
/[^x]{3}\.[^y]{3}$/ これじゃ駄目か?
アルファベットか、、、なら /[^\W\d_x]...\.[^\W\d_y]...$/
後から「.xxx.yyyじゃなくて.ne.jpの時の方法も教えてください」とか言いそうな気がする
>>269 "!"なしにしなければいけない理由はあるのか?
>>274 パターンが別にファイルか何かになってて、
正規表現読み込んで使うことになってるんじゃないのかなぁ。あくまで想像だけど。
だから1本のパターンでしか書けない。
/^([a-z]+\.)+(?!xxx\.yyy).{7}$/
だと1本で書けるけど。
末尾のマッチさせたくない文字列長分、ピリオドで埋めないといけないね。
276 :
デフォルトの名無しさん :2005/08/09(火) 11:02:18
半角英数を全角英数に変換する方法がよくわかりません。 ググってみたら以下のコードがあったのですが、まったく変化なし 何かよい方法ありませんか? require 'jcode.pl'; sub GL_ConvChara{ my ($conv_str)=@_; my $bef = "0123456789" ."abcdefghijklmnopqrstuvwxyz" ."ABCDEFGHIJKLMNOPQRSTUVWXYZ"; my $af = "0123456789" ."abcdefghijklmnopqrstuvwxyz" ."ABCDEFGHIJKLMNOPQRSTUVWXYZ"; &jcode'tr(*conv_str,$bef,$af); return $conv_str; }
単に使い方を間違えているだけのような気がする。 何も考えずに use encoding で tr/[A-Z]/[A-Z]/ するとか、 Perl4なら $tbl{A} = 'A' みたいなのを用意して $ptn=join('',keys %tbl); $ptn =~ s/(\W)/\\$1/g; $ptn=join($ptn,'([','])'); s/$ptn/$tbl{$1}/g するとか。
278 :
デフォルトの名無しさん :2005/08/09(火) 18:11:22
>>253 /(?<![a-z]\.xxx\.yyy)$/
ではダメ?
279 :
278 :2005/08/09(火) 18:12:01
下げ忘れた。。。
#!/usr/bin/perl -w print "Content-type: text/html; charset=Shift_JIS\n\n"; open(IN, "counter.txt"); $count = <IN>; close(IN); $count++; open(OUT, "> counter.txt"); print OUT $count; close(OUT); print <<EOM; Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title></title><body background="neko.gif" text="" link="" vlink="" alink="red"></head> <body>$count</body></html> EOM exit; 他にcounter.txtを属性を666に設定し同じフォルダに置いてcgiは755に設定してサーバにアップロードしましたが、Internal Server Errorになって表示したいようにできません。 どこが悪いのでしょう?
お聞きしたいのですが、 「perlで作ったプログラムがメールを自動受信をして、ファイルを作成する」 というようなことはできるのでしょうか? たとえば、メールを受信しsubjectを見てある特定の文字に反応してメールを転送するとか、 画像を添付してメールを送り、それをperlが自動で読み込みブラウザ上の画面に写真を追加する といったことがしたいと考えています。 どうでしょうか?
NET::POP
>>283 君の場合、携帯対応の無料BBSで我慢したほうがいいと思う。
とりあえずいらん改行すんな。
>>278 > /(?<![a-z]\.xxx\.yyy)$/
> ではダメ?
これでできました。
ありがとうございます。
>>273 > 後から「.xxx.yyyじゃなくて.ne.jpの時の方法も教えてください」とか言いそうな気がする
今回教えてもらった正規表現の応用だから、
わざわざ教えてくださいっていう必要はないと思うけど?
説明が悪くてすまない。
>>275 > パターンが別にファイルか何かになってて、
> 正規表現読み込んで使うことになってるんじゃないのかなぁ。あくまで想像だけど。
> だから1本のパターンでしか書けない。
ちょっと違うけど、そんな感じの制約があるのです。
>>283 > というようなことはできるのでしょうか?
できます
Windows上でHDDの空き容量を外部コマンドを呼ばずに確認するやり方を教えてくださいな。 cpanのmoduleをいくつか見てみたけど、unix系OS依存のものばかりだったんで。
Win32::DriveInfoかWin32::AdminMisc入れるのはありですかー
>>291 Thx.
Win32で探せばいいんですね。dfやらdisk spaceやらで捜してました。
>>292 Thx.です。
Win32::DriveInfoを使いたいと思います。
296 :
デフォルトの名無しさん :2005/08/10(水) 17:40:47
1.あるページにアクセスすると発行されるクッキーをPerlで受信するにはどうすればいいか。
2.クッキーをサーバに送信するにはどうすればいいか。
use
HTTP::COOKIES; まで分かった。
297 :
デフォルトの名無しさん :2005/08/10(水) 18:12:23
cpanにある参照したいモジュールのhtmlのリンクがぶつぶつきれているので 自分で作ろうかと思い、とりあえずperldocでhtml化するようなオプションなんぞ あるのかなとおもって調べてみたんですが、みあたりませんでした。 perlにはjavadocなみのドキュメントhtml化ツールってありますか?
298 :
297 :2005/08/10(水) 18:28:44
すいません、かいけつしますた
かいけつゾロリ
300 :
◆TWARamEjuA :2005/08/10(水) 20:24:23 BE:653832-###
>>296 # --- LWP::UserAgent のオブジェクト
my $UA = LWP::UserAgent->new(
agent => qq|monazilla/1.00"|,
cookie_jar => { file => "./Rock54_members.cookies" },
timeout => $Wait,
);
久喜を保存するファイルを生成して・・・
$UA->cookie_jar->save;
で、久喜を格納して・・・
# 読みに行く。
$UA->cookie_jar->load;
my $search_response = $UA->get( qq|
http://$Valid_2chfind_host/$query| );
で、久喜を食べさせるみたいな。
Rock54のとある装置から引用。
301 :
デフォルトの名無しさん :2005/08/11(木) 07:06:14
>>300 my $UA = LWP::UserAgent->new(
agent => qq|monazilla/1.00"|,
cookie_jar => { file => "./Rock54_members.cookies" },
timeout => 5,
);
$UA->cookie_jar->save;
$UA->cookie_jar->load;
my $request = $UA->get( qq|
http://www.google.co.jp/| );
実行した後のRock54_members.cookiesの中身
#LWP-Cookies-1.0
無理なようです。
>>301 GET する前に save してるんだから中身があるわけないだろう。
use strict;
use warnings;
use LWP::UserAgent;
my $user_agent = LWP::UserAgent->new(
cookie_jar => { file => 'www.google.co.jp.cookie_jar' },
);
my $request = $user_agent->get('
http://www.google.co.jp/ ');
$user_agent->cookie_jar->save();
コードが何やってるか理解しる。
304 :
デフォルトの名無しさん :2005/08/12(金) 00:47:55
1,hoge,000,Hoge 2,foo,111,FOO =,aaa,1,yy なんてデータがあった場合 hoge,HOGE,foo,FOO,aaa,,yy って単語を配列@aに格納する ワンライナーを教えてください
>304 仕様をもうちょい詳しく書かないと適当なコードしか書けんよ? aaa,,y で , が 2 つ入ってるの何?とか、Hoge が HOGE になってるの何?とか。 >perl -ne 'chomp; $i = 0; push @a, grep { $i++ % 2 } split /,/;'
306 :
デフォルトの名無しさん :2005/08/12(金) 01:06:45
すいません、カンマに意味はありません。 1行中に複数存在する英単語をファイルからすべてを 配列にとりこみたいです。
>>305 -ne だと本当に取り込んだだけになるけど…
要求仕様には沿ってるね…
308 :
デフォルトの名無しさん :2005/08/12(金) 02:52:42
LWPでファイルを送信する場合にはどうしたらいいんでしょうか? モジュール等があったら教えて頂けると嬉しいです。。
>>304 2列目、4列目を格納 push @a, (split /[,\n]/,$_)[1,3] for @data;
アルファベットなら格納 @a = grep { /^[a-z]+$/i } split /[,\n]+/, join /,/, @data;
単純に、$dataに全行ぶちこんで @a = $data =~ /(\w+)/gs; がいいんじゃないのかな
312 :
デフォルトの名無しさん :2005/08/12(金) 11:37:35
Form上で選択したファイルを添付ファイルとしてMIME::Liteを使ってメール送信する際の関数を作ったのですが空の添付ファイルが送付されてきます。どうすればちゃんと送信できるのでしょうか? 添付ファイルは主に画像ファイルを想定してますが他のファイルも対応できるようならしたいです。使用するブラウザは主にネスケ、できればIE,FireFoxなども。 ---以下HTML--- <form method="POST" action="../test.cgi" ENCTYPE="multipart/form-data"> <input name="file_path" type="file"> </form> --以下Perl-- my $cgi = CGI::new(); $test = $cgi->param('file_path');# 添付ファイル sub MailSendTemp{ my ($values) = @_; my $mailfrom = 'test@xxxxx'; #From my $mailto = 'test@xxxxx'; #To my $subject = 'test'; #Subject my $message = 'testです'; #Message my $bcc = 'test@xxxxx'; #Bcc my $filename = $values; #Temp $subject = mimeencode( jcode'jis($subject) ); $message = jcode'jis($message); my $msg = MIME::Lite->new(From => "$mailfrom",To => "$mailto",Bcc => "$bcc",Subject => "$subject",Type => 'multipart/mixed'); $msg->attach(Type => 'text/plain; charset="iso-2022-jp"',Data => "$message"); $msg->attach(Type => 'application/octet-stream',Data => "$attachment",Filename => "$filename",Disposition => 'attachment'); $msg->send(); }
もし、過去ログにあったら勘弁な。ということで 希望: 『WindowsXP 環境で ActivePerl5.8.6を使い、完全にSJIS 環境だけで まともな漢字混じりの入出力が出来るようにしたい。』 漢字コードはあくまでも SJISしか認めないという前提の下で 1)すなわち、ソースコーディングはSJISで書く。 2)ファイルの入出力ももちろん SJIS 3)成果はTkモジュール上に表示するけど、これも SJIS 4)また、デバッグ情報はCMD.exe上から起動することを 考慮して、print "表示" などもSJISでまともに表示される これらを達成するにあたり、ベストな順として A) 既存の(SJIS対応の)Jperl5 やUTF-8不完全対応時代のPerl5.6 ソースがそのまま使える。 B) ソース頭などに、特別な記述やプラグマを書いて対処する C) インストール先のPerlシステム部分を変更する。 D) ソースの入出力部分を場合に応じて変更する が、思いつくんだけど、どこまで実現可能なんだろうか。 はっきり言ってUTF-8なんぞ、対応して欲しくも無かった。。。
>>313 5.8.1以上ならuse encoding 'Shift-JIS';
>>303 こっちじゃ動くよ。環境は?
HTTP::Response の中身がどうなってるか気になる。
>>313 > はっきり言ってUTF-8なんぞ、対応して欲しくも無かった。。。
俺は CSI 派だから Unicode なんぞ大嫌いだが、メリットの方が遥かに
大きいと思う。
> 漢字コードはあくまでも SJISしか認めないという前提の下で
これがそもそもナンセンスだということに、いい加減気が付くべき。
>>315 OSの標準エンコーディング下で使い物にならない方がナンセンスだろ。
「日本語WindowsでPerlは使うべきでないのが標準」って立場で言うなら勝手だが、
いいのか? それで。
だいたいPerlの中の人にとって、マルチバイトなどどうでもいいわけで PHPでも使ってろ
318 :
デフォルトの名無しさん :2005/08/12(金) 23:11:18
Perlの中の人ってなんだよ 死んでろ
>>313 のようなことを言っているやつに限って想定しているコード系は
JISのどの規格でもないなぞのコードだからなあ。
窓は結構 Unicode で動く部分が増えてきたぞ ファイルシステムとかはもう Unicode でやってるしな そのうちメモ帳のデフォルトも UTF-8 になるんじゃないかね 好き嫌いはともかく、 Unicode 対応の必要性は増してきていると思うがね
窓の場合、UnicodeはUnicodeでもUTF-16だけどね。
馬鹿馬鹿しい質問なのは承知してますがお聞きしたいのです。 Perlにおいてサブルーチンのみを定義したファイルを.plで作成し、実質的な処理を行うファイルを.cgiで作成しています。 .plの中には現在10個程のサブルーチンが格納されています。 1個のサブルーチンの中にはおよそ100~200行程度の処理を記述してあります。(コメントを含む。) この場合、以下の条件ではどちらの方がより良い方法だと判断されるのでしょうか。 >この.plファイルをこのままにしてrequireする >一つ一つのルーチンをそれぞれ別のファイルに分散させ、状況に応じてrequireさせる どなたか回答宜しくお願い致します。
SelfLoaderを使う。
>323 それは条件ではなくて選択肢じゃね? 大抵の場合、複数選択肢がある場合には一長一短があったりすると思うんだけど。 例えば、実行時のメモリ効率、実行時間、保守性、簡単さ、etc. で、どれをどれぐらい重要視するかってのが条件になるんじゃないか?
@a=(2,3,5); @b=(1,2,3,4); map {$tmp{$_}++} (@a,@b); @intersect = grep {$h{$_}>1} keys %tmp; 積を求める部分、一行にしたくて悶々としてるんだけど、なんかない?
>>326 一体何処で積を求めているのかが・・・「積を求める」でぐぐるとよいかも?
>>326 普通、リストを持ってきて「積を求める」っつったら行列を思わせるので、
質問としてどうかと思うが。しかも %h なんてどこにもないし、
まぁいいや。2 つのリストで重複している要素を挙げろ、ということの
ようだけど、そのコードをそのまんま一行にするなら、こうかな。
@intersect = grep { ++$tmp{$_} > 1 } sort(@a, @b);
ただ、
>>326 もこのコードも、@a や @b の中で重複要素があった場合
(ex. @a= (2, 3, 5, 5)) には誤った結果が返るのは分かってるよな?
>>327 間違った。
map {$tmp{$_}++} (@a,@b);
@intersect = grep {$tmp{$_}>1} keys %tmp;
^^^^^
@aと@bの積集合を求めてるのです。
>>328 sortいらない気がするけど、使うといいことあるの?
何で一行なぞにしたいのだ? これでよいなら。 my @intersect = (join(";", sort {$a <=> $b} (@a, @b)) =~/(?:(\d+)(?:;\1)+)/g);
332 :
323 :2005/08/14(日) 19:44:37
>>324 ああ、SelfLoaderがありましたね…すっかり忘れてましたorz
>>325 条件、じゃなくて選択肢 でした。すみません。
とりあえず私の方で重要視しているのは『保守性』と『実行時間の早さ』です。
分散させて状況により読み込ませた方が効率性は判りませんが時間短縮になるのかなぁと思ってるのですが、
Perlの中の人から見ればそれほど変化は無いのかな?
>>332 > Perlの中の人から見ればそれほど変化は無いのかな?
ケースバイケース。測定すべし。
>>332 あの、、、いつの時代でしょうか。
それくらいのコード量では、余程頻繁にそのcgiが叩かれない限り、
大した違いはありません。
保守性を取るなら、ファイルは別にしない方が良いでしょう
(もちろん中身によりけりですが)。
とすると SelfLoaderになります。
CPUが80MHz以下、メモリが32MB程度の時代なら、AutoLoader読み込み時に
スクリプトが遅くなるのを体感できました。
が、今は時代が違いますし、CGIなのでそれ以外の要素も多くなります。
気になるなら 333 の言うように測定を。
335 :
328 :2005/08/14(日) 23:25:54
>>330 あ、ゴメン。消すの忘れてた。気にしないでくれ。
336 :
デフォルトの名無しさん :2005/08/16(火) 00:34:40
ソケット作ってHTTPサーバにごにょごにょ通信して最後まで読んだ後、 ソケットをcloseする必要ありますか?
>>336 close() の時にエラーが発生するケースもあるので、close() して
返り値を確かめるのがベスト。
>>337 レイヤが違うし。その RFC 読んだって何も分からないよ?
keepaliveがらみの話じゃないのか
たぶん
そもそも相手がHTTPサーバなんだったらソケットだの closeだので悩むよりLWPとか使った方がいいんじゃないかと。
LWPってでかくて無駄が多いイメージがある。 質問です。 LWPでドキュメントのボディーをリアルタイムで読み込む方法ありますか? イメージとしては、こんな感じです。 my $fh = ...; while(read($fh, ...)) { ...; } close($fh);
いや、これからの時代、POEを究めるのが良いと思う。
POEなんて1世代前のフレームワーク
テキスト処理以上のことはPerl以外の言語でやるのが良い
正規表現などでアルファベットの[a-z]みたいに、あ行をマッチさせるのに[あ-お]とやったらできません 何か方法はないでしょうか≧ω≦
use encodingが使えるなら、use encodingを使った方が楽だけどな。 m/[あ-お]/ で普通にマッチするから。
352 :
デフォルトの名無しさん :2005/08/18(木) 18:20:57
komodoで日本語入力できないのでしょうか...コピペでは入力できるみたいですが・・・ edit->current file settingはutf-8にしてますー。
>>351 ActivePerl の場合、use encoding を使ってると
デバッガ(-d)がクラッシュするんだな…orz
うちだけだろうか?
Tk::NoteBookのlabelが5.8.7でずれて表示されるようになった。 ActivePerl 5.8.7使用。
355 :
デフォルトの名無しさん :2005/08/18(木) 22:36:01
>>353 どれかのversionでこけて前スレあたりにActivestateにバグレポートを出したやつが
いたはず。
357 :
デフォルトの名無しさん :2005/08/19(金) 00:03:59
ActivePerlってソース公開してるから 自分でリメイクすればいいじゃん
>>353 \x{}でコード直接埋め込んでもだめ?
360 :
デフォルトの名無しさん :2005/08/19(金) 00:35:53
何のためにソースが公開されているんだか・・・
361 :
デフォルトの名無しさん :2005/08/19(金) 00:45:55
Vine 3.1 の標準で入っている Perl 5.6.1 を使っています。 子プロセスから親プロセスに文字列を渡したいのですができますか? できるのでしたら、方法を教えていただけるか、参考になるWebなどを 教えてください。 よろしくお願いします。
363 :
デフォルトの名無しさん :2005/08/19(金) 01:42:45
>>362 THX!
"perlipc.pod"をキーワードに調べてみます。
>>363 > man perlipc
とか
> perldoc perlipc
とかタイプしてみろ。
366 :
デフォルトの名無しさん :2005/08/20(土) 18:18:13
開発環境
Windows2K鯖SP4 IIS使用してます。
ActivePerl v5.8.7 built for MSWin32-x86-multi-thread
Excel 2002(10.6501.6626)SP3
WIN32::OLEを使用しまして、
PerlからExcelへのデータ出力をしようとしてます。
http://www.site-cooler.com/kwl/perl/ole.htm http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq12j.html 上記ページにてサンプルを動作させようとしたのですが、
「Win32::OLE(0.1701) error 0x80010105: "サーバーによって例外が返されました。"
in METHOD/PROPERTYGET "Open"」
このようにエラーが帰って来てしまい。
動作させることができません。
googleにて「excel WIN32 OLE」で検索しましたら、
Excel 97か、Excel 2000で動作ということが多く書かれておりました。
私のExcelのバージョンが原因ということでしょうか?
それともなにか別の問題が考えられるのでしょうか?
以上宜しくお願い致します。
っ[Spreadsheet::WriteExcel]
368 :
366 :2005/08/20(土) 21:57:32
>>367 なんとかめどが立ちました。
ありがとうございます。
Windowsのコンソールでprint済みの直前の1行を消す方法ってありますか?
あります。
配列同士を簡単に比較したいと思っています。 いろいろ調べていたのですが、簡単な方法が見つかりませんでした。 やっぱり、ループで回して突き合わせるしかないのでしょうか。 open(FILE,"sample1.txt"); @A = <FILE>; close(FILE); open(FILE,"sample2.txt"); @B = <FILE>; close(FILE); if( @A==@B ){ # ←この比較はできません print "内容一致"; }else{ print "内容不一致"; } :このファイル比較はあくまで用例で、 :目的はこのような配列の中身比較をしたいと思っています。
372 :
371 :2005/08/21(日) 06:16:39
if( "@A" eq "@B"){ 一致 } という方法はありましたが、速度とメモリを浪費しそうで…
>>371 ループ回すのが不満な理由に興味がわくけれども。
ループで良けりゃこんなんでどうかな?
sub cmparr (\@\@) {
my( $arref1, $arref2 ) = @_;
$_ ne shift @$arref2 and return 0 foreach @$arref1;
return 1;
}
>>372 メモリはともかく、速度はそれが一番速そうだけどな。
375 :
デフォルトの名無しさん :2005/08/21(日) 08:24:48
配列に流し込む前に、単なるバイト列として比較すればいいじゃん。
377 :
デフォルトの名無しさん :2005/08/21(日) 11:05:14
そういやファイル同士を比較するための File::Compare というモジュールがありますね。 diff コマンドのように色々オプションは付けられないようだけど。
378 :
371 :2005/08/21(日) 16:01:29
>>373-377 ありがとうございます。
>>373 なるほど、難しそうな…うぉなぜあんな所にandが!
と、コードを後ほどよく精読して参考にさせていただきます。
ループで回したくないわけでは無いのですが、も単に自分が
知らないだけのシンプルなステートメントがあったなら…
と思いまして。
>>374 そうですかぁ。文字列展開してるから遅いかなぁと思ったんですが。
小さい配列ならこれでいっかな。
>>375-376 了解です。今回は例が良くありませんでしたが、ファイル比較が
目的ではない為、また別のコーディングの際に参考にさせて頂きます。
(でもdiffは配列比較に転用できそうかな)
>>378 文字列にすると
@a = ("",1,2,3);
@b = (" 1",2,3);
とかが同じとみなされる可能性がある。
grepとかmapとか使ったりして試してみたけどあんまり速度変わらん。
素直に
>>373 がシンプルで一番よさげ。
380 :
デフォルトの名無しさん :2005/08/21(日) 19:16:08
>>373 それじゃ $arref2 の参照している配列の内容がなくなると思うが。
それでよければ良いのだが。
@arr1 = qw/a b c/; @arr2 = qw/a b c d/; で真が返る
382 :
デフォルトの名無しさん :2005/08/21(日) 20:30:48
こんなところか。 sub arraycmp (\@\@) { my ($a1, $a2) = @_; return 0 if ($#$a1 != $#$a2); my $i; $_ ne $a2[$i++] and return 0 foreach @$a1; return 1; }
つーか$| = undef しろよ
違った$/
まさか$-
何言ってんだ?こいつ
すまん。俺387。 385でも386でも無いが、 棒が傾いて行ってたので( "|" → "/")、一個加えてみたかった。
390 :
デフォルトの名無しさん :2005/08/21(日) 23:46:21
一つのオプションを複数個使いたい場合、たとえば % sample.pl -a hogehoge -a fugafuga としておいて、-a で指定した hogehoge と fugafuga を 一つの配列に入れたいです。 for 文で shift していけばなんとかできそうなのですが、 Getopt::Std では、そんなことできないですか?
>>390 そもそも、そういう syntax はよろしくないと思うんだが。
>>390 -a "foo,bar" みたいな感じでパラメータ渡して、
内部でsplitさせるとかどうなの?
いや、俺はWeb上で動くPerlしか作らないんで実際にそういう風に処理出来るのか知らないんだけどさ
>>390 Getopt/Std.pmを眺めてみると、オプションをキーにしたハッシュを作って
いるみたいなので、同じオプションがあると上書きされるようです。
それと、オプションの使い方としては
>>391 さんの言うとおりかと思います。
394 :
373 :2005/08/22(月) 01:21:06
>>380 ,381
あんがと。穴まみれだった。orz
もう話題シフトしてるけど個人的にキモチワルイんで書き直し。
sub arraycmp (\@@) {
my( $arref, @arrey ) = @_;
return 0 if @$arref != @arrey;
foreach ( 0 .. @$arref - 1 ) {
unless (defined $arref->[$_]) {
defined $arrey[$_] ? return 0 : next;
}
return 0 if $arref->[$_] ne $arrey[$_];
}
1;
}
>>388 わざわざ配列に代入しなくても、$/をundefにして$hogeに全部流し込めってことだろう。
それでeqで比較、と。
396 :
デフォルトの名無しさん :2005/08/22(月) 19:27:03
>>366 と同じような問題なんだが、
>>367 の[Spreadsheet::WriteExcel] って書くだけですよね。
こっちはテンプレートがあってそこに入れ込む形で利用したいんだけど、
同じようにOLEがうまく使えなくて困ってるんだけど・・・
>>395 いや、、、
>>386 で言いたいことは分かったが、
>>371 >:目的はこのような配列の中身比較をしたいと思っています。
って書いてあるんだからさ。
>>394 それだと2番目の配列の要素がパラメータスタックにどかっと積まれてすごくイヤじゃないか?
両方リファレンスにすべきだと思われ。
>>396 選べ。
1. Spreadsheet::ParseExcel がテンプレートに対応してることに期待する
2. Excel::Template で自前でテンプレートを作る
3. Excel を捨てる
質問です。 tkでmainloopがはしったあとに、別の動作中の処理を監視したり、通知してもらって mainloopがはしっているウィジェットにその状態を反映させるようなものを作ろうと おもっているのですが、とりあえずそれを実現する手段としてプロセス間通信もしくは スレッドしか思いつきません。 tkでその代わりになるようなものは容易されていないのでしょうか?
after; repeat じゃ駄目か?
402 :
373 :2005/08/23(火) 00:00:21
>>398 >それだと2番目の配列の要素がパラメータスタックにどかっと積まれてすごくイヤじゃないか?
>両方リファレンスにすべきだと思われ。
全面的に同意。
リストを渡せると便利かな程度の考えだったんだけども、言われてみれば確かにコピーすんのはアホっぽいね。
というわけで再々修正版。
sub arraycmp (\@@) {
my $arref = shift;
return 0 if @$arref != @_;
foreach ( 0 .. @$arref - 1 ) {
defined $_[$_] ? return 0 : next unless defined $arref->[$_];
return 0 if $arref->[$_] ne $_[$_];
}
1;
}
# ほとんど自分用のメモと化してる…。みんなごめんよ。
>>402 学ぶところがあるネタならメモでも結構だが、配列の比較なんて散々既出。
ヨソでやってよ。
>>390 です
やっぱりああいうオプションの使い方は変ですよね…。
データファイル
name,ORE,OMAE,DARE
aaa,*,*,*
bbbbb,,*,
cccc,*,,*
% ./sample.pll -t ORE -t OMAE
ORE
| OMAE
| |
aaa * *
bbbbb *
cccc *
% ./sample.pll -n aaa -n bbbbb
ORE
| OMAE
| | DARE
| | |
aaa * * *
bbbbb *
こういうのが欲しかったんです。
XYの項目の両方をターゲットに絞り込みたいとき、
どうするのがスマートなんでしょうか…。
pll になっているのはスルー
>>405 >>392 $ ./sample.pl -t 'ORE,OMAE'
$ ./sample.pl -n 'aaa,bbbb'
cut の -f なんかで使われてる、割とスタンダードな方法だ。
$ cat list
a:123:foo
b:456:bar
c:789:baz
$ cut -d: -f1,3
a:foo
b:bar
c:baz
>>392 見落としていました。ごめんなさい。
>>407 ありがとです。これならXY両方同時のフォーカスもできそうですね。
409 :
デフォルトの名無しさん :2005/08/23(火) 12:14:07
410 :
激マジ :2005/08/23(火) 12:21:24
411 :
デフォルトの名無しさん :2005/08/23(火) 12:26:51
412 :
デフォルトの名無しさん :2005/08/23(火) 12:33:59
>>411 dddの方は変わらないのか?
「aaa-bbb-ccc」と「ddd」 の分割の条件・パターン・ルールは何なんだ?
例えば、最も左側にある「.」で分割とか、それなりに一般的な説明を書いてもらえないと
使い回しの効く一般的な回答は得られませんよ。
>>411 $url =~ s{(?<=://)(\w+(?:-\w+)*)\.\w+} {
my $host = $1;
$host =~ tr/-/./;
$host;
}e;
414 :
411 :2005/08/23(火) 12:39:48
>>412 説明不足ですみません。
ddd.jpのほうは変わりません。
つまり頭のサブドメイン部分のみ変化します。
ですので、おっしゃるとおり「最も左側にある「.」で分割」
になります。
「ハイフン」の部分を「ドット」に変換して置き換えたい
と思っています。
>>413 やりたいことだけをきちんと書け。
$url =~ s/-/./g;
こういうことか?
416 :
415 :2005/08/23(火) 15:52:38
>>413 すまそ、上は
>>414 +訂正。
$url =~ s/\.ddd//g;
$url =~ s/-/./g;
417 :
415 :2005/08/23(火) 15:54:28
gいらね;ddd.jpも変わる場合は
>>413 さんの。
418 :
デフォルトの名無しさん :2005/08/23(火) 15:59:22
>>399 それはOLEが俺には使えないってこと?
それとも・・・OLE使っての処理が一般的じゃないってこと?
OLE使ってのEXCEL操作はあきらめろってことか・・・・orz
419 :
411 :2005/08/23(火) 17:43:00
>>413 ,415
まだきちんと動いていませんが、ありがとうございます。
シェル・スクリプトとかは大丈夫なんですが、
perlはさっぱりですみません。
squidのredirect_programにかませようとしてます。
>>419 単なる正規表現の範疇だぞ。
sedも使えないのはわかってるから体裁繕わなくていいよ。
422 :
399 :2005/08/23(火) 19:28:22
>>418 Perl + OLE でトラブってるのに、なんで Perl でやりたがるのか理解に苦しむ。
VB でサクっと書けるだろ。プログラミングは手段だ。手段と目的を履き違えて
ないか?
423 :
デフォルトの名無しさん :2005/08/23(火) 22:17:19
HIT000000001.3 ====================================================== HIT000000002.2 Cellular 0005222 Cellular 0005222 ====================================================== HIT000000003.2 Cellular 0005634 Cellular 0005634 Cellular 0003232 Cellular 0005634 Cellular 0005634 Cellular 0005634 Cellular 0005634 Cellular 0003232 Cellular 0005634 Cellular 0003232 Cellular 0005634 ...続く というファイルに対して、 出力 HIT000000002.2 0005222 HIT000000003.2 0005634 HIT000000003.2 0003232 ...続く のように、=================で区切られた中で、Cellular のないもの(一行目のように)は無視し、同じ数字は一つにまとめて、HIT...を見出しにして表示するには、どうしたらいいのでしょうか?
426 :
デフォルトの名無しさん :2005/08/23(火) 23:18:00
正規表現 /./s とすると . が改行にマッチしますよね /[^a]/s とした場合にも改行にマッチしますか?
427 :
デフォルトの名無しさん :2005/08/23(火) 23:24:11
>>426 自分で試せば良いのでは…。ワンライナーか何かで。
答えはyes。
だって、[^a] でしょ? /s オプションが無くてもマッチするよ。
429 :
デフォルトの名無しさん :2005/08/23(火) 23:27:26
>>429 じゃあ、Yes と No の両方の回答があったらどうするんだよ?
431 :
423 :2005/08/23(火) 23:53:01
ハッシュを使えばできそうなのですが、なかなかできません。 できればどなたか教えてください。よろしくお願いします。
>>431 一式、本買って通読しなよ。
あんた、以前も何度か似たようなことここで聞いてるだろ。
ちっとも進歩してないじゃないか。
>>431 ヒントだけ。
HITで HITの文字列を記憶。
Cellular の値をハッシュに記憶。
= が出たら、HIT-Cellularの値を表示して、ハッシュをクリア。
これを while で回すんだけど
最期に = の行が無いとハッシュに入ったままのものが残るので、、、
あとは自分で考えようネ。
全てを解決する魔法の構文を教えよう。 while(1){} だって何もせず回ってりゃ問題なんて起きない。
>>434 「プログラムとまらないんですけど…」という質問が来る問題発生。
ActivePerl で CPANモジュール取り込みって大変そう・・・ グーグルで検索した限り。 う~~ん・・
438 :
423 :2005/08/24(水) 09:54:22
>>433 ヒントをありがとうございます。でもまだうまくできません。
open(FILE,$ARGV[0]) ||die "Cannot open \"$ARGV[0]\": $!\n";
%hash;
while(<FILE>) {
chomp;
if($_=~ /^HIT/){
$hit=$_;
}
if($_=~ /Cellular (\d+)/){
$count{$hit}=$1;
}
if($_=~ /^=/){
if(defined($count{$hit})){
print "$hit $count{$hit}\n";
$count{$hit}="";
}
}
}
close FILE;
でやると、
HIT000000002.2 0005222
HIT000000003.2 0005634
となってしまいます。
答えを
HIT000000002.2 0005222
HIT000000003.2 0005634
HIT000000003.2 0003232
とするにはどのように直せばよいのでしょうか?
どなたか教えてください。
439 :
デフォルトの名無しさん :2005/08/24(水) 10:48:19
>>438 惜しいな。ハッシュが更にハッシュを参照するように代入する所は
こんな風にすれば良いんじゃないだろうか。
if ($_=~ /Cellular (\d+)/){
$count{$hit}->{$1} = 1;
}
で、こんな風に出力する。(sortしたい場合は keys の直前に sort を入れるなどする)。
for my $h (keys %count) {
for my $c (keys %{$count{$h}}) {
print "$h $c\n";
}
}
440 :
423 :2005/08/24(水) 12:38:46
>>439 できました!
本当にありがとうございます。
441 :
418 :2005/08/24(水) 16:46:10
>>422 結局はVBでサクッと書いたんだけれども、
やはりメンテナンスや変更等の際にVBを触るより<これもVBでの作成の仕方ひとつで違うが・・・
perlで変更できる方が利便性が高く良いと思って
Perl+OLEに執着してるし、Perl+OLEができないからって
VBに逃げたく無いって部分もあるんだよ。
まぁ折れはVB書けたから良いけど
書けないヤツはどうすれば良いんだ?とも思うのだけど。
>>441 そんなに執着するんならバグレポートでも送れば?
オタクの事情なんか知ったこっちゃないよ。
>>441 いちいち改造したりするのにコンパイルするのは確かに面倒だろうな。
ただ、逃げ先があるならおとなしく逃げという選択肢に甘えるのも手だよ
初めまして。 初心者ですが質問です。 perlで1京以上の数を扱うにはどうしたらいいんでしょうか? どなたか教えてください。 京を超えるとベキ数になっちゃうので。。。
>>445 …携帯からなんで調べれません…(T-T)
Math::BigInt
>>446 ネット環境を整えるか、ネットカフェなどで調べて下さい
ところで、Perlの整数演算って内部では倍精度浮動小数点型使ってたのか・・・知らなんだ use integerしておいたほうがCPUに優しかったりするのかしら
>>450 スクリプトにもよるけど、たぶん大して変らない
452 :
デフォルトの名無しさん :2005/08/24(水) 22:05:57
なんでなにかと検索するさいはグーグルっていうの? yahooじゃ駄目なのかしらん?
>>452 検索性能が段違いだから。
あと、Yahoo!は検索サイトではなくポータルサイトなので、
ページを開いた時にいろんな無関係の情報がグチャグチャ出て
重くてウザい、といった理由もある。
>>450 そうっすよ。
MS-DOSで使ってた時はコプロが使われる数少ないソフトの1つだった(w
(あとは1-2-3も使ってたっけ?)
iperl.exeとか使ってたけどね……。
>>451 そう?と思ったけど、確かに数値演算してる部分が少なければ変わんないか。
気になるならBenchmarkしよー
>>450
455 :
デフォルトの名無しさん :2005/08/24(水) 22:52:01
>>452 >検索性能が段違いだから。
ソースは?
>>452 というか、そもそもスレ違いの質問だと思うぞ
>>455 ま た ソ ー ス 厨 か
訳も分からんくせに一人前の口きくんじゃねえよ。
お前は一人寂しくソースカツ丼でも食っとけ。
>>450 そんなことするより手前のスパゲッティーソースをなんとかしろよ
と言われた
>>451 確かに今のCPUなら浮動小数点計算だろうと普通のPerlスクリプトで使う計算程度の
計算量では大差ないかもしれませんね
>>454 MS-DOS時代って・・・大ベテランの方ですな( ´д`;)
いや話がずれてました失礼
適当にベンチマークとって見ました所、私のPC(Athlon 1.0GHz)では、
use integerした場合、単純なインクリメント処理で約2.5倍のパフォーマンスという結果になりました。
> perl -MBenchmark -e "$c=0; timethis(10000000, sub{ $c++; });"
timethis 10000000: 3 wallclock secs ( 2.08 usr + -0.00 sys = 2.08 CPU) @ 4800768.12/s (n=10000000)
> perl -Minteger -MBenchmark -e "$c=0; timethis(10000000, sub{ $c++; });"
timethis 10000000: 2 wallclock secs ( 0.82 usr + 0.01 sys = 0.83 CPU) @ 12033694.34/s (n=10000000)
おまけ やっぱり多倍長整数演算は重いな・・・
> perl -MMath::BigInt=:constant -MBenchmark -e "$c=0; timethis(100000, sub{ $c++; });"
timethis 100000: 14 wallclock secs ( 9.61 usr + 0.02 sys = 9.63 CPU) @ 0.00/s (n=100000)
# 初め、integerとMath::BigInt=:constantを間違えて、逆に重くなった!?と思っていたのは秘密
Yahooは内部でGoogle呼んでるんじゃないの?だから性能はGoogle依存。
いつまでスレ違いを続けるつもりかねキミタチ
悪いな、大将。ここで止めとくよ。
466 :
デフォルトの名無しさん :2005/08/24(水) 23:36:48
好きな方使えよ
>>444 5.8系ならbigintプラグマなんてのもあったのか
469 :
デフォルトの名無しさん :2005/08/25(木) 00:49:52
AとBの2つのファイル比較して Bの行の単語がAのどこかの行にあったら その行を出力させたいんだけど。 open(FILE1,$ARGV[0]); open(FILE2,$ARGV[1]); while(FILE1){ $hoge=$__; while(FILE2){ $pattern=$_; if($hoge =~ /$pattern/){ print "$hoge \n"; } } }
open(FILE1,$ARGV[0]); @f1 = <FILE1>; close(FILE1); open(FILE2,$ARGV[1]); @f2 = <FILE2>; close(FILE2); foreach(@f1) { $i=$_; foreach(@f2) { if($_ =~ /$i/) { print "$_\n"; } } } こんなんどう?FILE1の存在行の分だけFILE2でまわすから効率悪いんだが
あ、FILE1とFILE2が逆ぽ
>>469 先にパターン一覧を読み込んでおいてそれぞれの行で回すのが一番手っ取り早いかな
こんな感じでどうだろ
my @patterns = ();
open(IN, $ARGV[1]);
while (<IN>) { chomp; push(@patterns, $_); }
close(IN);
open(IN,$ARGV[0]);
while(<IN>){ my $line=$_;
foreach my $pattern (@patterns) {
print $line if $line =~ /$pattern/;
}
}
close(IN);
473 :
472 :2005/08/25(木) 01:08:30
リロードしろ自分orz
sortしてからmergeしろ
>>469 せっかくだから、最初に1つの正規表現に加工する場合の例を書き捨て。
open(FILE1,"<$ARGV[0]");
open(FILE2,"<$ARGV[1]");
my $ptn;
while(<FILE2>) {
chomp;
$_ = quotemeta($_);
$_ = join($_,'\b','\b') if m/^\w+$/;
$ptn .= join($_,'(',')|');
}
substr($ptn,-1) = '';
close(FILE2);
eval("m/$ptn/ && print while <FILE1>");
close(FILE1);
>>457 俺は盆休みに東京から福井県にあるヨーロッパ軒までソースカツ丼食べに行った。
マジで美味かったよ。
479 :
デフォルトの名無しさん :2005/08/25(木) 19:28:11
WindowsXPマシンで、おすすめのPerlの開発環境をいくつかあげるとすると、 みなさんなら、どんな構成になるでしょうか。理由込みで。
Cygwin
編集させる内容をAタグ化しきゃいいだけじゃないの?
>>483 説明不足ですみませんでした。<a href="
http:// ">リンク</a>みたいなこともやるので、
タグにかこわれていない時だけリンクをしたいんです。
488 :
デフォルトの名無しさん :2005/08/26(金) 00:11:54
[^"\n] ってダブルクォーテション、改行(0X0A)以外のキャラクタという意味で 良いんですか?
>>487 なんだか難しくてよくわからないので自分で書いてみたけど、$1がすごく変です・・・上手くはいったから良いでしょうか??
$value =~ s/
http:\/\/ ([\w|\!\#\$\%\&\'\(\)\=\-\^\`\\\|\@\~\[\{\]\}\;\+\:\*\,\.\?\/]+)/<a href=\"
http:\/\/$1\ ">
http:\/\/$1<\/a >/g;
この拾った正規表現を以下のように変更しました
$value =~ s/([^"'=><])(http|https|ftp):\/\/([\w|\!\#\$\%\&\'\(\)\=\-\^\`\\\|\@\~\[\{\]\}\;\+\:\*\,\.\?\/]+)/\1<a href=\"\2:\/\/$3\">\2:\/\/$3<\/a>/g;
いつも不思議に思うんだが、何でみんな正規表現で過剰にエスケープするんだ?
文字クラス内ではエスケープする必要無いよって書けばいいんだよガキ
それ以上に多すぎだろ馬鹿。
そこは見てなかった悪い
まあまあ。 なんだかんだ言ってもこのスレの回答者はいい奴ばかりなんだよ。 ソースカツ丼でも食べて落ち着いてくれよ。
495 :
489 :2005/08/26(金) 02:14:26
これだと文頭にURLが来る場合駄目そうな気がしてきました どうしたらいいでしょうか
>>489 Regexp::Common 使った方が良いかと。
use Regexp::Common qw/URI/;
our $URI_RE = qr/
$RE{URI}{HTTP}
| $RE{URI}{HTTP}{'-scheme' => 'https'}
| $RE{URI}{FTP}
/x;
our $HREF_ATTR_RE = qr/
href
| action
| src
/ix;
s@(^|(?:$HREF_ATTR_RE)[^='"])($URI_RE)@$1<a href="$2">$2</a>@g;
とりあえず、こんなもんですか。
499 :
489 :2005/08/26(金) 18:35:23
>>497 さん
>>496 さん有り難う御座います。
497さんの方法で出来ました。ただそうゆうURLが出ると再編集のときにおかしくなりますね。
もうちょっと正規表現について勉強しようと思います。
500 :
デフォルトの名無しさん :2005/08/26(金) 22:00:36
Perlならではのノウハウを習得するのに参考になったお気に入りの本ってなんでしたか?
オライリー本
PerlでGUIの実行ファイルを作成される方はいますか?
503 :
デフォルトの名無しさん :2005/08/26(金) 22:07:08
"Perl"でGUIプログラムなんて書けたっけ・・・?
Perl/Tkと言う話?
>>504 Encode.pmの作者がレビューしてるなw ここも見てるのかな。
>>502 Tkとか
GUI::Loftとか
で、PARでexeにするとか?
Win32::GUIなんてのも
510 :
デフォルトの名無しさん :2005/08/26(金) 23:21:07
>504 >507 弾氏が評価してるようですね。 邦訳はいつ頃になるんだろう・・ はてなの人が翻訳した本が今度出るらしいですね。 方向としては>504と近いのでしょうか? Effective Perl 、Perl CookBookってどうですか?
>>510 両方ともオススメ。
クックブックは原著買っても良いかも。この手の本は分冊されてると
ちょっと使いにくいんじゃないかなと思うんで。安く済むし。
512 :
デフォルトの名無しさん :2005/08/27(土) 11:48:18
おはようございます。 2進法から10進法、10進法から2進法に変換するには、どの様に記述すれば良いのでしょうか? Perl云々以前の話だと思うのですが・・・
検索で一発
514 :
デフォルトの名無しさん :2005/08/27(土) 12:00:34
@kubun = ('1','0','0','0','1','0',・・・ ,'1');
具体的には上記の様な20項目程のスイッチがありまして、
それを10進法に置き換えてファイルに格納したいのです。
そのままcsv形式で格納しても良いのですが、スイッチを随時増やす予定なので。
圧縮が目的ですので8進法でも16進法でも問題ありません。
途中で送信してしまいました。
>>513 無い訳がないですよね・・・もう一度ググってきます。
>>512 Perl以前どころか、10進法、2進法以前の話。
>>514 packのb/Bかvecあたりを勉強するのがいいんじゃないかと。
517 :
デフォルトの名無しさん :2005/08/27(土) 13:54:32
進数で圧縮したいなら Math::BaseCalc 使って 64進数へ変換すれば、速度落とさずに効果出ますよ
518 :
デフォルトの名無しさん :2005/08/27(土) 14:00:55
PLESKのパワーパックのPGSQLにPERL経由でつながらないや
519 :
514 :2005/08/27(土) 14:24:54
>>516 packとunpackの使い方で、進数の変換が出来るのですね。
ヒントをありがとうございました。勉強してみます。
>>517 そのものズバリのモジュールがあったのですか。検索が全然足りませんでした。
速度が気になりますが、取り敢えずは関数で処理してみたいと思います。ありがとうございました。
520 :
デフォルトの名無しさん :2005/08/27(土) 14:25:20
bit stringにしたい、っていう話なのかな? 直接可読である必要があるのだろうか。
>>516 進数がどうこういうのが直接の目的じゃなくて1と0だけのデータ
を効率よく少ない記憶領域に詰めこみたいというのが本来の目的
みたいだから、perlならpack使うのが自然じゃないかな。
スイッチとやらが随時増えるにしても、たかだか数十項目を圧縮する意味はあるものなのか?
その数十項目の組が100万個ぐらいあったら意味あるんでねーの?
っていうか、スイッチ自体をbit stringにするだろ、ふつう。
525 :
デフォルトの名無しさん :2005/08/27(土) 16:43:49
Active Perl/Tkでプログラムを作っているのですが、 hoge.plをダブルクリックするとコマンドプロンプトが出るのですが 必要ないので出ないようにするにはどうすればいいの?
wperl
528 :
デフォルトの名無しさん :2005/08/27(土) 20:42:38
$Fileに2バイト文字が含まれると -e $File が偽を返すようです。 対処法をご存知の方、よろしくお願いします。 $FileはTkのgetSaveFile()の返却値が入っています.
529 :
時間があったらでいいわよっ、あ、でも来て欲しいな :2005/08/27(土) 20:43:17
VIPから来てあげたわよ
いまVIPが、世界が認めてない東海って名前を、
日本海に直してもらう作戦を行ってるのは、当然知ってるわよね?
VIPPERの力で、Googleが東海の単独表記を取り下げたのは有名ね。
でも、いまVIPは大きな問題を抱えてる。
ITスキル、特に鯖関係のものが、圧倒的に足りないのよ。
それでなんだけど・・・んちょっと、、、VIPに協力してほしいのよね。
べ、べつにあんただったから頼みに来たわけじゃないわよ!勘違いしないでよね!
でも、あなたの力があれば、日本海を取り戻すのが近くなるのは・・・確かだわ。
もし・・・協力してくれるんなら、このスレに書き込んでほしい。
http://ex11.2ch.net/test/read.cgi/news4vip/1125074145/ ・・・・やっぱり、あなたに協力して・・・ほしいから。
530 :
デフォルトの名無しさん :2005/08/27(土) 21:22:22
>>528 2バイト文字って、何? シフトJISのこと?
GUI をなでしこで作って、イベント時にPerlを呼び出したりして。 処理結果はファイル経由でやりとり。
糞重いな
533 :
デフォルトの名無しさん :2005/08/28(日) 00:28:36
ハッシュやXMLの形式をとるデータをJSON(JavaScriptObjectNotation)の形式に変換する楽な方法を知りたいのですが・・
>>533 ハッシュやXMLの形式を取るデータをJSONの形式に変換するモジュールを使うと楽ですよ。
535 :
デフォルトの名無しさん :2005/08/28(日) 02:35:53
皆さんperlプログラムのデバックってどうやっています.? 数百行程度の小さなプログラムなら地道にprintできるけど デカイものだとさすがにしんどい
>>535 デバッガを使うといいですよ、っていうか。
小さな単位に分割して個別に攻めましょうよ。
537 :
デフォルトの名無しさん :2005/08/28(日) 03:19:01
ごめん俺デバックはしたことないな てかなんですかそれ
538 :
デフォルトの名無しさん :2005/08/28(日) 03:27:33
deback backでない状態にすること。 なんだろう? 支援を中止すること? 推薦を取り消すこと? de-buck? ドルをドル以外に変えること?
デバッカ(w
540 :
デフォルトの名無しさん :2005/08/28(日) 04:34:58
>>540 ネタにマジレスカコワルイが…
× デバック
○ デバッグ
542 :
デフォルトの名無しさん :2005/08/28(日) 07:03:58
perlcc -o hoge.exe hoge.pl で下記が出力され、hoe.exeができません。 どうやってつくるの? Note (probably harmless): No library found for oldnames.lib Note (probably harmless): No library found for kernel32.lib Note (probably harmless): No library found for user32.lib Note (probably harmless): No library found for gdi32.lib Note (probably harmless): No library found for winspool.lib Note (probably harmless): No library found for comdlg32.lib Note (probably harmless): No library found for advapi32.lib Note (probably harmless): No library found for shell32.lib Note (probably harmless): No library found for ole32.lib Note (probably harmless): No library found for oleaut32.lib Note (probably harmless): No library found for netapi32.lib Note (probably harmless): No library found for uuid.lib Note (probably harmless): No library found for ws2_32.lib Note (probably harmless): No library found for mpr.lib Note (probably harmless): No library found for winmm.lib Note (probably harmless): No library found for version.lib Note (probably harmless): No library found for odbc32.lib Note (probably harmless): No library found for odbccp32.lib Note (probably harmless): No library found for msvcrt.lib
とても明確で分かりやすいエラーメッセージですな。
アホか
ちゃんとデバックしましょう
547 :
デフォルトの名無しさん :2005/08/28(日) 14:57:53
>>543 パソヲタから見ると明確で分かりやすいかもしれませんが
フツーの人から見ると全く不明瞭で分かりづらいです.
アホか
550 :
デフォルトの名無しさん :2005/08/28(日) 15:32:04
>>547 パソヲタが見てもさっぱりわかりません
ふつうの人が見てもさっぱりわかりません
多少プログラムをかじった人が見れば大体理解できる
プログラムで飯食ってる俺が見たら解決法まで瞬時に思いつく
551 :
デフォルトの名無しさん :2005/08/28(日) 15:36:22
いづれにしろヲタでしょw
はいはい
542必死だな
554 :
デフォルトの名無しさん :2005/08/28(日) 15:45:34
まあ オプションでライブラリを指定しろってことだ
『見つかりません』というエラーも判らない人が居るのはこのスレですか
556 :
デフォルトの名無しさん :2005/08/28(日) 16:44:58
>>554 言うは易し
自分でやってみればわかるよ
何のエラーも出ませんでした
パス通ってないだけだろ。。
前スレあたりで、use encodingとスレッドを同時に使うとPerlがこけるという 話がありましたが、やはりバグだそうです。 詳しい話を聞く時間はなかったのですが、グローバル変数が悪さしている とか。5.10.xでなおるといいねえ。とのこと。
560 :
デフォルトの名無しさん :2005/08/29(月) 00:19:30
>>558 言うはやすしって言うか
あんたライブラリがどのディレクトリにあるかわかってる?
そもそもライブラリって何かわかってる?
わかってるんなら perlcc -L /dir ***.pl でディレクトリ指定してやれば通るし
ていうかコンフィグファイルにフルパスで設定しとけばオプションなしでもいけるし
わかってないんならCとかコンパイルが必要な言語を基礎から勉強汁
561 :
560 :2005/08/29(月) 00:20:09
562 :
デフォルトの名無しさん :2005/08/29(月) 00:23:54
>>560 perlcc -L /"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib" aaa.pl
こうやってもだめだったが・・・
563 :
560 :2005/08/29(月) 00:29:35
>>562 そこのディレクトリにエラーログで出た.libは全部入ってた?
564 :
デフォルトの名無しさん :2005/08/29(月) 00:37:00
565 :
560 :2005/08/29(月) 00:43:46
>>564 俺は入れてない
スタンドアローンで動くプログラムならCで作ったほうがはるかに簡単だし
perlはインタープリタだからこそ使ってるからな
ぶっちゃけメリットが何一つない気がする
perlcc は、技術的にはすごいが、実用的にはあまり薦められたもんじゃない。
馬鹿かコイツ。
568 :
デフォルトの名無しさん :2005/08/29(月) 00:52:00
もういいや、やったことないのに あたかもやれるよみたいなやつ ばっか
569 :
560 :2005/08/29(月) 00:53:44
開発に携わってる人には大変失礼なことだと思うが perlccはソースを公開したくない時に使うと有用じゃない?
571 :
デフォルトの名無しさん :2005/08/29(月) 01:26:46
て言うかそれくらいしか有効利用できないなくない? ただそれなら別の言語で作ったほうがボリューム的にも格段違うわけだし perlって割とシェルやawkと同じ感覚で使ってるんだけどな CGIは別として
.plとして保存したPerlScriptを、タスクトレイに入れた状態で起動する方法はありませんか? PerlTrayとタスクトレイ格納ソフト以外で、あれば教えてください。
>>559 ううっ。。。俺あのときバグ報告進められてたのに忘れてました・・・。
本当に申し訳ない。
574 :
デフォルトの名無しさん :2005/08/29(月) 04:31:09
本当に忘れてただけか? バグ報告はそれ相応の知識がないと(ry
嫌な奴だな。
576 :
デフォルトの名無しさん :2005/08/29(月) 05:05:08
よく言われるw
人間と接する相応の知識がないようだな。
578 :
デフォルトの名無しさん :2005/08/29(月) 11:02:25
不愉快に思う人が一人でもいるのなら、やるべきではないでしょう。
じゃあ俺不愉快を訴える役ね。
じゃあ俺こっそり不愉快に思う役ね。
じゃあ俺不愉快にする役ね。
不愉快を表明されるのは不愉快です。やめてください。
おいおい、それじゃあ無限ループに陥るじゃないか。
ほか行ってやれよ。
これは何人での自演ですか?
どうやら全て俺のようです
お疲れ様でした
○○ ー一
まあたまにはこういう流れも面白いな。
>>562 それは普通に駄目。
perlcc -v=4 -L /"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib" aaa.pl
とでもすれば、「駄目な理由」は無理でも「駄目という事」は分るだろ?
542のメッセージの抑止「だけ」が目的なら
perl -e "use Config;print $Config{archlibexp}"
で表示されるパスのCOREフォルダにlibを入れとけ。
perlccを使う事が目的なら、Config.pm,Config_heavy.plの定義と実際の環境を一致させる事。
それが出来ない場合で、.plから.cを作りたいなら
perl -MO=C ぬるぽ.pl >ぬるぽ.c
とでもやっとけ。.cから.exeを作る方法は知らん。
データの先頭4バイトだけを取り出し16進表記にしたいです。 長さは8文字限定で足りない部分は0で埋めます。 今は下のようにしています。 もっと簡単にできるんじゃないかと思うのですが、どう書いたら良いのでしょうか? $str = substr( $str, 0, 4 ); $str =~ s/(.)/sprintf( "%02X", unpack("C", $1) )/eg; $str = substr( $str . '00000000', 0, 8 );
尻に00000000付けてるのがわけわからん。 とりあえず1二ブル単位で表現するなら print unpack("H*", substr($str, 0 ,4));
593 :
591 :2005/08/30(火) 11:03:58
すみません、説明が分かりにくかったかもしれません。 したいことは、データの先頭4バイトまでを丁度8文字の16進表記に変換することです。 入力の長さは不定です。入力が0バイトの場合も4バイトを超える場合もあります。 出力する16進表記の文字列の長さは常に8文字に揃えます。 出力が8文字に満たない(=入力が4バイトに満たない)場合は出力する文字列の末尾を0で埋めます。 具体的には以下のように変換されます。 "" -> 00000000 "a" -> 61000000 "aaaaaaaaaaXYZ" -> 61616161 宜しくお願いします。
なんだ数値は関係ないのか print qq|"$_" -> |, unpack("H*", pack("a4",$_)),"\n" for ('', 'a', 'aaaaaaaaaaXYZ');
595 :
デフォルトの名無しさん :2005/08/30(火) 12:09:21
LWP使ってウェブページを取得するとき、 特定のrefererを送信するにはどうすればいいんですか?
perl -le 'print &{sub {if (1) {return do {1;1;}}}}' perl -le 'print &{sub {for (1) {return do {1;1;}}}}' 1 perl -le 'print &{sub {if (1) {return do {1;}}}}' 1 一つ目の出力がおかしいんですが、どなたか説明できますか?
597 :
:2005/08/30(火) 13:34:03
>595 use LWP::UserAgent; $ua = new LWP::UserAgent; $response = $ua->get($url, Referer => $url2);
>>596 何所で消えてるか調べようとしてたらif(1)の1を
オブジェクトに変えたら再現しなくなっちまった・・・バグかなこれ
package CatchDestroy;
sub new {
my ($class, $data) = @_;
my $self = { DATA => $data };
print "new obj ", $self->{DATA}, "\n";
return bless $self, $class;
}
sub DESTROY { my $self = shift; print "DESTROY obj ", $self->{DATA}, "\n"; }
#----------------------------------------------------------
package main;
sub a() {
# if (new CatchDestroy(0)) {
if (1) {
return do {
new CatchDestroy(1);
new CatchDestroy(2);
};
}
}
print "=0\n"; my $t = a();
print "=1\n"; print "$t\n";
print "=2\n"; undef $t;
あらホント。可笑しいわね。
因みに Active Perl 5.8.6 での
>>598 出力結果。
=0
new obj 1
DESTROY obj 1
new obj 2
DESTROY obj 2
=1
=2
>>598 なんか、if (1) {} がオプティマイザによって、do {} になるみたい。
ちゃんとした条件入れると if文のまま。
この自動的な変換と、doの中に複数の命令がある時、というのがダメみたい…。
いまんとこ、それしか分からない。
おもろいな。perl5.004でも起きた。5.003ではparse error。 さらに perl -le 'print &{sub { if(1) { do {$foo=3}}}};' これも空表示になるが、 perl -le 'print &{sub { if(1) { do {$foo=3}}}}; print $foo' は 3 が表示される。 奥が深い…
お前が今感じている感情は奥が深い症候群だ
しずめる方法は俺が知っている。俺に任せろ。
奥が深いっつーか…ただのバグだろそれは。
またバクの話題ですね。
606 :
デフォルトの名無しさん :2005/08/31(水) 20:15:13
LWP::UserAgent使ってるんですけど、 何秒か過ぎてもページが取得できてない場合は、ページの取得を終了させるにはどうすればいいのですか?
「能力値(の絶対値)でボーナスを与える事でレベルアップ」の意味が分からん。誰か説明して。 そもそも能力値の絶対値ってなんだ?
ごめん誤爆 orz
これはまた壮大な誤爆でつね。
>>601 すまん。下のが当たり前すぎてマジで笑える。
>>601 うわ、本当だ。
なんだよ下のコードwww
615 :
デフォルトの名無しさん :2005/08/31(水) 22:50:40
>>615 perldoc で読めるということでしょ
617 :
デフォルトの名無しさん :2005/08/31(水) 23:45:27
すみません。質問の仕方が悪かったです。 $ua->timeout($n)は試しましたが、何でか知りませんがn秒を過ぎても終了されない事があって非効率的なので、 別の方法があれば教えてください。
>>617 ページによって差があるようなら、そこにブラウザなりtelnetなりでアクセスしてみては。
619 :
デフォルトの名無しさん :2005/09/01(木) 06:51:42 BE:208240676-##
データベースからIPを取り込み、それを元にSSHでログインし、/sbin/ifconfig
コマンドを実行してログアウトするというスクリプトを作り、これをCronで実
行するという処理をしようとしています。
>>620 に載せるスクリプトを、端末から実行するとうまく処理されるのにcronで動かす
と、/sbin/ifconfigを実行してくれません。
ログインまでは問題はないようですが、どこが間違っているのか判りません。
お願いします。
620 :
デフォルトの名無しさん :2005/09/01(木) 06:52:39 BE:79330728-##
>>619 のプログラム
#!/usr/bin/perl -w
use DBI;
use Expect;
$user = "foo";
$pass = "bar";
$db_name = "giko";
$table_name = "testdb";
$db = DBI->connect("DBI:mysql:$db_name:localhost", $user, $pass);
$sth = $db->prepare("select * from $table_name");
$sth->execute;
while (@a = $sth->fetchrow_array) {
for ($i = '2'; $i < '6'; $i++) {
if ($a[$i]) {
$exp[$i]=Expect->spawn("ssh -v -o ConnectTimeout=$timeout $user\@$a[$i]\n");
$exp[$i]->expect(300,
[ qr/\(yes\/no\)/ => sub { my $self = shift; $self->send("yes\n"); exp_continue; }],
[ qr/password:/i => sub { my $self = shift; $self->send("$pass\n"); exp_continue; }],
'$'
);
$exp[$i]->send("/sbin/ifconfig -a\n");
$exp[$i]->expect(300,'$');
$exp[$i]->send("exit\n");
$exp[$i]->close();
}
}
}
$sth = $db->disconnect();
>>617 > n秒を過ぎても終了されない事があって非効率的なので、
> 別の方法があれば教えてください。
LWP::Protocol::http の中で select() を使っているので、これで駄目なら
他の方法なんか無いと思うけど。
>>620 「ssh HOSTNAME /sbin/ifconfig -a」じゃ駄目なんか?
ログインのところだけ expect 使え。
623 :
デフォルトの名無しさん :2005/09/01(木) 13:52:18
自分自身を次々にバックグラウンドで実行させたいのですが、どうすればいいでしょうか。 systemだと実行が終わるまで元のプロセスは止まってしまうので駄目なようです。
624 :
デフォルトの名無しさん :2005/09/01(木) 14:02:14
625 :
デフォルトの名無しさん :2005/09/01(木) 15:57:49
>>624 ありがとう。
forkに関して質問ですが、
if($p = fork) {
wait;
}elsif(1) {
print "ここは子プロセス\n";
}
waitがないと子プロセスは正常終了しないのですか?
waitがないとゾンビ化?
>>625 その前に、なんで else じゃなくてわざわざ elsif(1) って書くの?
>>619 シェルの問題とか、cron実行時のユーザとか、
スクリプト以外に確認する所がありそうな気がします。
628 :
デフォルトの名無しさん :2005/09/01(木) 20:13:11
>>626 ごめん。
まぁ、とにかくforkで生成されたプロセスは普通に文末までくれば普通に死んでくれるよね?
629 :
デフォルトの名無しさん :2005/09/01(木) 20:43:12
>>625 waitがないと子が終了後にゾンビ化したままになる。
親をwaitでブロックさせたくなければ SIGCHLD のハンドラを書いて
受け取ったらwaitするようにするか、または定期的に waitpid を
すれば良い。
注) 全てのOSでこのようになるとは限らない。上記はUNIX系OSでの話。
もしくは if ($p = fork) { wait; } else { fork && exit; # child } 子の子は面倒みる必要ない。
631 :
デフォルトの名無しさん :2005/09/02(金) 15:12:28
時間が掛かる処理してるときPerl.exeのウインドウが邪魔なんで、 裏(バックグラウンド?)で実行させる方法ありませんか? Windows xpでactive perl5.8.7使ってます。
バイナリファイルの種類?(画像ならjpgとかpngとか)を抜き出す方法を教えていただけませんでしょうか image/pjpeg のような感じです。
system("file hoge.jpg");
>>633 そんな感じです。
cgi-libと言う物を使えばup時に取得できますが、
既にアップロードされているものを何のファイルか再取得してみるっと言った感じです。
>>634 $enctype = system("file $files");
こんな感じで使ってみましたが、0が返ってきました。
使い方間違っていますでしょうか
637 :
デフォルトの名無しさん :2005/09/02(金) 16:11:10
>>633 ,635
Win32::Console::Freeだと
一瞬、コマンドプロンプトが表示されるのが嫌なんだけど、どうにかならないかな。
>>636 $enctype=`file $file`;
基本的な関数の動作位覚えよう。systemはコマンドの戻り値(主にエラーコード)が返って、出力は標準出力へ
>>638 ありがとうございます。結果を取得する事が出来ました。
やっぱ【image/pjpeg】こんな感じで出すのは無理すかね^^;
とりあえずこの結果を正規表現でこれに近づけるようにしてみます。
wperl.exe
>>632 File::MimeInfo なんか使えないかな?
642 :
デフォルトの名無しさん :2005/09/02(金) 17:21:12
>>636 Webサーバ経由で外部からアクセス可能な所に画像があるならばそのサーバに
HTTP で接続して HEAD でヘッダだけ取得すれば Content-Type: に image/jpeg
とか入ってるよ。
644 :
デフォルトの名無しさん :2005/09/02(金) 21:13:22
>>644 MimeInfoが鯖に入っていない模様でした。
646 :
デフォルトの名無しさん :2005/09/04(日) 19:05:54
648 :
デフォルトの名無しさん :2005/09/04(日) 19:54:47
ある変数が1桁の数字の場合は頭に2つ「0」を付けて、 2桁の数字の場合は頭に1つ「0」を付けて、 3桁の数字の場合は何もつけないで出力したいのですが、 ifとか使わないで、簡潔に記述したいのですがどうすればいいですか?
>>648 $str = sprintf ("%2d", $math);
これ?
650 :
デフォルトの名無しさん :2005/09/04(日) 20:05:07
>>649 それだと頭にスペースが付くけど、
「0」が付いて欲しい。
>>648 $str = sprintf ("%02d", $math);
これ?
653 :
デフォルトの名無しさん :2005/09/04(日) 20:11:22
655 :
652 :2005/09/04(日) 20:14:11
>>654 print "orz " x 100, "\n";
なんで03dじゃないんだ?
>>656 質問あんま読んで無かっただけじゃないかと…
サーバーから転送量激しいから何とかしてくれってメールきて画像系CGIの転送量がやばいらしいから該当CGIにトラフィック制御を付けようと思ってます。 そこで次のサブルーチンを作成してみました [ $Trafic_Timeout ]秒間に [ $Trafic_min_limit ] バイト転送したら転送量エラーと表示したいとして &TraficPlus(画像サイズ); って感じで呼び出したいと思っています。 全くスマートなプログラムではありませんが、これでいけると思ってやった見て、何度か改良しましたがうまくいきません。 どなたか改良又は知恵をかしていただけませんか?宜しくお願いします。 sub TracficPlus{ $plus = $_[0]; my $size; &filelock('tr.lock'); $Trafic_min_limit = 202400; $Trafic_Timeout = 60; my $nowtime=time; open(IN,"time.trafick");$mtime = <IN>; close(IN); open(IN,"now.trafick");$total = <IN>;close(IN); $time = $nowtime - $mtime ; if($time > $Trafic_Timeout){ $total = 0; open(IN,">time.trafick");print IN $nowtime; close(IN); } $total += $plus ; open(IN,">now.trafick");print IN $total;close(IN); open(IN,"total.trafick");$ttt = <IN>;close(IN); $ttt += $plus; open(IN,">total.trafick");print IN $ttt;close(IN); &fileunlock('tr.lock'); if($total > $Trafic_min_limit){&Error($Limit);} return $size; }
forkって失敗したら何を返してくれるの?
spoon
>>660 ふざけてないで教えてくれよ!!
マニュアル見んのめんどくせえんだよ!!!
>>661 > マニュアル見んのめんどくせえんだよ!!!
英語のマニュアル読めないんだよ!と正直に言えば
教えてもらえるかもしれないのに
解決方法 つ while(1){}
fork while(1);
while (1) {~} と for (;;) {~} っておんなじだよね?
違うよ
>>667-668 おんなじだよ。
> cat test.pl
while(1){1}
for(;;){1}
> perl -MO=Deparse test.pl
while (1) {
'???';
}
while (1) {
'???';
}
test.pl syntax OK
>>669 とすれば、最初から while (1) {} と書いたほうが良いのかな
>>669 意味は同じだが、while(1) の方がより自然言語に近いからベター。
for(;;) って書く香具師、キライ。
つうかfor(;;)は顔文字に見えて仕方が無い
潤いがあっていいじゃないか。
674 :
667 :2005/09/05(月) 08:44:10
>669 ありがと。普段はwhile(1)って書くけど、web上で見つけたコードでfor(;;)を使ってるコードがあって気になってた。 つーか、 perl -MO=Deparse こういうやり方あったのか。知らなかったから勉強になった。thx.
> perl -MO=Deparse おもすれーこれ
676 :
デフォルトの名無しさん :2005/09/05(月) 14:19:19
最近のPerlのコーディング規約はJavaに近づいているのでしょうか?
677 :
デフォルトの名無しさん :2005/09/05(月) 15:43:55
>667 while(1)が正解さ。 forはね、何かをカウントする時に使う。って使い分けが読みやすくす秘訣。
Cはwhile(1)だとWarningがでるからその習慣でfor(;;)って書く人がいる
1っていう謎の定数が出現するのが嫌な俺はfor(;;)派なわけだが。
>>678 それは、よっぽどのヘタレコンパイラ。
今時のちゃんとしたコンパイラなら、Warningなど出ない。
#define forever while(1) って書く香具師がいるけど、どう思う? (#define forever for(;;) でも同じ) ちなみに俺は書かない。
>>681 俺も書かない。単なるアホだと思う。
でもそれ、Perlがやってることに非常に似てる。
「ここで "is" って書く代わりに、"are" って書けたら自然で良くね?」
「いいねぇ、追加しちゃえ。」
「ジャーン!Perlは更に自由度を手に入れました!どっちも同じ意味ですが。」
Perlについての質問箱です。 Perlについての質問箱です。 Perlについての質問箱です。
スコープの大カッコをどう書くか、くらいどっちでもいい話だ
>>682 しかし、Perlほど英文ぽさを意識しておきながら
そこで「複数のブツ」にもisしか使えないとなると、
それはそれで思想的な一貫性に欠ける気もするし、難しいところだなー。
@ARE
for派とwhile派の宗教戦争がうざいので、 プリプロセッサのマクロで気分で変更してます><
>>687 宗教戦争に負けないような、強い自己を持ちましょう。
690 :
デフォルトの名無しさん :2005/09/05(月) 22:24:41
前から思ってたんだけど、 print($a,$b,$c); と print $a,$b,$c; って何が違うの?
691 :
デフォルトの名無しさん :2005/09/05(月) 22:35:14
open TEST,'+<test.c' or die("error"); test.cは読み書き可能な状態なのにundefineが返してくるのは何で?
692 :
デフォルトの名無しさん :2005/09/05(月) 22:38:30
691だけど自己解決しました
そこでgotoの出番ですよ。
open関数によって作成されたファイルのパーティションってどうなってるの?
>>695 ミス
open関数によって作成されたファイルの権限ってどうなってるの?
でふぉるとだと644とかその辺じゃないの?
DBIを使わずにPg.pmを使う利点とかありますか? PostgreSQLを使用するスクリプトでPg.pmが使われているのを DBIを使うように書き換えていきたいんですが。
>>698 そのスクリプトがDBD::Pg を直接叩いてるなら、狙ったのは速度でしょうね。
スクリプト --> DBI(Perl) --> DBD::Pg(Perl, XS) --> Postgres
スクリプト --> DBD::Pg(Perl, XS) --> Postgres
DBIで書き換えるのは賛成です。
メソッド名がDBIと揃ってるんじゃないかと思うので、そんなに労力要らないハズです。
お前らかわいい
>>700 おい。DBD::PgじゃなくてPgだろ。
703 :
デフォルトの名無しさん :2005/09/06(火) 02:50:39
perlのソース読めば分かります.
704 :
619-620 :2005/09/06(火) 03:29:42 BE:277654278-##
解決後にその方法を書くのは、お礼を言うこと以上に素晴らしい。
706 :
デフォルトの名無しさん :2005/09/06(火) 19:44:21
binmode ってやって意味あるの? やらないのと何が違うのか具体的に教えて。
707 :
デフォルトの名無しさん :2005/09/06(火) 19:46:55
>>706 Windows(ActivePerl)だと問題が発生する
Cygwin/UNIXじゃ大丈夫だけどな
Windowsはテキストファイルとバイナリファイルを区別してるから
バイナリファイルを読み込むときはbinmodeしないとファイルを正しく読み込めない
とラクダ本に書いてあります
ラクダ本ぐらい買えよ
ご質問というかご相談を。 1行でデータが羅列されているテキストファイルに改行をいれたいのです。 例えば X Y Z X Y Z X Y Z というファイルを X Y Z X Y Z X Y Z にしたいのです。、一応動くのですが、なんとなく遠回りしてる気がして・・・・ データ数も多いので、処理速度を改善できないかとご相談を。 もしよろしければ、間違った文法のご指摘等もよろしくお願いします。 open(FILE, "$file") or die "ERROR:そのようなファイルはありません。\n"; while(<FILE>){ @gyo = $_; } $all = @gyo[0]; $outfile = "out.txt"; open(OUTPUT, ">>$outfile"); $count = 1; while($count < 33697){ $tests = substr($all,0,85); $testss = $tests . "\n"; $all =~ s/$tests//g; push @alls ,$testss; $count = $count + 1; } foreach(@alls){ print OUTPUT "$_"; } close(OUTPUT); close(FILE);
33697とか85の意味がわからんが @gyoにファイルのデータをためこむとメモリ使用量が増大して実行速度は遅くなるだろうね 普通はbufferとか変数つくって1024byteごと読むとかがセオリーだけど その処理なら 一行よんで一行(分割した行)を書き込むという処理がベストかと
>>706 標準で有効になっているエンコード変換(の一種)を抑止する指示。
この変換は、OS標準のテキスト形式をPerlが想定するテキストストリーム形式に変換する。
OSの標準形式がPerlが想定するテキストストリーム形式と等しい場合は、何も起きない。
極端な例.
perl -e "use encoding 'euc-jp';while(<STDIN>) {print}" <in.euc >out.euc
perl -e "use encoding 'euc-jp';binmode(STDOUT);while(<STDIN>) {print}" <in.euc >out.utf8
perl -e "use encoding 'cp932';while(<STDIN>) {print}" <in.sjis >out.sjis
perl -e "use encoding 'cp932';binmode(STDOUT);while(<STDIN>) {print}" <in.sjis >out.utf8
これは、テキストモードだと文字コード自体の変換を伴う例。
binmode時は、文字コードの変換も止まっている事がわかると思う。
警告が邪魔なら、printの前にuse bytes; 入れれ。
711 :
708 :2005/09/06(火) 21:11:53
>>709 あ、元のファイルは1行しかないんです。
85文字目までが1行の単位でそれが33697回繰り返してある1行のファイルなんです。
最初のファイルから1行読むってのは85文字目まで読むってことですか?
そうすると次は85~170まで次は~って感じですか?
そういう感じ Whileじゃなくてreadで85byteづつ読んだほうがいい
> 708 while(<FILE>){ chomp; print OUTPUT $line,"\n" while ( $line = substr( $_, 0, 85 , q[] ) ) }
>>708 約 3MB のファイルか。
メモリ利用の効率を無視できるなら、それくらいの容量なら、
今のままの一気に読み込む富豪的アルゴリズムでもいいと思うけどね。
(目的と、ファイルサイズがどれくらいになりうるかで
決めるといいかも。)
フィールド長(85バイト)が決まっているなら、
read で書いても簡単に書けると思うし、
不定でもバッファを用意すればいいね。
>>708 のコードは次のように簡潔に書けるから、参考になりそうならどうぞ。
メモリ効率等は改善してないが、可変フィールド長には対応。
open(IN, $file);
my @data = split(/\s+/, <IN>);
close(IN);
open(OUT, ">>$outfile");
for (my $i=0; $i<@data; $i+=3) {
print OUT "$data[$i] $data[$i+1] $data[$i+2]\n";
}
close(OUT);
714 のコードを 671 みたいな for(;;) 嫌いが書くと while ( @data ){ printf ("%s %s %s\n" , ( shift @data, shift @data, shift @data)) } になるのかな? for(;;) というよりも添字がごちゃごちゃしてて嫌い。
>>712 ,713,714
レスありがとうございます。
大体3MB弱のファイルなのですが、これが400ファイルほどあって。。。
出来るだけ処理速度を上げたいと思いまして。。。
改善の余地としては
@gyoのところで全部読まず1行づつreadで読み書きするようにするとメモリ使用量が少なくてすむ!
という感じですね。
readというものを知らなかったのでこれを使って少し改善してみたいと思います。
>>713 さんのだと1行で出来ちゃうのですか?
私にはどんな処理を行っているかすぐに出てきませんOTZ
勉強していろいろ試してみたいと思います。
私の最初の記述でも
>>714 さんの位短く書けてしまうのですね。
参考にさせていただきますφ
>716 こういう場合、ディスクのIOの方がネックになるのでreadでチマチマ読むより一気にメモリに読み込んで処理した方が速いんじゃなかろうか? この程度だったらたいした差にはならないだろうけど。
sysreadじゃなくてreadならバッファ入るからそれほど 気にしなくていいんじゃないかと。
超富豪的解法。 perl -e 'local $/ = \85; print map "$_\n", <>' file1 file2 file3 ... > splited.log
>>716 単純に処理速度を上げたいだけなら、717も書いているが
ファイルを一気に読み込むコードのままでもOK。
さらに処理速度を上げたいなら、
例えば ファイルを 100 個ずつ個別に処理し、
最後に結合するなども。
(要するに並列処理を。)
>>719 ワロタ
これで入力ファイルを1つずつにして、シェルスクリプトでファイルを1つずつ渡してやれば
十分現実的だね。
for i in file*.log; do perl -e ~ $i >> splited.log; done
>719 ソレイイ!! いや、マジで。 $/ に\数字使うって知らなかったよ。 map でなく、普通に while 使って perl -ne 'BEGIN{$/ = \85}; print $_,"\n"' file1 file2 file3 ... > splited.log で超富豪からちょっと慎ましく。
722 :
712 :2005/09/06(火) 23:03:38
「while 使って」っていってるくせに while 使ってないし。 -n オプション付けてるんでwhileループは省略してます
723 :
722 :2005/09/06(火) 23:17:41
721=722=723 712 と 721 間違えた。 ついでに 3M*400 = 1.2G となるとやっぱりネックはディスクへのアクセス。 out.txt を読み込みファイルと別のディスクにすると速くなるはず。 それと、100個ずつ並列処理なんかさせるとディスクのアクセスが不連続になって逆に遅くなるのでは?
724 :
デフォルトの名無しさん :2005/09/06(火) 23:23:53
質問です 「すれ立てるまでもない質問はここで 第69刷」スレの921,925で質問していた者ですが こちらのスレが適しているということで来ました。 元々他スレの話題で大変恐縮なのですが、 $str = "0xa4a2"; print &hoge($str); で画面に"あ"と表示させたい場合に、関数&hoge はunpack を使って実現できるとお聞きしたのですが どのようにすればうまくいくのでしょうか 元々は 1.文字列「0xa4a2」(EUCの「あ」) ↓??? 2.文字列「0x82a0」(SJISの「あ」) ↓pack 3.文字列「あ」 ※自分のところには、コード(EUC)の形でしか渡してもらえない という流れで考えていました。1から3に直接飛べるならそれに越したことはないのですが・・・
>>723 読み込みの方に時間がかかるなら、たしかにファイルへのアクセスが不連続
になって遅くなるかも。
もちろん並列の場合のアルゴリズムは
>>714 に書いたように一気に読み込むものだけど。
どちらにせよ、速度の差は多分、出ても数倍のオーダーだろうね。
素直に直列(?)処理でよさそうだ。
出力ファイルのドライブを分けるのは、効果ありそうだね。
>>724 元の質問はコレね?
http://pc8.2ch.net/test/read.cgi/tech/1123220967/921 とりあえずロジックを考える時は、やらなきゃいけない事を分けよう。
1. 16進数文字列 → 通常の文字列
2. EUC-JP → Shift_JIS 変換
use Encode qw/from_to/;
# '0xa4a2' → EUC-JP の「あ」
my $str = '0xa4a2';
$str =~ s/^0x//i;
my $euc_a = pack('H*', $str);
# EUC-JP の「あ」 → Shift_JIS の「あ」
from_to(my $sjis_a = $euc_a, 'EUC-JP', 'Shift_JIS');
print $sjis_a;
これでいいかね。
0xを使う手もあるね $str = pack("n",eval $str);
728 :
724 :2005/09/07(水) 00:06:12
>>726 できました。ありがとうございます!
需要はないと思いますが、私のミスを整理してみました_| ̄|○
1.pack関数にSJIS「あ」の文字コードを入れてみると、うまく変換された。
2.pack関数にEUC「あ」の文字コードを入れてみると、うまく変換されなかった(実際はコマンドプロンプト上で文字化けしてるだけ)
3.1と2の出来事から、pack関数はSJISしか受け付けてくれないものと勘違い
※pack関数の引数に"SJIS"とか"EUC"が必要なかったため、勘違いしてしまいました。実際は文字コード自動判別してくれるんですね。
4.そして泥沼へ・・・
ご迷惑をお掛けして申し訳ありませんでした。
splited ってなぁに?
>>728 乙。
結果報告は重要だと思うので、しっかりお礼&報告する
姿勢はよいと思うぞ。
だれにも食えもしないお礼なぞいらん。 結果報告だけでいい。
732 :
デフォルトの名無しさん :2005/09/07(水) 01:46:53
>>707 ありがと
ところで、binmodeからテキストモードに戻す場合はどうすればいいの?
>>732 binmode(IN, ":crlf")
734 :
デフォルトの名無しさん :2005/09/07(水) 05:37:25
>>715 printf( "%s %s %s\n", splice @data, 0, 3 ) while @data;
じゃね?
735 :
デフォルトの名無しさん :2005/09/07(水) 09:47:41
$hogeというファイルが存在しないのを確認して、 もし存在しなければ$hogeというファイルを作成→終了。 もし存在したなら$hogeに1を足してまた存在を確認、、、、 とえんえん繰り返していくようにするはどうすればいいですか。
$hogeにどんな文字列が入ってるのかわからんから 「1を足す」の実際の動作やら何やらは特定できんが、 考え方としては while (1) { if (-e $hoge) { ++$hoge; } else { open F, $hoge and last; } }
こんなのもありかな? while (1) { next if -e $hoge++; open F, $hoge and last; }
おお、ありがとうございます。 さっそくやってみます。
そのプログラムを走らす人が常に一人しかいないのならば それでも動くけれども、複数同時に走らす場合は、 A: -eでしらべる。なさげ B: -eでしらべる。なさげ A: ファイル作成 B: ファイル作成 てなことになりかねないので危険です。 私が書くならsysopenでO_EXCL指定してEEXISTエラーのときだけ $hoge++してリトライでこんな感じ。 use Fcntl; my $hoge = 0; while (!sysopen F, $hoge, O_WRONLY|O_CREAT|O_EXCL) { $!{EEXIST} or die "sysopen $hoge: $!"; $hoge++; } でも一時ファイルですぐ消すんならFile::Tempとか使った方がいい だろうし、どんどん作られていくなら別にカウンタもった方が効率的 じゃないかと。
無限ループで本当にいいのかw
質問者がそういってんだからいいんでね―の
余計な気を回したり細部を掘り下げたりせずに とっとと訊かれたことだけ答えたほうがこの場合よさげ。
キモの部分が分かりやすければいいでしょう。
binbinmode(ORE, "チ○ポ");
>>744 die "Can't change mode.";
>>744 sourou() if $mi-kosuri-han;
print 〇ANKO $aieki;
748 :
デフォルトの名無しさん :2005/09/07(水) 17:36:12
print ++$_ foreach @omaira = qw(D Q N);
print 119.97.114.111.116.97.40.87;
>>749 length q caller getc and print chr ord qw q do q and print chr ord q local and print chr ord qw q uc q and print chr ord q tie gt
select('ティッシュ');
do __FILE__; オススメ。
755 :
デフォルトの名無しさん :2005/09/08(木) 10:57:36
質問です。 各ハッシュがテーブルの行になる%hashがあります。 キーが列名で、値がセルの内容です。 %hash=('a'=>1, 'b'=>2, 'c'=>3); push(@array, \%hash) %hash=('a'=>4, 'b'=>5, 'c'=>6); push(@array, \%hash) %hash=('a'=>7, 'b'=>8, 'c'=>9); push(@array, \%hash) %hash=('a'=>10, 'b'=>11, 'c'=>12); push(@array, \%hash) %hash=('a'=>13, 'b'=>14, 'c'=>15); push(@array, \%hash) %hash=('a'=>16, 'b'=>17, 'c'=>18); push(@array, \%hash); があって、@arrayの中身を $hash{'c'}の値で各%hashをソートさせたいときはどうしたらいいでしょうか?? つまりテーブルの列の値で、行をソートさせたいのです。
@array = sort { $a->{'c'} <=> $b->{'c'} } @array; でもその例のままだとpushされてるのは全部同じハッシュへのリファレンスだから、 すべての@arrayの行が%hashの最新の状態、つまり ('a' => 16, 'b' => 17, 'c' => 18)になっちゃうよ。
757 :
デフォルトの名無しさん :2005/09/08(木) 13:57:30
perlのpackってCで表現できる?
Cは型に厳格で常時packを使ってるようなもの。でいいのかな。
あるプログラムを cron で起動しています。 このプログラムのログ(成功とか失敗などなど)を syslog のように出力したいのですが、 一般的に log をとる場合はどのようにしているのでしょうか
>>760 プログラムから STDERR に出力して、cron にログを取らせるのが一般的。
syslog のようにどころか、大抵の cron は syslog に丸投げ。
今時の UNIX 環境では、標準的な状態ではそうなっていると思う。
それは嫌だ、というのであれば、CPAN Search に行って syslog や log などの
単語で検索して、一度死ねばいいのに。
> 単語で検索して、一度死ねばいいのに。 ごめん、これは誤爆(;´Д`)ちょっとメッセしてたもんで…
>検索して、一度死ねばいいのに どんな誤爆だ(w
誤爆だとしても性格悪そう
頭が性格に移ったんだろうな。
766 :
708 :2005/09/08(木) 22:23:53
>>708 で質問したものです。
皆さんに言われ、readを使って自分なりに考えてみたのですが。
なんと、、readを使うと以前より大幅に処理スピードアップしました!!!
ここまで違うとは思いませんでした。ちなみにあの記述だと1つのファイル5分位かかっていたのですが
readを使った方法では1秒強になりました。何が原因だったんでしょう?やはりメモリに一気に
読ませてたことなのかな?
自分はこんな感じでreadを使いました。
open(FILE,"<$file") or die "ERROR:そのようなファイルはありません。\n";
while(read(FILE, $gyo, 85)){
push @alls, $gyo;
}
foreach(@alls){
print OUTPUT "$_\n";
}
close(OUTPUT);
close(FILE);
>>766 解決乙。これでも良いのでは。
open(FILE,"<$file") or die "ERROR:そのようなファイルはありません。\n";
while(read(FILE, $gyo, 85)){
print OUTPUT $gyo, "\n";
}
close(OUTPUT);
close(FILE);
768 :
708 :2005/09/08(木) 23:36:43
>>767 あれ?
>>767 さんの見て今思ったんですが、自分の結局@allsに全部溜め込んでますね・・・・
何でそんなに差が出たんでしょう(汗
>>767 さんのだと一行づつ読み書きする理想的な記述ですね!
そこで
>>719 の技ですよ。
open(FILE,"<$file") or die "ERROR:そのようなファイルはありません。\n";
local $/ = \85;
print OUTPUT "$_\n" while (<FILE>);
close(OUTPUT);
close(FILE);
>>708 に関しては、文字列連結や正規表現が繰り返されてた
というのも速度に関係あるかもね。
>> 708 いや、いくらなんでもその程度の処理に5分はかかりすぎだろ! 5分*400ファイル=2000分=約33時間..... その上、$all=s/tests//g なんてやってるから同じデータがあると全部消されたり、 84,85文字目が「.*」だったらそこで終了するし.... ま、いずれにしろ、結果的に速くなったならいいか。 出来れば、どの処理で遅くなっていたのか報告が有れば嬉しいのだが...
>>769 数値のリファレンスを $/ にセットして行入力演算子で
読むのは、素直に read を使うのより大分遅い。
- local $/ = \85;
- print OUTPUT "$_\n" while (<FILE>);
+ local $\ = "\n";
+ print OUTPUT while read FILE, $_, 85;
772 :
デフォルトの名無しさん :2005/09/09(金) 04:09:45
Socketとかそういうのに関して詳しく解説してるサイトない?
>>764-765 当たってるだけに笑えない(´Д`)
>>766 エラーメッセージは $! を使った方が良い。
open(FILE, "< $file") or die("ERROR: $file: $!");
>>772 まとまった解説は読んだ記憶がない。
基本的に、使い方は C 言語でのソケットプログラミングと同じなので、
それに関するドキュメントと、perldoc を読むと良いかと。
Net::* はSocket.pm 使ってたりするので、読むと参考になるかも。
あと、凝った事をする必要がないのであれば、IO::Socket とか、
楽な方向に逃げるのも一つの手。
>>772 >Socketとかそういうのに関して詳しく解説してるサイトない?
あなたのマシンがそうです。
>>766 >何が原因だったんでしょう?
$all=~s/$tests//g
1回の置換速度は $allの長さ($allに含まれる要素数 N )に「ほぼ」比例するので、
全ての要素を処理したときの s/// の演算量は O(N^2)
s///がネックになって、コード全体の演算量も O(N^2)
対して、
>>766 や他の人のコードの演算量は O(N)
要素数3万だと3万倍差なので、5分(300秒)と1秒の違いも不自然じゃない。
試しに、
>>708 の $all=~s/$tests//g を $all =~ s/$tests// や substr($all,0,85)=''
に変更しただけのコードで速度を確認してみるといい。
776 :
708 :2005/09/09(金) 20:54:01
調査結果の報告を致します。 その前に、お詫びと訂正を・・・・_| ̄|○ 最初の記述で5分は嘘でした。。。。 今日アバウトに計ってみると2分半位でした。 で、いろいろ試してわかったのですが、やはり $all=~s/$tests//g の部分が遅い原因でした。 これ以外の処理では、細かくは計っていませんが遅くても2秒より 遅くなることはありませんでした。 この1行の処理で2分30秒のほぼ全てを使っているとは・・・・・ ちなみに g を抜いた $all =~ s/$tests// の記述では処理時間4秒となり、やはり全てマッチを調べると 時間が掛かるみたいですね(汗
777get
778 :
デフォルトの名無しさん :2005/09/10(土) 10:47:25
ライブドアブログの ブログを再構築(インデックス)をPerlで自動的にやりたいのですが、 どうすればいいでしょうか? LWP使ってPOSTしてみましたが、その後返されるページのjavaスクリプトによって、 処理されてるみたいです。
再構築はページにアクセスすることによって行われている。 だから、次のどのページにアクセスするか、ソースから正規表現でURLを抜き出して順次アクセスすれば良いと思う。 最初からアクセスするページをうち決める方法もあるが、月ごとのページなどを余分に生成することになるので、これはライブの鯖に優しくない。 自分で日時取得してURLを生成するのもアリ。
Livedoorのことなので、アク禁されるかも…w
781 :
名無しさん@そうだ選挙に行こう :2005/09/10(土) 18:39:35
あるフォーマットを別のフォーマットに変換する その際 A1 -> A2, "このパターンに対応した文字列" B1 -> B2, "このパターンに対応した文字列" : みたいな感じに変換します。この時、今は、 データ構造として上の→の左側と右側で それぞれ個別の変数に入れて、if 分で 対応させる関数作ってやってるんですが、 もうちょっと見通し良くするためには どういうデータ構造にすべきでしょうか。
ハッシュ構造にする場合、{ A => B } みたいにすると思いますが、
>>781 みたいに、A => B, C みたいに1対多の対応付けはどう
やるんでしょう
>>783 %hash = (A => [1, 2]);
print $hash{A}[0];
みたいに匿名の配列参照するとか
なるほど ありがとうございます。 ハッシュで書き直してやってみます。
786 :
名無しさん@そうだ選挙に行こう :2005/09/10(土) 21:34:43
mechanizeをCGIサーバに置くことはできますか。
>>786 > mechanizeをCGIサーバに置くことはできますか。
ぼくの自宅のCGIサーバには普通に置けます。
グローバル変数はダメといわれたので、use strictを使ってみました。 まだメリットがよくわからず、正直、面倒くさいんですが…… すると、$PI=3.1415926535,$E=2.71.... をほぼ全てのサブルーチンに書くことになってしまいました。 グローバル変数のままだとファイルの先頭の方に一回だけ $PI と書けば良かったのです。 今は sub でサブルーチンを定義するたびに$PI を定義する必要があります。 皆さんuse strictしたときに定数を使用するときにはどうされているのでしょう? 自分の考えとして (1)全サブルーチンで定義する (2)$PI と書いていたところをすべて $main::PI に置換 (3)sub PI{ return 3.1415926535 } として $PI を PI に置換 などがあると考えたのですが、他に何かいい方法は無いでしょうか? プログラム全体で適用される定数用のマクロ定義みたいなのは無いのでしょうか。
>>788 漏れはPIとか設定とかそう言うのであればuse strictした上でグローバル変数にするが…
グローバル変数が駄目ってのはグローバルにするべきでないローカルスコープであるべき変数の話じゃないかい?
790 :
788 :2005/09/11(日) 01:00:28
(4) use constant PI => 3.141592
(5) our $PI = 3.141592 ;
というのもあります。
ただ、(3)(4) は「$」で始まらないので、何か奇妙な感じがします。
>>789 さんが言われているのは(5)ということでしょうか?
グローバル変数はダメだといわれたので、まだ理由もよくわかんないままやってるのです。
やはり場合によってはグローバル変数使った方が良いときもありますよね?
>>788 あースマソ論点がずれてたかな
use strict;しても同じパッケージ内なら普通にいけると思うんだけど・・・
何か勘違いしてる?
use strict;
my $PI = 3.1415926535;
hoge();
sub hoge {
print $PI;
}
>>788 use constant使えよ... まあ中身は(3)なんだがね。
793 :
788 :2005/09/11(日) 01:18:19
あ、なんか勘違いしてたみたいです。 同一ファイルの中であればいちいち定義しなくても良いのですね。 ただ、別ファイルにして require 'my_functions.pl'; して、そのなかで$PI を使うととエラーがでてしまいます。 これも my_functions.pl の先頭に1回書いておくと良いようです。
package PI; $value = 3.1415926535; 1; こんな物を書いた奴をhoge.plとでもしてrequireすれば$PI::value で読めなかったっけ? packageいまいち分かってないからよーシラネ
>>793 BEGINブロックの中に入れてやれ
use strictはBEGIN節の中でチェックが走るからrepuireの実行時読み込みでは遅い
$res795 =~ s/BEGIN節の中で/実行前に/; 間違えたorz あと、use strictするようなPerl5環境で共通関数をrequireで取り込むのはあまり感心しないな。 出来ればモジュール化するべきだと思うよ
797 :
788 :2005/09/11(日) 02:06:50
「皆が言っているので、my、use strict、およびuse warnings を使用している」という レベル5弱 のヘタレPerl 使いなのでモジュールの作り方がよくわからないんです。 require と use って、そんなに違うものなんでしょうか? strict するような環境で require しないほうがいい理由もまだわからないのですが。
そう思うならマニュアル読めよあほ
799 :
788 :2005/09/11(日) 02:19:01
use の場合、 require の後にimportすることまでわかりました。 これから perldoc perlmod 見て勉強します。
800 :
795 :2005/09/11(日) 04:52:54
スマソ…決定的な読み間違いをしていたことにいまさら気づいた… 吊ってきます('A`)
801 :
788 :2005/09/11(日) 05:54:48
>>795 さんの
「BEGINブロックの中に入れてやれ」
の意味がようやくわかりました。
main.pl
1: use strict;
2: my $PI=3.14;
3: require 'func.pl';
4: sub main_hoge{print "main:",$PI};
5: main_hoge();
6: req_hoge();
func.pl
1: sub req_hoge{ print " req:", $PI }
2: 1;
だと
main:3.15 req:
となります。
main.pl の2行目を
BEGIN{ my $PI=3.14 };
にしたら $PI の有効範囲は BEGIN ブロックの中になるため
Global symbol "$PI" requires explicit package name at main.pl line 4.
となります。
BEGIN{ $main::PI=3.14 };
としても Global symbol "$PI" requires explicit package name at main.pl line 4.
802 :
788 :2005/09/11(日) 05:55:32
結局、 BEGIN{ $main::PI=3.14 }; my $PI=3.14; と、2回書いてやれば main:3.14 req:3.14 となりました BEGIN ブロックの中で $main::PI を定義していても、 my $PI=3.14; を書かなければエラーになるのが少し不思議な気がします。
803 :
788 :2005/09/11(日) 05:57:19
804 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 06:59:50
ファイルに対する書き込みでバッファリングしないようにするにはどうすればいいの?
>>802 BEGIN{ $main::PI=3.14 };
はBEGINブロックが実行されるタイミングで
$main::PIに3.14を代入するだけで、以後に
出現する裸の$PIが$main::PIのことであると
いうような意味はどこにもないよ。スコープ
とかmyとかourとかパッケージとか勉強し直す
ことをお勧めする。
複数のファイルから同じ定数を使いたければ
[MyConstant.pm]
use strict;
package MyConstant;
use Exporter qw(import);
@EXPORT = qw(PI);
use constant PI => 3.14;
1;
と用意しといて各ファイルからは
[main.pl]
use strict;
use MyConstant;
print PI;
とかいう風にuseして使うのが普通。
806 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 07:43:45
807 :
788 :2005/09/11(日) 08:28:48
>>805 様
ありがとうございます。
main ブロックで使用されている裸の $PI が $main::PI だと
思っていたんですけど、どうやら違うみたいですね。
試しに
BEGIN{ $main::PI=3.14 };
my $PI=3.15;
とやると
main:3.15 req:3.14
となったので、何か範囲が違うということはわかりました。
どこまで範囲が及ぶのか、と、その理由 がわからないので、
これから勉強してわかるようになるつもりです。
(今までグローバル変数しか使ってなかったのであまり気にしたことがなかったんです)
カレントディレクトリにMyConstant.pm を保存し、早速使用してみました。
"import" is not exported by the Exporter module at MyConstant.pm line 3
と出るんですけど、自分の環境がおかしいんでしょうか?
perl, v5.6.1( ActivePerl build 638 )なんですけど。
素直にourでグローバル変数にしちまえばもう良いんじゃ・・・
809 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 14:13:02
>> 807 単にourにすればいいと思うんだがなぁ…。 この結果見て考えなされ。 ------------- use strict; $main::PI= 3.14; $main::PI2= 3.14; my $PI; our $PI2; print "PI : $PI"; # PI : print "PI2 : $PI2"; # PI2 : 3.14
811 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 14:27:04
$hoge1="{"; とか、完結してない正規表現を入れて $hoge=~s/$hoge1/$hoge2/; という命令をすると、 500エラーになってしまいます。 置換の段階で、どうしたら500エラーを回避できますか? $hoge=~s/$hoge1/$hoge2/; のあとに、 dieやらwarnやら入れてもうまくいきませんでした。
>> 814 eval{$hoge =~ s/$hoge1/$hoge2/;}; print $@ if($@); #エラーメッセージをあれば表示
ありがとうございます。 やってみます
ありがとうございます。 やってみます
>>811 メタ文字をquoteすればOK。
$hoge1 = quotemeta("{");
>>818 $hoge1 = "\{";じゃだめなの?
821 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 16:52:26
wperl.exe使って音鳴らすにはどうすればいいのですか? perl.exeじゃ、\aを出力すればよかったけどwperlだと音がならない
822 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 16:54:01
>>810 $|=1;
してもバッファリングするんですよ。STDOUTはバッファリングしないようになりますが。
Winです。
>>822 selectで一旦変えてやってる?
$oldfh = select(OUT); $| = 1; select($oldfh);
FileHandleのautoflushの方が判りやすいかな
825 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 17:56:40
>>823 だっさ
perlなんだからもうちょい”らしく”かこうぜ
select((select(OUTPUT_HANDLE), $| = 1)[0]);
>>825 かっこよさより判りやすさ重視でいいだろ。マターリしる。
ふん、まだ投票にも行ってないやつがなにカッコつけてんだか。
830 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 19:02:05
選挙特番っていつから?
831 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 19:05:24
>>825 一応・・・perlfuncからのほぼコピペですよと
確かにらしくないというのは同意するけどね
Perlなんて大してスマートな言語じゃねえ
たしかにねえ。 ガムテープで張り付けてあるエンジンとか、 ロープで縛り付けてある翼とか、 格好悪いかもね。
でも、わりとプアなUnix環境だと、わりと最強なインタプリタ言語なのよね。
>>828 むしろ有名だから一瞬でわかってもらえると思うけどな。
汚いが何度も危機を助けられたよ>perl
俺も困ったときはいつもPerlだ
>>836 俺、マジで分からんわ。みんな一瞬で分かるようなもんなの?
どのコード?
840 :
788 :2005/09/11(日) 22:57:26
myとか、スコープとかについて少し調べた結果、 自分が基本的なことがわかってない上、その事を隠そうともせず 恥をさらしてたことがわかりました。スマソ。 use strict した場合のグローバルな定数を使う方法としては (1)各ファイルの先頭の方に my $PI=3.14を記述する (2)use const PI => 3.14 (内部では sub PI{ return 3.14 }) (3)our $PI=3.14 でグローバル化 (4)モジュール化してuseする ( 805さんの方法 ) の方法がある。 自分にとっては our 使うのが簡単でよさそうです。
841 :
788 :2005/09/11(日) 22:58:12
(つづき) ただ、せっかく805さんにコードを書いてもらっているのですから、 これのやり方を学ばないと805さんに申し訳ないと思うのです。 805 のモジュールはそのままコピペだとエラーが出ました。 ●perl 5.8.7 の場合 use Exporter qw(import); の次の行に use vars qw(@EXPORT); を追加すると動くようになりました ●perl 5.6.1 の場合 use strict; package MyConstant; require Exporter ; use vars qw( @ISA @EXPORT ); @ISA = qw(Exporter); @EXPORT = qw(PI); use constant PI => 3.14; 1; で動きました。 まだ勘違いしてるところがあったら、ビシビシつっこんでください。
use strict; $PI = 3.14; の二行でサッと済む訳なので、わざわざ複数行に書かんでも・・・ 勉強しようという姿は素晴らしいのだが、時には簡略するという術もしないとだめよん。
どなたか優しい人、構文チェックしてもらえまえんか?
エラーログは以下の通りです。
syntax error at ./log.cgi 行番号 18, near "};"
Unmatched right curly bracket at ./log.cgi 行番号 41, at end of 行番号
syntax error at ./log.cgi 行番号 41, near "}"
Compilation failed in require at C:\check.cgi 行番号 54.
Perlへのリンクです。
ttp://www5e.biglobe.ne.jp/~kokotubo/upbbs/img/90.txt
844 :
842 :2005/09/11(日) 23:20:25
our($PI) = 3.14 だった。 $PIじゃ駄目だよね・・・orz
>>843 17行目に記号間違い
36行目に}が多い
52行目に"が足りない
60行目 '''' なんだこりゃ
もうねアボカド、バナナかと
>>843 主な問題は
>>845 が言ってるからいいとして・・・
print "</body></html>\n";
↑<body>は何処行ったの?
後 sub error{}について。
&error('0'); で呼び出してるみたいだが、'0'を引数にしてやる必要性なくないか?
&error; 又は &error(); で良いような。
汎用性を持たせたいなら引数にエラーメッセージを渡してやるなりとあるが、それはまた別の話
847 :
名無しさん@そうだ選挙に行こう :2005/09/11(日) 23:36:16
汎用性を持たせたいならPerlを使うな! 全てCで書け
>>846 '0' を引数にするのは、
('0') が顔に見えるからじゃないかな。
849 :
788 :2005/09/11(日) 23:41:52
>>842 ,844
ありがとうございます。
すでに840にも書いているように、自分も our 使おうと思ってます。
805さんが「useして使うのが普通」とかおっしゃっているので、
自分の弱点克服のためにも勉強してみたのです。
(あんまり普通じゃないんでしょうか?)
Perl にはいろんなやり方があるので、場合によって読みやすさや、汎用性等メリット、デメリットを
考慮しながらやり方を選択出来るようになればいいなぁ。と思ってます。
いまいちよくわからんのだが ourで変数宣言しないとmainパッケージの 範囲でしか適用されないの?
851 :
デフォルトの名無しさん :2005/09/11(日) 23:59:33
じゃあ、死ね
use strict時は、my又はlocalで宣言する事を強制される。(use vars, our等を除く) 宣言された変数がどの程度の範囲まで通用する物かはmyはlocal等に関するマニュアルでも読め。
>>845 ,846,848
レスありがとうございます。
指摘されたとこを修正したつもりなんですが、エラーとなってしまいます。
もう自分でも何がなんだかわからなくなってしまいました。
どうかお力を貸していただけませんか。
>>853 指摘されてるのはどれも基本中の基本な気がするのですが・・・
855 :
デフォルトの名無しさん :2005/09/12(月) 00:05:11
じゃあ、死ね
>>856 とりあえず動かしてみたが処理自体は出来ている。俺が言えるのはただそれだけだ
>>858 まともに動かないです(汗
accsesslog.txtも作られないし。。。
Content-type: text/html
記録ファイルの入出力にエラーが発生しました.
とブラウザに表示が出ます。
自己解決しますた
861 :
デフォルトの名無しさん :2005/09/12(月) 00:59:51
いいかげん ”しますた ”なんて表現止めれば マジ オタクっぽいよ
つ「鏡」
とりあえず現状でのエラーは Perlのエラー出力 Name "main::PLOG" used only once: possible typo at tmp.pl line 50. Name "main::act" used only once: possible typo at tmp.pl line 28. Name "main::for" used only once: possible typo at tmp.pl line 21. Name "main::isdst" used only once: possible typo at tmp.pl line 3. Name "main::agent" used only once: possible typo at tmp.pl line 22. Name "main::year" used only once: possible typo at tmp.pl line 3. Name "main::yday" used only once: possible typo at tmp.pl line 3. tmp.pl syntax OK となっております。 どなたか分かる人、力をお貸しください。 今日はこのへんで。
英語読めばわかるじゃん
>863 どれも、一度しか使ってない変数だけど、打ち間違いじゃねぇか?ってメッセージ。
870 :
デフォルトの名無しさん :2005/09/12(月) 01:55:23
マルチのなにが悪いの? おまいが使っているOSもマルチタスクちゃんうんかい?
またこいつか
自己解決しますた
注:このスレはコンパイラではありません
その通り。 コンパイラなんて上等なもんじゃないよ、ここのクソ回答者はw
876 :
デフォルトの名無しさん :2005/09/12(月) 10:58:15
w ってなんですか?
アルファベットって知ってる?
878 :
デフォルトの名無しさん :2005/09/12(月) 11:16:21
いえ
>>856 よ。
このスレで、まともなアドバイスを得たければ、ソースを短くしろ。
例えば、この最初の部分....
>($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time +9*60*60);
>if ($month < 10) { $month = "0$month"; }
>if ($mday < 10) { $mday = "0$mday"; }
>if ($sec < 10) { $sec = "0$sec"; }
>if ($min < 10) { $min = "0$min"; }
>if ($hour < 10) { $hour = "0$hour"; }
>$month = ($mon + 1);
>$y0="日"; $y1="月"; $y2="火"; $y3="水"; $y4="木"; $y5="金"; $y6="土";
>$youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6) [$wday];
>$date_now = "$month\/$mday($youbi) $hour\:$min:$sec";
....ここまでの処理で自分が望んでいるような$date_nowが得られたかどうか
確認せよ。今日の日付を「09/12(月)」の形で得たいのなら、望んでいる
通りのものは得られないだろう。なぜ得られないのか自分で考えて、解らなければ
この部分のみを挙げて質問すればいい。sprintfを使え、という親切なアドバイスを
も得られるかもしれん。
自分が望んでいるような$date_nowが得られたならば、この部分を削って、
ソースを短くしろ。このようにして、問題のある部分を顕在化した数行程度の
ソースを作れば、まともなアドバイスが得られるだろう。
881 :
デフォルトの名無しさん :2005/09/12(月) 12:20:30
たったこれだけのソースが長いとは・・・
無駄に長いのは確かだ。 いかにもKENTの負の遺産って感じの内容。
883 :
デフォルトの名無しさん :2005/09/12(月) 12:40:56
たくさん書いて、書いたなりに成長してきた奴は 現在こんな無駄に長いコード書かんだろ。
>>880 指摘されたようにソースを短くしたら、
Error 500
CGI エラー - 標準出力に何も出力されていません。
となります。
886 :
デフォルトの名無しさん :2005/09/12(月) 15:10:06
$iが0~6まで1つずつ増えていくのを利用して それに呼応するような、スカラー変数と配列変数を7つずつ作りたいんですがどういう方法がありますか? $hoge[$i]とか@hoge[$i]では、べつの意味になってしまって困っています。
>>886 やりたいことがよくわからん。
別の名前を持った変数を作りたいなら、${"hoge$i"}とか配列も同様に。ただしお勧めできないな。
それとも、やりたいのはこういうことかな。
my @hoge;
$hoge[$i] = {SCALER => 'hage', ARRAY => ['foo', 'bar', 'baz']};
print $hoge[$i]{SCALER}, $hoge[$i]{ARRAY}[0];
>>886 use strict; を使ってるなら、
for (0..6) {
no strict 'refs';
${"hoge$_"} = 1;
}
print $main::hoge0;
使ってないなら
for (0..6) {
${"hoge$_"} = 1;
}
print $hoge0;
---
887も書いてるが、上の方法はあまりお勧めではない。
配列やハッシュの要素にすると、一括処理しやすいというメリットもあるし。
887の下のようにハッシュを使うのをおすすめ。
いまどき20万行書く方がアホだと思うが…
仕事で何度も保守を繰り返してきた結果数万行になったPerlコードが動いてるのを見ると、どうしようもなかったんだろうなぁと
4万行あったコードを、既存のモジュール使いまくりにコード整理にと やって、6000行にシュリンクしたことがある。
設計がもうできていて コーディングするだけなら一日2000行は書ける
print map sprintf(qq|%02d\n|), (0 .. 99); 無駄に行数を稼いでみるテスツ。
設計を完了(もしくは構想を完了)していざ書くぞーっていう気になってるときは2000行でも何千行でも書ける。 でもその後しばらくしてくるとやる気失って1日10行書くのも億劫になる
% perl -e 'print ";\n" x 200000;' > hoge.pl
5.8.6.811-MSWin32-x86-122208.msiをインストールして これからPerlを勉強しようとしてるのですが、 パッケージをインストールしようとしたのですが下のようになります。 win32-apiをインストールします Error: No valid repositories: Error: 500 Can't connect to ppm.ActiveState.com:80(connect: Unknown error) zip形式でパッケージが入手できると聞いたのですが、どれが目的のパッケージかわかりません、 ご存知の方教えててください。
>>899 自分でやれって事で終了だったでしょうに…。
ここの板の人達をデバッガに使うつもり?
ちゃんとしたエディタでも使って、自分でやんなよ。
他の人に頼ってたら、いつまで経ったも書けないぞ。
>>901 終了だったんですか?
別にそんなつもりはないですけど、力を貸して欲しいんです。
ではこの板は何のために存在するんですか?
そもそも覗いてて、そうゆうレスしか返さない人は意味ないと思います。
指摘されて習得することも多いと思います。
だからこうやって罵られても投稿するんです。
自分は低脳の猿なんで温かく見守ってください。
>>899 問題が再現する最短のコードのみを書くべし。
英語くらい読めよな
>>902 used only once: possible typo でググったら一発で解決なのだわ
>>902 used only once っていう英文の段階で"何かが1回しか使われてないのか?"くらい判れ。
…いや、それが分からなかったとしても "tmp.pl syntax OK"と正常終了していることぐらい判れ。
自分を低脳だと言うのはどうでもいいが、それすら読めなきゃ同類にされる猿がかわいそうだ。
>>902 警告の意味はわかってるんですが、tmp.pl syntax OK
と出ているのに正常動作しないから困っているんです。
ソースにも書いてあるとおり「accesslog.txt」は生成されないし、
サーバー側に送って実行しても
記録ファイルの入出力にエラーが発生しました.
となってしまいます。
パーミッションも問題ないです。
>>902 まあ、一つだけヒントをやろう。
4行目で、既に間違ってるぞ。
>>908 つうかメモ帳にコピってperl走らせてやりたいが、00xx:と行書いてあるの取り除くのかったりいよ。
>910 つ [colrm 1 6] プログラマなら、これくらいのツールは用意しとけよ。
908 print "Content-type: text/plain\n\n正常動作"; __DATA__ 3行目の前にこの2行を書いてみるとエラーも出ずに正常動作するよ 注意点は 行頭に空白を入れないこと。
>>912 自分がPerl使う時はTeraPadあたりでやるから必要ないのよ。
要するに書けたり置換出来たりすればいいんであって、colrmとかを使う必要を感じない。
企業とかでチーム組んで書いてるとかじゃなくて個人で書いてるだけだし。
ましてや他人のソース見るために入れるのはめんどい
accesslog.txtを作ったら正常動作しました。 ご迷惑をおかけしたみなさん、及びレスをくれた方々に本当に感謝します。
sed標準装備じゃなきゃやってらんない
つうかそれこそ Perl で書けよ。 数十秒でかけるでしょ。
>>902 > ではこの板は何のために存在するんですか?
http://pc8.2ch.net/tech/ > この板はプログラムを作る人のための板です。
この板の全てのスレが質問スレだなどと勘違いしないでくれよ。
このスレは確かに質問スレだが、お前のしていることは質問じゃない。少なくともそう見えない。
もう少し質問の仕方を勉強するべきだと思うよ。
長文失礼
>>914 おまいは本当にPerl使いかと(ry
$ perl -pe "s/^\d+:\s?//"
>>899 >>902 >>915 >>848 氏が指摘してくれた姿勢を尊重して調整してみたが、こういう事がやりたいのか?
exit if eval <<'__END__';
$_=$_>9?$_:qq;0$_;for ($sec,$min,$hour,$mday,$mon,$year,$wday)
=gmtime time+9*60*60;$date_now=
join undef,qw. 01 , 02 , 03 , 04 , 05 , 06 , 07 , 08 , 09 , 10 , 11 , 12.
[$mon<<1],q|/|,@{[$mday]},qw.
(日) (月) (火) (水) (木) (金) (土) (^_^).
[$wday],qq. $hour:$min:$sec.
;m<^(\D+)(\d)>m and $' and $$1=$2 ? $ENV{(HTTP_)[$2-1].$'} : $' for via1VIA,q(-_-),
xfor1X_FORWARDED_FOR,for1FORWARDED,agent1USER_AGENT,addr2REMOTE_ADDR,
q,access_log0./00accesslog.txt,,log01,rescue01000;
do { $_=$a if 4 eq split q,\., and local $a=gethostbyaddr pack(C4,@_),2}
for $host=$addr,$xfor_name=$xfor;
$trueip = $_ for $via and $xfor or $addr;
@linebox =<< "$access_log";
$date_now,$act,$addr,$host,$xfor_name,$trueip
$access_log
;open LOG,qq,<$access_log, and push @linebox,<LOG> or error ('0');;;
;splice @linebox,$rescue-1
;open LOG,qq,>$access_log, and print LOG @linebox or &error qw (;_;)
;#~中略~ 正常メッセージ
;exit q(^_^)
;sub error {
#~中略~ 異常メッセージ
!!!!!shift() ? return : exit length (T_T);
}
__END__
>>921 ステキ!!!
>>902 >指摘されて習得することも多いと思います。
だからみんな親切に指摘してあげてるじゃない。
質問の仕方が間違ってるって。
みなさんテキストエディタは何を使っていますか? メモ帖から乗り換えようと思っているのですが Perlのキーワードを着色してくれたり色々あって迷っています
「メモ帳から乗り換え」wwwww
926 :
デフォルトの名無しさん :2005/09/13(火) 01:40:23
QX 最強
>>924 >>479 同様の質問に答えた覚えがあったから過去ログさかのぼってみたらPart16でも出てるな。参照不能だけど
>>925 何か学校でいやな事でもあったのか?
なにこのスレの伸びは
結局、主だったエディタがひととおり出て、それで終わると……
perl ぐらいなら、プログラミング向けエディタならみんなサポートしているだろうからな。
>>921 オレは、キミのプログラムも、相当にキモイと感じるのだが。
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime;
$mon++;
@dayofweek = qw[(日) (月) (火) (水) (木) (金) (土) (^_^)];
$date_now = sprintf("%02d/%02d%s %02d:%02d", $mon, $mday, $dayofweek[$wday], $hour, $min);
結局、普通のコーディングでも顔文字は必要なんだなw
(^_^)
日付のフォーマットには、POSIX::strftime を使うと良いと思う。
940 :
デフォルトの名無しさん :2005/09/13(火) 16:30:33
ハッシュのキーやデータ部、配列の要素等に、 文字列を指定する際、シングルクオテーションで 挟むのが良いのでしょうか?ダブルクオテーション で挟むのが良いのでしょうか?
>>940 完全に好みの問題だと思うが、漏れは必要なければダブルクォーテーションは使わんな。
エスケープ文字の検査の処理が余計に掛かりそうな気がして・・・実際のところはどうか知らないけれど
>>940 おれも必要なければシングルクォーテーションを使ってる。
文字列中の変数展開検査に関しては941と同じ理由なのと、
明示的に変数展開をしないことを示すため。
まぁ、どちらを使うかは趣味の問題だと思うよ。
>>940 クォート打つのめんどいから囲んでない。
必要なトコはダブルで。
ちなみにシングルでも検査はされるし、
展開が無けりゃ速度は変わらん。
944 :
941 :2005/09/13(火) 17:45:56
>>943 > ちなみにシングルでも検査はされるし、
'ho\'ge'こういうのありだったんだ。知らなかった
あと、ハッシュのキーに関しては漏れも囲まないな。
打つのが面倒なのもあるが、何より自分の主観的にそっちのほうが格好良いと思ってるから。
>>940 クォートは打つのがめんどくさいから => とか qw()とか使いまくり。
>>947 5.005 ぐらいまでは
my @array = qw(foo bar baz);
というコードはコンパイル時に
my(@array) = split(/\s+/, 'foo bar baz', 0);
というコードへ変換されていたが、今は
my(@array) = ('foo', 'bar', 'baz');
へ最適化されるので気にしなくていい。
>>948 マジっすか。 Perlのコード最適化スレないんかの
>>949 % perl -MO=Deparse ファイル名
して確認
951 :
デフォルトの名無しさん :2005/09/15(木) 08:13:40
forkで子プロセス作りまくったら数十個で作れなくなるんだけどどうにかならないの? メモリは普通にあいてる。 winXPです
>>948 全然関係ないけどちょっと気になったのですが、
my @arrayとmy(@array)の括弧の有り無しの違いは何ですか?
953 :
デフォルトの名無しさん :2005/09/15(木) 09:42:51
ない
>>954 > なぜ、自分で調べよう、試そうとしないんだろう。
まあまあ。
どうせリアルで友達いないんだろうから、せめてネットの中で
他人とのコミュニケーションを求めようとしてるんだろ。
桶愚とおんなじだ。生暖かく見守ってやれ(w
どっちかっつーと、
>>950 =952は「無属性の馬鹿」で、友達の有無までは見えてこない。
むしろ
>>955 みたいなネチっこい奴のほうが「リアルで友達いない」タイプに見えるなぁ。
自分にとって「友達の有無」が痛点だから、煽りにも真っ先に混ざっちゃいました、って感じ。
なんかあるとすぐ リアルで~ って・・・ すげーアレだなw
おまいらスレタイ嫁
>>955 自分に友達がいないことをばらしている馬鹿
紅玉とニシキヘビだけが友達さ
つーか煽りあいはやめとけ。
は?
963 :
949 :2005/09/15(木) 19:02:13
>>950 あ、展開されてるかどうかの意味ではなくて、
こういう perl向けの最適なコーディングの事。
例えば、
my @week = qw(日 月 火 水 木 金 土);
を、パッケージの頭で宣言しておくか、
関数内で宣言するかで、ひょっとして関数呼ばれる度に
代入されてんのか?実はコンパイラが同等へ最適化してる?
みたいな実行効率の疑問が出てくる。
そんなの、まとまってないかなぁとか思って。
(スレじゃなくても サイトでもいいか)
自分で調べる方法を教えて欲しいんだが、ベンチぐらいしか思いつかない。 ソース読んだりしてるのかなぁ・・・・。
>>964 > 自分で調べる方法を教えて欲しいんだが、ベンチぐらいしか思いつかない。
何を自分で調べる方法?
966 :
デフォルトの名無しさん :2005/09/15(木) 20:39:35
普通に調べようがないよね。うん 笑
>>963 実行時にリストに変換される。
実行効率は同じ@perl, v5.8.4 built for i386-linux-thread-multi
968 :
デフォルトの名無しさん :2005/09/15(木) 21:02:10
951だけど誰か教えてよ(^^)
970 :
デフォルトの名無しさん :2005/09/15(木) 22:11:47
for($i=0;$i<1000;$i++) { if($p=fork) { next; } elsif(defined($p)) { sleep 10000; exit; } else { print("$i\n"); <STDIN>; } } WindowsなのでUnix系OSと少し違うと思いますが
971 :
デフォルトの名無しさん :2005/09/15(木) 22:26:49
わからず悩んでます。 perlでoracleからbind_paramを使用して 値を取得したいのですがうまくいきません。 $AAA = 'hoge1'; $BBB = 'hoge2';(実際はWEB上からの入力値) SQL文は"select * from TBL whrere AAA = :sid and BBB :hid;" $sh->open(); $sh->bind_param(':sid',$AAA); $sh->bind_param(':hid',$BBB); $sh->execute(); $sh->execute();でエラー エラー内容は型があってないとのことです debugすると select * from TBL whrere AAA = 'hoge1' and BBB = "hoge2"と出力されており、、 $BBBにダブルクォーテーションがついてしまいます。 直打ちで'hoge2'とすれば問題なく取得できました。 どうすればダブルクォーテーションからシングルダブルクォーテーションに なるのでしょうか? どなたかよろしくお願いします。
972 :
デフォルトの名無しさん :2005/09/15(木) 22:28:05
SQL文がまちがってました。 SQL文は"select * from TBL whrere AAA = :sid and BBB = :hid;" です。
どっちみちwhereがwhrereになってるので意味無いね
質問するときは >エラー内容は型があってないとのことです とか書かないで出力されたエラーメッセージをありのままに 書けって習わなかった?
975 :
デフォルトの名無しさん :2005/09/15(木) 23:40:37
重ね重ねすいません。 SQL文は"select * from TBL where AAA = :sid and BBB = :hid;" です。 出力されたエラーは DBD::Oracle::st execute failed: ORA-12704: (DBD ERROR: error possibly near <*> indicator です。 これでわかることがありましたら教えてください。
>>975 丸一日レスないし。
DB板へ行って訊いたら?
>>975 "select * from TBL where BBB = :hid and AAA = :sid;"
ってBBBを前に書くとどうなる?
978 :
デフォルトの名無しさん :2005/09/17(土) 10:56:22
951,970だけど誰か答えてよ(^^)
Copyright 1987-2005, Larry Wall Larry Wallって18年もperl書き続けてるのか
クスクス(^ω^)
983 :
デフォルトの名無しさん :2005/09/17(土) 14:30:58
18年もの歳月があってあの程度じゃ Larry Wallってのもたいしたことないよね
>>971 use DBD::Oracle qw(:ora_types);
なり
use DBI qw(:sql_types);
なりして
bind_paramにアトリビュート設定してみたら?
986 :
デフォルトの名無しさん :2005/09/17(土) 23:11:00
教えていただきたいのですが、Aサーバにあるperlプログラムが Bサーバにあるテキストファイルを読み込ませるにはどうすればよいのでしょうか?
教えていただきたいのですが、Aサーバにあるperlプログラムが Bサーバにあるテキストファイルを読み込ませるにはどうすればよいのでしょうか?
すいません、2回書き込んでしまいました。
989 :
デフォルトの名無しさん :2005/09/17(土) 23:19:13
教えていただきたいのですが、Aサーバにあるperlプログラムが Bサーバにあるテキストファイルを読み込ませるにはどうすればよいのでしょうか?
986ですが、989の3回目の書き込みは自分じゃないです…
次スレよろ
992 :
デフォルトの名無しさん :2005/09/18(日) 01:18:59
教えていただきたいのですが、Aサーバにあるperlプログラムが Bサーバにあるテキストファイルを読み込ませるにはどうすればよいのでしょうか?
993 :
デフォルトの名無しさん :2005/09/18(日) 01:20:07
教えていただきたいのですが、Aサーバにあるperlプログラムが Bサーバにあるテキストファイルを読み込ませるにはどうすればよいのでしょうか?
>>986 教えてあげるから次スレ立ててくだされ。
HTTP なり FTP なり ssh なり メール なり他の通信路なりで
やりとりすればOK。
んじゃ誰か埋めといて。
んじゃ、埋め
998
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。