トップページ⇒php
988コメント342KB

CGIに依存しないPerlの話題一般

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2001/05/31(木) 21:49ID:bKRSBFew
・コマンドラインからのPerl活用
・モジュール、オブジェクト指向プログラミング
・Perl6や.NET対応など
・各種GUIツールキット(Perl/Tk, Gtk-Perlなど)
・他言語による拡張(Inline::*, XS, Swigなど)

についてマターリと語り合うスレッドです。

#CGI関連の話題は、なるべく専用スレッドで。
0497名無しさん@お腹いっぱい。02/01/09 17:11ID:???
>>496
じゃあそういうモジュール作って〜。
0498名無しさん@お腹いっぱい。02/01/10 12:46ID:???
http://sawayaka.msweb.jp/service/shopping/saba/index.html
これはどう?
0499名無しさん@お腹いっぱい。02/01/10 12:48ID:???
>>498 sine
0500500GET02/01/10 12:49ID:???
500GET
0501名無しさん@お腹いっぱい。02/01/11 09:42ID:IHYyu2/p
sigtrapの使い方がいまいち分からない。
Ctrl+Cでファイルをクローズして終了したくて、
use sigtrap qw(die normal-signals);
END{close FH;}
のようにしてるけど、アプリケーションエラーになってしまう。(Win2K)

どうすればいいんだ。
0502名無しさん@お腹いっぱい。02/01/13 10:01ID:???
あげ。 
0503名無しさん@お腹いっぱい。02/01/13 12:29ID:???
>>501
perldoc sigtrapしてみた?まさにそのまんまの例が載ってるけど(w、
>Die on HUP, INT, PIPE or TERM:
>  use sigtrap qw(die normal-signals);
これはdieしたいときの設定。

501がやろうとしているシグナル受信時のハンドラ設定はこんな感じ:
sub my_handler { print "Caught a signal! FH is being closed..."; close FH }
use sigtrap qw(handler my_handler normal-signals);

ちなみに、ハンドラの再設定は、$SIG{...} = \&my_handlerでOK!
終了すべき状況なら、my_hanlderでexit()。
あと、ハンドラ内での再設定も時に有用。(e.g. ALRM)
050450302/01/13 12:47ID:???
>>503
ああ、>>501が言いたかったのは、
「dieでアプリケーションエラーになってしまう。(Win2K)」
ということか、、、逝ってくる。
050550102/01/13 15:34ID:???
>>503-504
いえいえ、レスありがとです。
そっちの方もやってみたんですけど、 my_handler() の中で exit() するとやっぱり
アプリケーションエラーになってしまうんですよね。まあファイルクローズまでは
逝くので問題ないと言えばないのですが。
う〜ん、とりあえず我慢してこのまま使います^^;

ところでWinではキーボード入力待ちってできないのかなぁ? 他の環境用には
そういうモジュールがあったと思うけど…
0506名無しさん@お腹いっぱい。02/01/13 20:13ID:???
>>505
あるような気がするよ。
perl -MCPAN -e shell
でモジュール入れるときに、テストで入力待ちになるじゃん?
0507名無しさん@お腹いっぱい。02/01/13 20:23ID:???
>>265-267 を応用して出来ないかな
0508名無しさん@お腹いっぱい。02/01/17 01:21ID:???
あげとこっと
0509名無しさん@お腹いっぱい。02/01/17 02:31ID:???
1は責任持って盛り上げるべし
0510プ02/01/17 20:33ID:6zEN00QH
func1();
sub func1()
{
  my $ret = func2();
  print "return code -> $ret \n";

}
sub func2()
{
  eval {
    return 1;
  };
#  if($@){} # <==
}

これさあ、コメント外すと返却値が無くなんだけど
分かる人居ます?  
0511名無しさん@お腹いっぱい。02/01/17 20:44ID:???
そのまんま、 if($@){} が何も値を返さないからでしょ。
0512名無しさん@お腹いっぱい。02/01/17 20:59ID:???
もしかして、return 1; で func2 から抜けているつもりなのかな?
eval内のreturnはevalから抜けるだけだよ。
でreturnした値はevalの返り値になる。
0513プ02/01/17 21:00ID:6zEN00QH
ん、ちょっと意味不明系
if($@){return 100;}
だとどうなの
0514名無しさん@お腹いっぱい。02/01/17 21:41ID:???
>>513
なにがどうなの?
$@に何も入ってないんだから変わらないよ。
たぶんあなたの望んでいる動作は、
sub func2()
{
  my $ret = eval {
    return 1;
  };
  return $ret if $ret;
  if($@){}
}
こういうことでしょ?

ところで、検証してて思ったけど、
if って評価した値が偽、かつelseがないと評価した値が返るのね。
sub func { if(0){} }
だと 0 が返る。どうでもいいけど。
0515heno02/01/17 23:08ID:oR04RU/Z
 「ファイルグロブが可能なmake」のような効果をPerlで実装して
みたいのですが、ファイルの変更時刻を得るにはどのようにすれば
良いのでしょうか?
0516名無しさん@お腹いっぱい。02/01/17 23:33ID:???
-M
051751502/01/17 23:33ID:???
(自力解決) stat/lstatで逝けるとわかりました。
051851502/01/17 23:35ID:???
>>516
-M だと日数比較だそうで、makeのような秒単位で比較する
効果が期待できないと思われます。
コメントありがとうございます。
0519名無しさん@お腹いっぱい。02/01/18 03:40ID:Z2zR15g4
Perlでプロセスを跨いでディスクリプタパッシングさせたいんですけど、どっかにサンプル転がってないっすかね。
0520名無しさん@お腹いっぱい。02/01/18 04:03ID:???
俺用語は辞めようねボク

http://www.google.com/search?q=descriptorpassing&hl=ja
http://www.google.com/search?sourceid=navclient&q=%83f%83B%83X%83N%83%8A%83v%83%5E%83p%83b%83V%83%93%83O
0521名無しさん@お腹いっぱい。02/01/18 04:43ID:???
>>520 意味は分かってるよな? サンプルを示すくらい簡単だろ。
0522名無しさん@お腹いっぱい。02/01/18 05:34ID:???
>>519
ほれ。
http://search.cpan.org/search?dist=Socket-PassAccessRights
つーか検索ぐらいしろよと。
http://www.google.com/search?q=%22descriptor+passing%22+perl
0523名無しさん@お腹いっぱい。02/01/18 09:37ID:Z2zR15g4
>>522
ありがとうございます。
一応[email protected]のアーカイブは漁ってるのでSocket::PassAccessRightsの存在は知っていたのですが、
このモジュールはXS使ったモジュールなんですよね。
でIPC::SysVやIPC::Msgだけでなんとかならないかなー、と試行錯誤した結果質問させてもらった次第です。

でも当たり前に考えてファイルディスクリプタのアドレスっちゅーか番号を得る必要があるのですが、Perlのファイルハンドルはそこらへんが抽象化されてるので現行のPerlだけでは無理なんですよね。
おとなしくSocket::PassAccessRights使います。

あー、ディスクリプタパッシングとは何ぞやってヒト向けに説明付けると、異なるプロセス同士でファイルやソケットハンドルを受け渡しする方法のことです。
0524 02/01/18 10:13ID:???
数十万エントリぐらい256バイトデータがあるのですが、連想配列使うのはマヅイですか?
0525日下部圭子 ◆ib749tYo 02/01/18 14:40ID:???
>>524

"/sage/524" wrote in message
news:[email protected]...
> 数十万エントリぐらい256バイトデータがあるのですが、連想配列使うのはマヅイ
ですか?

テストデータを作って実験することをお勧めします。
数百Mもメモリをつんでいるマシンなら、大丈夫だとはおもいますが。

----------------------------------
||//
(@_@) Kusakabe Keiko
----------------------------------

0526名無しさん@お腹いっぱい。02/01/18 20:54ID:???
>524
foreachとか?(笑)
whileで読み込みつつ回すのはだめなんですか?
0527名無しさん@お腹いっぱい。02/01/18 23:21ID:fgthOeGG
Perlモジュールの、
fj::void
はどこにあるんでしょうか?
CPANを探しても有りませんでした
0528名無しさん@お腹いっぱい。02/01/18 23:23ID:???
>527
まじかよ!
どんなモジュールなの?
0529heno02/01/19 13:55ID:WCPxz8Ug
Perl上で strings を呼ばずに同様の処理を行うには、一般的にどうすると良いのでしょうか?
0530名無しさん@お腹いっぱい。02/01/19 15:07ID:???
>>529
stringsって? 同様って何と?
もっと具体的に書いてください。
053152902/01/19 16:02ID:WCPxz8Ug
コメントありがとうございます。
バイナリを読み込んだ後に、その中から表示可能な文字列だけを取り出したいのです。

strings - ファイル内の表示可能な文字列を表示する
ttp://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=strings&dir=jpman-4.4.0%2Fman§=0
0532名無しさん@お腹いっぱい。02/01/19 16:38ID:CWyCsorl
http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/strings/strings.c?rev=1.10
と同様な処理をPerlで作ればいいわけだが、
割合簡単そうですね

File::strings とかあるかなってCPAN見たけどなかった
053352902/01/19 17:21ID:WCPxz8Ug
>>532
なるほど (^_^ ;;)

ここのあたりをPerlで実装すれば良さそうですね。
#define ISSTR(ch) (isalnum(ch) || ispunct(ch) || \
(isspace(ch) && (!iscntrl(ch) || ch == '\t')) || \
(isascii(ch) && isprint(ch)))

#私も始め strings() という関数があるのではないかと思っていました・・・
053452902/01/19 18:22ID:???
 どうも正規表現の [:alnum:] 等を使えばほぼ同様の事ができそうに
思いましたが、今回は個別に置換 (s/\x00// 等) して済ませてしまい
ました。
 コメントありがとうございました。
0535名無しさん@お腹いっぱい。02/01/25 03:32ID:llLEjDhT
どなたか、Perl/Tk使いの方、

windoze上でPerl/Tk使う場合、日本語はsjisじゃないと駄目ですよね。
でも、日本語の文字列処理はeucじゃないと駄目な場合がありますよね。

描画と文字列処理でファイルを分ければ問題なしですが、
同一のファイルで描画と文字列処理を文字化けせずに行う方法知ってたら
お願いします。
ファイルを euc で書いて、Perl/Tk で使う日本語部分だけ Jcode.pm を
使って変換してみたりしましたが、駄目でした。
(どうも、Perl/Tkについての理解が足りない気がする…)
もし、具体例が必要でしたら書きます。

環境は、Win98SE, ActivePerl 5.6.1(631), Perl/Tk 800.023
Jcode.pm 0.79
053653502/01/25 03:59ID:???
ぎゃふん。フォント名をsjisに変換し忘れてたのが原因でした。
逝ってきます。
0537名無しさん@お腹いっぱい。02/01/27 02:12ID:Sw8wyViQ
ホスィ...
http://www.thinkgeek.com/stuff/apparel/321a.shtml
0538名無しさん@お腹いっぱい。02/01/27 09:55ID:???
>537
そうかなぁ?なんか色合いがタクっぽくてやだなぁ。
もっと粋な色使いにして( ゚д゚)ホスィ…
0539名無しさん@お腹いっぱい。02/01/28 09:32ID:???
>>538
Child Processの方は子供に欲しいぞ。誰かクレ。
0540名無しさん@お腹いっぱい。02/01/31 22:34ID:???
kakkiganaizo-
0541名無しさん@お腹いっぱい。02/02/02 11:12ID:+ALef/KR
BSD Resouce
の使い方わかるかたいますか?

ttp://www.perl.com/CPAN/modules/by-module/BSD/
time()を使うときに精度UPできるようなのですが、
readme読んでも使い方がわかりません・・・・。
0542名無しさん@お腹いっぱい。02/02/02 11:23ID:???
time() じゃなくて times() じゃないの?
使い方は組み込み関数のtimes()と同じだよ。
054354102/02/02 11:33ID:+ALef/KR
そうです。すみません。times()でした。

じゃ、use BSD::resource;
とだけ宣言して、普通にtimes()を使えばいいってことですか。
0544名無しさん@お腹いっぱい。02/02/02 11:35ID:toL+Z2MW
    / ̄ ̄ ̄ ̄\   
   (  人>>538 _) 
    |ミ/  ー◎-◎-) そうかなぁ?なんか色合いがタクっぽくてやだなぁ。
   (6     (_ _) ) もっと粋な色使いにして( ゚д゚)ホスィ…
  _| ∴ ノ  3 ノ   
 (__/\_____ノ    
 / (   ||      ||   
[]__| |さくら命  ヽ  
|[] |__|_538______)    
 \_(__)三三三[□]三)   
  /(_)\::::::::::::::::::::::::/  
 (_____):::::/:::::::/      
     (___[]_[]    
0545名無しさん@お腹いっぱい。02/02/02 11:42ID:???
READMEは読んだけどPODマニュアルは読んでないってか?
use BSD::Resource qw(times);
($user, $system, $child_user, $child_system) = times();
0546名無しさん@お腹いっぱい。02/02/02 17:48ID:Ew98jRS/
なんか面白そうだ。
http://search.cpan.org/doc/MARCEL/Exporter-Simple-0.12/lib/Exporter/Simple.pm
054754102/02/02 20:05ID:+ALef/KR
>>545
ありがとうございました。

でも、timesってopen2で処理してもらってる時間は計測してくれないのね。
鬱市
0548名無しさん@お腹いっぱい。02/02/02 20:16ID:2Jw7igNJ
すいません。perlでピタゴラスの定理やりたいんですけど・・・

Aの2乗=Bの2乗+Cの2乗ですが、
BとCの値を入れて計算が終わったとして、
ルートAの出し方がわかりません。
お助け下さいませ・・・
0549名無しさん@お腹いっぱい。02/02/02 20:23ID:BTZXmzNs
>>548
sqrt(expr) で平方根。
0550名無しさん@お腹いっぱい。02/02/02 20:40ID:2Jw7igNJ
>549
ありがとうございます。うまくいきました!
0551名無しさん@お腹いっぱい。02/02/02 22:15ID:lgb4aC0K
>>550
そんなんでいいんかい?
perkの問題じゃなくて数学の問題だろ
0552名無しさん@お腹いっぱい。02/02/02 22:35ID:2Jw7igNJ
>551
いえ、CGIに依存しないPerlのお話だったんです。
sqrt関数がわかんなかったんです。
0553デフォルトの7子02/02/03 00:54ID:juTMfXhd
WIN2000+ActivePerl
でperl APIを使用したCプログラミングをしようと思っています。
Cのソース上で
#include <perl.h>し
VC付属のコンパイラ CL.EXEで
>cl -I\Perl\lib\CORE perltest.c
とすると以下のようなエラーが出てしまいます。
おそらくperl.hで名前解決が出来てないためだと思うのですが、
ご存知の方アドバイスをよろしくお願いします。

**************************
\Perl\lib\Core\perl.h(797) : warning C4273: 'win32_strerror' :
しています。DLL にエクスポートされていると仮定します。
\Perl\lib\Core\dosish.h(111) : warning C4005: 'Stat' : マクロが再定
\Perl\lib\Core\win32.h(305) : 'Stat' の前の定義を確認し
\Perl\lib\Core\perl.h(1755) : error C2061: 構文エラー : 識別子 'pe
ンタックスエラーを起こしました。
\Perl\lib\Core\perl.h(1755) : error C2059: 構文エラー : ';'
\Perl\lib\Core\perl.h(1756) : error C2061: 構文エラー : 識別子 'pe
スエラーを起こしました。
\Perl\lib\Core\perl.h(1756) : error C2059: 構文エラー : ';'
\Perl\lib\Core\perl.h(1757) : error C2061: 構文エラー : 識別子 'pe
エラーを起こしました。
\Perl\lib\Core\perl.h(1757) : error C2059: 構文エラー : ';'
\Perl\lib\Core\perl.h(1758) : error C2061: 構文エラー : 識別子 'pe
ラーを起こしました。
\Perl\lib\Core\perl.h(1758) : error C2059: 構文エラー : ';'
\Perl\lib\Core\perl.h(2246) : warning C4273: 'win32_crypt' : DL
ています。DLL にエクスポートされていると仮定します。
\Perl\lib\Core\perl.h(2356) : warning C4273: 'win32_environ' :
しています。DLL にエクスポートされていると仮定します。
\Perl\lib\Core\perlvars.h(22) : error C2061: 構文エラー : 識別子 '
ックスエラーを起こしました。
\Perl\lib\Core\perlvars.h(22) : error C2059: 構文エラー : ';'
\Perl\lib\Core\perlvars.h(39) : error C2061: 構文エラー : 識別子 '
タックスエラーを起こしました。
\Perl\lib\Core\perlvars.h(39) : error C2059: 構文エラー : ';'
0554デフォルトの7子02/02/03 01:49ID:juTMfXhd
>553
自己レスです
結局コマンドラインをあきらめてVC
のIDEでインクルードパスを
C:\Perl\lib\COREにしたらあっさり出来ました。

しかし今度はたったこれだけのソースがメモリエラー
実行できず・・・・
道は遠いなあ
#include <EXTERN.H>
#include <perl.h>
static PerlInterpreter *my_perl;

int main(){
SV *pvalueSV;
pvalueSV = newSViv(132);
return 1;
}
0555名無しさん@お腹いっぱい。02/02/03 01:53ID:+IXT+7Wc
>554
がんばれ!
0556デフォルトの7子02/02/03 03:11ID:NWocp2us
>555
ありがとう!
頑張ってる!
でも
newSViv(132);
なぜこれがエラーになるのかがわからんです・・・・
参考ソースもすくないね・・perlAPIは・・
0557名無しさん@お腹いっぱい。02/02/03 10:17ID:GN3WrqUC
このあたりのソースコードが参考になるんじゃない?
http://www.t.ring.gr.jp/pub/lang/perl/CPAN/modules/00modlist.long.html#ID22_MicrosoftW
0558名無しさん@お腹いっぱい。02/02/03 11:46ID:???
>>554 perlembedみれ。
インタープリタの初期化しないと駄目だ。
0559singleton02/02/04 13:32ID:8LIPl4QI
川o・-・) < Singletonクラスを以下のように実装したわけだが、何か問題あ りますか。CPANのClass::Singletonはなんか面倒くさいです。

foreach (1..3) {
print Foo->getInstance(), "\n";
print Singleton->getInstance(), "\n";
}

package Singleton;
my %instances;
sub getInstance {
my $class = shift;
return $instances{$class} ||= $class->_new();
}
sub _new {
return bless {}, shift;
}

package Foo;
use base q/Singleton/;

-----------
Foo=HASH(0x80efc1c)
Singleton=HASH(0x80efc34)
Foo=HASH(0x80efc1c)
Singleton=HASH(0x80efc34)
Foo=HASH(0x80efc1c)
Singleton=HASH(0x80efc34)
0560名無しさん@お腹いっぱい。02/02/04 14:28ID:???
>>559
面倒くさいってアンタ…数文字だけタイプ数が変わるだけじゃん。

車輪の再発明をしたいならせめてもっとマシな物を作らないと。
例えば、Class::Singletonの_new_instanceを

sub _new_instance {
my $instance = bless { }, shift;
$inctance->_init(@_)
return $instance;
}

とでもすれば、_init()さえ定義すれば良いようになるだろ?

0561名無しさん@お腹いっぱい。02/02/05 16:41ID:slTopwFT
面倒ってのはそういう意味じゃなくて、Class::Singletonが使ってる方法が
面倒って意味。
それに、Class::Singletonだと、$YourSingletonClass::_instanceでカプセルかが
破壊できちゃうのが何となく嫌。
レキシカル変数だと大丈夫だよね。
あと、_initは貼る時に削っただけでやってます。
0562名無しさん@お腹いっぱい。02/02/12 23:36ID:gr8exDbO
スクリプトのなかでrequire "./jcode.pl";
などしてカレントディレクトリのモジュールを取り込んでいるケースに
違うディレクトリから
perl /html/test.cgi
などしてスクリプトを実行使用とすると、
カレントディレクトリが違うので
can't locate ./jcode.pl at /html/test.cgi line 2
などとなりますよね。
このような場合はどのようにして実行できますでしょうか?。
perl /html/test.cgi -I/html/
としてみても結果は同じでした。
0563名無しさん@お腹いっぱい。02/02/12 23:40ID:???
>>562
フルパス。
0564名無しさん@お腹いっぱい。02/02/12 23:41ID:???
requie "/path/to/jcode.pl";

絶対パスで指定する。
056556402/02/12 23:42ID:???
被鬱
0566undef02/02/13 07:31ID:???
sqrt 知らなくても 0.5 乗すれば良い話なのにとか思ったり。
あ、中学校の範囲じゃない?
056756202/02/13 08:07ID:2kRNjnhV
>563,564
レスありがとうございます。
すみません。少々説明不足でした。
もちろんフルパスでの指定というのがありますが
ソースコードを変更しないで実行したいのです。
perlスクリプトの方ではなくWEBサーバを書いているので。
Apacheなんかだとperlがどこにあってもカレントディレクトリの
スクリプトを実行できますよね。
0568名無しさん@お腹いっぱい。02/02/13 10:51ID:???
>>562
フルパスとか相対パス指定なんてダサいことしてるからそーなる。

use lib '/path/to/lib';
require 'jcode.pl';

ってすれば万事休す。もしくは
use FindBin;
use lib "$FindBin::Bin/../lib";
require 'jcode.pl';

な。とりあえず絶対パスはなんて言ってる奴は*論外*。クソな配布スクリプトを参考になんかしてると、一緒に腐っちゃうぜ。

なんなら .htaccessで

SetEnv PERL5LIB /path/to/lib

で済ましても良いし。
0569名無しさん@お腹いっぱい。02/02/13 11:01ID:RcZE7nBS
ネタだろうが、万事休すの使い方間違ってるよ。
プログラム言語ができても国語ができないようで。残念。
0570名無しさん@お腹いっぱい。02/02/13 13:37ID:???
いやおれは純粋にネタだと思ってるんだがちがうんかね?(笑)
0571名無しさん@お腹いっぱい。02/02/13 23:03ID:???
つーか書いてる事全般がドキュソ風味じゃん。
0572名無しさん@お腹いっぱい。02/02/13 23:21ID:???
レス読んでる?
0573名無しさん@お腹いっぱい。02/02/13 23:22ID:???
>use lib '/path/to/lib';

結局絶対パス。大したこと無いね。
0574名無しさん@お腹いっぱい。02/02/14 13:12ID:???
>>573
スレ読んでる?

> use FindBin;
> use lib "$FindBin::Bin/../lib";
0575名無しさん@お腹いっぱい。02/02/14 13:15ID:???
万事休す。
0576名無しさん@お腹いっぱい。02/02/14 20:23ID:???
バンジー急っす!
0577環境変数02/02/14 23:47ID:s7CAF/TS
Perlを実行している親プロセス(?)の環境変数(特にWin系)を変える
プログラムは、どうすれば良いのでしょうか?

たとえば、
MS-DOSプロンプトで、「SET」とすると環境変数が出てきます。-(1)

次に、そのまま、何らかのPerlプログラムを実行。

再び、そのプロンプトで、「SET]で環境変数を表示。-(2)

この(1)と(2)で違う状態にしたいのです。(Perlで環境変数を変える)

よろしくお願いします。
0578名無しさん@お腹いっぱい。02/02/15 00:14ID:???
>>577
確か無理。
0579名無しさん@お腹いっぱい。02/02/15 19:40ID:8vhXaga7
とりあえず現在の日付と時間がちょいと整形した形でほしいとき、こういう記述する人います?
自分、結構好きだったりするんですけどね、こいうの。

$date_time = sprintf "%04d/%02d/%02d %02d:%02d:%02d\n", sub{$_[5]+1900,$_[4]+1,@_[3,2,1,0]}->(localtime);
0580名無しさん@お腹いっぱい。02/02/15 19:44ID:???
>>579
元々C言語な人なんで複数行+sprintfですな。俺は。
0581名無しさん@お腹いっぱい。02/02/15 20:06ID:???
>>579
自分のサイトでも載せてるし、実際に使ってます、そんなの。
0582名無しさん@お腹いっぱい。02/02/15 20:18ID:???
>>580
そうですか、自分もCからPerlに入ったんで最初は違和感あったんですけど
いちいち中間変数を考えるのが面倒になったときこっちが便利になってきました。

>>581
はい、おっしゃるとおり、そんなのです。
他に使っている人がいて安心しました。
そんなん蛇道とかいわれなくてよかったです。
058358102/02/15 23:26ID:???
>>582
誤解があったようなので。
> そんなの
「そういうの」って言った方が良かったね。
悪意はまったく無いので。スマソ

ちなみに私はPerl厨なので、俗に言うトリッキーな書き方が大好きです。
0584賛成の反対の反対ナノだ!02/02/16 02:29ID:???
コンパクトなコーディングもいいですが、sprintf関数はオーバーヘッドが大きくてらっしゃる
のでわたしは使いません。
058558202/02/16 10:22ID:???
>>583
いぇいぇ、わざわざすみませんです。
Perlコードのパズル感覚は私も面白くてはまるたちです。

>>584
やはり、そいった御意見もありますよね、ふむふむ。
ここは、使い分けということですよね。

処理時間が短さが重要な処理で、かつ大量の日付表示処理の繰り返し
とかやる場合は、オーバーヘッドの少ない方法を使うわけですね。

ちょっとしたレポートに作成日付をつけるぐらいの処理だったら
>>579に示した方法でもいいですよね。
0586名無しさん@お腹いっぱい。02/02/16 11:37ID:???
よく考えたらPerlでsprintf使う意味ってあんまり無いよね。

型変換は必要ないし0fillとか桁削りも簡単。
0587名無しさん@お腹いっぱい。02/02/16 13:05ID:???
>>584は試してみてからそういってるのか?
手動フォーマットよりsprintf()の方が圧倒的に高速だが…俺のやり方がまずいんだろうか。
それともオーバーヘッドの意味が俺の考えている小物と違うのかな。
WinME perl5.6.1 ActivePerl 631
メモリ320MB CPU Duron 800MHz
#!perl -w
use Benchmark;
my @tm = localtime time;
sub timef1{
($sec, $min, $hour, $day, $mon, $year) = @tm;
$year += 1900;
$mon++;

$_ = sprintf '%d/%02d/%02d %02d:%02d:%02d', $year, $mon, $day, $hour, $min, $sec;
}
sub timef2{
($sec, $min, $hour, $day, $mon, $year) = @tm;
$year += 1900;
$mon++;

($mon < 10) and ($mon = "0$mon");
($day < 10) and ($day = "0$day");
($hour < 10) and ($hour = "0$hour");
($min < 10) and ($min = "0$min");
($sec < 10) and ($sec = "0$sec");
$_ = "$year/$mon/$day $hour:$min:$sec";
}
timethese 100000 => {
sprintf => \&timef1,
handformat => \&timef2,
};
__END__
結果
Benchmark: timing 100000 iterations of handformat, sprintf...
handformat: 6 wallclock secs ( 5.38 usr + 0.00 sys = 5.38 CPU) @ 18587.36/s (n=100000)
sprintf: 1 wallclock secs ( 0.82 usr + 0.00 sys = 0.82 CPU) @ 121951.22/s(n=100000)
0588名無しさん@お腹いっぱい。02/02/16 13:06ID:???
s/小物/もの/
0589名無しさん@お腹いっぱい。02/02/16 21:23ID:???
href="http://hoge.hoge.jp/hoge/fuga/index.html"
といった文字列から、別のファイルに保存してある
http://hoge.hoge.jp/hoge/
といった文字列にマッチしていればそのマッチした部分を削除
してくれるような操作をしたいのですが、どうすればうまく行くでしょうか?

= 置換したい文字列が動的に変化する時、":" や "/"のエスケープは
 どうするとよいのでしょうか?
0590名無しさん@お腹いっぱい。02/02/16 22:17ID:???
s/http:\/\/hoge\.hoge\.jp\/hoge\///;
059158902/02/16 22:41ID:???
>>590
単発ならそうするのですが、http:〜hoge までが動的に変化する場合の
うまいやり方が思いつかないのでげす・・・

059258902/02/16 22:43ID:SkVhVlKI
具体的には、htmlファイルのリンク書き換えのような事を
する場合、今まではエディタを使っていたのですが、perl
だとどうするのだろうかと・・・

0593名無しさん@お腹いっぱい。02/02/16 23:04ID:???
foreach $hoge (@hoges) { s/$hoge//; } とか?
059458902/02/16 23:25ID:???
>>593
あれ?

open LIST, "tmp.list";
while (<LIST>) {
s/$hoge//;
print;
}

 これで素直に動きました(汗)
 ありがとうございました・・・
0595名無しさん@お腹いっぱい。02/02/16 23:27ID:???
>>594
$hogeは?
0596名無しさん@お腹いっぱい。02/02/17 00:11ID:???
>>587
sprintfが重いってのはここを含めた一部の馬鹿板に於いて定説
ベンチも取らずに講釈並べるのが特徴です
>>584は馬鹿板育ちだからそっとしてあげよう
■ このスレッドは過去ログ倉庫に格納されています