Perlについての質問箱 21箱目

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"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/12/12現在の最新版: 5.8.7
● 2005/12/12現在の開発版: 5.9.2

リンク集は>>2-3
過去スレは>>4-5
2デフォルトの名無しさん:2005/12/12(月) 03:56:16
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.7/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
3デフォルトの名無しさん:2005/12/12(月) 03:56:46
4デフォルトの名無しさん:2005/12/12(月) 03:57:30
5デフォルトの名無しさん:2005/12/12(月) 03:58:00
6デフォルトの名無しさん:2005/12/12(月) 07:21:57
舞-乙
7デフォルトの名無しさん:2005/12/12(月) 07:57:00
まあ確かにURLだけ貼るだけで放置なら無意味だよな
テンプレにあるサイトくらい回るのが当然だし
質問者はそれでも分からないっていってるんだろうから

…蒸し返してごめん。一乙
8デフォルトの名無しさん:2005/12/12(月) 08:03:03
無意味ではないし。
回答したいやつが勝手に回答すればいいだけのこと。
質問者が分からないならお前が回答してやれ。
9デフォルトの名無しさん:2005/12/12(月) 08:15:15
はいはい、しつこいよ。
10デフォルトの名無しさん:2005/12/12(月) 08:25:22
>>1
11デフォルトの名無しさん:2005/12/12(月) 09:48:25
まあ質問スレでの無意味な書き込みは荒らし同然だからなあ。
埋まった質問は掘りだされることないし。
12デフォルトの名無しさん:2005/12/12(月) 14:26:59
これから回答者が注意すれば良いだけじゃない
何ムキになってるんですか?
13デフォルトの名無しさん:2005/12/12(月) 14:51:17
⊂二二二( ^ω^)二⊃
14デフォルトの名無しさん:2005/12/12(月) 15:12:39
>>12
まあまあ落ち着いて。
にしても……こういう時に限って質問無いんだよな。
15デフォルトの名無しさん:2005/12/12(月) 15:16:05
use Hoge qw/abc def/;
use Hoge qw(abc def);
use Hoge qw{abc def};

どれが一番クールですか
16デフォルトの名無しさん:2005/12/12(月) 15:33:52
>>15
qw// はリストコンストラクタだから、通常の ( ... ) と合わせて
qw( ... ) と書くのが一番「自然」。他の演算子やマニュアルの
凡例との整合を取るなら qw/ ... / 。B::Deparse の出力では
qw[ ... ] をよく見る。それ以外の文字を使う理由は寡聞にして
知らないし、好みの問題で優劣は無い。
17デフォルトの名無しさん:2005/12/12(月) 20:01:14
Perl6の資金がないとかいって収集した金を誰が浪費したの?
もしかして僕らのヒーロー、ラリーヲールたん?
18デフォルトの名無しさん:2005/12/12(月) 20:11:52
どこの話?
19デフォルトの名無しさん:2005/12/12(月) 22:04:13
ここでする質問する内容なのかわからない上にわかりにくい説明で恐縮なのですが

if ($in{'command'} eq "start") { $first = 5; }
elsif ($in{'command'} eq "next") { $first ++; }

startボタンを押したらnextボタンが表示されるようにしてあります。
nextボタンを押したら $first に1加えるようにしたいのですがうまくいきません。
どうすればうまく動くようになるのでしょうか?よろしくお願いします。
20デフォルトの名無しさん:2005/12/12(月) 22:09:04
エスパーさーーーん
21デフォルトの名無しさん:2005/12/12(月) 22:17:16
セッションを使え。
22デフォルトの名無しさん:2005/12/12(月) 22:19:13
それだけはいやです。
23デフォルトの名無しさん:2005/12/12(月) 22:22:54
>>19
よりわかりやすく説明できるように整理しよう。

・やってみたこと
・出た結果
・期待した結果

をそれぞれその場にいない人にも伝わるように日本語に直してみよう。

現場で現象を見ているあなた自身で「わかりにくい」と思う説明では誰にも理解できんです。
また整理しているうちに、それだけで解決してしまうケースも多々あるのよ。
24デフォルトの名無しさん:2005/12/12(月) 22:56:02

if ($in{'command'} eq "start") { $first = 5; }
elsif ($in{'command'} eq "next") { $first ++; }
print "$first";

最初startボタンを押したときに $first の値として 5 が表示されて、
次にnextボタンを押したら $first の値として 1 が表示されました。

startボタンを押したあとnextボタンを押したときに、
$firstに代入された5という数字に1を加えた6を表示させたいと思ってたのですがうまくいきませんでした。
25デフォルトの名無しさん:2005/12/12(月) 23:10:17
エスパーさーーーん
26デフォルトの名無しさん:2005/12/12(月) 23:21:34
ルーク、フォースを使え。
27デフォルトの名無しさん:2005/12/12(月) 23:23:43
$firstにはstartボタンを押した時点で5が代入されてるので、
その次にnextボタンを押したら前に代入された5に1を加えた6が代入されるのではないかと思いまして。
そのように動作させるためにはどうすればよいのでしょうか?
28デフォルトの名無しさん:2005/12/12(月) 23:27:28
>>27
何所から説明したものか…とりあえず…それCGIか?
CGIならWebProg板に移動してもらおうか。
CGIならCGIで根本的な動作原理すらわかってないようだし…
29デフォルトの名無しさん:2005/12/12(月) 23:27:37
>>27
$firstもしくは"5"が伝わってない以上仕方ねえよ。webprog行ってくれ
30デフォルトの名無しさん:2005/12/12(月) 23:29:12
普通に Perl/TK じゃないの?
31デフォルトの名無しさん:2005/12/12(月) 23:31:01
>>30
Perl/Tkで$inとか出てくるかな
まあその可能性も無いわけじゃないから一応CGIかどうか訊いた訳だが
32デフォルトの名無しさん:2005/12/12(月) 23:44:33
ホームページ上で動くものなのでCGIなのでしょうか?
スレ違いでしたらすいませんでした。
33デフォルトの名無しさん:2005/12/13(火) 01:28:49
HPから印刷のダイアログを出さずに直接ダイレクトで印刷したいのですが方法はありますか?
34デフォルトの名無しさん:2005/12/13(火) 04:10:29
>>33
Linuxならできる
35デフォルトの名無しさん:2005/12/13(火) 04:11:41
ユーがブラウザ作っちゃいなyo
36デフォルトの名無しさん:2005/12/13(火) 06:42:26
マチルダさーーーん
37デフォルトの名無しさん:2005/12/13(火) 07:47:38
やっぱムリですか
印刷のダイアログ自体のデザインを
変えたりなんかは出来るんでしょうか
38デフォルトの名無しさん:2005/12/13(火) 08:19:12
Perlの質問(笑)
39デフォルトの名無しさん:2005/12/13(火) 08:21:40
相手すんなよ。
40Lavi:2005/12/13(火) 11:38:03
sendmailについて質問させてください。
現在、メールフォームを作っておりまして、

regist.cgiでファイルにログ書き出しと同時に
&send_mail();という具合でsendmailを呼んでいるのですが、
うまく指定したアドレスにメールが送信されません。
原因はわかりますでしょうか?以下ソースです

# sendmailのパス
$path_sm = '/usr/sbin/sendmail';
$MailTo = '[email protected]';
$MailFrom = 'hoge Official';
41Lavi:2005/12/13(火) 11:38:33
つづき

sub send_mail{
foreach $key (keys %FORM){
$MAIL_FORM{$key} = &jcode::jis($FORM{$key});
}

@r = ("男性", "女性");
$MAIL_FORM{'sex'} = &jcode::jis($r[$MAIL_FORM{'sex'}]);

open(MAIL, "|$path_sm -t");

my $tpl = new CGI::FastTemplate("./cgi-bin/template/");

$tpl->define(main => "mail.tm");
$tpl->assign(NUMBER => $count);
$tpl->assign(DATE => $date);
$tpl->assign(SEND_ADDRESS => $MailTo);
$tpl->assign(NAME => $MAIL_FORM{name});
$tpl->assign(ADDRESS => $MAIL_FORM{address});
$tpl->assign(SEX => $MAIL_FORM{sex});
$tpl->assign(AGE => $MAIL_FORM{age});
$tpl->assign(TEL => $MAIL_FORM{tel});
$tpl->assign(EMAIL => $MAIL_FORM{email});
$tpl->assign(TEXT => $MAIL_FORM{text});
$tpl->parse(RESULT => main);

print MAIL $tpl;
close(MAIL);
}

おねがいしますm(__)m
42デフォルトの名無しさん:2005/12/13(火) 11:53:15
CGI::FastTemplateオブジェクトのリファレンスを
そのままsendmailのパイプにprintしてもどうにも
ならんと思うが。

CGI::FastTemplateのマニュアルのfetchの説明
あたりをよく嫁。
43Lavi:2005/12/13(火) 11:55:00
>>42
重大なヒントありがとうございます!
マニュアルよく読んでまた きます。
44デフォルトの名無しさん:2005/12/13(火) 13:02:51
>>24
if 文について勉強しる。
45Lavi:2005/12/13(火) 14:07:14
40です。
http://perldoc.jp/docs/modules/CGI-FastTemplate-1.09/FastTemplate.pod
を読破してきましたが、結果

print MAIL $tpl; ⇒ print MAIL $$tpl;
とすればいいということでしょうか?
46Lavi:2005/12/13(火) 14:10:36
うーん。なんか勘違いしてますよね,俺;
メールの書式にtemplate使いながら、
他のCGIでsendmailを呼び出して,送信すること自体 無理なんですかね

orz
47デフォルトの名無しさん:2005/12/13(火) 14:17:48
最近Perlを勉強しだした超初心者なのですが
コマンドラインから引数nを一つとって
n=3なら

◆◆
◆◆◆
◆◆

n=4なら

◆◆
◆◆◆
◆◆◆◆
◆◆◆
◆◆

nが文字列ならエラー表示して終了といったスクリプトを
for文一回のみ、配列は無し、if文も無しで1行で組むということは可能でしょうか?
48デフォルトの名無しさん:2005/12/13(火) 14:27:52
>>47
宿題はこちらへ。

Perlでリクに答えるスクリプトを作るスレ
http://pc8.2ch.net/test/read.cgi/tech/1086143976/
49デフォルトの名無しさん:2005/12/13(火) 14:32:41
>>45
どこをどう読んできたんだお前は(;´Д`)
50Lavi:2005/12/13(火) 14:36:47
sub send_mail{

━━前略━━

 $tpl->parse(RESULT => main);
 $mail_data = $tpl->fetch("RESULT");

 #print MAIL $tpl;
 print MAIL $mail_data;

 close(MAIL);
}
考えてみたのですが、もしかしてこういうことでしょうか;
51Lavi:2005/12/13(火) 14:50:18
アルぇー
うごかね orz
52デフォルトの名無しさん:2005/12/13(火) 14:58:54
>>50
どうしてそこまでいって間違えるかね...
print MAIL $$mail_data;
だろ。

あとコマンドに食わせる奴がうまくいかないときは、
まずファイルに書いてみて期待した通りの出力に
なってるか確認する、とかしてみるのがセオリー。
53Lavi:2005/12/13(火) 15:14:16
うあああ
動きました。ありがとう(ノД`)
みんな、ほんとにありがとうです。
>>52
はい、これからはそのセオリー遵守します。
54デフォルトの名無しさん:2005/12/13(火) 15:21:53
>>53
あと厳密にはスレ違いなんで今度から>>1読んでくれ。
55デフォルトの名無しさん:2005/12/13(火) 17:20:40
>>47
perl -e 'die if (($n = shift) ne $n+0); print "◆" x ($n-abs($n-$_)),"\n" for (1..$n*2-1)' 3
56デフォルトの名無しさん:2005/12/13(火) 19:51:13
スレ違いだったら許してくれ。

ActivePerl をインタプリタとして組み込みたいんだが
PerlEz(限定インタフェイス)
perl58.dll 参照
以外にお手軽に組み込める、COMインタフェイスとか存在しない?

なければ自分で作ろうと思うのだけど、できれば
perl58.dll が見つからなくても動くバイナリを作りたい。
PerlEz を使ってみたけど、機能的に限定されすぎてるし、
実行形式が perlez.dll を要求するようになっちゃう。
57デフォルトの名無しさん:2005/12/13(火) 20:03:12
簡単にファイルロックできるモジュールってありませんか
できれば標準モジュールで
58デフォルトの名無しさん:2005/12/13(火) 20:44:06

ありますね
59デフォルトの名無しさん:2005/12/13(火) 20:51:34
60デフォルトの名無しさん:2005/12/13(火) 20:58:26
>>59
わざわざ検索しないでも、トップページのド真ん中にリンクがあるよ。
http://search.cpan.org/modlist/File_Name_System_Locking
61デフォルトの名無しさん:2005/12/13(火) 21:04:53
>>58-60
どうもです
具体的にはどれがいいんですかね
62デフォルトの名無しさん:2005/12/13(火) 22:04:48
>>56
えーと、staticにリンクしたいってこと?
63デフォルトの名無しさん:2005/12/13(火) 22:21:01
>>62
うんにゃ
手元では、perl.h のダイナミックリンクは成功してるけど
インポートライブラリを使いたくないのだ。
ActivePerlない環境でもそれなりに動いてほしいので。

環境は BCB
64デフォルトの名無しさん:2005/12/14(水) 02:52:34
>>63
普通にLoadLiblary & GetProcAddressはだめなの?
65デフォルトの名無しさん:2005/12/14(水) 11:21:17
>>64
それを(ある程度)勝手にやってくれる方策を探してたのだけど
あきらめて自分で作りまつ
ヘッダ&インポートライブラリから定義抜き出してラップすんのマンドクサッ

いいものができたらBCB&デルスレに貼るyp
66デフォルトの名無しさん:2005/12/14(水) 15:22:05
>>56
Windowsで、Script機能を自作プログラムに組み込むための標準的な機構として、
Windows Script Interfacesというのがある。
ttp://msdn.microsoft.com/library/en-us/script56/html/4c750627-6797-4857-9f5e-e5f54371f83c.asp?

JScript/VBScriptと同じようにPerlScriptもイケルはず。
67デフォルトの名無しさん:2005/12/14(水) 17:52:27
要素の中身から添え字番号を調べる方法教えてください。

$hoge[0]='あああ',$hoge[1]='いいい',$hoge[2]='ううう',$hoge[4]='えええ''
があるとしたら、'ううう'という言葉から$hoge[2]の2という数字を知りたいのです。
68デフォルトの名無しさん:2005/12/14(水) 17:56:10
>>67
そういう用途には逆マップのハッシュを使え。
もちろん要素は重複しないのだな?

%reverse_map{@hoge} = (0..$#@hoge);
69デフォルトの名無しさん:2005/12/14(水) 17:59:04
>>68
ありがとうございます。
ディレクトリのファイル名を読み込んで、使いたかったんです。
70デフォルトの名無しさん:2005/12/14(水) 18:01:31
>>67
List::MoreUtilsにfirst_indexなんてのもある、と一応紹介。
繰り返し処理するならハッシュに突っ込んだほうが良いね

http://search.cpan.org/~vparseval/List-MoreUtils-0.17/lib/List/MoreUtils.pm
my @list = (1, 4, 3, 2, 4, 6);
printf "item with index %i in list is 4", firstidx { $_ == 4 } @list;
__END__
item with index 1 in list is 4
71デフォルトの名無しさん:2005/12/14(水) 18:04:04
>>70
ありがとうございます。
使い方よく見てみます。
72デフォルトの名無しさん:2005/12/14(水) 18:25:35
for (0..10000) って1マンコの配列返してたんだ…知らんかった…
for($i=0; …を書くのめんどいから使いまくってたよアヒャ
73デフォルトの名無しさん:2005/12/14(水) 18:30:19
>>72
ttp://perldoc.jp/docs/perl/5.6.1/perlop.pod
のRange Operators
> 現状の実装では、foreach ループの式の中で範囲演算子を使っても一時配列は作りませんが、古い Perl は以下のようなことを書くと、大量のメモリを消費することになります:
> for (1 .. 1_000_000) {
> # code
> }
foreach(for)に限っては新しいPerlなら大丈夫
74デフォルトの名無しさん:2005/12/14(水) 18:44:11
>>73
そうなんだぁ、最適化解釈されてて大丈夫なんだ。ありがとうございます。
75デフォルトの名無しさん:2005/12/14(水) 19:17:36
この中にperlコードを携帯アドレスにしてる子はいねーがーー
76デフォルトの名無しさん:2005/12/14(水) 19:19:44
最もPerlらしさを表すコードってどんなの
77デフォルトの名無しさん:2005/12/14(水) 19:20:01
>>75
kwsk
78デフォルトの名無しさん:2005/12/14(水) 19:21:14
つ[ comp.lang.perl.poems ] >>76
79デフォルトの名無しさん:2005/12/14(水) 19:25:21
pinrt_@docomo.. で配列展開…
80デフォルトの名無しさん:2005/12/14(水) 19:26:19
[email protected]

とかなら文法的には合ってるよな
81デフォルトの名無しさん:2005/12/14(水) 19:43:58
>>68
この展開ってできるんですか?! いろいろテストしても書式エラーになってしまう...
いままで逆マップはforで作ってたけどこれやりたい
82デフォルトの名無しさん:2005/12/14(水) 19:48:33
微妙に間違ってね?

my %reverse_hash = ();
my @hoge = qw(a b c);

@reverse_hash{@hoge} = (0 .. $#hoge);
83デフォルトの名無しさん:2005/12/14(水) 19:49:32
>>81
打ち間違い。わりいわりい。
@hash{@a} = 0..$#a;
84デフォルトの名無しさん:2005/12/14(水) 19:50:31
そろそろベンチマーク厨の出現
8581:2005/12/14(水) 20:04:41
>>82-83 できました。ありがとうございまっする
86デフォルトの名無しさん:2005/12/14(水) 20:10:48
>>79
その配列、確か先日5000万突破してんねんで。メチャメモリ喰ってんぜ
87デフォルトの名無しさん:2005/12/14(水) 20:14:27
オラにTieしてあとはがんがれww
88デフォルトの名無しさん:2005/12/14(水) 20:16:34
ActivePerlで階乗の計算をさせてたら、
171!で1.#INFという結果になってしまいました

もっと大きい数を扱うにはどうすればいいですか?
89デフォルトの名無しさん:2005/12/14(水) 20:22:47
90デフォルトの名無しさん:2005/12/14(水) 20:40:58
解決しますた

newだけでいいのか、楽だ
91デフォルトの名無しさん:2005/12/14(水) 21:12:57
5.8以上の環境があるならbigintプラグマ使う手も
use bigint;
まあ、中身はMath::BigIntだけどね
92デフォルトの名無しさん:2005/12/15(木) 09:37:30
最近なんか流行ってるフレームワークとかある?
93デフォルトの名無しさん:2005/12/15(木) 10:01:15
質問させて下さい
C言語のcharのように文字を操作したく、現在
@chars = split(//, $string);
こんな事してるんですが、もっと効率のいい方法ってありますか
よろしくお願いします
94デフォルトの名無しさん:2005/12/15(木) 10:12:12
>>93
逆説的だがC言語のようには操作しないのが一番。
Perlならもっと高級な文字列操作ができるのでうまく使え。
95デフォルトの名無しさん:2005/12/15(木) 10:32:06
と言っても1文字ずつじゃないと出来ないことだって多いだろ
96デフォルトの名無しさん:2005/12/15(木) 10:48:01
>>93
1文字ずつに分解するのはそれが楽。
でもCっぽくってことならunpackとpackを使った方がいいと思う。
そうでなければsubstrとかでいちいち文字列の長さを使って操作することになる。

それにしてもわざわざC風に扱いたくなるPerlの文字列処理ってなんだろう?
97デフォルトの名無しさん:2005/12/15(木) 10:48:09
そんなに無い。
9893:2005/12/15(木) 11:15:47
皆さん回答どうもありがとうございます
物凄い複雑な正規表現を使うより、
C風に扱った方が後々メンテする人が楽だと思いました。
すみませんでした。
99デフォルトの名無しさん:2005/12/15(木) 11:42:17
>>98
ケースバイケースだけど、多くのロジックは正規表現を上手く使えば、
C 風の文字列処理よりずっとスッキリする。複雑だな、と感じるのは
正規表現に対する理解が足りないからじゃね?

メンテナンスする人間も正規表現(ひいては Perl)に対する理解が浅いと
いうことが今の時点で分かりきってるなら、開発言語を変えることを勧めるよ。
10056:2005/12/15(木) 12:09:18
>>64
遅レスだけど遅延ロードはOSの実装ではなく
ヘルパライブラリの実装であることに気付いた今日この頃。
いまターゲットにしているBorlandでも
遅延ロード&インタプリタ駆動はできました。

あとはライブラリが見つからなかった際のエラーハンドリング。
101デフォルトの名無しさん:2005/12/15(木) 12:32:12
Perl5.6でも標準でEncodeモジュールって入ってたっけ
102デフォルトの名無しさん:2005/12/15(木) 12:48:18
ActivePerlにはWindowsのDLL関数をロードできるモジュールがあるけど
UNIXのPerlにはsharedLibraryの関数を直接ロードできるモジュールってあるの?
103デフォルトの名無しさん:2005/12/15(木) 12:52:02
あるあるwwww
ねーよwww
104デフォルトの名無しさん:2005/12/15(木) 12:58:13
105デフォルトの名無しさん:2005/12/15(木) 13:02:02
>>104
どうもありがとう
106デフォルトの名無しさん:2005/12/15(木) 19:00:47
ものすごい複雑な正規表現をC風に扱ってメンテし易いとは思えないずら。
近頃は佐藤くんや鈴木さんでもエディタの検索窓で正規表現使えるんだから。
107デフォルトの名無しさん:2005/12/15(木) 22:58:27
>>92
Web系ならCatalystじゃね?
108デフォルトの名無しさん:2005/12/15(木) 23:05:08
いるよね。変数に$を付けただけの C みたいなスクリプト書くヤツ。
C に無い関数はほとんど使わない。
正規表現やハッシュを一切使わない。
for とかも for $val ( @array ) { print $val } じゃなく 
for($i=0;$i<$max;$i++){ print $array[$i] } みたいに必ず添字付きだし。

自分には理解しづらくてメンテしにくい。
人それぞれだからかまわないんだろうけど...

自分の書いたスクリプトも、そいつにしてみたらすごく変に見えるんだろうなぁ。
109デフォルトの名無しさん:2005/12/15(木) 23:13:35
>>108
> いるよね。変数に$を付けただけの C みたいなスクリプト書くヤツ。

Cに移植する可能性も考えて試験的実装をしてみるというケースもあるけどな。
110デフォルトの名無しさん:2005/12/15(木) 23:21:47
>>108
 C言語使える人の数 >>>> Perl 使える人の数
そもそも Perl わかりにくい。
なんで変数に$を付けないといけないんだ?
読みにくくてしかたない
111デフォルトの名無しさん:2005/12/15(木) 23:24:47
ここはPerlスレなんだからそんな事言うのもどうかとw
112デフォルトの名無しさん:2005/12/15(木) 23:37:12
>>110
( Д )   ゚ ゚
113デフォルトの名無しさん:2005/12/15(木) 23:58:36
Perlで関数を動的に呼び出すにはどうしたらいいですか?

&call("&disp();");

sub call(){
my $func = shift;
eval $func;
}

sub disp(){
print "Hello!!";
}

ってなことをやりたいんですが、もう少しエレガントな方法はないものかと。。。
114デフォルトの名無しさん:2005/12/16(金) 00:02:55
>>113
ふつうに eval( "disp()") しない理由は何?
115デフォルトの名無しさん:2005/12/16(金) 00:05:23
$func_name = 'test';
&{$func_name};
116113:2005/12/16(金) 00:10:41
>>114
きゃあ!

>>115
おお!

ありがとうございました(ぺこ)
117デフォルトの名無しさん:2005/12/16(金) 00:49:50
正規表現に適していない解析処理を無理矢理正規表現で
書かれるとコメントがついていても意図が汲み取れない
ケースが出てくる
何でも正規表現で書こうとするのは病気
118デフォルトの名無しさん:2005/12/16(金) 01:17:10
>>117
そもそも、そういうケースって Perl で処理するのに向いてるのか?
具体例を示さないと。
119デフォルトの名無しさん:2005/12/16(金) 02:56:11
>>113
動的ってのが、文字列からプサブルーチン名を得ないと
イケナイノならeval なのだけど、
たいていのケースではサブルーチンのリファレンスで事足りるのでね?
120デフォルトの名無しさん:2005/12/16(金) 03:21:34
>>113
my %sub = (foo => \&foo, bar => \&bar, error => \&error);
sub call {
  my $name = shift;
  $sub{ UNIVERSAL::isa($sub{$name}, 'CODE') ? $name : 'error' }->(@_);
}
call(foo => 0..4);

このページ全部読んでおく事を勧める。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq7.html
121デフォルトの名無しさん:2005/12/16(金) 05:57:27
しばらくperl手がけてて、久しぶりにCに戻ったら
変数に$付けたくて仕方なし
122デフォルトの名無しさん:2005/12/16(金) 13:13:18
WWW:::mechanizeを使用して、”NEXT”というイメージリンクをクリックして
リンク先のコンテンツをGETし続けたいのですが、
url_regex や text_regex、また、n=> も指定できない状況にあります。
HTMLソースの中で指定できるのは、NEXTというイメージリンクのURLである
<img src="http://www.hoge.com/hoge.gif" border="0">の
http://www.hoge.com/hoge.gifなのですが
これを使ってうまく次のページをGETする方法はありますか。もし知ってたら
方法を教えていただけますか
123デフォルトの名無しさん:2005/12/16(金) 13:42:05
>>122
ここはCGIのスレじゃないです。
124デフォルトの名無しさん:2005/12/16(金) 13:52:21
>>123
おちつけ
125デフォルトの名無しさん:2005/12/16(金) 14:18:21
>>122
<a href="hoge.html"><img src="hoge.gif"></a>

というリンクを含んだコンテンツを食わせて$mech->links()で
WWW::Mechanize::Linkオブジェクトをとりだしてみたが、
imgタグを特定できるような情報がないので今のままじゃ
どうにもならないと思われる。かろうじてimgがふくまれていた
というのが[IMG]でわかる程度だな。

$VAR1 = [
bless( [
'hoge.html',
'[IMG]',
undef,
'a',
bless( do{\(my $o = 'http://example.jp/foo.html')}, 'URI::http' ),
{
'href' => 'hoge.html'
}
], 'WWW::Mechanize::Link' )
];
126デフォルトの名無しさん:2005/12/16(金) 15:05:52
ハッシュを使ったときにキーの部分検索をすることは出来ますか?

$hoge{'aaa'} = 0;
$hoge{'bbb'} = 1;
$hoge{'cac'} = 2;
$hoge{'ddd'} = 3;

でキーに'a'を含むもの

$hoge{'aaa'} = 0;
$hoge{'cac'} = 2;

を取り出すように。
127デフォルトの名無しさん:2005/12/16(金) 15:09:02
keysでキーだけ取り出して、条件に合っていたらやりたいことをやる。
128デフォルトの名無しさん:2005/12/16(金) 15:43:08
129デフォルトの名無しさん:2005/12/16(金) 15:52:03
>>126
「効率的に」ってことであればデータ構造の持ち方を考えるしかない。
単純にってことだったら grep keys なんかでいいんでは?

@hoge{grep(/a/, keys %hoge)
130デフォルトの名無しさん:2005/12/16(金) 16:04:44
モジュール使うときそこで使いたい機能(ユーティリティ的なモジュール群と思ってください…)があり、
そのモジュールにある他の関数などを使わない場合、
use Hoge qw( 使う関数 );
を使うとモジュールの読み込みは早くなりますか?
131デフォルトの名無しさん:2005/12/16(金) 16:13:23
>>130
モジュールの実装にもよるが通常はExportしてるだけだからならない
逆に言えばなる物も有り得る
132デフォルトの名無しさん:2005/12/16(金) 16:15:06
>>130
>>131 に補足。
http://perldoc.jp/docs/perl/5.8.0/AutoLoader.pod
CGI.pm も自前で遅延コンパイルしているな。

使用する関数を明示する意味で use Hoge qw( ... ) する事もある。
133デフォルトの名無しさん:2005/12/16(金) 16:19:10
>>128
ちょっと見てみました。
なんかできそうです。今から試してみます。
ありがとうございます!
134デフォルトの名無しさん:2005/12/16(金) 23:37:40
書き込みと評価システムがくっついたような、amazonの評価システムみたいなcgiはperlでできますか?
135デフォルトの名無しさん:2005/12/16(金) 23:41:17
もちろん出来るが藻前にはできん
スレ違いもしくは板違い
136デフォルトの名無しさん:2005/12/17(土) 00:23:18
cgiスレで聞いてきます。
137デフォルトの名無しさん:2005/12/17(土) 05:17:56
perlで積分させる方法を教えて下さい。
式は自分で書けます。
138デフォルトの名無しさん:2005/12/17(土) 06:46:57
>>137
use Math::Matlab;
139デフォルトの名無しさん:2005/12/17(土) 19:54:43
Matlabを使うしかないのでしょうか。そもそもモジュールの使い方も理解しているわけではないのでで、
他の方法があったらおながいします。
140デフォルトの名無しさん:2005/12/17(土) 20:00:15
理解しろ
141デフォルトの名無しさん:2005/12/17(土) 20:41:01
HTML::Parserでハンドラの中でフラグを立てて、他の
ハンドラでそれを参照したりしたいのですが、
グローバル変数を使う以外の方法はないでしょうか?
142デフォルトの名無しさん:2005/12/17(土) 22:21:04
>>141
クロージャ
143デフォルトの名無しさん:2005/12/18(日) 01:05:20
質問というか、思いついたお題を一つ。

ある二つの正規表現がある。
ただし限定条件として、どちらも/^foo$/の形式を取る。

両方の正規表現にマッチする文字列を一つ見つけるか、
もしくは一つも存在しないことを示したい。さてどうする?
144デフォルトの名無しさん:2005/12/18(日) 01:13:52
日本語でおk
145デフォルトの名無しさん:2005/12/18(日) 01:17:53
>>143
とりあえず ?{ } や ??{} が登場したら解くのをあきらめて逃げる。
146デフォルトの名無しさん:2005/12/18(日) 02:35:23
日付や時刻を扱うモジュールってないんですか?
147デフォルトの名無しさん:2005/12/18(日) 03:22:34
>>146
標準モジュールもさがせないんですか?

低脳な質問はWebProg板でしてね。
ここはPerlのプロフェッショナル専用のスレだから
148147:2005/12/18(日) 03:23:27
誤爆スマソ
149デフォルトの名無しさん:2005/12/18(日) 03:29:22
>>146
あるよ。なにしたいの?
150146:2005/12/18(日) 04:58:48
いえ、聞いてみただけです。
151デフォルトの名無しさん:2005/12/18(日) 13:46:10
>>149
時刻オブジェクトの保持と、strptime()やstrftime()を
効率良くやりたいんです。POSIX.pmはstrftime()しか
無いしリソースを食うので…
152デフォルトの名無しさん:2005/12/18(日) 16:35:18
んー、Time::Pieceとか?
153デフォルトの名無しさん:2005/12/18(日) 18:58:15
漏れの好みはTime::Formatだな。

ところで、%{パッケージ::}というハッシュにアクセスすると、
そのパッケージ内の変数・関数・子パッケージすべて列挙できるんだな。
さっき必要性があって調べたら、こんな方法とは目から鱗だった
154デフォルトの名無しさん:2005/12/18(日) 19:18:12
>>153
155デフォルトの名無しさん:2005/12/18(日) 19:19:20
#動かない。
&{
 my $sub= sub{
  print $_[0];
  $sub->("再起\n");
 };
}("初起\n");


#動く。
&{
 my $sub; $sub= sub{
  print $_[0];
  $sub->("再起\n");
 };
}("初起\n");



コンパイル時でのmyとsubの認識の順番が原因と思ったのですが、正解でしょうか?
代入演算子が右側から処理していくため、コンパイル時も右からの認識と言うことでしょうか??
もしそうだとしたら、コンパイルは静的にレキシカルであってほしい。
見た目とスコープが噛み合わないのはいかがなものだろう。
よって、この処理結果を改善してほしい。
156デフォルトの名無しさん:2005/12/18(日) 21:21:17
>>155
順番じゃなくてスコープの問題。
myが左辺で使われた時、右辺はmyのスコープ外。

my $a = $a; で、左辺の$aと右辺の$aは別の変数。
my $sub = sub {...;$sub->...;}; でも同じ。
左辺の$subと右辺の$subは別の変数。
157デフォルトの名無しさん:2005/12/18(日) 21:51:32
そっか、ありがと。
右辺に{}があるときは実行時にその定義を変更してほしいですな。

実行そのものは、リファレンス代入のほうが先にされるわけだし…。
これは順番が噛み合わなくなって変になる仕様だ。
158デフォルトの名無しさん:2005/12/19(月) 02:41:28
>>157
その方が仕様として整合性が取れないじゃないか。逆に直感的じゃなくなるよ。
159デフォルトの名無しさん:2005/12/19(月) 04:37:51
>>151
localtime とか time とか use Time::Local して timelocal 使うとか。
文字列に変えたり文字列から値を切り出したりするのは perl だから
自分で作っても大差ないような気がする。
160デフォルトの名無しさん:2005/12/19(月) 11:04:52
Unix(Linux)でユーザの管理を行いたいんですが
それに適したモジュールや解説ページなどはないでしょうか
161デフォルトの名無しさん:2005/12/19(月) 13:51:51
PAM/LDAP でまずは組むってのはどう?
162デフォルトの名無しさん:2005/12/19(月) 20:56:32
なぁ・・
$buf eq 'hoge'
より
$buf =~ /^hoge$/
の方が早いのはなんで・・?
163デフォルトの名無しさん:2005/12/19(月) 22:18:53
>>162
たぶん、測定時の$bufが、パターンが成立可能な文字列長よりも短かったから。
164デフォルトの名無しさん:2005/12/20(火) 00:13:29
htmlの特定タグを削除したいのですが <html>・改行・・改行・</html>
途中で改行があると、動作しません。改行をはさんだ削除はどうすればいいでしょうか?
改行あると動作しないソース

#!C:/perl/bin/perl
$file="a.txt";
$outfile="result.txt";
open (IN, $file) ;
open (OUT, ">$outfile") ;
while (<IN>) {
s/<.*?>//g;
print OUT $_;
}
close (IN);
close (OUT);
165デフォルトの名無しさん:2005/12/20(火) 00:49:39
>>164
メモリに余裕があるなら1行ずつじゃなくて一度に全部読み込めば簡単。
どうしても1行ずつ処理したければ状態をもって頑張れ。
166デフォルトの名無しさん:2005/12/20(火) 01:04:45
HTMLを1行ずつ処理するのは間違ってる
167デフォルトの名無しさん:2005/12/20(火) 03:28:14
つか、タグの削除やるんならそういうモジュールなかったっけ?
普通に正規表現でやると結構失敗するよ。
168デフォルトの名無しさん:2005/12/20(火) 03:43:11
html::TagFilter かな
169デフォルトの名無しさん:2005/12/20(火) 04:43:33
というか BEGIN〜ENDの間を削除したいだけなんですが。もう5時間ググったけどまだ分からん。
検索で出てくる例は while( 使ったものばかりで複数行だと使えないし・・・

置換コマンドは分かるんです  s/<image(.|\n)*>//ig  <image..改行・・改行・・>を削除できる
実際に動くスクリプトが作れなくて。

BEGIN
aaa
sd
??
END

BEGIN〜ENDを削除したい。
170デフォルトの名無しさん:2005/12/20(火) 06:55:47
>>169
・$/(入力レコードセパレータ)をundefとか、local $/してから読み込む
 行で読んでから@htmlをjoinするのもいい
 htmlまとめてスカラ変数に入ったらsオプションつけて置換実行

・どうしても1行ずつやりたい時はflagを1個使えばいい
while(<HANDLE>){
  $flag and s!.*END!! ? $flag=0 : next;
  s!BEGIN.*END!!g;
  $flag = s!BEGIN.*!!;
  print;
}
171デフォルトの名無しさん:2005/12/20(火) 06:59:16
例えば
30C2 → (30*29)/(2*1)

mCn
の形でmとnを入力して実行させたい場合、どのような式にすればいいのでしょうか。
172デフォルトの名無しさん:2005/12/20(火) 08:21:03
>>170
ありがとうございました。キーワードいただいたらすぐにできました。
while (<IN>) { の前に undef $/; を一行足すとできました。

#!C:/perl/bin/perl
$file="a.txt";
$outfile="result.txt";
open (IN, $file) ;
open (OUT, ">$outfile") ;
undef $/;
while (<IN>) {
s/BEGIN(.|\n)*END/BEGIN\r\nEND/ig;
print OUT $_;
}
close (IN);
close (OUT);
173Lavi:2005/12/20(火) 11:21:32
#! /usr/local/bin/perl

require "jcode.pl";
require "cgi-lib.pl";
require "apply.pl";

の呼び方だと動くのですが、

cgi-binディレクトリの中に、これら3つのplファイルを入れて

require "./cgi-bin/jcode.pl";
require "./cgi-bin/cgi-lib.pl";
require "./cgi-bin/apply.pl";

のように、呼んだとたん、以下のようにエラーが出てしまいます。
Premature end of script headers: confirm.cgi, referer: http://localhost/official/demae/menu.html
Can't locate ./jcode.pl in @INC (@INC contains: C:/usr/local/lib C:/usr/local/site/lib .) at ./cgi-bin/cgi-lib.pl line 2.\r, referer: http://localhost/official/demae/menu.html
Compilation failed in require at C:/Program Files/Apache Group/Apache2/htdocs/official/demae/confirm.cgi line 5.\r, referer: http://localhost/official/demae/menu.html
File does not exist: C:/Program Files/Apache Group/Apache2/htdocs/favicon.ico
どうしたら、よいでしょう?
174デフォルトの名無しさん:2005/12/20(火) 11:37:18
cgi-bin に入れたら動かんじゃなかったっけ?
175デフォルトの名無しさん:2005/12/20(火) 13:33:06
>>173
エラーメッセージを読んで、どんなエラーか理解すればいいよ。

以下は、エラーメッセージが理解できない人向け。
require './cgi-bin/jcode.pl';
$INC{'./jcode.pl'}=$INC{'./cgi-bin/jcode.pl'};
require './cgi-bin/cgi-lib.pl';

念の為、こんなの普通は使わないからな。
176デフォルトの名無しさん:2005/12/20(火) 14:24:44
テンプレートについて質問です。
perlのテンプレートの種類にTemplate Toolkitがありますが、
foreachなどもっと楽に記述できるテンプレートはないですか?

template toolkitの場合
[% FOREACH temp=list %]
[% temp %] :
[% END %]

これを
[%
foreach @a{
$a;
}
%]
みたいな、perlそのままでかけるような感じのテンプレートはないでしょうか?
177デフォルトの名無しさん:2005/12/20(火) 14:25:36
まちがえた…$a;でなく$_ですね
178デフォルトの名無しさん:2005/12/20(火) 15:08:54
>>176
Template Toolkitなら

[% PERL %]
...
[% END %]

でいいんでねーの。オプションで使えるようにしとく必要はあるが。
179デフォルトの名無しさん:2005/12/20(火) 15:16:31
>>178
そんなのがあったんですか…
180デフォルトの名無しさん:2005/12/20(火) 15:27:26
> [%
> foreach @a{
> $a;
> }
> %]

テンプレート使ってる意味ないし。
181デフォルトの名無しさん:2005/12/21(水) 00:38:00
>>164
全部繋げろや。HTMLはread()で塊全部読め。
それから s/\s+/ /g; だ。これやると <pre></pre> の中が失敗するが、気にするな。捨てろ。
182デフォルトの名無しさん:2005/12/21(水) 05:49:16
あるライブラリがそのperlに含まれているかどうかを調べるにはどうしたらいいんでしょうか。
183デフォルトの名無しさん:2005/12/21(水) 11:05:39
>>182
http://pc8.2ch.net/test/read.cgi/tech/1131286411/307

> 307 名前:デフォルトの名無しさん[sage] 投稿日:2005/11/18(金) 17:10:06
> >>306
> BEGIN {
>  eval "use Hoge"; # try
>  if ($@) { # catch
>   # モジュールが無かった
>  } else {
>   # モジュールがあった
>  }
> }

的外れな回答だったかな?
184デフォルトの名無しさん:2005/12/21(水) 11:19:54
自力で探すとしても
if( grep { -e "$_/Hoge.pm" } @INC ){
# モジュールがあった
}
185デフォルトの名無しさん:2005/12/21(水) 12:28:54
対象のサーバに接続して、サーバのSSL証明書の有効期限を
表示するスクリプトを作成しています。

Crypt::SSLeayはほぼLWPでのHTTPSアクセス専用みたいだったので、
Net::SSLeayを使えば出来そうだと考え、試しに、

use Net::SSLeay;
($reply, $err, $server_cert) = Net::SSLeay::sslcat('ほげほげ.jp', 443, '/');
print Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_subject_name($server_cert)) . "\n";

などとしたところ、証明書のサブジェクトが表示されました。
同様に有効期限も取得できると思い、

print Net::SSLeay::X509_get_notBefore($server_cert) . "\n";
print Net::SSLeay::X509_get_notAfter($server_cert) . "\n";

などとしましたが、なんだか良く分からない数字が出てきます。
(アクセスするごとに違う(増えたり減ったりする)ので、これは時刻ではなさそうです。)

opensslのソースを見てみましたが、私はCが分からないため、
意味不明です。

具体的にどのようにすれば有効期限を取得できますか?
186デフォルトの名無しさん:2005/12/21(水) 13:44:45
>>185
戻り値がASN1_UTCTIMEとかいう形式なので、
Net::SSLeay::P_ASN1_UTCTIME_put2stringを通せばいい

Net::SSLeay付属のQuickRefというファイルに書いてあるよ。
いまいち不親切なドキュメントだが。

$asn1_utctime = Net::SSLeay::X509_get_notBefore($x509);
$asn1_utctime = Net::SSLeay::X509_get_notAfter($x509);
$x509_name = Net::SSLeay::X509_get_subject_name($x509);
$x509_name = Net::SSLeay::X509_get_issuer_name($x509);
Return information from a certificate.

$string = Net::SSLeay::P_ASN1_UTCTIME_put2string($asn1_utctime);
Convert a asn1_utctime structure to a printable string.


187デフォルトの名無しさん:2005/12/21(水) 17:42:52
モジュールでEXPORTに設定されてない関数を
my $hoge = HOGE::not_export_function( $tmp );
のように呼び出すことができるのですが、これはアリなんですか?
EXPORTとlib hoge qw( ... )は使用関数を明示したりするためだけにあるのでしょうか?
速度的にかわったりしますか?
188デフォルトの名無しさん:2005/12/21(水) 18:59:35
エクスポートって単なる namespace の問題でね?
189デフォルトの名無しさん:2005/12/21(水) 21:11:11
質問です。

$a=['任意のstring'] のとき $a->[0] として print させたいのですが、
この場合はいいとして、$a=[{}] のとき、$a->[0] として表示させると、
HASH(0x??????)というアドレスが入ってしまいます。
表示させる前に、$a が ['任意のstring'] か [{}] かチェックしたいのですが、
うまいチェックの仕方がないでしょうか?

お願いします。
190デフォルトの名無しさん:2005/12/21(水) 21:13:36
>>189
ref $a->[0] で判定できるお
191デフォルトの名無しさん:2005/12/21(水) 21:34:48
できました。ありがとうございます。
ただ、$a=['string'] の場合は、ref の戻り値がありませんね。
192デフォルトの名無しさん:2005/12/21(水) 21:45:44
>>191
'string'はリファレンスじゃないから
193デフォルトの名無しさん:2005/12/21(水) 22:36:43
ある処理の開始時にダイアログボックスを表示させ、処理が終わった時にダイアログボックスを消したいのですがどのようにすれば良いでしょうか?

ダイアログを表示した時点でメインの処理が止まってしまうので困っています。

ダイアログはPerl/Tkで表示しています。
194デフォルトの名無しさん:2005/12/21(水) 23:32:31
マルチスッドレ!
195デフォルトの名無しさん:2005/12/22(木) 03:31:10
前スレにも似たような内容あったな。
threadは無理だったはず。
196デフォルトの名無しさん:2005/12/22(木) 06:38:47
>>193
最初に $dialog->update; で表示して、最後に $dialog->destroy; で破棄。
処理の最中は定期的にDoOneEvent(0); の呼び出し。
197デフォルトの名無しさん:2005/12/22(木) 16:43:04
こんにちは、トムです。

ファイルのタイムスタンプを取得したいのデスが、
どうするのが一番簡単でしょうか。
年月日時分秒 までほしいところデス。
198デフォルトの名無しさん:2005/12/22(木) 16:45:20
はじめまして、トム。
わたしはエミリー・ブラウンです。
Perlスレへようこそ。
199デフォルトの名無しさん:2005/12/22(木) 16:55:27
>197
やあトム、お姉さんは元気かい?

http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq5.html#how_do_i_get_a_file_s_timestamp_in_perl

つーか困ったらとりあえずググれや。
200デフォルトの名無しさん:2005/12/22(木) 17:11:18
モジュール内におけるBEGINの処理について質問です

use Exporter;
use vars qw( @ISA @EXPORT );
@ISA = qw( Exporter );
@EXPORT = qw( sub1 sub2 );


use Exporter;
use vars qw( @ISA @EXPORT );
BEGIN {
 @ISA = qw( Exporter );
 @EXPORT = qw( sub1 sub2 );
}
の違いが分かりません。
あえてBEGINにするのには何か意味があるのですか?
201デフォルトの名無しさん:2005/12/22(木) 19:13:14
よほど最初に実行させたいとか
202デフォルトの名無しさん:2005/12/22(木) 19:42:28
>>199
トムです。

おかげでタイムスタンプが見事にゲットできたデス。
ありがとう。お礼に姉さんを紹介するよ。
203デフォルトの名無しさん:2005/12/22(木) 20:11:26
Hi! スーザンよ。 弟がお世話になったわね。
ところで私も質問があるの。

UNIX時間を適当にフォーマットしたいけれど
どうするのが一番簡単かしら。
"date +'%Y/%m/%d %H:%M:%S' --date '" . localtime($sec) ."'"
とかをopenで実行してたみたいだけど、ダサいのよね
204デフォルトの名無しさん:2005/12/22(木) 20:31:37
#!/usr/bin/perl
use strict;
my $mode = $ARGV[0] || $ENV{QUERY_STRING};
print "Content-type:text/plain\n\n" if exists $ENV{QUERY_STRING};
print $::{$mode} ? $::{$mode}() : "undefined\n";
sub aaa { "im aaa\n";}

このスクリプトをsetuid+CGI経由で実行すると
Can't coerce GLOB to string in cond_expr at hoge.cgi line 5.
と怒られてしまうのですが何かグッドアイディアはありませんでしょうか。
205デフォルトの名無しさん:2005/12/22(木) 20:45:38
>>203
use POSIXしてstrftimeを使うのがまあ楽といえば楽かな。
206デフォルトの名無しさん:2005/12/22(木) 22:52:12
>>204
"Taintモード" でgoogle検索ってのはどうだ?

204みたいな場合だと、
my $mode;
my $m = $ARGV[0] || $ENV{QUERY_STRING};
for my $s qw(aaa) {
$mode = $s if $m eq $s;
}
print $::{$mode} ? $::{$mode}() : "undefined\n";
sub aaa { "im aaa\n";}

あたりでの汚染除去が無難という気がする。
207デフォルトの名無しさん:2005/12/22(木) 23:35:16
>>206
検証過程で
($mode) = $mode =~ /(.*)/;
としても改善しなかったのですが再度検証したら
別の部分で間違ってたらしく自分の勘違いでした。
ありがとうございます。
208デフォルトの名無しさん:2005/12/24(土) 04:43:55
>>203

$time_string = sprintf('%6$4d/%5$02d/%4$02d %3$02d:%2$02d:%1$02d', (@temp=(localtime $sec)[0..5], $temp[5]+=1900, $temp[4]++));
209デフォルトの名無しさん:2005/12/24(土) 06:23:21
>>208
どう見ても POSIX::strftime() を使うべきです。
本当にありがとうございました。
210デフォルトの名無しさん:2005/12/24(土) 07:26:19
慌てて >>203 とマジレスしたのですが、どうみても既出です。
本当にありがとうございました
211デフォルトの名無しさん:2005/12/24(土) 11:47:49
C言語でのファイル操作ができるようになったので、次はperlを覚えたいのですが

入門にはオライリーの『はじめてのPerl』が良いのでしょうか?
それとも駱駝の本の方が後々手元に置いておくには良い本なのでしょうか
212デフォルトの名無しさん:2005/12/24(土) 12:12:07
書棚に並べておくには駱駝本のほうが格好いいね。
213デフォルトの名無しさん:2005/12/24(土) 14:04:33
PerlはWeb上の情報だけで十分かと
214デフォルトの名無しさん:2005/12/24(土) 16:04:26
わーい明日はクリスマスだぁ
215デフォルトの名無しさん:2005/12/24(土) 16:36:19
>>211
ttp://naoya.dyndns.org/~naoya/mt/archives/000657.html

ラクダ本買う金があったら、perldoc でごまかしながら

- Effective Perl
- Perl デバッグ
- Perl プログラミング救命病棟

あたり買っとけって。絶版が混じってるけど。
216デフォルトの名無しさん:2005/12/24(土) 18:37:41
>>211
どうするのが一番良いのかは、君の才能の程度によって変わってくる。

217デフォルトの名無しさん:2005/12/24(土) 20:50:36
http://www.perldoc.com/ が見れないのはなんでですか?
218デフォルトの名無しさん:2005/12/24(土) 21:14:53
あー全部お前を食べるためだよ
219211:2005/12/25(日) 03:13:25
>>213
>>215
webから勉強を始めたいと思います。
参考になりました。有難うございました
220デフォルトの名無しさん:2005/12/25(日) 15:02:49
cpan.jp最近広告ふえて鬱陶しいです。
クリックしてもらえるとおもってるんですかね?
221デフォルトの名無しさん:2005/12/25(日) 21:42:21
思ってるから付けるんでしょうね
222デフォルトの名無しさん:2005/12/26(月) 00:26:40
やー別にいいじゃん。
つか、復活してるの知らなかったヨ。
223デフォルトの名無しさん:2005/12/26(月) 02:23:17
メール送信CGIを作っているんです
Perlチェック(Kent WEBで配布されているもの)ではえらーなしなんですが、なぜか設置すると500エラーになってしまいます。
何が原因か分かりますでしょうか?
ちなみに設置場所はland.to
#!/usr/bin/perl

use strict;
use CGI;
require"./jcode.pl";

my $mailPath='/usr/sbin/sendmail';
my $fromAddress='[email protected]';
#引数を取り込む
my $cgi = CGI::new();
my $address = $cgi->param('address');
my $subject = $cgi->param('subject');
my $body = $cgi->param('body');

#エンコード
my $enc_sub = &Base64Encode($subject);
&jcode'convert(*body,'jis');

if($address !~/^.+@.+$/){ &error('Input Error','addressを入れてください。');}
if($enc_sub =~/^\s*$/){ &error('Input Error','SUBJECTを入れてください');}
if($body =~/^\s*$/){ &error('Input Error','BODYを入れてください');}
224デフォルトの名無しさん:2005/12/26(月) 02:25:05
>>223
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
225デフォルトの名無しさん:2005/12/26(月) 02:26:41
つーか、>>1 ぐらい読めや、カス
226デフォルトの名無しさん:2005/12/26(月) 02:29:15
#続き

if(open(SENDMAIL,"| $mailPath")){
print SENDMAIL<<"EOM";
From:$fromAddress
To:$address
Subject:$enc_sub
MIME-Version:1.0
Content-Type:text/plain; charset="ISO-2022-JP"

$body
EOM
close(SENDMAIL);
} else {
&error('System Error','システムエラー');
}

print<<"EOM";
Content-type:text/html

<html><head>
<title>Submarine mail</title>
<META HTTP-EQUIV="Content-Type"CONTENT="text/html;CHARSET=Shift-JIS">
</head>
<body>
送信完了
</body></html>
EOM
227デフォルトの名無しさん:2005/12/26(月) 02:30:53
#続き2です
sub Base64Encode {
my ($target) = @_;
my ($base) = "ABCDEFGHIJKLMNOPQRSTUVWXWZ"

."abcdefghijklmnopqrstuvwxyz"
."0123456789+/";
my $eStr ="";
&jcode'convent(*target,'JIS');
my $pStr = unpack("B*",$target);
for (my $i = 0; my $cStr = substr($pStr,$i,6); $i+= 6) {
$eStr .=substr($base,ord(pack("B*","00" .$cStr)),1);
if (length($cStr) ==2) { $eStr.="==";}
elsif (length($cStr) ==4) { $eStr.="=";}
}
return("=?iso-2022-jp?B?$eStr?=");
}
sub error {
my ($mes,$com) =@_;
print<<"EOM";
Content-type: text/html
<html><head><title>$mes</titie>
<META HTTP-EQUIV="Content-Type"CONTENT="text/html;CHARSET=Shift-JIS">
</head><body>$com</body></html>
EOM
exit;
}
exit;
1;
228デフォルトの名無しさん:2005/12/26(月) 02:37:15
ウザイ
229デフォルトの名無しさん:2005/12/26(月) 02:51:02
プログラミングの前に、人としての礼儀と気配りを学びましょう。
230デフォルトの名無しさん:2005/12/26(月) 02:55:49
すみませんでした。。。
別スレで誘致されたので>>1を見もせず、書き込んでました
迷惑かけて申し訳ありませんでした
231デフォルトの名無しさん:2005/12/26(月) 08:49:25
フォーム解析の為だけにクソ重いCGI.pm使ってる人ってまだ居るんだ・・
232デフォルトの名無しさん:2005/12/26(月) 09:01:22
クソ重い Perl 使っててよく言うよ
233デフォルトの名無しさん:2005/12/26(月) 09:09:52
つ mod_perl
234デフォルトの名無しさん:2005/12/26(月) 10:33:12
perlの入門書を探してるんですが
Windowsでperlを学ぶなら
初めてのPerl Win32システムと
初めてのPerl 第3版

お薦めなのはどちらでしょうか?
235デフォルトの名無しさん:2005/12/26(月) 10:58:41
ネット検索で十二分
236デフォルトの名無しさん:2005/12/26(月) 11:41:05
両方買え。全部読め。
以上。
237デフォルトの名無しさん:2005/12/26(月) 12:58:36
http://i-111.hp.infoseek.co.jp/sakuramochi/
すみません。ユニックスかわからないんですが、ここのカウンターが変になってしまい、困っています。
多分、最後の画像結合処理が上手くいってないと思うんですが、

print &gifcat::gifcat(@dat);#関数を実行して、カウンターの画像をひとつの画像にまとめる
exit; #処理終了

ここの、、、初心者なので全然わからないんですが、誰か教えてたも。
238デフォルトの名無しさん:2005/12/26(月) 12:59:17
間違えました。Perlです。
239デフォルトの名無しさん:2005/12/26(月) 14:59:20
>>234
【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

>>237
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
240デフォルトの名無しさん:2005/12/26(月) 15:59:13
>>239
誘導乙.
でも、237はアニメGIFの各Disposal Methodが2(表示前の状態を復元する)に
なっているのが原因だから、CGI設置だと解決しない気もする。
Perl上で誤魔化すなら s///g 一撃なんだが、「初心者なので全然わかんない」
という相手に誤魔化しを教えるのも気がひける。
241デフォルトの名無しさん:2005/12/26(月) 17:39:53
〇チだろ
242237:2005/12/26(月) 19:51:49
>>240
どこが悪いのかわかっているなら教えていただけませんか?
それとも、初心者に説明するのは難しいですか?
243デフォルトの名無しさん:2005/12/26(月) 20:18:41
初心者ってのは免罪符になるのか?
244デフォルトの名無しさん:2005/12/26(月) 20:32:45
ユカイな釣りか?
245237:2005/12/26(月) 20:57:10
#!/usr/local/bin/perl

$file = "./data.txt"; #変数file=./datta.txtの中身
$gif_file = "./image/"; #GIFファイルまでのアドレス(GIFファイルの入ったフォルダ)



#ファイル読み込み
open (FP,"$file"); #$file=data.txtを開く
$data = <FP>; #変数$dataに<FP>を格納
close(FP); #ファイルを閉じる

#カウント
$data = $data + 1; #$dataに1プラスする処理

#ファイル書き込み
open (FP,">$file"); #変数$fileに$data=<FP>を格納
print FP $data; #$dataの表示
close(FP); #FPを閉じる
246237:2005/12/26(月) 20:57:41
(@dat) = split(//,$data); #$dataファイルの中身を一文字ずつ分割する処理

for($i=0 ; $i <= $#dat ; $i = $i + 1 )
{
$dat[$i] = "$gif_file$dat[$i].gif";
} #ループ($iに0を代入;$iが$#datに入った3桁以下だったらループする;#iに1プラスする)$datを$dat{$i}.gifに置き換える

#HTML表示
#print "Content-type: text/html\n\n"; #おまじない
print "Content-type: image/gif\n\n"; #おまじない
require "./gifcat.pl"; #gifcat.pl読み込み
binmode(OUT);#おまじない

print &gifcat::gifcat(@dat);#関数を実行して、カウンターの画像をひとつの画像にまとめる
exit; #処理終了


こうなっているのですが、どこが悪いのでしょうか?
247デフォルトの名無しさん:2005/12/26(月) 21:01:37
248デフォルトの名無しさん:2005/12/26(月) 21:12:10
use strict; と use warnings; がないところ
249酩酊 ◆TWARamEjuA :2005/12/26(月) 21:46:13 BE:2940293-
KヨNT臭もする悪寒♪
250デフォルトの名無しさん:2005/12/26(月) 21:56:40
Windows2000(IIS5)上で、Perl-CGIを動かそうと
思ったのですが一台もありません。
Windows2003(IIS6)に思い切ってCGIを設置し
ブラウザーで動作確認したのですが
HTTPヘッダーが出力された瞬間に上司に見つかりました。
慌ててソースを修正したと言い訳したのですが
どう見ても精子です。
本当にありがとうございました。

IIS6に移行したら、クッキーの設定内容がブラウザー
表示されているのを見て・・・・・オワタ OTL
251デフォルトの名無しさん:2005/12/26(月) 22:00:21
×Windows2000(IIS5)  ○Windows2000(IIS6)
×Windows2000(IIS6)  ○Windows2000(IIS7)
もうだめぽ
252デフォルトの名無しさん:2005/12/26(月) 22:27:05
正直、何を言いたいのか全然わかりません
253デフォルトの名無しさん:2005/12/26(月) 22:53:04
Windoz-XP のIISでCGI動かしたら、content-type: text/html とか
IEで表示されちゃうってことじゃね。
Javaにしろ、Javaに
254デフォルトの名無しさん:2005/12/27(火) 02:27:14
本当にありがとうございました。
255237:2005/12/27(火) 05:13:23
>>247-248

#!/usr/local/bin/perl

use strict;
use warnings;

$file = "./data.txt"; #変数file=./datta.txtの中身
$gif_file = "./image/"; #GIFファイルまでのアドレス(GIFファイルの入ったフォルダ)



#ファイル読み込み
open (FP,"$file"); #$file=data.txtを開く
$data = <FP>; #変数$dataに<FP>を格納
close(FP); #ファイルを閉じる

#カウント
$data = $data + 1; #$dataに1プラスする処理

#ファイル書き込み
open (FP,">$file"); #変数$fileに$data=<FP>を格納
print FP $data; #$dataの表示
close(FP); #FPを閉じる
256237:2005/12/27(火) 05:14:29
(@dat) = split(//,$data); #$dataファイルの中身を一文字ずつ分割する処理

for($i=0 ; $i <= $#dat ; $i = $i + 1 )
{
$dat[$i] = "$gif_file$dat[$i].gif";
} #ループ($iに0を代入;$iが$#datに入った3桁以下だったらループする;#iに1プラスする)$datを$dat{$i}.gifに置き換える

#HTML表示
#print "Content-type: text/html\n\n"; #おまじない
print "Content-type: image/gif\n\n"; #おまじない
require "./gifcat.pl"; #gifcat.pl読み込み
binmode(OUT);#おまじない

print &gifcat::gifcat(@dat);#関数を実行して、カウンターの画像をひとつの画像にまとめる
exit; #処理終了


これでいいのでしょうか?
257デフォルトの名無しさん:2005/12/27(火) 06:29:28
最近は文頭に自分のURL書くのがはやってるの???
strictつけたら、そのソースじゃうごかないしとりあえずエラーログ見ようね。
あとおまじない多すぎ。binmode(OUT)ってOUTなんか使って無いじゃん。
あと、きになるのは、ファイル読み込み〜ファイル書き込みの間に
複数人のアクセスあったらどうなっちゃうんだろう。
258デフォルトの名無しさん:2005/12/27(火) 06:48:57
どう見てもCGIです。
本当にありがとうございました。
259デフォルトの名無しさん:2005/12/27(火) 08:25:05
見るに耐えないので書き直してみるテスト
use strict;
use warnings;
use IO::File;
use File::Spec;

my $datafile = './data.txt';
my $gif_dir = './image/';

my $fh = new IO::File $datafile, 'r+' or die q|Can't open datafile.|;
flock $fh, 2;
my $count = <$fh>;
truncate $fh, 0;
seek $fh, 0, 0;
print $fh ++$count;
undef $fh;

my @dat = map { File::Spec->catfile($gif_dir, "$_.gif") } split(//, $count);
# 以下CGIのため略

いや、問題の解決にはなってないけどね
260デフォルトの名無しさん:2005/12/27(火) 08:33:12
>>1
> CGIについての質問は板違いです。WEBプログラミング板でどうぞ。

日本語も読めないアホは帰れよ。あぁ、冬休みですか、そうですか。

>>259
> my $fh = new IO::File $datafile, 'r+' or die q|Can't open datafile.|;
$! マジオススメ。perlvar(1) 参照。
261259:2005/12/27(火) 08:51:41
>>260
確かに詳細が含まれているであろうシステムエラーのメッセージを使うべきですね。
今後は$!を使って吐く事にします。指導thx
262デフォルトの名無しさん:2005/12/28(水) 01:59:04
open関数ではなくIO::Fileモジュールを使うのはなぜですか?速くなったりしますか?
263デフォルトの名無しさん:2005/12/28(水) 03:41:08
オブジェクト嗜好
264デフォルトの名無しさん:2005/12/28(水) 03:44:02
至高ですな。
265デフォルトの名無しさん:2005/12/28(水) 04:13:24
シコシコー
266デフォルトの名無しさん:2005/12/28(水) 10:56:32
シコルスキー
267デフォルトの名無しさん:2005/12/28(水) 15:01:05
undef $fhだとエラーとれないから$fh->closeがいいんじゃない?

んでIO::Fileは早くなるどころかopenより遅くなるハズ
じゃぁなんでIO::Fileを使うかだけど
・オブジェクト指向であつかえる
・閉じ忘れてもスコープ抜ければ勝手に閉じてくれる
・グロブつかうと名前空間ぶつかりやすい
 (最近はopen($fh,'filename')でも解決できるが)
・グロブはわたすのめんどくさい
ってとこかな?

http://www.cpan.jp/mirror/perldoc.jp/docs/perl/5.6.1/perlfaq5.podを
読むと参考になるかもしれません。
268デフォルトの名無しさん:2005/12/28(水) 15:33:16
>>267
>>259 みたいに書くなら use Symbol; して gensym() 使うか
>(最近はopen($fh,'filename')でも解決できるが)
で充分だと思うんだ。わざわざ IO::File を使う理由としては
説得力に乏しいな。
269デフォルトの名無しさん:2005/12/28(水) 16:22:55
どうでもいいけど
my $fh = new IO::File $datafile, 'r+' or die q|Can't open datafile.|;
よりも、
my $fh = IO::File->new($datafile, 'r+') or die "Can't open datafile: $!\n";
のが好み。
270デフォルトの名無しさん:2005/12/28(水) 16:26:24
open my $fh, 〜 で十分
271デフォルトの名無しさん:2005/12/28(水) 17:55:14
俺は open(FH 派
272デフォルトの名無しさん:2005/12/28(水) 18:00:36
>>264
至高と究極で対決か。
273デフォルトの名無しさん:2005/12/28(水) 23:03:40
どっちでもいいけどグロブ方式だけはやめた方がいい
何もいいこと無い
274デフォルトの名無しさん:2005/12/29(木) 13:17:01
小数点第2位まで表示するにはどうしたらいいんですか?
275デフォルトの名無しさん:2005/12/29(木) 13:21:58
>>274
printf "%.2f", $n;
276デフォルトの名無しさん:2005/12/29(木) 20:18:55
小数点3位を四捨五入して2位まで表示する方法も教えてください
277デフォルトの名無しさん:2005/12/29(木) 20:32:19
( ´д)ヒソ(´д`)ヒソ(д` )
278デフォルトの名無しさん:2005/12/29(木) 20:47:38
俺の出番だなヽ(´ー`)ノ
279デフォルトの名無しさん:2005/12/29(木) 22:10:31
>>276
負数の扱いはどうしたらいい?
280デフォルトの名無しさん:2005/12/30(金) 02:46:03
>>276
%..2fがそうなんだって

printf "%.3f -> %.2f\n",$_,$_ for( 0.004, 0.005, -0.004, -0.005);
0.004 -> 0.00
0.005 -> 0.01
-0.004 -> -0.00
-0.005 -> -0.01
281デフォルトの名無しさん:2005/12/30(金) 15:26:58
>>280
かならずしもそうとは限らないけどな。
282デフォルトの名無しさん:2005/12/30(金) 16:04:01
round は perl にはねえか。
こうか?
$n = int($n * 100 + 0.5) / 100;
283デフォルトの名無しさん:2005/12/30(金) 16:35:43
int($n+.5)じゃダメなの?
284デフォルトの名無しさん:2005/12/30(金) 16:55:23
負のときどうするの
285デフォルトの名無しさん:2005/12/30(金) 17:58:35
int($n<0?$n-.5:$n+.5)とか?
286デフォルトの名無しさん:2005/12/30(金) 18:03:39
287ヽ(´ー`)ノ ◆.ogCuANUcE :2005/12/30(金) 22:17:02
288デフォルトの名無しさん:2005/12/30(金) 23:48:55
>278
のリンク先に、「int()関数は単純に小数値を取り除き、整数部を戻すので」とありました。
perldoc -f int には「You should not use this function for rounding:」とあります。

四捨五入するため 0.5 を足す場合は int を使っても問題ないのでしょうか? 

問題があるとしたら、 int(6.725/0.025)の結果が 268 になるといったような具体例を教えていただけないでしょうか?

289デフォルトの名無しさん:2005/12/31(土) 00:10:18
は?

小数計算して最後にintで切り捨てれば何も問題ないと思うが。
というかやってみれば一発でわかることジャン。
290デフォルトの名無しさん:2005/12/31(土) 00:24:07
>268
278 が例に出しているように
print (6.725/0.025) → 269
print int(6.725/0.025) →268
になるのはやってみれば一発でわかる。

切り捨てにintを使うのはやめておいたほうが無難。
291290:2005/12/31(土) 00:26:17
スマソ
番号がめちゃくちゃだ。290 の最初二行は
>289
288が例に出しているように
が正しい
292ヽ(´ー`)ノ ◆.ogCuANUcE :2005/12/31(土) 00:44:38
むー。perlfaq4 にあったや。

Q. Does Perl have a round() function? What about ceil() and floor()? Trig functions?

> Rounding in financial applications can have serious implications, and
> the rounding method used should be specified precisely. In these
> cases, it probably pays not to trust whichever system rounding is
> being used by Perl, but to instead implement the rounding function you
> need yourself.

(IEEE 754 的に)正しい結果が得られたかったら自前で実装するしかないようだ。

>>290
ということは、int($n + 0.5) ではなくて floor($n + .5) がいいんかね?
大人しく Math::Round::round() を使った方がいい気はする(笑)。
293デフォルトの名無しさん:2005/12/31(土) 03:05:58
>>292
>(IEEE 754 的に)正しい結果が得られたかったら
コンピュータ言語はすべて小数演算は自前でごまかすものと思ってたけど、
そうでない言語もあるってこと?
294293:2005/12/31(土) 03:13:28
COBOLは昔から言語側が用意してたね。
295デフォルトの名無しさん:2005/12/31(土) 08:27:31
>>293
意味がわからん。なんのためにCPUにFPUがあったり、OSでエミュレートしたり、
ライブラリ(libm)があると思ってんだ。
296デフォルトの名無しさん:2005/12/31(土) 10:44:35
>>295
あんたの言ってることのほうがおれには意味不明。
297デフォルトの名無しさん:2005/12/31(土) 10:58:46
>>293-294
もちろん、自前の勝手な方法ではなく、(IEEE 754的に)厳密な方法で
行えるモノ(言語とは限らない)もあるよ。
298デフォルトの名無しさん:2005/12/31(土) 16:53:17
汎用的な複数行置換ロジックが欲しいす。>>170にあるようなスカラーにまとめ読みは
10万行くらいのtextには手も足も出ないし、置換するtextのブロックごとの目印を
もとに読み込むやりかたはロジックの使いまわししずらそうでめんどいし。
複数行置換をサポートしたテキストエディタの正規表現置換みたいな使い方ができる
汎用的な複数行置換ロジックがほしいす。
299デフォルトの名無しさん:2005/12/31(土) 17:04:54
s/<image.*>//igs;
じゃだめなの?
300デフォルトの名無しさん:2005/12/31(土) 19:20:03
だめっす。たとえばcal 119988ヶ月分の結果を以下のように整形したいとします。

置換前「\n[0-9]」置換後「」

自分がつかってるエディタの複数行置換だとこれそのまま置換に使うことができるですが
これと同じことをperlでやろうとすると$_がどの行読んでて、ある行にくるまでスカラーに
行をためこみつつ置換して、ある行にきたらprintしてスカラーを解放するみたいな
めんどくささがあってやなのです。

ちなみにおれ>>169じゃないっす。
301デフォルトの名無しさん:2005/12/31(土) 20:51:12
>>300
Tie::File を使うといいかもね。
302デフォルトの名無しさん:2005/12/31(土) 21:49:29
cgi初心者です。
もしスレ違いでしたら誘導お願いします。

perlでパスワード認証cgiを作っています。
認証された人のみサーバーに隠しもっているドコモの着メロ(MLD)が
ダウンロードできるようにしたいのですが、
PCでうまくいっても、携帯だとうまくいきません。
どなたか、お知恵をお貸しくださいませ

□cgiの内容
#!/usr/local/bin/perl
open( IN, "<./test.mld" );
my @data = <IN>;
close(IN);
print "Content-type: application/octet-stream\n";
print "Content-disposition: filename=\"test.mld\"\n";
print "Content-length: @data\n\n";
print @data;

□,htaccessファイルの内容
<Files ~ "\.(mld)$">
deny from all
</Files>

303デフォルトの名無しさん:2005/12/31(土) 22:07:26
うしヽ(´ー`)ノおれにまかせろ
304デフォルトの名無しさん:2005/12/31(土) 22:33:55
>print "Content-length: @data\n\n";

@dataの要素数がプリントされる気がするが
305302:2005/12/31(土) 22:51:17
すいません
変に簡略化したソースのせてしまいました。
実際は

open( IN, "<./test.mld" );
my @data = <IN>;
my $data_len = (-s IN);
close(IN);

として、Content-lengthにdata_lenを使ってますます。
306 【だん吉】 【316円】 酩酊 ◆TWARamEjuA :2006/01/01(日) 01:15:03 BE:2287073-
明けちゃった♪
307デフォルトの名無しさん:2006/01/01(日) 01:28:25
ここはCGIスレじゃないので
308デフォルトの名無しさん:2006/01/01(日) 06:14:55
明けましておめでとう
今年もよろしく
309デフォルトの名無しさん:2006/01/01(日) 11:37:10
>>307
CGIスレってどこにありますか?
310デフォルトの名無しさん:2006/01/01(日) 11:40:40
>>309
その質問がスレ違い。
311デフォルトの名無しさん:2006/01/01(日) 12:45:41
>>310
プ、おまえに聞いてないと思う
312デフォルトの名無しさん:2006/01/01(日) 12:51:12
WebProg板で訊くとよさ気



…で良いんだっけ
313デフォルトの名無しさん:2006/01/01(日) 12:54:03
ネット関係カテゴリのWebProg板へどうぞ
314302:2006/01/01(日) 13:03:09
みなさま、誘導感謝です
スレ汚し大変しつれいしました

ついでに
あけおめ
315デフォルトの名無しさん:2006/01/01(日) 18:03:00
さてはて新年最初の質問は何になることやら
316 【大吉】 【1817円】 :2006/01/01(日) 18:11:09
型グロブとは何ですか?
同じ変数名のスカラー、配列、ハッシュとかをまとめるものじゃないですよね(><)
317デフォルトの名無しさん:2006/01/01(日) 18:21:58
もうそれでいいよ
318デフォルトの名無しさん:2006/01/01(日) 22:41:42
319デフォルトの名無しさん:2006/01/02(月) 02:30:44
CGIの神にお聞きしたいです。

$|=1;

これは何を意味するのでしょうか?
(変数に代入?)
320デフォルトの名無しさん:2006/01/02(月) 02:42:20
>>319
syntax的には $| = 1;。 |= ではない。
意味は man perlvar すれ
321デフォルトの名無しさん:2006/01/02(月) 03:09:36
>>320
調べたら|(縦棒)は定義済み変数なんですね。どもです!

$| 0 以外に設定されると、その時点で選択されている出力チ
ャネルに write や print を行なうごとに、強制的にフラ
ッシュします。 デフォルトでは 0 となっています。
STDOUT は通常では、端末への出力時には行バッファリン
グ、それ以外ではブロックバッファリングであることに注
意してください。 これは、Perl のスクリプトを rsh 配
下で実行して、実行状況を確認したい場合のように、パイ
プに出力するときに特に便利でしょう。 (記憶法: パイ
プをホットな状態にしておくために使う。)
322デフォルトの名無しさん:2006/01/02(月) 10:16:30
他人のプログラムを読んでるのですが
下の一行が何をしてるのかわかりません。
教えてください。

print join("\n", @{ $self->{captions}->{$i} });
323デフォルトの名無しさん:2006/01/02(月) 11:23:44
$self->{captions}->{$i} には恐らく配列へのリファレンスが入ってるのだろう
それを \n でjoinして出力してるだけ
324322:2006/01/02(月) 12:13:04
>323
わかりました。ありがとうございました。
助かりました。
325デフォルトの名無しさん:2006/01/02(月) 16:31:09
ActivePerl(5.8.6)です。

メイン処理実行中にWin32::MsgBoxを使用して別スレッドでメッセージボックスを表示しています。
メイン処理がある程度すすんだところでメッセージボックスを消したいのですがどのようにすればいいでしょうか?

スレッドはThreadモジュールを使用しています。
326デフォルトの名無しさん:2006/01/02(月) 16:53:20
設計を見直す
327デフォルトの名無しさん:2006/01/02(月) 17:21:52
設計見直しかなぁ。標準だとWin32のDLL直に叩く方法もわからないし。

追加でモジュール入れないでWM_DESTROYとか投げつける方法ないですかね?
いや、それでうまくいくかはわからないですが。
328デフォルトの名無しさん:2006/01/02(月) 18:43:58
@lines = <STDIN>;
をDOSウィンドウで実行した場合に、入力の終わりを伝える方法が分かりません。
初めてのperlという本ではコントロールZと書かれていたのですが、その方法では
上手くいきませんでした。どなたかお教え下さい。

環境は Windows XP ActivePerl 5.8.7です。
329デフォルトの名無しさん:2006/01/02(月) 19:44:35
>>327
Perlを使わなければいい
330デフォルトの名無しさん:2006/01/02(月) 21:07:05
>>328
Ctrl+Z 押すと ^Z って表示される
と思うけどその状態で Enter じゃムリ?
331デフォルトの名無しさん:2006/01/02(月) 22:27:44
>>330
ありがとうございました・・・簡単な事だったのですね。
332デフォルトの名無しさん:2006/01/02(月) 22:33:46
perl+SQL(or XML)でBLOGを作成しようとしているのですが、
それを成し遂げるためにはどのような本はどれを読むといいだろうか?

この質問はwebプログラム逝き?
333デフォルトの名無しさん:2006/01/02(月) 22:46:31
日本語でおk
334デフォルトの名無しさん:2006/01/02(月) 22:54:45
>>332
WebProg板だな。書籍スレもWebProgにある。
ひょっとしたらBlog板に関連スレがあるかも。
335デフォルトの名無しさん:2006/01/02(月) 23:22:18
>>332
> perl+SQL(or XML)でBLOGを作成しようとしているのですが、
> それを成し遂げるためにはどのような本はどれを読むといいだろうか?

なぜ本? なぜそんな遠回りを?
あえて困難に挑戦しようというのか?
336デフォルトの名無しさん:2006/01/03(火) 02:25:12
cygwin + perlで使っていきたいと思うのですが、windowsでは普通active perl
でやってくもんなんでしょうか?
というのはcygwin perlはcpanモジュールのインスコにことごとく失敗するのです(Tkはmakeで失敗。
ほかもいろいろインスコしたけど、しょっちゅうmake testに失敗する)。
cygwin上のこまわりのきくスクリプトってな感じにつかいたいのでactive perlは
つかいたくないっす。みなさんどんな環境でperl使ってますか?

337デフォルトの名無しさん:2006/01/03(火) 02:54:34
普通にCygwin Perl使ってるよ。
失敗するっつっても特殊な環境だから動作確認されて
ないモジュールが多いだけでしょ。バグレポートする
しかないわな。それが嫌ならそもそもCygwin使うの
やめたほうがいい。Perlに限らずそのままビルド
できないもの多いから。
338デフォルトの名無しさん:2006/01/03(火) 02:58:29
WinXP+ActivePerlだ
最初から色々入ってるから便利やわ
339デフォルトの名無しさん:2006/01/03(火) 03:11:20
Perlプログラムを書くとき
環境依存を防ぐために一行目の#!/usr/bin/perl
を省略したいのですが、可能でしょうか?
毎回パスが変わるたびに何百ものファイルを置き換えるのは非効率で面倒でして。
パス変更という環境依存は避けたい所存で御座います

「#!/usr/bin/perlを省略」ぐぐっても「Perl パスを省略」
でググッても即座に省略する方法が簡単に見つからないのですが
これについて調べるにはどんなキーワードが適切でしょうかね?



340デフォルトの名無しさん:2006/01/03(火) 03:13:28
>>339
漏れの場合は、その#なんたらの1行目はまったく書いてないヨ。
341デフォルトの名無しさん:2006/01/03(火) 03:27:19
俺も書いてないな。
つーかパスが変わるってどういう状況だ?
342デフォルトの名無しさん:2006/01/03(火) 03:34:08
#!./perl
とでもしておいて
環境ごとに
ln -s
するとか
343デフォルトの名無しさん:2006/01/03(火) 04:01:42
ln -s /usr/local/bin/perl /usr/bin/perl
の方がましじゃね
344デフォルトの名無しさん:2006/01/03(火) 04:08:48
普通 #!/usr/bin/env perl
345デフォルトの名無しさん:2006/01/03(火) 04:36:39
>>344
envは必ず/usr/binにあるの?
346デフォルトの名無しさん:2006/01/03(火) 05:11:19
>>345
perlよりは。
347デフォルトの名無しさん:2006/01/03(火) 05:21:19
>>336
他のログ読まずに書き込み
winならcoLinuxが激しくお勧め
詳しい事はぐぐるとよろし
348デフォルトの名無しさん:2006/01/03(火) 05:26:53
何言ってんだこいつ
349デフォルトの名無しさん:2006/01/03(火) 08:10:18
>>345
Cygwin, Linux, FreeBSD, Solaris で/usr/binにあった。
(バージョン・デストリ依存はあるかもしれんが。)
350デフォルトの名無しさん:2006/01/03(火) 08:22:04
最近CygwinからcoLinuxに移行したけど凄く便利だと思うよ
351デフォルトの名無しさん:2006/01/03(火) 09:49:14
>336
おめでとう。perl-Tk は cygwin 本家から配布されるようになりました。Cygwin/X 版だけどね。
っつーか、環境依存の激しそうなもん(Tk なんてその最たるものかと)をビルドするんだったら、
自前でパッチを当てるくらいの気合いがないと苦しいかと。

ちなみに Active Perl と Cygwin Perl の両方を使ってる。
352デフォルトの名無しさん:2006/01/03(火) 11:26:39
#!/usr/bin/env perl と use lib と FindBin 以外になんか気をつけることある?
353デフォルトの名無しさん:2006/01/03(火) 14:00:12
>>341
OSがLinuxからBSDにかわったとき、
同じLinuxでもディストリビューションが変わったとき、SolarisやCygwin
に変わったとき、などです。

#!/usr/bin/perl を #!/usr/local/bin/perl や #!/usr/sbin/perl
などに変えないとうごかないときがあります。

>>340
今Eclipseの E.P.I.C. Perl プラグイン + Cygwinを使っているのですが
書かなくてもPerl5.8.xでは動くのですか?


どのPerl入門サイトにもPerlのソースコードの戦闘には
必ず#!/usr/bin/perl 書けと書いてありまして。困惑しております。
354デフォルトの名無しさん:2006/01/03(火) 14:02:26
>>350
coLinuxは便利そうですね。しかしエミュレータのように
重たそうなところやある程度のハンデを背負いそうなところが恐いですね。
何か副作用はありましたか?
355デフォルトの名無しさん:2006/01/03(火) 14:11:43
スレ違い
356デフォルトの名無しさん:2006/01/03(火) 14:14:51
>>353
#!を書けば、perl hoge.plじゃなくて、hoge.plだけで実行できるようになるだけのこと。
Windowsのコマンドプロンプトならあってもなくても関係ない。
>>344は見たか?
357デフォルトの名無しさん:2006/01/03(火) 14:17:54
見てないですけど何か?
358デフォルトの名無しさん:2006/01/03(火) 14:26:21
過去ログ読むのを強制するような奴は答えなくていいよw
359デフォルトの名無しさん:2006/01/03(火) 15:07:46
スレ違いかもしれないけどcoLinuxきになるなー。
Windows上のファイルとかクリップボードとかプロセスとか
その他もろもろCygwinとおんなじ程度には扱えるんかな。
扱えるんなら導入してみてー。
360デフォルトの名無しさん:2006/01/03(火) 15:20:18
はいはい
361デフォルトの名無しさん:2006/01/03(火) 18:28:21
正月からあまり俺を笑わさないでくれ
362デフォルトの名無しさん:2006/01/03(火) 20:59:10
>>356
読みましたが、
#!/usr/bin/env perl は書いたほうがパフォーマンスに
プラスといった効果があるのでしょうか?
363デフォルトの名無しさん:2006/01/03(火) 21:16:23
何で突然パフォーマンスの話が?
コマンドラインから実行するときに、わざわざ頭に perl を付ける必要がなくなるだけのこと。
364デフォルトの名無しさん:2006/01/03(火) 22:36:09
>>359
samba入れてwinのドライブにマウント
365デフォルトの名無しさん:2006/01/04(水) 00:03:04
>>362
shebang について勉強してください
366デフォルトの名無しさん:2006/01/04(水) 13:09:56
以下のプログラムを作ってみたのですが
どうもうまく動きません。

testUndefined subroutine &Test::MyClass::new called at C:/Documents and Settings/ユーザ名/workspace/PerlTest3/Test/Main.pm line 6.
と表示されます。
コンストラクタとして使用するnew()メソッドはすでにTest::MyClass定義済みのはずなのですが。

//ファイル名Main.pm
package Test::Main;
print 'test';
$a = Test::MyClass::new();
#my $a = Test::MyClass->new();

$a->test();

//ファイル名MyClass.pm
package Test::MyClass;
sub new {
print "Hello world!!\n";
my $pkg = shift;
my $hash = {
name => shift,
weight => shift
};
bless $hash, $pkg;
}

sub test(){
print "Hello TEST world!!\n";
}

367366:2006/01/04(水) 13:10:23
双方のファイルの場所は
C:\Documents and Settings\ユーザ名\workspace\PerlTest3\Test
に存在。
IDE : Eclipse 3.1 * epi Perlplugin
cygwin Perl5.8
Eclipse内でのプロジェクト名 : PerlTest3
EclipseのプロジェクトではPerl IncludePathを
C:\Documents and Settings\ユーザ名\workspace\PerlTest3
に設定済み。

です。
368デフォルトの名無しさん:2006/01/04(水) 13:19:18
use MyClass;
369デフォルトの名無しさん:2006/01/04(水) 17:26:03
>>368
Can't locate MyClass.pm in @INC (@INC contains:
/cygdrive/c/documents and settings/ユーザ名/workspace/perltest3
c:/usr/local/apps/eclipse/3.1/eclipse/plugins/org.epic.debug_0.2.0/
/usr/lib/perl5/5.8/cygwin
/usr/lib/perl5/5.8
/usr/lib/perl5/site_perl/5.8/cygwin
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/vendor_perl/5.8/cygwin
/usr/lib/perl5/vendor_perl/5.8
/usr/lib/perl5/vendor_perl/5.8)
at C:/Documents and Settings/ユーザ名/workspace/PerlTest3/Test/Main.pm line 3.
BEGIN failed--compilation aborted
at C:/Documents and Settings/ユーザ名/workspace/PerlTest3/Test/Main.pm line 3.
370デフォルトの名無しさん:2006/01/04(水) 17:29:09
そのくらいのエラーメッセージの意味もわからないようでは
先は暗いな...
371デフォルトの名無しさん:2006/01/04(水) 17:30:36
>>370
つまりincludeパスに入っていないということですか?
いやMyClassは入っているはずですが
372デフォルトの名無しさん:2006/01/04(水) 17:35:22
use MyClass;をuse Test::MyClass;
に変えてみましたが
エラーの変えたヶ所で赤線が現れています。

吹き出るエラーメッセージは
Test/MyClass.pm did not return a true value at - line 3.
BEGIN failed--compilation aborted - line 3.
です。
メソッドでtrueを返さないと?
ということはMyClass::new()メソッドで
戻り値としてreturn TRUE;
と書けばよいと。

以下のように書き換えてみましたが全然ダメですよ。
sub new {
print "Hello world!!\n";
my $pkg = shift;
my $hash = {
name => shift,
weight => shift
};
bless $hash, $pkg;
return TRUE;
}

いったいこれは・・・・・・・
373デフォルトの名無しさん:2006/01/04(水) 17:44:45
┐(´ー`)┌
374デフォルトの名無しさん:2006/01/04(水) 17:46:08
375デフォルトの名無しさん:2006/01/04(水) 18:06:07
>>373
Huh?
376デフォルトの名無しさん:2006/01/04(水) 18:08:12
>>374
そこで
use Module VERSION LIST
がでてくる意味がわからないのですが。
377デフォルトの名無しさん:2006/01/04(水) 18:11:32
>>374
意味がわからないのですが、
とりあえずuse v5.6.1;
を追加してみましたがまったく事態はかわりませんでしたよ。
一体何がいいたいのでしょうか?
378デフォルトの名無しさん:2006/01/04(水) 18:37:02
use v5.6.1; をuse v5.8;
に変更しても事態は解決しませんね
379デフォルトの名無しさん:2006/01/04(水) 18:39:29
想像のみでPerlの仕様を突き止めようとしている超越知性が跋扈するスレはここですか?
380デフォルトの名無しさん:2006/01/04(水) 18:42:57
>>370
まて、お前はEclipseを使ったことがあるのか?
381デフォルトの名無しさん:2006/01/04(水) 18:44:44
Perl厨って傲慢だね
382デフォルトの名無しさん:2006/01/04(水) 18:47:47
ところでみんなは
Perlでパッケージ宣言するとき
パッケージ名にドメイン名ちゃんと割り当てているの?
たとえば2chだったら
net::2ch::www::test::package1::ClassName;

みたいな
383デフォルトの名無しさん:2006/01/04(水) 18:49:01
>>376-378
すまんな、 fragment identifier は単に「そこから下を読め」という意味で
付けただけなんだ。

http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_use_Module_VERSION_LIST
> Module が単なる単語でなければならないことを除けば、
> BEGIN { require Module; import Module LIST; }
> と等価です。

http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_require_VERSION
> 初期化コードの実行がうまくいったことを示すために、ファイルは真を
> 返さなければなりませんから、真を返すようになっている自信がある
> 場合を除いては、ファイルの最後に 1; と書くのが習慣です。実行文を
> 追加するような場合に備えて、1; と書いておいた方が良いでしょう。

http://search.cpan.org/~nwclark/perl-5.8.7/pod/perldiag.pod#%s_did_not_return_a_true_value
384デフォルトの名無しさん:2006/01/04(水) 18:49:10
Perlでデザインパターンってどうやって実装するん?
385デフォルトの名無しさん:2006/01/04(水) 19:09:28
>>383
1;を書いてuseの問題は突破しました。
とりあえず一旦、どうもありがとう御座いました。
386デフォルトの名無しさん:2006/01/04(水) 19:29:07
>>382
パッケージ名に _ 入れて我慢してる
387デフォルトの名無しさん:2006/01/04(水) 19:38:31
冗談を言ってるの?
388デフォルトの名無しさん:2006/01/04(水) 20:34:22
Perlの基本的な事を知らないのにイクリプスとか使うなよ…
他の大抵の言語でも、最初はエディタ+コンソールでやるだろ…
389デフォルトの名無しさん:2006/01/04(水) 21:35:43
Perlでイクリプス使ってる奴はどのくらいいるんだろうか...
390デフォルトの名無しさん:2006/01/04(水) 22:04:44
>>388
いや、今までにEclipseでC,C++,PHP,Java開発をやっておりまして。
その影響でEclipseを使ってPerlの世界でオブジェクト指向、デザインパターンを
実践することに挑戦しているのです。
Perlでどれほどオブジェクト指向を実践できるかがわかったら
次はRubyの出番です。
PHPでオブジェクト指向を実践しようとしましたが名前空間が使えず
>>386のようなやり方しかできずに非常にがっかりしました。
しかしPerlならそんな心配もせずパッケージが使えるので期待できそうですね。
しかし気になるのはメソッド引数の型を指定できるかどうかですね。
PHP5からは多少は指定できるのですがPerlではどうもそうでもなさそうですかね。
それにPerlも双方ともC++やJava, C#, Dのように戻り値の型を指定できない
のでしょうか。PHPではそれができずに姑息な手段を使わなければならずがっかりしました。
Perlが、ちゃんとDesign By Contractに乗っ取った開発手法をどこまで実現できるか
もっと知りたいと思ったためにPerlに手を出してみました。
391デフォルトの名無しさん:2006/01/04(水) 22:09:07
>>388
Perlにはtelnetプラグインやsshプラグインがあります。
とはいってもクライアントサイドでやってみたいというのがありまして
cygwinを使ってやっています。
私もはじめはPerl以外の言語を使うとき、エディタ+SDKという組み合わせでやっていました。
最近ではEclipse + Apache Ant + Apache Maven + 各種Eclipseプラグインという
組み合わせで開発を行っております。

perlをよりC++やJavaのような言語と同じような言語として扱えるようになるために、
Perl6が出て欲しいですが、開発資金を私用につかったとかで揉めて
その期待もしばらくの間はかなり薄いままでしょうかね。

PHPをC++やJavaのように使いたかったのですが、あらゆる面でPHPには失望しました。
Perlならその失望感をぬぐってくれるでしょうか?
私は、Perlでオブジェクト指向をどこまで実践できるかもっと知りたいのです。
392デフォルトの名無しさん:2006/01/04(水) 22:32:34
>>389
Eclipse+epicでしばらくやってみた。
ペンタM1.5GHz(Let'snoteY2)/768MBでさえ重くてやめた。
P4-2.6GHz/1.5GBでやっと実用ぎりぎりって感じかな。

で、俺は
Unixではvi、WindowsではEmEditor、MacではJeditでガリガリ書いてる。
秀丸やterapadはUnicodeの扱いが半端なので( ゚Д゚)マズー。

IDEまではいかないけど補完とか欲しければ
Emacs+Perlplus、Macならmi、Windowsではez-HTML。
oopやるならこっちのが若干便利。
393デフォルトの名無しさん:2006/01/04(水) 22:53:26
>>390
>しかし気になるのはメソッド引数の型を指定できるかどうかですね。
>PHP5からは多少は指定できるのですがPerlではどうもそうでもなさそうですかね。

多少なら指定できるよ。「Perl プロトタイプ」でググること。

>それにPerlも双方ともC++やJava, C#, Dのように戻り値の型を指定できない
>のでしょうか。PHPではそれができずに姑息な手段を使わなければならずがっかりしました。

これは指定できない。Perl でもがっかりすることに決まったね。
394デフォルトの名無しさん:2006/01/04(水) 23:10:04
>>390
戻り値の型は……
あ、wantarrayでscalarと(ARRAY|HASH)は切り替えられるよ。

あと、OO-Perlなメーリングリストがあったハズなので、入ってみると良いかも。
395デフォルトの名無しさん:2006/01/04(水) 23:10:12
Perlを触っておいて型指定できなくてがっかりって
すごいな。初めて触った言語がJava+Webアプリだったり
するとVMとコンテナの中で世界が完結するからこんなに
モノリシックな思考回路になるんだろうか…

変にPerlのプロトタイプなんて教えたらメソッド呼び
出しではプロトタイプが効かないぞ!って発狂しそうだなw
lispとかSmalltalk触らせたら何て言うんだろう。
396デフォルトの名無しさん:2006/01/04(水) 23:15:06
>>393
いや、「メソッド引数」の型は指定できません。
もっとも、必要はあまり感じないですが。
$foo->bar( array => \@array, hash => \%hash )
とかすればいいわけだし。

あるいは$foo->bar( \@array )と$foo->bar( \%hash )で挙動を変えたい場合は
refとか使えばいいわけで。
それがダサいってのはわかるけど。
397デフォルトの名無しさん:2006/01/04(水) 23:20:33
>>390
引数の型指定はプロトタイプで可能。
ttp://www.rfs.jp/sb/perl/02/07.html
あたり山椒。

戻り値指定は出来ないつうかやらないのがPerl流。
メソッド呼び出し元のコンテキストを解析して引数の型に応じて
「同一名称で引数の異なる複数のメソッド」でなく、「ひとつのメソッド」で
戻り値を変えるようなこともやるのでね。

というか恐らく貴方が言っているC/Java的なプリミティブな「型」はそもそも
Perlには存在しないんだな。多次元配列もないし。(厳密には「リスト」は
あるが「配列」さえない)
この根本部分が他の言語と大きく違うので、他の言語をマスターしてPerlに
入ってくる場合注意して勉強したほうが良い。

逆にPerl使いが多用する柔軟で手軽なハッシュ、リスト、リファレンス回しが
出来る言語はほかになかなか見当たらないな。まあバグの温床でもあるしな。
398デフォルトの名無しさん:2006/01/04(水) 23:33:33
>>393-397
結論からいうと型指定はできそうだが
メソッドのオーバーロードができぬってか?

399デフォルトの名無しさん:2006/01/04(水) 23:47:08
どこをどうしたらその結論になるのか
「PerlやPHPのOOPは後付けであり、オブジェクト指向言語ではない」
これだけ覚えておけば結構
400デフォルトの名無しさん:2006/01/05(木) 00:36:56
型が好きな人はMLかHaskellでも使ってなさい。
401デフォルトの名無しさん:2006/01/05(木) 00:52:31
>>399
なに、オーバーロードができると?
同じ名前のメソッドを同一クラス内で
複数定義できると?
まさか。
402デフォルトの名無しさん:2006/01/05(木) 02:11:33
Perlのオブジェクト指向機能の有無についてひとつひとつ
語ること自体がナンセンスだわ。継承でさえ単なるハックなのに。
コンパイル時のおまけチェックを型指定と言ってみたり。

ところでuse overloadってあるんだなw
いわゆるオーバーロードじゃないけど
403デフォルトの名無しさん:2006/01/05(木) 02:42:37
最初からOOPLとして作られたRubyだって
変数の「中身」には型あるけど
変数や引数自体には型無いぞ

Perlだけでなく、いくつかの言語では
型指定が無いのがむしろ利点だったりするんだがな
私はDelphi以来、型指定には飽きたよ
404デフォルトの名無しさん:2006/01/05(木) 03:14:54
実用性やPerlのスタンスは別として、関数のオーバーロードはフィルタ等を駆使すれば
そう言う機能を提供するモジュールを作るのも不可能では無いと思うがどうだろう。
勿論Perlには型が無いから例えばマッチングを行なって振り分ける事になるが。
405デフォルトの名無しさん:2006/01/05(木) 03:39:21
Perlの機能は何もかもマッチングとさぶるーちん呼び出しで作られている
406デフォルトの名無しさん:2006/01/05(木) 04:04:31
マッチングまちこ先生の出番です
407デフォルトの名無しさん:2006/01/05(木) 06:50:44
マッチングまちこ先生をふるちんで呼び出す ってどういうことやねん
408デフォルトの名無しさん:2006/01/05(木) 12:25:30
まいっちんぐ・・
409デフォルトの名無しさん:2006/01/05(木) 13:20:07
PerlでGenericsやTemplateも使ってみたかったりする。
型指定が大前提だが

Java SE 5 Tigerでいうところのこんな感じのをPerlで実現する方法
知りたかったり。
(ListオブジェクトにはString型以外の型を入れることは許されない、という指定)

List<String> list = new ArrayList<String>();
410デフォルトの名無しさん:2006/01/05(木) 14:26:16
>>409
だから、C的な意味の「型」なんてないって、みんな言ってるでしょ。
$foo = 333;
とすれば、$fooは「333」という数値でもあるし、「333」という文字列でもある。
$fooに対して数値演算もできれば、文字列操作もできる。
OOPの前にPerlの基本的なことを勉強汁。
411デフォルトの名無しさん:2006/01/05(木) 14:36:31
>>409 は、プログラマじゃなくタダの言語ヲタクだなw
412デフォルトの名無しさん:2006/01/05(木) 15:17:49
型がないからそもそもperlプログラミング=Genericsプログラミングともいえる。
413デフォルトの名無しさん:2006/01/05(木) 17:00:33
Perl5.8.7+Spreadsheet::WriteExcel 2.15について質問です。スレ違いの場合は誘導ください。
上記環境サーバ(RedHat9)にてExcelシートを作成しています。
日本語出力はUnocode::Stringにてeuc→utf16変換し、write_unicodeメソッドにて書き出しています。
2バイト文字の"−"を出力する際に、半角"-"と全角"−"の中間位のサイズの、コード
"&#8722;"(ギリシア文字のマイナス。コードは実際は半角)に置き換わってしまいます。
そのため、このシートをCSV形式に変換しますと、置き換わった部分が?となって出力されてしまいます。
これを回避し、全角の"−"(ハイフン)を出力する方法はありますでしょうか?
クライアントはWindows98/2000/XPです。よろしくお願いします。
414デフォルトの名無しさん:2006/01/05(木) 17:30:16
>>413
化ける余地がありそうなところがeucからutf16に変換するところとwrite_unicodeの
2箇所あるので、どっちかぐらいは切り分けてから質問した方がいいと思われる。

最初の変換で化けているならSpreadsheet::WriteExcelが云々というのは全く無駄だし、
write_unicodeで化けているならUnocode::Stringで変換したとか曖昧なことを言わずに
化けるutf16文字の文字コードをきっちり書くべきだ。
415デフォルトの名無しさん:2006/01/05(木) 18:09:43
>>413
&#8722; は &#x2212; 。U+2212 は MINUS SIGN なので正しいと
言えば正しい。U+FF0D (FULLWIDTH HYPHEN-MINUS) に変換したい
という話なら、確認した限りでは Unicode::Japanese がそう変換してくれる。
http://search.cpan.org/~hio/Unicode-Japanese-0.32/

#!/usr/local/bin/perl -w
use Encode qw(from_to);
use Unicode::Japanese;
my $str1 = "\xA1\xDD"; # EUC-JP の '−'
my $str2 = Unicode::Japanese->new($str1, 'euc')->utf16;
from_to($str1, 'euc-jp' => 'UTF-16BE');
print unpack('H4', $str1), ',', unpack('H4', $str2); # 2212,ff0d
__END__

>>414
というわけで化けてるのではなく Unicode のマッピングの話。
http://www.asahi-net.or.jp/~hc3j-tkg/unicode/
416デフォルトの名無しさん:2006/01/05(木) 18:49:26
オライリーの砂ネズミ本買ったひといますか?
417デフォルトの名無しさん:2006/01/05(木) 19:13:00
>>415
ありがとうございます。お陰で解決しました。
調べたところ、Unicodeコンソーシアムがテキトーに文字設定しちゃったからこんな状態に
なってるようですね。勉強になりました。
418デフォルトの名無しさん:2006/01/05(木) 21:44:23
下の動かすとtell(IN)の戻りは10になるものだと思っていたのですが
infoseek、tok2、uuhpのレン鯖では0になり、まいっちんぐです。
自分では確認していないのですがniftyも0になるらしいです。
ほかに0になる環境のやついますか?

#!/usr/local/bin/perl

print "Content-Type: text/html\n\n";

# 検証用の 10 バイトの test.dat を作成
if (open OUT, '>test.dat') {
print OUT '0123456789';
close OUT;
} else {
print $!;
}

if (open IN, '+>>test.dat') { # eof(IN)が1のはず
print "os:$^O<br>\n";
print "perlver:$]<br>\n";
print 'tell():', tell IN;
close IN;
} else {
print $!;
}
419デフォルトの名無しさん:2006/01/05(木) 22:19:52
TemplateやGenericsの話をするときにC++よりもJ2SE 5が先に
出てきてしまうあたりがJava厨の悲しさ…
420デフォルトの名無しさん:2006/01/05(木) 22:26:37
>>418
Perl の open() の ">>" は C ライブラリの fopen() の append
mode に対応している。少なくとも POSIX における append mode の
定義は「ファイルの seek 位置に関係なく末尾に追記する」こと
なので tell() で 0 が返されるのはおかしくない。

標準 C の規格は手元にないけど、レンタルサーバならほとんど
UNIX だから POSIX 準拠だろう。
421デフォルトの名無しさん:2006/01/05(木) 22:43:43
>>418
ここ、ム板だから。一応。 >>1

#!/usr/local/bin/perl -w
open OUT, '>' . './test.dat' or die $!;
print OUT '0123456789';
close OUT;
open IN, '+>>' . './test.dat' or die $!;
print tell IN, "\n";
__END__

ActivePerl Build 522 (5.005_03) on Win98SE → 0
ActivePerl Build 815 (5.8.7) on Win98SE → 10
5.005_03 on FreeBSD 4-STABLE → 10
5.8.7 on FreeBSD 4-STABLE → 10
5.8.5 on RHL 7.3 (glibc 2.2.5) → 10
5.6.1 on RHL 7.3 (glibc 2.2.5) → 10
422デフォルトの名無しさん:2006/01/06(金) 06:50:31
ファイルの読み込み&出力の効率化について質問です。

現在perlでhtmlの出力をしております。 この内、<body>の内容は
データファイルに丸々保管されています。
この為、処理自体はprintで htmlヘッダ/ファイル/htmlフッタ
という単純な出力で正常に動作しています。

 そこで、このbodyファイルの出力についてですが、現在は
open(FILE, 'hoge.dat');
print <FILE>;
close(FILE);
とありきたりに出力しているのですが、これは別の書き方で更に高速化
する余地はあるでしょうか?

p.s. データファイルをいじってlocationで飛ばす方法は、URLが変わって
しまう為、断念しました。
423デフォルトの名無しさん:2006/01/06(金) 08:13:34
>>422
undef $/;
424デフォルトの名無しさん:2006/01/06(金) 09:13:44
>>422
syscallでsendfileシステムコールを呼ぶ
425デフォルトの名無しさん:2006/01/06(金) 09:43:31
そんなに単純ならCで書け
426デフォルトの名無しさん:2006/01/06(金) 10:48:28
>>425
どうしてPerlスレ見てんの?
427デフォルトの名無しさん:2006/01/06(金) 12:12:33
print <FILE>;よりprint while(<FILE>);のがいいんじゃ?

428デフォルトの名無しさん:2006/01/06(金) 12:36:05
>>426
適材適所。

>>427
理由は?
429デフォルトの名無しさん:2006/01/06(金) 13:31:03
>>427
428ではないが、前者は一度全部メモリに読み込んでから書き込みになるが、
後者だと読み込みと書き込みが交互に行われる。

速度的にどっちが有利かは場合によりそうだが、メモリ消費は後者が圧倒的に
少ないと思われる。
430デフォルトの名無しさん:2006/01/06(金) 14:18:42
print "犬を英語でなんという?";
$aaa=<>;
chomp($aaa);

if ($aaa eq "dog"){
print "オマエヤルナ";
} else{
print "逝け";
}

431デフォルトの名無しさん:2006/01/06(金) 15:00:45
chomp($aaa = <>), print $aaa eq 'dog' ? 'オマエヤルナ' : '逝け';
432デフォルトの名無しさん:2006/01/06(金) 16:00:38
>>422
>更に高速化する余地はあるでしょうか?

この動物を英語で何というか解れば、高速化できる。

    ∧∧         ∧∧           A_A
   (*゚ー゚)        ミ*゚ー゚ミ         (*゚ー゚)
  〜(,,,uu)       @ミ__ミ        〜(,,,uu)
433デフォルトの名無しさん:2006/01/06(金) 16:06:41
kitten
434デフォルトの名無しさん:2006/01/06(金) 16:32:59
>>422
まずはベンチマークだ
435デフォルトの名無しさん:2006/01/06(金) 17:20:52
Perlのメモリ使用量を得るにはどうすればよいですか?
CPU負荷はBenchmarkで計れますが、そのメモリ版です。
WinXP ActivePerl5.8.7
436デフォルトの名無しさん:2006/01/06(金) 17:23:05
>>435
CPANで探したら思わず名前にワラタ
http://search.cpan.org/~salva/Memchmark-0.01/lib/Memchmark.pm
437435:2006/01/06(金) 18:16:16
メ、メンチマークw
ありがとうございます。Devel::Sizeしか見つからなくてまいっちんぐでした。
Winでは動かないようなので、ぶっ壊れたRedHatが返ってきたら試してみます。
438デフォルトの名無しさん:2006/01/06(金) 20:53:42
>>422
system('cat hoge.dat');
これがいちばん速いだろう
439デフォルトの名無しさん:2006/01/07(土) 00:03:58
>>422
こんなのは?

open(FILE, "hoge.dat");
while ($len = sysread(FILE,$buf, 1024)) {
syswrite (STDOUT, $buf, $len);
}
close(FILE);

メモリ使用量は1024を変えて調整。
440439:2006/01/07(土) 00:11:16
あげてすまん。ちなみに誰かprintとsyswriteを混ぜることに問題があるかどうか知ってる?
printはバッファリングするのかな?それともいちいちflushしてる? 
441デフォルトの名無しさん:2006/01/07(土) 00:37:24
442デフォルトの名無しさん:2006/01/07(土) 00:41:47
print <> =~ /^dog$/ ? 'オマエヤルナ' : '逝け';
443デフォルトの名無しさん:2006/01/07(土) 01:58:48
use Foo::Bar;
my $obj = Foo::Bar->new(module => $hoge, %hash);

上のように呼び出して、Foo::Bar::$hogeってモジュールの
newメソッドを呼び出すようにしたいんだけどFoo::Bar.pmをどう書けばいいか教えてくれ

具体的には、$hoge = 'Hoge'だったら実際に呼び出すのはFoo::Bar::Hoge->new(%hash)
$hoge = 'Piyo'だったらFoo::Bar::Piyo->new(%hash)
444デフォルトの名無しさん:2006/01/07(土) 02:16:49
eval "Foo::Bar::${hoge}->new()";
445デフォルトの名無しさん:2006/01/07(土) 02:23:37
配列を昇順にソートしたいんですけど
@list=(20,1,3);
@result = sort { $a <=> $b } @list;を実行すると
配列は(1,20,3)のようになってしまいます
昇順だから(1,3,20)にならなければだめなのに
どうしたらちゃんと昇順にソートできるんですか?
446デフォルトの名無しさん:2006/01/07(土) 02:28:18
>>445
> 配列を昇順にソートしたいんですけど
> @list=(20,1,3);
> @result = sort { $a <=> $b } @list;を実行すると
> 配列は(1,20,3)のようになってしまいます
少なくともこっちではならない
目を皿のようにして自分のプログラムをチェックしなさい
447デフォルトの名無しさん:2006/01/07(土) 02:31:32
>>444
->演算子の左辺が文字列のときはクラス名と解釈されるので、
evalを使うまでもなく

"Foo::Bar::$hoge"->new(%hash);

とか書ける。

448デフォルトの名無しさん:2006/01/07(土) 02:32:38
>>447
おお、すごい
449443:2006/01/07(土) 06:57:44
>444,447
ありがとう、助かった。
そっか、そんな簡単なことでよかったのか。
450418:2006/01/07(土) 07:23:36
>>420-421
遅漏ですみません。
あれから他のレン鯖10箇所以上でも確認してみたのですが
OS依存でもなければPerlのバージョン依存と言うわけでもないという結論に至りました。
+>>で開くときは追加してから読み込むはずなので嵌る事は無いと思いますが
篠沢教授に1500点くらいの微妙さなので気をつけたほうがよさそうですね。
ありがとうございました。
451デフォルトの名無しさん:2006/01/07(土) 09:33:43
perlで自分のIPアドレスを調べる方法はありませんか。

CGIではないので、$ENV{'SERVER_ADDR'}とかは使えません。
できれば、eth0とかeth1とかbr0とかNICを指定して調べられると良いのですが…
452デフォルトの名無しさん:2006/01/07(土) 10:07:36
453デフォルトの名無しさん:2006/01/07(土) 13:35:55
>>446
それでもわからないお
正解を教えてお
454デフォルトの名無しさん:2006/01/07(土) 14:00:43
↑書き込むスレ間違えました。
455デフォルトの名無しさん:2006/01/07(土) 14:08:59
perlって一桁の数字しかちゃんとソートできないのか
使えない言語だな
456デフォルトの名無しさん:2006/01/07(土) 14:18:05
>>455
そうだよ。
使わなくていいよ。
457デフォルトの名無しさん:2006/01/07(土) 16:01:19
ワロス
458デフォルトの名無しさん:2006/01/07(土) 17:16:54
package hoge;
の全変数名と値を出力したいのですがよい方法ありますでしょうか。
459デフォルトの名無しさん:2006/01/07(土) 17:42:28
上の方で出てなかったか
460デフォルトの名無しさん:2006/01/07(土) 20:04:40
perlのsort関数は一桁の数字しかちゃんとソートできないんでしょうか?
461デフォルトの名無しさん:2006/01/07(土) 20:09:50
>>460
どうせ、1 10 11 12 2 3 4 …になる、と言いたいんだろ?
“文字列”と“数値”の違いについて、一から勉強し直せ。
462デフォルトの名無しさん:2006/01/07(土) 21:15:26
自作自演
463デフォルトの名無しさん:2006/01/07(土) 21:21:48
>>462
また馬鹿を一匹発見。今日は収穫多いなw
464デフォルトの名無しさん:2006/01/07(土) 23:34:59
sortごときでマニュアルも読めない奴はサポート付きの言語を使ってなさい
465デフォルトの名無しさん:2006/01/08(日) 02:52:09
今までC言語で書いていたフォーマット変換プログラムをperlで書いてみた。
1/4のステップで同じものができた。
コーディング時間も大してかからなかった。

正直うれしかった。
そしてperlの強力さを知った。
466デフォルトの名無しさん:2006/01/08(日) 04:01:52
シャチ泳ぎがすきです
467デフォルトの名無しさん:2006/01/08(日) 05:11:07
>>465
言語の質はともかくステップ数の少なさだけならRubyも使ってみな
468デフォルトの名無しさん:2006/01/08(日) 05:39:34
>>467
言語の質はともかく、ステップ数の少なさ
ならPerlのが上では?…分野によりけりか
469デフォルトの名無しさん:2006/01/08(日) 06:19:28
>>468
CPAN があるので Perl の方が上
470デフォルトの名無しさん:2006/01/08(日) 06:41:46
perlの文字列処理は強力だもんなぁ。
Cで同じ事しようと思ったら、考えただけでうんざりする。
471デフォルトの名無しさん:2006/01/08(日) 07:26:38
>>470
うんざりすることに対しては、
たいていの場合、
うんざりしないようにしようという努力が傾けられている。
472デフォルトの名無しさん:2006/01/08(日) 11:38:58
ただの配列のソートはできるようになりましたが

@lines=("番号<>名前<>得点","1<>aaa<>600","2<>bbb<>500","3<>ccc<>800");
のようなデータベース配列で得点の高い順にソートして

@lines=("番号<>名前<>得点","3<>ccc<>800","1<>aaa<>600","2<>bbb<>500");
のような配列にするにはどうすればいいんでしょうか?
473デフォルトの名無しさん:2006/01/08(日) 12:18:28
>>472
<>でsplitして得点でソートすればいいよ。
474デフォルトの名無しさん:2006/01/08(日) 12:56:17
475デフォルトの名無しさん:2006/01/08(日) 13:08:49
>>474
ありがとう試してみます
476デフォルトの名無しさん:2006/01/08(日) 13:55:14
>>475
@lines=("番号<>名前<>得点","3<>ccc<>800","1<>aaa<>600","2<>bbb<>500");
list(\@lines);
@lines = sort {(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]} @lines;
list(\@lines);
sub list{ my $a=shift; print $a; print join("\t",(split '<>',$_)),"\n" for (@$a);}
477デフォルトの名無しさん:2006/01/09(月) 19:28:24
今日はまだ質問ないのか
ちゅまんね
478デフォルトの名無しさん:2006/01/09(月) 21:50:39
>>477
>>143のおれのお題を考えてみてくれよ。
文字そのものと「.」「*」「?」「[ ]」しか使わないという条件もつける。
解法のとっかかりでもいい。
479デフォルトの名無しさん:2006/01/09(月) 21:54:20
問題の意味がわからん
日本語でおk
480デフォルトの名無しさん:2006/01/09(月) 22:03:51
>>478
そんなの文字クラス[]にマッチする文字のリストアップだけ出来たら終了じゃね?
[]の中身が空集合でなかったらマッチするの作れるだろ。
[]の中身が空集合だったらその文字クラスごと * や ? で潰せないか確認。
481デフォルトの名無しさん:2006/01/09(月) 22:10:43
>>479
これ以上どう書けばいいのかわからない。

>>480
文字列長は不定だよ。
/^abc$/と/^a.+$/くらいなら全文字列を列挙していけばどこかでひっかかるけど。
482デフォルトの名無しさん:2006/01/09(月) 22:16:08
483デフォルトの名無しさん:2006/01/09(月) 22:25:59
>>482
それを使っても総当たり方式にしかならんでしょ。
484デフォルトの名無しさん:2006/01/09(月) 22:38:07
>>483
総当たりで得た文字列を数えればいいじゃないか。
@both_match = grep $count{$_}++, @regex1, @regex2;
485デフォルトの名無しさん:2006/01/09(月) 22:40:29
CGIなどのウェブプログラミングの勉強に
「初めてのPerl」という本を読んでいます。
続・初めてのperlは専門的な内容とアマゾンのレビューに
書かれているのを見かけたのですが、
次に読む本としてはperlクックブックと続・初めてperlの
どちらが良いでしょうか?
486デフォルトの名無しさん:2006/01/09(月) 22:44:55
>>484
だから文字列は不定長なんだって。
blute forceは使えない。
487デフォルトの名無しさん:2006/01/09(月) 22:49:13
Effective Perlで。
488デフォルトの名無しさん:2006/01/09(月) 22:59:17
>>485
【Perl, CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/
489デフォルトの名無しさん:2006/01/09(月) 23:17:53
>>488
すれ違いでしたか、すいません
490デフォルトの名無しさん:2006/01/10(火) 08:55:04
アッー!
491デフォルトの名無しさん:2006/01/10(火) 09:24:05
エッ?!
492デフォルトの名無しさん:2006/01/10(火) 09:55:05
>>486
もしどちらの正規表現にもマッチする文字列があるなら、
その最短のものの長さには上限がありそうだから、
うまいことそれを証明すればあとは総当りでOKなんじゃ
ないか、と考えてみた。
493デフォルトの名無しさん:2006/01/10(火) 12:00:39
open関数でパイプや意図しないファイルをオープンされるのを防ぐには
サニタイズするのは当然ですがsysopenを使った方がいいのでしょうか。
494デフォルトの名無しさん:2006/01/10(火) 12:21:36
>>493
「>」や「<」とファイル名はopenでも別々の引数にできる

例:
open FH, '>', $file

ので、こう書けば$fileについてはsysopenと同等。
495デフォルトの名無しさん:2006/01/10(火) 12:23:26
sysopenだから安全とは・・
496デフォルトの名無しさん:2006/01/10(火) 12:38:12
IO::File 使えばイイんじゃね。
497デフォルトの名無しさん:2006/01/10(火) 13:03:47
>>492
regex-A: ^(aaa)+$
regex-B: ^(aaaa)+$

どっか移動するスレ無いだろうか
498デフォルトの名無しさん:2006/01/10(火) 13:53:42
ちょっと教えてください
こんなテキストがあって(一行)

foo('a','b'); foo('c','d'); foo('e','f'); foo('g','h');

このfooの第一引数、つまりa, c, e, gを抜き出して処理したいのですが(引数は2つ固定)、
こういう場合どうするのが定石でしょうか
よろしくお願いします。
499デフォルトの名無しさん:2006/01/10(火) 14:02:13
日本語でおk
500デフォルトの名無しさん:2006/01/10(火) 14:10:45
>>498
正規表現を使うのが定石
$line = q|foo('a','b'); foo('c','d'); foo('e','f'); foo('g','h');|;
@aceg = ($line =~ /\bfoo\('([^']*)'/g);
501デフォルトの名無しさん:2006/01/10(火) 14:12:06
>>498
それが書き捨てかどうかによるが、
書き捨てなら漏れなら>>500よりももっと簡潔にこう書く
@args = $line =~ /\('(.*?)'/g;
502デフォルトの名無しさん:2006/01/10(火) 14:29:13
>>500>>501 さん

ありがとうございます。かなり書き捨てなのですが両方ともども参考にさせていただきます!
どもでした。
503デフォルトの名無しさん:2006/01/10(火) 15:06:43
>>494
引数3つにすると、use open ':encoding(hoge)';が使えねー。
504デフォルトの名無しさん:2006/01/10(火) 17:41:14
webprogのスレどうにかしてくれ
505デフォルトの名無しさん:2006/01/10(火) 18:08:54
>>504
板全体のレベルがアレなので、華麗にスルー。これ。
506デフォルトの名無しさん:2006/01/10(火) 22:00:44
以下のような処理をしています。@all_lineの各行に「aaa」「bbb」「ccc」と
いう文字が含まれている、あるいは行頭に「ddd」がある、と言う場合は'NG'と
判定します。

foreach(@all_line) {
 $line_ok_ng = '';#OKかNGか
 if ((/aaa/)||(/bbb/)||(/ccc/)||(/^ddd/)){
  $line_ok_ng = 'NG';
 }else{
  $line_ok_ng = 'OK';
 }
 #$line_ok_ngに沿って処理
}

しかし、条件が増えてきた為、aaa bbb ccc等の条件を他のファイルに
書き出す必要が出てきました。そこで次のように変更しました。
507506:2006/01/10(火) 22:01:39
つづき
foreach(@all_line) {
 $line_ok_ng = &line_check($_);
 #$line_ok_ngに沿って処理
}

sub line_check {
my $line_ok_ng = 'OK'; #始めはOK
my $each_line = $_[0]; #調査対象
my @ng_word = @other_file::ng_word;
my @ng_header = @other_file::ng_header;
foreach (@ng_word) {
$line_ok_ng = 'NG' if $each_line =~ /$_/;
}
foreach (@ng_header) {
$line_ok_ng = 'NG' if $each_line =~ /^$_/;
}
return($line_ok_ng);
}
#other_fileの中に@ng_word=("aaa", "bbb", "ccc")が記入してあります

やりたいことは実現出来たのですが、微妙に遅くなった気がします。
@all_lineは1万行弱なので、特に困りはしないのですが、上記のことを
もっと綺麗に実現するような方法、あるいは私が覚えておいた方が
良いような手法がありましたら、ぜひ御示唆いただけないでしょうか。
よろしくお願いします。
508デフォルトの名無しさん:2006/01/10(火) 22:11:04
509 ◆TWARamEjuA :2006/01/10(火) 22:32:49 BE:6861479-
Rock54もそこがネックなのよね(哀)@NGワードの正規表現による多重検索
510デフォルトの名無しさん:2006/01/10(火) 22:46:55
>>507
>>508 が順等な答え。

で、わざわざ /$_/ と /^$_/ を分けるんじゃなくて、
^ddd
なものも、aaa, bbb, ccc と一緒に入れて大丈夫。
できればファイル中では ^ddd を先に持ってきた方が良いかも。

他にはファイルに入れたパターンを join して、evalする方法もある。
511506:2006/01/10(火) 23:48:53
>>508さん、>>510さん、ありがとうございます。
qrとかmapとか\bとか、いろいろ勉強になりました。
mapの部分とかが時間がかかるのならば、サブルーチンの中に入れるよりも、
一番最初にグローバル変数として作っておくべきですかね。あとnextで
抜けるのも忘れていました。^dddを一緒に、というのは明日職場でやってみます。
またよろしくお願いします。
512デフォルトの名無しさん:2006/01/11(水) 00:51:09
Perlで作ったプログラムの二重起動を防止する方法を
考えているのですが良い方法が思いつきません。
何か良い方法ありませんでしょうか?
513デフォルトの名無しさん:2006/01/11(水) 01:07:00
>>512
UN*Xなら/var/runに<script_name>.pidファイルを置くのが常套手段。
起動時にvar/run/<script_name>.pidを検索しあったら起動しない。
丁寧にやるなら多重起動につき起動キャンセルの旨のログを
cronやほかのprogramから起動時はログに吐く
コマンドラインから起動されたらSTDOUTにもアラートを吐かせる。

winはどうやるのかなあ?
514デフォルトの名無しさん:2006/01/11(水) 01:13:08
515デフォルトの名無しさん:2006/01/11(水) 11:45:15
perl -vで何も表示されないのはインストール失敗ですか?
516デフォルトの名無しさん:2006/01/11(水) 12:02:31
>>512
#!/usr/bin/perl
use strict;
use warnings;
use IO::File;
use Fcntl qw(:flock);
my $lock_f= $ENV{SCRIPT_NAME} || $0 || '/tmp/lock';
my $lock= new IO::File($lock_f,'+<') || die("$lock_f:$!");
flock($lock,LOCK_EX|LOCK_NB) ||die($!);
# 適当に処理
517デフォルトの名無しさん:2006/01/11(水) 12:20:32
すいません、マジわかんないんですけど
http://www.site-cooler.com/kwl/perl/environment.htm#helloworld
のサイトの通りwindowsのmsiファイルをダウンロードしてインストール
したんですけどコマンドプロンプトでperl -vと入力してもエラーになるし
.plファイルを実行しても一瞬で消えてしまうんですけど
何かインストールの仕方に問題があったのでしょうか?
機種はxpです
518デフォルトの名無しさん:2006/01/11(水) 12:24:33
webprog辺りでやってくれるとありがたいのだが
エラーメッセージくらい書けよ
519デフォルトの名無しさん:2006/01/11(水) 12:31:07
すいません、再起動したら上手くいきました。
環境変数いじったときだけ再起動するのかと思ってました。
スレ汚しすいません。
520デフォルトの名無しさん:2006/01/11(水) 23:28:10
すみません、cygwinのスレで質問しましたが
相手にされませんでした。

ここで質問させてください。

perlのリャマ本で、以下の文がありました。

open passwd, "/etc/passwd"
   or die "How did you get logged in ? ($!)";

while (<passwd>) {
  chomp;
  if (/^adminidtrator/i) {
     print "iroiro!";
   }

}

Unixのかわりにcygwinで実行したら、
die 以下が実行されました。

なんで、passwdが開けないのですか?
宜しくお願いします。
521デフォルトの名無しさん:2006/01/11(水) 23:53:43
CygwinのPerlを実行しているつもりが、実は
ActivePerlを実行しているとか
522デフォルトの名無しさん:2006/01/12(木) 00:18:32
>>520
何の為にエラーメッセージを表示しているんだ?
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlvar.pod#OS_ERROR
523デフォルトの名無しさん:2006/01/12(木) 00:33:22
CGI を書くときには 有名なとほほさんの http://www.tohoho-web.com/cgi/wwwperl.txt のように
環境変数を直接読むのが普通です。
ただ、近頃は、CGI.pm を使うの方法も増えているようです。
でも、聞いた話によると、CGI,pmを読み込む分、環境変数を直接扱うより遅くなるそうですし、
使えない環境もあるそうです。
なんか、CGI.pmのマニュアル見ても難しそうだし、結局、CGI.pmを使うメリットというのは何なのでしょう?
524デフォルトの名無しさん:2006/01/12(木) 00:43:39
有名なって…

目を覆いたくなるような悲惨なスクリプトだな。
525デフォルトの名無しさん:2006/01/12(木) 00:46:04
開いた瞬間に拒絶反応起こしたwwwww
526デフォルトの名無しさん:2006/01/12(木) 00:56:52
とほほさんより有名なサイトを作れない雑魚どもは黙れ
527デフォルトの名無しさん:2006/01/12(木) 01:06:26
528523:2006/01/12(木) 01:32:10
スレ違いすみませんでした。
WEBプログラミング板で聞き直します。

でも、とほほさんのスクリプトって、そんなに酷いのでしょうか?
みんなここを見て勉強しているはずですけど。

とほほさんより良いサイトがあれば教えてください。
529デフォルトの名無しさん:2006/01/12(木) 01:37:04
>>526
>とほほさんより有名なサイトを作れない雑魚どもは黙れ

とほほにもKENTにもWeb裏技にも世話になったし感謝もしてるけど
今となってはどうしようもなく汚く移植性にも再利用性にも欠ける
最悪スクリプトなのは確かだ。

かつては先生として、今は反面教師として役に立っているwww
530デフォルトの名無しさん:2006/01/12(木) 01:43:09
再利用性があれば良いってもんでもないけどな

と、移植性や再利用性が自己目的化して、本来の目的を
達成できない大量のJavaだけプログラマを見ていると思う
531523:2006/01/12(木) 01:45:10
昔は良かったけど近頃は酷くなったということなのでしょうか?
技術力がマイナス成長したということ?
あまり、あり得ない気がするのですが。

ここが悪いというのであれば、反面教師でないサイトを具体的に教えてもらいたいのですが。
532デフォルトの名無しさん:2006/01/12(木) 01:48:51
>>526
知名度は質と比例しない

>>528
テンプレや本(詳細は書籍スレ)
533523:2006/01/12(木) 02:01:11
テンプレにあった
http://www.site-cooler.com/kwl/perl/ 
を見てみましたが、とほほさんのところが悪くて、ここが良いといわれる理由がわかりません。

そもそも、OLE使って Excel を使うとかソケット使ってメールを送るとか、難しいことは書いてあるのに、
肝心のCGI の説明が全くありません。

普通にCGIを使うだけならとほほさんのところが一番良いように見えるのですが。

本に関しては、今すぐ見れないので何とも言えないのですが....
534デフォルトの名無しさん:2006/01/12(木) 02:16:10
>>533
自分が良いと思ったら他を否定してないで信じて学べ。

とほほで勉強してPerlでいろいろ作って2年ぐらいしたら
KENTやとほほ流のやり方の限界がきっと見えてくる。

すぐ正解を求めないで、もっといろいろ勉強することだ。
とりわけ、こんなところにカキコしている暇があるなら
1ステップでもコードを書いたほうがいい。そしてコードを膨らませて
取り返しの付かないような失敗もするべきだな。

535デフォルトの名無しさん:2006/01/12(木) 02:16:13
とほほさん最高!!
煽りしかできない根暗オタクどもは逝ってよし!
536デフォルトの名無しさん:2006/01/12(木) 02:19:38
私的にPerお勉強サイトはsmartが一番良いと思うけどね。
537523:2006/01/12(木) 02:51:36
>534
http://www.site-cooler.com/kwl/perl/ を否定するつもりは有りませんでした。
もし、否定しているように見えたのならすみません。

# どちらかというと、否定されているのは とほほさん のような....

でも、マジで、どの辺がどうダメなのか具体的に教えて欲しいのです。
ダメだダメだといわれるのに、どこが悪いかわからないと、勉強しようがないじゃないですか?

# とほほさんに対する単なるヒガミってことは無いですよね?
538デフォルトの名無しさん:2006/01/12(木) 03:16:28
>>537
>>529とかに書いてある。推測だけど、今となっては…ってのは
何にも知らない頃はわからなかった悪いところがわかるようになった、ってことでは。
入門編としてはわかりやすいと思うけど門から先に入るにはちょっとね。
539デフォルトの名無しさん:2006/01/12(木) 03:22:49
ここはとほほさんを妬むクズの溜まり場
まともな話ができるWebProg板に行こうぜ!
540デフォルトの名無しさん:2006/01/12(木) 04:40:54
初心者でもわかりやすく説明するにはあれぐらいが妥当じゃないか。
KENTもPerl初心者の頃は行単位の処理がわかりやすかった。
541デフォルトの名無しさん:2006/01/12(木) 06:50:10
$hoge = "/foo/bar";
use lib $hoge;

のようなことをしたいのですが、このようにすると
use lib $hoge; のとこどでエラーになってしまいます。
use lib 変数というのはできないのでしょうか?

542デフォルトの名無しさん:2006/01/12(木) 07:04:13
WebProg板ではあのコードが御神体
543デフォルトの名無しさん:2006/01/12(木) 07:23:57
>534
そんなことを言っていると、とほほを手本にした糞スクリプトが大量に発生してしまう。
(既に大量発生しているのだが)

確かに、向上心のあるヤツならがんばって、そのうち限界が見えて来るかもしれない。
だが、ほとんどの人間はがんばりもせず、やり方に疑いも持たずに糞スクリプトを日々生産するだけだ。
544デフォルトの名無しさん:2006/01/12(木) 07:48:48
>541
use が実行されるタイミングは、$hoge="/foo/bar"より前になるので、できない。
545デフォルトの名無しさん:2006/01/12(木) 09:19:24
>>543
若いものがその体たらくではわしらの時代もまだまだ安泰じゃのう。
ガッハッハッハ
───大原巌@月下の棋士
546デフォルトの名無しさん:2006/01/12(木) 09:35:45
板違いの話は相手する方も問題だな。無視しろよ。
547デフォルトの名無しさん:2006/01/12(木) 09:55:24
板違い質問に対しては誘導以外はレス不可とテンプレに書いてくれ。
わけがわからない質問者よりわかってる分悪質だ。
548デフォルトの名無しさん:2006/01/12(木) 09:55:33
カカオかよwwwwwwwwww
549デフォルトの名無しさん:2006/01/12(木) 11:29:56
>>537
とほほの方法は非常に仕組みを理解しやすい反面、環境変数決め打ちなので
・参照できない、或いは存在しない環境変数
・参照した結果なにも入っていない環境変数
を判定できない。

具体的なところではCONTENT_LENGTHやCONTENT-TYPEはCGIの場合
POSTでデータが送信されないとそもそも存在しないわけだが、
件のスクリプトでは存在して空文字列が入っているように見えてしまう。

また、
・指定していないが実は存在する環境変数
・サーバのバージョンアップなどで新しく追加された環境変数
もキャッチアップできない。

print "Content-Type: text/plain\n\n";print "$_ = ",$ENV{$_},"\n" for (sort keys %ENV);

こんなワンライナで、参照可能な全環境変数を確認できるし、
Content-Typeにtext/plainを利用すればタグ出力も不要だし
ターミナルからコマンドで確認する場合も楽だ。
(1行目を読み飛ばせば良いだけだからな)

まずそんなことはないと思うが絶対無いとは言い切れない
「どこかの環境変数に"</xmp>"という文字列が入っていたら?」
「どこかの環境変数に悪意のvbsやJavaScriptが入っていたら?」
という潜在問題への対処でもある。

こういうのは本やWebを読んでるだけじゃダメでたくさんスクリプト
書いて、ハマって、解決しないと身に付かないし、そもそも経験則
なので、blogなどに散見されるがまとまったFAQにはなりにくいんだ。

550デフォルトの名無しさん:2006/01/12(木) 11:47:38
>>607 じゃ売ればいいじゃん

♪高値で掴んで走り出す 行く先もわからぬまま
暗い夜の帳の中へ
これ以上損し出したくないと 損切った昨日の引けに
自由になれた気がした その日の夜
551デフォルトの名無しさん:2006/01/12(木) 13:38:11
perldoc perldebug してみたところ、デバッガの起動例として、
> $ perl -d -e 42
というのがありました。

この 42 って一体何なんでしょうか?
「銀河ヒッチハイクガイド」と関係ありますか?
552デフォルトの名無しさん:2006/01/12(木) 14:14:41
>>551
perldoc perlrun
553デフォルトの名無しさん:2006/01/12(木) 16:12:56
data.txtとdata1.txtを単純に以下のように連結しdata3.txtに書き出す方法を教えてください。
よろしくお願いいたします。
data.txt    data1.txt
1,山田,A     1,山田さん,10
2,鈴木,B     2,鈴木さん,15

data3.txt
1,山田,A,1,山田さん,10
2,鈴木,B,2,鈴木さん,15
554デフォルトの名無しさん:2006/01/12(木) 16:22:43
1. おもむろにテキストエディタでdata.txtを開く
2. 置換で行末に , を付ける
3. data1.txtを開き、全て選択してコピーする
4. data.txtに矩形貼り付けする
5. 名前を付けて保存でdata3.txtを作成する
555デフォルトの名無しさん:2006/01/12(木) 16:28:30
Excel
556デフォルトの名無しさん:2006/01/12(木) 16:34:05
冬休みの宿題か?
#!/usr/bin/perl
use strict;
use warnings;
use IO::File;
my %data1= parse('data1.txt');
my %data2= parse('data2.txt');
my @keys= unique( keys %data1, keys %data2 );
my $fh= new IO::File('data3.txt','>');
for( sort @keys ){
my $key= $_;
my @data1= @{ $data1{$key} || [] };
my @data2= @{ $data2{$key} || [] };
print $fh join(',',map {nval($_)} ($key,@data1[1..2],@data2[0..2]))."\n";
}
sub nval{defined $_[0] ? $_[0] : ''}
sub unique{my %t;grep !$t{$_}++,@_}
sub parse {
my $file= shift;
my $fh= new IO::File( $file ) || die("$file:$!");
my %r= ();
while(<$fh>){
chomp();
my @data = split /,/,$_;
$r{ $data[0] }= \@data;
}
return wantarray ? %r : \%r;
}
557553:2006/01/12(木) 16:36:17
>>554 有り難うございました そうします。
558553:2006/01/12(木) 16:43:58
>>556 おーっ すごーい。
556さん 感動です。感謝申し上げます。
宿題ではないです。有り難うございました 。
559デフォルトの名無しさん:2006/01/12(木) 17:01:32
そんなもん paste -d, data.txt data1.txt で終わりじゃねーか。
560デフォルトの名無しさん:2006/01/12(木) 18:37:56
>>559
Perl のスレだからな。

open eyes, pop or die;
open mind, pop or die;
chomp, print, print "\054".
<eyes> for @your = <mind>
561デフォルトの名無しさん:2006/01/12(木) 20:18:43
ポエムキタ-
562デフォルトの名無しさん:2006/01/12(木) 20:19:18
なんか無理に問題を難しくしてないか?

open IN1,"data.txt"; open IN2,"data1.txt"; open OUT,">data3.txt";
while(<IN1>){chomp; print OUT $_ . ',' . <IN2>;}
close OUT; close IN2; close IN1;


じゃダメなのか?
まあこんなことは俺も迷わず>>559と同じことをするけど。
563デフォルトの名無しさん:2006/01/12(木) 20:43:43
1列目がIDでマージするのかと(日ごろそういう作業が多いので)勝手に思い込んでましたOTL

564デフォルトの名無しさん:2006/01/12(木) 21:58:01
565デフォルトの名無しさん:2006/01/12(木) 22:51:25
566デフォルトの名無しさん:2006/01/12(木) 22:54:18
>>565>>564
 ↑片想い↓
>>561>>562
567523:2006/01/12(木) 23:42:17
>549
確かに前半部分は
print "Content-Type: text/plain\n\n";print "$_ = ",$ENV{$_},"\n" for (sort keys %ENV);
で済むし、書き方がスマートで無いことはわかりました。
スレ違いなのに、ありがとうございました。
568523:2006/01/12(木) 23:43:51
スレ違いなのはわかっていますが、最後に一つだけ教えてください。
とほほさんのコードで、もっともよく使うのは以下の部分です。

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
} else {
$query_string = $ENV{'QUERY_STRING'};
}
@a = split(/&/, $query_string);
foreach $a (@a) {
($name, $value) = split(/=/, $a);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
print "$name = $value\n";
$FORM{$name} = $value;
}

これが最悪とおっしゃる方々に質問です。
これを、最良の書き方をすればどうなりますか?

WebProg板で普通のコードが最悪とまで言われているのがいまだに理解できないのです。
「最悪」「反面教師」とまで言っておきながら、どこが悪いのか549以外は指摘しないし、
とほほさんを否定するばかりで、とほほさん以上のサイトを紹介してくれないですし。

569デフォルトの名無しさん:2006/01/12(木) 23:48:54
とほほ信者うぜぇ
570デフォルトの名無しさん:2006/01/12(木) 23:51:43
>>568
それは別に普通のコードだと思うけど…
妙にmap{}とか使ったりしてるコードの方が読みにくい
571デフォルトの名無しさん:2006/01/12(木) 23:59:58
ま、色々なスレを数年ROMれば分かるようになる。
572デフォルトの名無しさん:2006/01/13(金) 00:00:27
>568
この板にいるのは口先で悪口言っているだけで、実際自分では何もできない煽りばっかりなんだから、
あんまりまじめに相手するなよ。
573デフォルトの名無しさん:2006/01/13(金) 00:06:53
>>568
コーディングに限った話をすればフォーマットの"C"が無駄なくらいだな
574デフォルトの名無しさん:2006/01/13(金) 00:49:50
Content-Lengthの最大値が無いのでメモリ食い潰し
DoS攻撃を受けるな
575デフォルトの名無しさん:2006/01/13(金) 00:52:36
readのエラーチェックが無いから入力が途中で切れたり
したらCGIの内容によっては大変なことになるかもね
576デフォルトの名無しさん:2006/01/13(金) 00:54:09
>>568
> これが最悪とおっしゃる方々に質問です。
> これを、最良の書き方をすればどうなりますか?

自分で「最良の書き方」を考えても車輪の再発明どころか
劣化版ができあがるだけなので世の中で広く使われている
モジュールを使います。Perlに限ったことではありません。
577デフォルトの名無しさん:2006/01/13(金) 00:59:59
ブラウザ別Cookieの解析やマルチパートが必要になったら
それもとほほの実装をコピペして使わないといけない。
てゆうかあるのか?w
578デフォルトの名無しさん:2006/01/13(金) 01:02:08
フォームの値はデコードしてるのに名前はデコードしないのか
579デフォルトの名無しさん:2006/01/13(金) 01:30:43
            た
            し
           ま
          り
         参
       て
盛り上がっ
580デフォルトの名無しさん:2006/01/13(金) 02:01:46
とほほって有名なのか?全然知らんかったけど.
>>568 のコード現代的な Perl としてはいまいち.

簡単にいって,
1. use strict; がない (コンパイル時のチェックがきかない)
2. CGI, CGI::Util モジュールの再実装
3. my を使ってない,あと変数名がいまいち
がだめ.いま perldoc 見れない環境だからうろおぼえでかくけど普通↓だろ.

use strict; # この行がないのは基本的にだめ
use CGI;
use CGI::Util;
my $q = CGI->new;

my @names = $q->param;
foreach $name (@name) {
my $value = CGI::Util::unescape($q->param($name));
print "$name = $value\n";
$FORM{$name} = $value;
}
581580:2006/01/13(金) 02:04:06
あぁぁぁネボけて挙げてしまった…もうねるわ
処理内容としても一対一で翻訳したので微妙だがなー
582551:2006/01/13(金) 02:32:32
>>552
読んでもよくわからないのですが・・・

一応確認なのですが、
42 でなくても、 0 でも 1 でも 100000 でも効能は変わらんのですよね?
583デフォルトの名無しさん:2006/01/13(金) 03:53:55
>>(512+64+4+2)
もう1回読め。
584583:2006/01/13(金) 04:40:07
悪い、-Dと勘違いした。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0
perlfaq3では強調されているな。
585デフォルトの名無しさん:2006/01/13(金) 04:47:11
>>568
なんでperl4から5に移り変わる前後に思考停止してそれ以上向上しようとしない人達を
信じてこだわっているのか自分にはよくわからないんだけど...

膨大なモジュールの中から標準モジュールとして選ばれ、多く人から検証されているモジュールをなぜ否定するんですか?
そしてより少ない人からしか検証されていないコードを良しとするのですか?
広く知れ渡っている設計モデルやデザインパターンを否定し、あえてスパゲッティーになりやすい冗長ないコードを書き続けるのはなぜですか?
なぜ、バグの混入が少しでも少なくなるように提供されそして、使う事を推奨されているてる機能を使わず、
たびたびバグを発生させるのですか?(使っていてもバグは発生するのに...)
なぜ、同じコードを何度も(コピペだろうけど)書こうとするのですか?
なぜ、10行コーディングすれば済むプログラムをわざわざ100行かけてコーディングしようとするのですか?

色々考えそして経験していけばそのうちわかると思う。
586551:2006/01/13(金) 05:02:43
軽くぐぐってみたんですが、このへんが元ネタですかね。
http://sumo.genetics.ucla.edu/pipermail/bioinfo/2003-July/000020.html
587551:2006/01/13(金) 05:07:41
あ、 perl 5.005 の頃から 42 とあるので違いますね。
まあとりあえず数字に深い意味はないことがわかったので良しということで。
588デフォルトの名無しさん:2006/01/13(金) 08:30:26
>>585
まあ落ち着け
589デフォルトの名無しさん:2006/01/13(金) 09:02:19
ttp://ja.wikipedia.org/wiki/%E4%BA%BA%E7%94%9F%E3%80%81%E5%AE%87%E5%AE%99%E3%80%81%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E7%AD%94%E3%81%88
>「42」はメタ構文変数に似た使い方をされることがある。「42」は、integer(整数)型変数の初期値として、プログラムのテストに使われることがある。
590549:2006/01/13(金) 12:44:01
>>568
説明すると長くなるから
ttp://perldoc.jp/docs/perl/5.6.1/perlfaq9.podの
How do I decode a CGI form?の項を1000回読め。
とほほのコードがどうしてまずいのかがよ〜く解るだろう。

ついでにCGI.pmはpure perlだから読んでみるとよかろう。
もし君が解読しきれなくても本当に正しくフォームデコード
するというのはどんなに大変なことなのかぐらいは解るだろう。

CGI/util.pmのunescapeメソッドを読むだけでも君は
ここで「とほほのコードはWebProg板では普通のコード」
と言い切ってしまったことをとても恥ずかしく思うようになるはずだ。

cgi.pmのマニュアルがよく解らないというのはオブジェクト指向や
参照渡しがよく解ってないからじゃないのかな。
cgi.pmにはcgi-lib.plもどきの関数インターフェースもあるので
Webを漁って探してみてくれ。日本語訳もあるよ。

まあ頑張れ。
591デフォルトの名無しさん:2006/01/13(金) 14:12:43
なんだ?ここはCGI.pm信者ばっかなのか?
あんなクソ重くて不要な機能テンコ盛りのモジュールのどこがいいんだか
こればかりは車輪の再発明させてもらったよ
592デフォルトの名無しさん:2006/01/13(金) 14:21:33
プギャプギャ━━━━m9(^Д^≡^Д^)9m━━━━ッ!!!!
593デフォルトの名無しさん:2006/01/13(金) 14:23:04
信者とかそうじゃないけどな
やりたいようにやればいいんじゃない?プゲラッチョ
594デフォルトの名無しさん:2006/01/13(金) 14:31:02
信者ということにしてしまわないと自分の居場所がないんだよ。
そっとしておいてやれ。
595591:2006/01/13(金) 14:37:17
だってあんなクソモジュール、信者以外の誰が使うの?
マジで教えてほしいんだけど、頼む
596デフォルトの名無しさん:2006/01/13(金) 15:13:16
俺もCGIモジュールはあんま好きじゃないな
597デフォルトの名無しさん:2006/01/13(金) 15:20:46
だからって自分で書いたらその糞よりもっと糞になっちゃうような気がするんだが
598デフォルトの名無しさん:2006/01/13(金) 15:26:46
軽けりゃいいのよぉ
599デフォルトの名無しさん:2006/01/13(金) 15:34:10
こうしてセキュリティホールが日々生まれているわけだな
600デフォルトの名無しさん:2006/01/13(金) 15:36:11
どこまでセキュリティホールって言うんだか
601デフォルトの名無しさん:2006/01/13(金) 15:49:18
私も CGI.pm は重い、というか、あまり使わない機能がてんこもりな気がしています。
かと言って車輪を再発明するのはいやなので、既存ので良いのがあれば良いのですが、
基本的な機能だけの機能限定版とか、必要なときに必要な機能だけを use するとか、
そういうのでおすすめなものがあれば教えていただきたいです。
602デフォルトの名無しさん:2006/01/13(金) 16:24:53
一昔前のマシンスペックならまだしも
今時重いとか何言っちゃってんの?
603デフォルトの名無しさん:2006/01/13(金) 16:40:16
うちのサーバは一昔前のスペックですが
604デフォルトの名無しさん:2006/01/13(金) 16:54:02
■テストコード
use strict;
use warnings;
use Benchmark qw(:all);
## テスト2ではコメントアウトをはずす
# use CGI;
# use CGI::Lite;
my $count= 10000;
sub use2 {
delete $INC{ my $pkg = shift };
eval "use $pkg;";#テスト2ではコメントアウトする
return $pkg;
}
sub func {my$p=use2(shift);my$o=$p->new();}
timethese($count, {
'CGI'=> sub {func('CGI')},
'CGI::Lite'=> sub {func('CGI::Lite')}
});
1;
__END__
605デフォルトの名無しさん:2006/01/13(金) 16:54:54
■テスト環境
OS :CentOS4.2
CPU:AMD Duron 1GHz
MEM:256MB

■テスト結果1
Benchmark: timing 10000 iterations of CGI, CGI::Lite...
CGI: 9 wallclock secs ( 9.18 usr + 0.00 sys = 9.18 CPU) @ 1089.32/s (n=10000)
CGI::Lite: 6 wallclock secs ( 5.94 usr + 0.00 sys = 5.94 CPU) @ 1683.50/s (n=10000)

■テスト結果2
Benchmark: timing 10000 iterations of CGI, CGI::Lite...
CGI: 3 wallclock secs ( 3.18 usr + 0.01 sys = 3.19 CPU) @ 3134.80/s (n=10000)
CGI::Lite: 1 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 15151.52/s (n=10000)
606デフォルトの名無しさん:2006/01/13(金) 16:55:51
秒間1000回以上実行できるんですけど...重いですかね?
607デフォルトの名無しさん:2006/01/13(金) 16:57:20
塵も積もればなんとやら
608デフォルトの名無しさん:2006/01/13(金) 16:58:30
オーバーヘッドを考えてない馬鹿発見
609デフォルトの名無しさん:2006/01/13(金) 17:03:28
お前も釣りが好きだな
610デフォルトの名無しさん:2006/01/13(金) 17:07:28
>CPU:AMD Duron 1GHz
>MEM:256MB

高スペック杉
611デフォルトの名無しさん:2006/01/13(金) 17:14:39
>>604
use される時や new() の中でやってる処理の内容が全然違うから
そんなの比較しても何の意味も無いよ。
612デフォルトの名無しさん:2006/01/13(金) 17:18:41
オレはTemplate Toolkit使ってるのでCGI.pmのオーバヘッドなんてゴミみたいなもんだぜ。
613デフォルトの名無しさん:2006/01/13(金) 17:24:58
use CGI;
($u, $s) = times();
print $u + $s, "\n";

これで十分なベンチだろ
ちなみに俺の環境(Cel2.4G + 512MB ActivePerl5.8 WinXP)だと
0.14〜0.155で安定しとる
614デフォルトの名無しさん:2006/01/13(金) 18:21:53
CGI自体のオーバーヘッドに比べればネコパンチ程度だよ。
塵も積もればはわかるが事実上デフォルトなモジュールなんで
なるべく使うようにしてる
multipartなんかの処理も論理的に書かれてるし。
615デフォルトの名無しさん:2006/01/13(金) 18:24:07
それとコンソールから
./abc.pl mode=preview&name=taro
でフォームと同様に値を取れるのでデバッグ時にも便利。
616デフォルトの名無しさん:2006/01/13(金) 18:39:08
CGI.pm自体は仕方が無いけど
他モジュールでCGI.pmへの依存度が高いのはなんだかなとは思う
それこそCGI::Applicationなんかquery、header、cookie位なんだからリファクタして欲しい(他人任せ)
617 ◆TWARamEjuA :2006/01/13(金) 20:02:34 BE:6099078-
では次のご質問どうぞ。
618デフォルトの名無しさん:2006/01/13(金) 22:17:03
>>616
それは敢えてそうしてるんだと思うよ。
619デフォルトの名無しさん:2006/01/13(金) 22:35:31
いずれにしても自分で書くのはクソという結論には変わりない
とほほのコピペともなれば尚更無意味
あっ、でも遊びで書いてる人はいいのかな
620デフォルトの名無しさん:2006/01/13(金) 22:37:17
>>610
それのどこが高スペックなんだ・・・
今時ノートPCでもそれ以上あるし、サーバ用途ならむしろ
低スペックだっつーの
621デフォルトの名無しさん:2006/01/13(金) 22:43:46
ああ言えばこう言う
622523:2006/01/13(金) 23:33:37
CGI.pm を使う最良のコードになるかを示して欲しかったのですが、
「CGI.pm を使う」というだけで、実際にCGI.pmを使ったコードを
書いたのは 結局 >580さんだけですね。
この >580 のコードには
>574 さんの指摘した「Content-Lengthの最大値が無いのでメモリ食い潰し」
>575 さんの指摘した「readのエラーチェック」
>578 さんの指摘した「フォームの値はデコードしてるのに名前はデコードしないの」
というのは対応済みなのでしょうか?

>585 「そしてより少ない人からしか検証されていないコードを良しとするのですか?」
google で検索した結果
とほほ CGI の検索結果のうち 日本語のページ 約 338,000 件
CGI.pm の検索結果のうち 日本語のページ 約 32,000 件
一桁以上違いますね。
「知名度は質と比例しない」と言われてしまえばそれまでですけど。
623523:2006/01/13(金) 23:34:09
とはいえ、何となく、CGI.pmを使ったほうが良いという理由もわかってきました。

以前は「勉強しろ」「何年か使い続ければわかる」「それぐらいもわからないのか」
と言った抽象的な精神論みたいなコトばっかり言われて、どこが悪いのか、
さっぱりわかりませんでした。
どこが悪いかも指摘せずに、そんな言い方をされても、簡単には納得できないのは
普通だと思います。

間違っているかもしれませんが、自分の理解としては、
とほほさんのやり方は「最悪」と言うよりも......不完全?...というか、足りない?..
...というか漏れがある?....みたいな雰囲気なんですね。

でも、なんで有名サイトはCGI.pmを使っってないんでしょう?
とほほさんとか KENT とか、みんなCGI.pm を使ってません。
624デフォルトの名無しさん:2006/01/13(金) 23:40:17
偉そうなことを言ってるけど、CGI.pm使ってるのはまだまだ少数派だからな。
以前より衰えたとはいえ、主流はまだまだとほほ系だよ。
625デフォルトの名無しさん:2006/01/13(金) 23:41:00
Perl 5.8 が主流になりつつある今、
敢えて 5.005 をひきずったコードを参考にすることはないっしょ。

5年前なら「とりあえず KENT やとほほのコードを見れ」で良かったかも知れんけど。
626デフォルトの名無しさん:2006/01/13(金) 23:43:32
>623
>でも、なんで有名サイトはCGI.pmを使っってないんでしょう?
>とほほさんとか KENT とか、みんなCGI.pm を使ってません。

なんであんなサイトがなぜ有名なのか、こっちが聞きたい。
627デフォルトの名無しさん:2006/01/13(金) 23:44:49
>>623
CGI.pmがデフォで置かれてないサーバもあるし、みんながそうしているから。
今はどうなっているか知らないけどURI unescapeもなぜか効率の悪くて汚いコードが驚くほど出回ってた。
CGI界の不思議。
628520:2006/01/13(金) 23:45:51
>521
cygwinのshellで実行しているので、それなないです。

>522 よくエラーメッセージを読んで解決しました。

open passwd, "../../etc/passwd"#<-----------------相対パス
or die "How did you get logged in ? ($!)";

while (<passwd>) {
chomp;
if (/^Administrator/) {
print "eureka!";
}

}

相対パスじゃないとダメみたいです。
絶対パスはなんでダメなんでしょう。
これはcygwinのperlの仕様なんでしょうか?

スレ違いならごめんなさい。
629デフォルトの名無しさん:2006/01/14(土) 00:19:57
>>521
>cygwinのshellで実行しているので、それなないです。

perl -v で確認したのか?
630デフォルトの名無しさん:2006/01/14(土) 00:28:00
>>626
どういうサイトのほうが有名になるべきなのか教えていただけますでしょうか? 
631デフォルトの名無しさん:2006/01/14(土) 01:09:51
もういいじゃない
ずっととほほのコード使ってればいいと思うよ
どうせ中学生の趣味プログラミングだろうし
その昔、BASICのGOTOプログラミングに夢中になった
子供たちと同じだと思えば実に微笑ましい
632580:2006/01/14(土) 01:12:01
>>622
基本的に貴方の示したコードを 1:1 に直訳しただけですからね.

CONTENT_LENGTH -> $CGI::POST_MAX=1024; # 1024 バイトに制限
read のエラーチェック -> 十分ではないですが,標準でされてます.
デコード -> CGI::Util::uscape() 使ってください

正直とほほとか KENT とかは一瞥しただけでコメントしかねますが,
かわりにオススメの Perl 入門を…

1. Learning Perl(O'reilly 入門 Perl)
Windows ユーザーなら Win32 のほうを.2. 以降は結構高度なので,まずこれを飽きるまで読むといいですよ.
2. Programming Perl(邦訳:プログラミング言語 Perl )
3. Advanced Perl (邦訳:実用 Perl プログラミング)
4. Object Oriented Perl (邦訳:オブジェクト指向 Perl マスターコース)

今は Perl Best Practice を読んでます.これはすごくイイ.
633580:2006/01/14(土) 01:12:55
あぁぁぁ,また age ちゃった…もう消えまつ
634デフォルトの名無しさん:2006/01/14(土) 01:17:17
>とほほ CGI の検索結果のうち 日本語のページ 約 338,000 件
なんで"日本語のページ"?
635デフォルトの名無しさん:2006/01/14(土) 01:20:00
簡単な判断基準を教えてやろう use string; がなかったら読む価値なしの場合がほとんど
636デフォルトの名無しさん:2006/01/14(土) 01:22:43
何故とほほが有名かというと、本当に正しく作らないと
困るような重要なWebプログラムは、そもそもPerl+CGIで
書かれないから。例外はいくつもあるけどね。MovebleTypeは
Perlだっけ。

だから、PerlのCGIプログラムを探すと必然的にどうでもいい
コードばかりザックザック出てくるわけですw

ハカーに攻撃されても困らないからいい! ちょっと負荷が
掛かったらポシャルくらいは別に気にしない! プログラムの
メンテナンスなんて不要! バグなんて知るか! そういう
場合はとほほ式のプログラムを作るといいでしょう。
あ、皮肉じゃあ無いですよ。適材適所ってことです。
637デフォルトの名無しさん:2006/01/14(土) 01:23:35
>>635のレスは読む価値無し
638デフォルトの名無しさん:2006/01/14(土) 01:28:29
×string ○strict
639デフォルトの名無しさん:2006/01/14(土) 01:29:00
mod_perl使わない程度の開発案件とか
1年くらいで使わなくなる程度の案件なら
冗長(というかいい加減に)書くこともあるし
時と場合だよねぇ
640デフォルトの名無しさん:2006/01/14(土) 03:42:33
>>623
> 以前は「勉強しろ」「何年か使い続ければわかる」「それぐらいもわからないのか」
> と言った抽象的な精神論みたいなコトばっかり言われて、どこが悪いのか、
> さっぱりわかりませんでした。
知りたい側が成長しなきゃ理解できないことのほうが世の中多いんだよ。
「今の自分がどんなに未熟でも、説明のほうがちゃんとしていればどんな物事も理解できるはず」
っていう間違った信念持ってない?
641デフォルトの名無しさん:2006/01/14(土) 04:53:51
>それぐらいもわからないのか
これでどういう成長を期待してるんだかw
642デフォルトの名無しさん:2006/01/14(土) 05:08:59
オフトピだが、>640に一言。

知らせる側がきちんと説明しないと理解してもらえないことの方が世の中多いんだよ。
「説明がどんなに酷くても、自分が正しければ相手は理解するはず」
っていう間違った信念持ってない?

たいていの場合、どんなに正しくても、権限を持っているお偉いさんたちに、わかりやすく説明できないと、
予算が取れないのですよ。
逆に、どんなに間違っていても、わかりやすく説明して、納得してもらえると、あっさりハンコもらえる。

君も大きくなって、苦労したららわかると思うよ。
643デフォルトの名無しさん:2006/01/14(土) 05:37:17
>>640
> 以前は「勉強しろ」「何年か使い続ければわかる」「それぐらいもわからないのか」
> と言った抽象的な精神論みたいなコトばっかり言われて、どこが悪いのか、

これで伸びる奴も居れば、辞める奴もいる。
まあ発奮させるにしても下手な煽り方ではあるな。
644520:2006/01/14(土) 05:40:07
>629

申し訳ありません、嘘ついていました。

perl -vで確認したところ、

This is perl, v5.8.6 built for MSWin32-x86-multi-thread
(with 3 registered patches, see perl -V for more detail)

Copyright 1987-2004, Larry Wall

Binary build 811 provided by ActiveState Corp. http://www.ActiveState.com
ActiveState is a division of Sophos.
Built Dec 13 2004 09:52:01

略)

Active State社のものでした。

さらに、パスは
/cygdrive/c/Perl/bin/perlでした。

私は、cygwinのperlでなく、Active〜のを使っていたようです。

それが原因か調査してみます。
645640:2006/01/14(土) 06:44:45
>>642
> っていう間違った信念持ってない?
持ってないよ。
ていうか、唐突にまったく関係ない話を始められても困っちゃうな。
646640:2006/01/14(土) 07:14:32
>>643
といっても仕方ないんだよな。
学習者の理解度より数段階先の話や、経験から思い知ったことへの対策の重要性を、
「現時点の学習者」に技術面で理解させ、納得させるのは至難だもん。
その辺は学習者にコツコツとステップアップしてもらうしかない。

ちなみに君のすぐ上に、主人公もゴールもまったく異なる話を始めて俺に噛み付いてる人が
いるんだけど、この人のラスト一行って、ものを理解するための必要事項として
「経験を積む」ことを挙げるという、俺の主張とまったく同じ内容になってるんだよね。
一体何に噛み付きたかったんだろw
647523:2006/01/14(土) 08:24:49
>580さん
とほほ方式はココがダメ!と指摘されているのに、CGI.pm方式で書いても、
同じ問題が残っているように感じたので質問させてもらいました。

・CGI.pmで書いても書き方によってはとほほ方式で指摘された問題が残る場合がある。
・ただし、その問題解決のための関数は既に用意されている。
ということですね。

オススメの Perl 入門まで教えていただき、ありがとうございます。
(邦訳って...なにか、英語の原書を薦められてるような気も....)
週末、O'reilly 入門 Perl を買ってきます。

これまでの意見で一番参考になりました。ありがとうございました。
648523:2006/01/14(土) 08:28:08
>>640
成長しないと理解できないことが多いことは痛いほど承知してます。

ただ、2chで全く理由を示さないまま否定されても、
単なる煽りなのか、本当に問題があるのか判断できないのです。

たとえば、2chで
「Perl はダメだ。 Rakuda のほうがいい。理由? そんなの勉強すればわかる」
と言われて、Perlをやめて Rakuda を勉強する人は少ないと思うのです。

実際、まだみなさんの説明が完全に理解出来ているとは言えません。
でも、568 以降の書込はきちんと悪い理由を示してもらっているので、
煽りではなさそうだということがわかったし、なんとなくCGI.pmを使った
ほうが良さそうだとも思えるようになりました。

これからCGI.pmの使い方とか勉強していこうと思います。
いつか、理解できるようになったら、とほほ方式を頭ごなしに否定するのでなく、
「この点がこんな風に悪いんだよ」と説明できるようになりたいです。

スレ違いの上、チラシの裏ですみませんでした。
649デフォルトの名無しさん:2006/01/14(土) 09:11:07
ん?なんだこの伸びようは
まったりいこうよまったり
650デフォルトの名無しさん:2006/01/14(土) 09:47:29
本人がまとめに入ったんだから
以後この話題続けた奴は荒らし決定な
651デフォルトの名無しさん:2006/01/14(土) 10:31:54
> ただ、2chで全く理由を示さないまま否定されても、
> 単なる煽りなのか、本当に問題があるのか判断できないのです。
嘘を嘘と(ry
652デフォルトの名無しさん:2006/01/14(土) 10:44:59
自分で煽りかどうかを判断できないなら、2chで
勉強しようとするなよw
653 ◆TWARamEjuA :2006/01/14(土) 10:59:06 BE:6099078-
はいはい次の質問どぞー♪
654デフォルトの名無しさん:2006/01/14(土) 11:12:50
変なコテまで沸いてるし
末期だな
655デフォルトの名無しさん:2006/01/14(土) 11:20:00
そう簡単に終わりなんて来ないよ
良い流れも悪い流れもアッサリ死ぬのが2ch
656デフォルトの名無しさん:2006/01/14(土) 14:51:22
          /  /-'―  _/ ´―- 、ヽ       ',
          ,′ i′           ヽ|         l
       l  l   __     __    |       l
        |   | ィ´:::}'     {:::::::l\  |      |
        | ,|/弋ン   ,.  弋_ソ  l |.        |   
        |:.:.{ノ    }⌒{       } -|.:.:. . .:. .  l
       |:.:.ト---‐′ ヽ、_____,ノ  |:.:.:.:.:.:.:.:.:.:.:.:.l
.         |:.:.',                |:.:.:.:.:.:.:.:.:.:.:./
.        |:.l:.\    ゚        |:.:.:.:.:.:.:.:.:.:./
          l∧,ハ/')、           _,.|:.;.:.:.:.:.;.:.:./
         ′ / /__ `7 _┬   _|Vj/∨∨ル′
         / ´ -┤__ノ   ̄ ̄  \_
          r|   _┤: l:{ー ^ー ^ァ' ̄: :\
657デフォルトの名無しさん:2006/01/14(土) 17:56:50
>>644
なら、それが原因だな。
とりあえず、cygwin perlで実行した結果を得たいだけなら
$ /usr/bin/perl 〜.pl
として明示的にcygwin perlを起動すれば良かろう。

もっとも、Cygwinのシェル内で実行したときには、cygwin perlが起動するように
pathを設定し直した方が良いと思うが。
658デフォルトの名無しさん:2006/01/14(土) 18:05:14
これを期にCGI::Liteモジュールを使う形に移行しようかなと思ったのですが、
cpanにあるモジュールは再配布しても良いですか?
659デフォルトの名無しさん:2006/01/14(土) 18:12:09
>>658
CPAN で配布されているか否かは関係無い。
それぞれのモジュールが採るライセンスに準じる。
http://search.cpan.org/~smylers/CGI-Lite-2.02/Lite.pm#COPYRIGHT_INFORMATION
660デフォルトの名無しさん:2006/01/14(土) 18:19:09
CGI::LiteはライセンスUnknownになっていて、作者もCGI::Liteを放棄して
行方不明とのことなのでいいんじゃないでしょうか。

661デフォルトの名無しさん:2006/01/14(土) 18:22:18
C言語のプログラムからPerlのプログラムを呼び出すには
どのような方法があるのでしょうか?
662デフォルトの名無しさん:2006/01/14(土) 18:29:04
ヒアドキュメントで

$a = <<UNKO;
・・・・・・
UNKO



$a = <<UNKO
・・・・・
UNKO
;

って何か違いがありますか?
663デフォルトの名無しさん:2006/01/14(土) 19:06:26
>>659-660
ありがとうございます。
勉強になりました
664ヽ(´ー`)ノ ◆.ogCuANUcE :2006/01/14(土) 19:10:49
>>660
ライセンスあるよ。>>659 のリンク先に書いてある。

>>661
呼び出して何したいかによる。
exec*、system、libperl、お好きなのをどうぞ。
665661:2006/01/14(土) 19:50:40
>>664
CプログラムからPerlプログラムを利用して得られた結果(文字列)を
Cプログラムで受け取りたいのですが、
このような場合にはどの方法が良いでしょうか?
666ヽ(´ー`)ノ ◆.ogCuANUcE :2006/01/14(土) 20:57:37
>>665
受け取るだけ(対話的な Perl スクリプトじゃない)なら、popen() が簡単。
凝った事をしたいなら exec* を。
667デフォルトの名無しさん:2006/01/15(日) 01:07:33
質問です。
perlに関しては、ver.4の頃の知識止まりで、最近の事を良く知らんのですが、
モダンなperlをサクッとエレガントに解説してくれるようなお勧め参考書ってありますか?

cgiやら正規表現の初歩やら、スクリプトやOOPの何たるかをダラダラ書いてるような
本はNGってことで。
668デフォルトの名無しさん:2006/01/15(日) 01:09:56
ありません
669デフォルトの名無しさん:2006/01/15(日) 01:12:51
らくだ本
670デフォルトの名無しさん:2006/01/15(日) 02:00:34
>>662
こう書けば分かりやすい?

$text = join "\n"x3,
<<_P_
1段落目
_P_
,
<<_P_
2段落目
_P_
;

$text = join "\n"x3, <<_P_, <<_P_;
1段落目
_P_
2段落目
_P_

違いと言えば、通常ありえないけど開始識別子の直後に複数行にわたるコードを書きたいときはセミコロンを後ろに持っていくしかないね
671デフォルトの名無しさん:2006/01/15(日) 02:10:16
最近のらくだ本には、CTBCPPの話が載ってないんだよな。
CTBCPPの延長で、Perl5のチュートリアルがあればなぁ・・・。
672デフォルトの名無しさん:2006/01/15(日) 02:45:59
>>667
上の方で誰かも書いてたけど、全くの初心でないなら
SMART
ttp://www.rfs.jp/sb/perl/index.html
を必要なところから読めばいいかなと。

5.8からI/OやThread、文字コードの扱いなどかなり変わったので、
今からなら5.005や5.6はブッチして5.8に入るのが良策かと。

あとは>>3あたり
673デフォルトの名無しさん:2006/01/15(日) 04:22:57
>>672
SMART は駱駝本 2nd の劣化コピーに作者の偏った主張や
嘘を紛れ込ませたものという印象が強くて人には勧め難いな。
一見良サイトな分、余計にね。
674デフォルトの名無しさん:2006/01/15(日) 04:30:15
河馬屋二千年堂にくらべればマシ
675デフォルトの名無しさん:2006/01/15(日) 04:34:41
また微妙な
676デフォルトの名無しさん:2006/01/15(日) 05:04:36
結局、良解説サイトはないのか?
677デフォルトの名無しさん:2006/01/15(日) 05:32:05
>>676
「ズブの素人が取っかかりに読む」より上のものをお望み
なら、素直に駱駝本 or perldoc 、が正解だと思うよ。

変に噛み砕かれた説明で誤解して覚えるより、ほんの少し
苦労して正しく覚えた方が結局近道だしね。読み易い一次
情報なんだからそれ以上は望めないでしょ。
678デフォルトの名無しさん:2006/01/15(日) 08:38:46
PerlわかるんならCPANモジュール見るのが良いんじゃない?
679デフォルトの名無しさん:2006/01/15(日) 09:17:18
>>678
うん。実際のところ最近の流れで初めてCGI.pmを取っ掛かりに標準モジュールで
PurePerlなヤツ幾つか読んだけどスゲー勉強になった。星の数あるCPANから標準
になったものはPerlコーディングのお手本でもあるね。

やはりソースに勝る教科書はないな。
680644:2006/01/15(日) 12:56:47
>657
できました。

明示的にcygwinのperlを指定したら、
絶対パスで起動できました。

pathも切り替えます。

大変勉強になりました。
ありがとうございます。
681デフォルトの名無しさん:2006/01/16(月) 02:02:17
>>670
そういう仕組みがあるんですね。知りませんでした
どうもありがとうございます
682デフォルトの名無しさん:2006/01/16(月) 23:32:24
次の答えを教えてください。

以下のタグを結合したい。

(1)<M>hogeM</M><X>hogeX</X> →  <X>hogeMhogeX</X>
(2)<X>hogeX</X><M>hogeM</M> →  <X>hogeXhogeM</X>
(3)<M>hogeM</M><X>hogeX</X><M>hogeM</M>   → <X>hogeMhogeXhogeM</X>
※<M>hogeM</M><X>hogeX</X><M>hogeM</M><X>hogeX</X> は結合しない。

<例>
※以下は一行で、\ は連結の意味です。

......hoge.......<M>hogeM</M><X>hogeX</X>.....\
........hoge......<X>hogeX</X><M>hogeM</M>.....\
.....hoge.........<M>hogeM</M><X>hogeX</X><M>hogeM</M>...\
.........<X>hogeX</X>................<M>hogeM</M>..\
..<M>hogeM</M><X>hogeX</X><M>hogeM</M><X>hogeM</X>

......hoge.......<X>hogeMhogeX</X>.......\
......hoge......<X>hogeXhogeM</X>..........hoge....\
.....<X>hogeMhogeXhogeM</X>............<X>hogeX</X>...\
.............<M>hogeM</M>...\
.<M>hogeM</M><X>hogeX</X><M>hogeM</M><X>hogeM</X>

正規表現でも、何でもOKなのでお願いします。
683デフォルトの名無しさん:2006/01/16(月) 23:38:50
>>682
Perlでリクに答えるスクリプトを作るスレ
http://pc8.2ch.net/test/read.cgi/tech/1086143976/
684デフォルトの名無しさん:2006/01/16(月) 23:41:11
>>683
おおー
そんなすれが〜
ありがとん。
685デフォルトの名無しさん:2006/01/17(火) 20:08:16
Perlでモジュールの勉強をするなら
MorningMusume.pmのソースを読むべし。
686デフォルトの名無しさん:2006/01/17(火) 23:06:48
読んでみたが
別に特にいいと思われる所は無かった
smartので十分
687デフォルトの名無しさん:2006/01/18(水) 02:50:59
>>686は盲目
688デフォルトの名無しさん:2006/01/18(水) 03:15:22
恋してるんだろ
689デフォルトの名無しさん:2006/01/18(水) 03:16:07
ん?どこが盲目なのん?もしかして作者さん?
さらっと斜め読みしただけだから知らんけどね
690デフォルトの名無しさん:2006/01/18(水) 03:20:58
また逃げんの速いな
691デフォルトの名無しさん:2006/01/18(水) 03:40:16
そんなこと言われたからもう一回じっくり読んでみた
やっぱ>>686に変わりないわ
付け足すとしたら
ttp://www.pure.ne.jp/~learner/program/Perl_oo.html
これぐらいかな
692デフォルトの名無しさん:2006/01/18(水) 03:47:45
俺も見てみたけど
別にぃ・・って感じ・・
693デフォルトの名無しさん:2006/01/18(水) 03:48:20
あっ作者さんでしたか
失礼失礼^^;
694デフォルトの名無しさん:2006/01/18(水) 04:01:43
モーオタかよ
勘弁してくれ
695デフォルトの名無しさん:2006/01/18(水) 04:24:54
夜分遅くに質問すみません
(Shift_JIS)

$file = 'D:\picture\ニーソックス.jpg';
これを

D picture ニーソックス.jpg

に分割したいんですが
split(/[\\\/:]/, $buf);
こうすると ニーソックス の "ソ" の2byte目が "\" である事から

D picture ニー・ ックス.jpg

と、中途半端な所で切れてしまいます。
そこで
split(/[^\x81-\x9f\xe0-\xef][\\\/:]/, $buf);
と、Shift_JISの特性を考慮した所

\pictur ニーソックス.jpg

となってしまいます。
何かスマートな書き方はないでしょうか。
696695:2006/01/18(水) 04:37:18
あ…あとスミマセン
encodingプラグマは使わない方向でお願いします
697デフォルトの名無しさん:2006/01/18(水) 06:23:06
splitじゃなくてキャプチャ使えば悩むことはない
@list = $file =~ /((?:sjis|asciiから\と:を抜いた正規表現)+)/g
698デフォルトの名無しさん:2006/01/18(水) 09:36:47
配列の中身をJcodeで変換したいのですが、
ループ毎に行うのしかないのでしょうか?
699デフォルトの名無しさん:2006/01/18(水) 10:30:02
perlのメモリ管理についての質問です。

@hoge
に1Gのデータが入ってるとして
@hoge = ();
と初期化したらメモリは開放されるのでしょうか?
700699:2006/01/18(水) 10:31:20
すみません。調べたらすぐに分かりました。
失礼しました。。。
701デフォルトの名無しさん:2006/01/18(水) 10:44:08
漏れもしりたい。undef使ってるんだけどどうなの?
702デフォルトの名無しさん:2006/01/18(水) 11:52:54
>>698
結局はループだが一行でどうだ
$_ = Jcode->new($_)->euc foreach @hoge;

mapを使っても書けるがこっちはメモリ効率が悪いからお勧めしない
@hoge = map { Jcode->new($_)->euc } @hoge;
703デフォルトの名無しさん:2006/01/18(水) 11:59:03
>699-701
Perlは何やってもメモリ解放なんぞせんよ。
undefしても内部のメモリプールに返すだけ。
@hoge = (); はそれすらしない。
メモリ消費が心配だったら、その部分だけforkすればいい。
704699:2006/01/18(水) 11:59:11
>Perl は、ガーベジコレクションの機能を備えています。
だそうです。他のサイトも見たけど

undef @hoge;
は開放できて
@hoge = ();
は開放できないみたい。

====

えと、すみません。 今度は調べたのですが分からないので
また新しい質問させてください。

# a.pl
$hoge = "a";1;

# b.pl
require "a.pl";print $hoge."\n";exit 0;

で以下のように実行すると

$ perl -w b.pl
Name "main::hoge" used only once: possible typo at b.pl line 3.
a
$

と出てしまいます。この警告を消すことは出来ないのでしょうか?
よろしくお願いします。
705デフォルトの名無しさん:2006/01/18(水) 12:03:49
>>704
# b.pl
BEGIN { require "a.pl"; } print $hoge."\n";exit 0;

でもこのスレ的にはmy宣言してstrictなソースを書いたほうがいいかと
706699:2006/01/18(水) 12:10:12
>>705
ありがとうございます。とりあえず動きました。
BEGIN と strict についてはこれから調べてみます。
707689:2006/01/18(水) 13:42:30
>>702
ありがとうございます。こうしてみました。

my $jconv = new Jcode;
$_ = $jconv->set($_, 'sjis' )->euc foreach @hoge;
708デフォルトの名無しさん:2006/01/18(水) 13:43:41
名前激しく間違えた
709デフォルトの名無しさん:2006/01/18(水) 14:22:59
既出かもしれませんが、Perl5.8 で Encodeモジュールを使って
UTF-8 -> ISO_2022_JP へ 文字コードを変換しているのですが、
全角チルダ(〜)が文字化けし、? に置き換わってしまいます。

Jcode を使うと正常に変換されているようなのですが、
今回勉強を兼ねて Perl5.8標準のEncodeを使用したく思っております。
何か解決策などありますでしょうか・・・?
710デフォルトの名無しさん:2006/01/18(水) 14:26:54
>>709
それに関する質問は、もう散々既出。
711デフォルトの名無しさん:2006/01/18(水) 15:33:06
>>704
>>Perl は、ガーベジコレクションの機能を備えています。
>だそうです。

そうそう。そのおかげでスクリプトを実行し終えると
使ったメモリはきれいさっぱり解放してくれるわけだよ。
実行中には解放なんてしないんだって。
712デフォルトの名無しさん:2006/01/18(水) 15:38:58
実行中にメモリが足りなくなりそうだったら、動的に変数の生死を調べて
適宜解放するってのがGCだべさ

終了時に全解放されるのは当たり前
713デフォルトの名無しさん:2006/01/18(水) 15:42:02
encodingプラグマが使えるPerlのバージョンは幾つからでしたでしょうか
後Encodeモジュールが標準搭載されたのもお願いします
714デフォルトの名無しさん:2006/01/18(水) 15:45:19
>>713
5.8から。
715デフォルトの名無しさん:2006/01/18(水) 15:46:43
>>714
どうもありがとうございます。
716709:2006/01/18(水) 16:04:46
そうですか。。色々探してみたのですがわかりませんでしたので、
こんな感じで対応しておきました。

 s/\x{ff5e}/\x{301c}/g;
717デフォルトの名無しさん:2006/01/18(水) 16:58:52
>>711
なんかすごい釣りだな。
718デフォルトの名無しさん:2006/01/18(水) 17:22:29
質問させて下さい
open関数はパイプや標準出力を開く事ができますが
sysopen関数はファイルだけなのでしょうか?
宜しくお願いします
719デフォルトの名無しさん:2006/01/18(水) 18:42:27
GCつーか参照カウンタだけどな
まぁ、黒豹でも読んでくれ
720デフォルトの名無しさん:2006/01/18(水) 19:12:25
>>703
> undefしても内部のメモリプールに返すだけ。
> @hoge = (); はそれすらしない。

@hogeの各エントリも返さない?
721デフォルトの名無しさん:2006/01/18(水) 19:21:58
Perlで作ったデーモン走らせてるけど、ハッシュとかかなり大きく
なることがあるので undef してるけど、ps 見る限り解放はされて
ないような・・・
PerlのGCはメモリプールに返すためのものなのでは?
722デフォルトの名無しさん:2006/01/18(水) 19:35:03
>>721
俺もそんなことあった気が。
誰か真相を教えてくれ。
723デフォルトの名無しさん:2006/01/18(水) 19:42:12
>>701
気になったので、軽く確認してみた。ActivePerl 5.8.6
方法は、\@hogeの文字列値を使ってunpackのPで変数内を覗き見
@hoge=() では $hoge[0..$#hoge] が未アロケート状態に,
undef @hoge では加えてxav_array(配列管理用の領域)も未アロケート状態になった。
また、
 ・各要素($hoge[0..$#hoge])の文字列領域
 ・アレイ構造体のxav_array(中身はポインタの配列)
は開放時にメモリもfree(OSへのメモリ返却はライブラリに依存)されたが、
 ・各スカラーヘッダ構造体
 ・各スカラー構造体
はfreeされなかった。
xav_arrayの変化は、例えば
$#hoge=63; # xav_fill=63,xav_max=63
$#hoge=31; # xav_fill=31,xav_max=63;
@hoge=(); # xav_fill=-1,xav_max=63
undef @hoge; # xav_array=NULL,xav_fill=-1,xav_max=-1
といった感じ。
724デフォルトの名無しさん:2006/01/18(水) 22:53:06
>>723
検証乙。Devel::Peek使うと楽だったんじゃないか?
725721:2006/01/19(木) 10:53:08
>>723
検証乙。
てことは、うちの環境がfreeしてもOSに返されないだけなのか。
どっちにしても、返されないんじゃ意味ないな・・・
726デフォルトの名無しさん:2006/01/19(木) 13:41:29
知識が足りず理解しきれてないのですが、
・undefしとけばfreeは呼ばれる。
・freeで開放されるかどうかはOSに寄る。
・()での初期化はfreeがよばれないので可能性すらない。
っていうことですか?
727デフォルトの名無しさん:2006/01/19(木) 19:32:40
一般的なUNIXでは、free しても OS には返されない。
728デフォルトの名無しさん:2006/01/19(木) 19:43:51
Perlでプログラミングするとき
オブジェクト指向・デザインパターンバリバリ使ってる香具師いる?
729デフォルトの名無しさん:2006/01/19(木) 20:16:09
my(@a,$a,%a);
sub mem_check {print "$_[0],",`ps auxw|grep mem.pl|grep -v grep`;}
$a = 'x' x 1000000;mem_check('scalar1');
$a = '';mem_check('scalar2');
undef $a;mem_check('scalar3');
$#a = 1000000;mem_check('array1');
@a=();mem_check('array2');
undef @a;mem_check('array3');
$a{a} = 'x' x 1000000;$a{b} = 'x' x 1000000;mem_check('hash1');
delete $a{a};mem_check('hash2');
undef %a;mem_check('hash3');
sub test1 {my @b;$#b=1000000;}
test1();mem_check('test1');
sub test2 {my @b;$#b=1000000;undef @b}
test2();mem_check('test2');
730デフォルトの名無しさん:2006/01/19(木) 20:17:56
scalar1,***** 2693 0.0 1.3 9896 3324 pts/1 S+ 13:25 0:00 perl mem.pl
scalar2,***** 2693 0.0 1.3 9896 3336 pts/1 S+ 13:25 0:00 perl mem.pl
scalar3,***** 2693 0.0 0.9 8916 2360 pts/1 S+ 13:25 0:00 perl mem.pl
array1,***** 2693 0.0 2.5 12824 6276 pts/1 S+ 13:25 0:00 perl mem.pl
array2,***** 2693 0.0 2.5 12824 6284 pts/1 S+ 13:25 0:00 perl mem.pl
array3,***** 2693 0.0 0.9 8916 2376 pts/1 S+ 13:25 0:00 perl mem.pl
hash1,***** 2693 0.0 2.5 12836 6296 pts/1 S+ 13:25 0:00 perl mem.pl
hash2,***** 2693 0.0 2.1 11856 5320 pts/1 S+ 13:25 0:00 perl mem.pl
hash3,***** 2693 0.0 1.7 10876 4340 pts/1 S+ 13:25 0:00 perl mem.pl

centOS 4.2上のperl 5.8.5でためしてみたのですが
VSZもRSSもundefをしたところでへってるように見えます。
731デフォルトの名無しさん:2006/01/19(木) 23:28:34
ここで質問して良いか疑問ですがどなたかご教授願います。

perlで認証付きサイトを構築しようと考えています。
まずlogin画面があり、認証後サイトを見れるという感じなのですが
認証後のサイトURL直入力などを防止する為にはどのような対応が良いのでしょうか?
idとパスワードを画面遷移ごとにpostデータとして送るというのはなんか
パスワードがソース内に表記されているという事で嫌な感じがしますが
一般的なのでしょうか?
最近のセキュリティソフトではリファラを出さないそうなのでこれも使用しない
方向で考えています。

732デフォルトの名無しさん:2006/01/19(木) 23:35:29
>731
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
733デフォルトの名無しさん:2006/01/20(金) 00:07:27
print "1番目は[split(/,/, $aaa)]->[0]\n";
という文がうまくいかないので、

print "1番目は";
print [split(/,/, $aaa)]->[0];
print "\n";
としているのですが、何か他に良い書き方があるのでしょうか。
おねがいします。
734デフォルトの名無しさん:2006/01/20(金) 00:27:23
>>733
カンマでいいじゃないか
print '1番目は', (split(/,/, $aaa))[0], "\n";

先日思いついたBad Tips
print "1番目は${\do{(split(/,/, $aaa))[0]}}\n";
print "1番目は${proc((split(/,/, $aaa))[0])}\n"; sub proc {\shift}
735デフォルトの名無しさん:2006/01/20(金) 08:23:44
print "1番目は@{[[split(/,/, $aaa)]->[0]]}\n";
736デフォルトの名無しさん:2006/01/20(金) 08:39:36
このスレの回答者はレベル高いね。
コードをいかに短くするかという点においては凄いと思う。
だけど、サーバのスクリプトには使いたくないな。

短さを求めるこれらの美学には、エラー検証・セキュリティ対策が抜け落ちてるから。
そんなわけで、C/Java風のコードになってしまう。お前らはそんなことない?
737デフォルトの名無しさん:2006/01/20(金) 09:04:33
>>735
やはりperlfaq4とperlrefに同様の方法が載ってたか。すっかり見落としてた…

>>736
書き捨ては書き捨て、サーバの管理スクリプトは管理スクリプトでしょ
漏れはそういうのは結構エラー処理して書くよ。
しかし、それでもCやJavaっぽくなることはないと思うが・・・
短く書くことだけがPerlらしさではないと思うがどうかな
738デフォルトの名無しさん:2006/01/20(金) 09:36:25
>>736
737の言うように短く簡潔なコードを書くこととエラー/例外処理を丹念に行うことは相反しない。
ただperlerは短く書くことそのものが目的になってしまいがちなのも事実。
739デフォルトの名無しさん:2006/01/20(金) 09:42:27
Perlの場合、短さと簡潔さは両立すると限らない。
740デフォルトの名無しさん:2006/01/20(金) 09:45:34
分かりやすくて短いのならいい
コードを短くした上で結局コメントつけて解説するくらいなら、基本構文で書く
741デフォルトの名無しさん:2006/01/20(金) 09:48:48
Cだと長くてエラー処理無しのコードも多いけどな
Javaはエラー処理せざつを得ないから当たり前
742デフォルトの名無しさん:2006/01/20(金) 10:22:51
そういや他の言語で書くときは絶対使わない三項演算子をPerlでは多用してしまう。
なんでだろ?
743デフォルトの名無しさん:2006/01/20(金) 10:51:05
コーディングは文化
744デフォルトの名無しさん:2006/01/20(金) 11:03:40
>>742
俺C++でも結構三項演算子使う。
745デフォルトの名無しさん:2006/01/20(金) 12:26:10
> 短さを求めるこれらの美学には、エラー検証・セキュリティ対策が抜け落ちてるから。
ヘボだからでしょ。
746デフォルトの名無しさん:2006/01/20(金) 12:49:52
お前らって絶対難癖付けないと気がすまないタイプだよな
747デフォルトの名無しさん:2006/01/20(金) 12:59:15
>>746
> お前らって絶対難癖付けないと気がすまないタイプだよな

頼もしいねえ。
748デフォルトの名無しさん:2006/01/20(金) 13:04:04
749デフォルトの名無しさん:2006/01/20(金) 13:04:35
クッキーについてですけどSet-Cookieで保存できる最大文字数ってどれくらいですか?
750デフォルトの名無しさん:2006/01/20(金) 13:12:41
751デフォルトの名無しさん:2006/01/20(金) 13:15:37
ブラウザの実装次第だけど大体は4096byte
752デフォルトの名無しさん:2006/01/20(金) 13:18:39
753デフォルトの名無しさん:2006/01/20(金) 13:20:07
実際 session id ぐらいしか食わせないけどな
754733:2006/01/20(金) 23:00:45
>>734
カンマですか、言われてみればピリオドでもいけますね。
気づきませんでした。ありがとうございます。
>>735
@{[[split(/,/, $aaa)]->[0]]}の @{[ ]} あたりがいったいどうなって
いるのか見当もつかないのですが、何を勉強すればよいのでしょうか。
「@[{」でぐぐってみたのですが、何も出ませんでした・・・
キーとなる言葉が御座いましたら御示唆くださいませ。
755デフォルトの名無しさん:2006/01/20(金) 23:39:02
>>754
> キーとなる言葉
 >>737
 > やはりperlfaq4とperlrefに同様の方法が載ってたか。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_expand_function_calls_in_a_string
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
756クロエ:2006/01/21(土) 00:00:14
【1】@〜Mまでユーザーが任意に入力した数値を総計
【2】☆・△・■ ユーザーが任意入力した3つの数値を総計
【2】÷【1】を結果として表示
以上の様なCGIをプログラミングしてもらおうと、代行屋さんに見積もりしてもらいました。17000円との事でしたが、普通のお値段でしょうか?カモられていないか心配ですw
757デフォルトの名無しさん:2006/01/21(土) 00:09:11
え、オチは?
758デフォルトの名無しさん:2006/01/21(土) 00:10:46
一ヶ月20日として、一人月50万なら、
一日2.5万円。
半日で1.75万円。


まぁ妥当なとこじゃねーの?
759デフォルトの名無しさん:2006/01/21(土) 00:20:07
桁を一つ間違えているのかと思ったよ。
>>756のような頭の足りない人間の相手をしなきゃならんし。
760デフォルトの名無しさん:2006/01/21(土) 00:41:27
>>756
めちゃくちゃ安いな。
赤字でてるだろ向こうは。
761デフォルトの名無しさん:2006/01/21(土) 01:18:15
>>756
地域によっても違うが、かなり安い。(正直、自分だったらこんな仕事受けない)
ただ、こんなところで聞いても何の役にも立たない。
心配なら他の業者に合見積もりをとること。
762デフォルトの名無しさん:2006/01/21(土) 01:20:36
みんな優しいな。
763デフォルトの名無しさん:2006/01/21(土) 01:54:56
そんなので金とれるんだ・・・おれでもできるな・・・
学生だけど小使稼ぎと勉強がてらにコーディング出来るバイト探そうかな
764デフォルトの名無しさん:2006/01/21(土) 01:59:39
>756
>763 みたいな素人が作るとしたらもっと安くできる。ただし出来は......
765デフォルトの名無しさん:2006/01/21(土) 02:01:36
動きゃいいんだ・・・ちくしょう・・・
766デフォルトの名無しさん:2006/01/21(土) 11:07:58
>>756
それ間違いなくぼったくり。作成時間5分。
my @k = (1..14, '☆', '△', '■');
my ($s1, $s2) = (0) x 2;
for (@k) { print "$_ は? "; (/^\d+$/ ? $s1 : $s2) += <>; }
print join('+', grep /^\d+$/, @k), " = $s1\n";
print join('+', grep !/^\d+$/, @k), " = $s2\n";
print "$s2 / $s1 = ", $s2 / $s1;
767デフォルトの名無しさん:2006/01/21(土) 11:56:22
CGIなんだから入力用のページや結果出力用のページも作らないと。
1ページ辺りの相場は10000〜30000円程度、
CGIスクリプトはフルスクラッチで50000円くらい?
768デフォルトの名無しさん:2006/01/21(土) 12:00:26
>>766
せんせえ、それCGIになってねえっす。

あ、ちゃくっとuse CGIで技術サイトにあるようなForm部品むき出しのようなの
取って付けても駄目っす。
みっともなくない程度に最低限のデザインもしなきゃクライアントに怒られるっす。

それに加えて、概要設計書、詳細設計書、仕様書、テスト設計書とテスト結果、
それにまつわる数回の打ち合わせ、瑕疵対応まで入れて半人日17,000円で
じゃキツいっす。(この規模だから概要設計書と詳細設計書は仕様書で代用
させてもらうとしても・・・)
どんな小さな、たとえ3行スクリプト作成10秒でもCGI一本\17,000は安いっすよー

俺SOHOで今仕事に困ってますけど、その値段ではCGI作成は受けられないですぅ。
769デフォルトの名無しさん:2006/01/21(土) 12:07:29
>>766
そりゃ、こういう仕事やったことないなら、ボッタクリと思うかもしれんけどね。

CGIなんだから、それだけじゃ動かないだろ? フォームのHTMLの方も必要だし。

しかも>>756はどう見ても超ド級初心者なんだから、納品後に質問が来ることも
考えないといけない。「どうやって設置するの?」「FTPって何?」とか。
設置したサーバがメンテナンスに入っただけなのに、「動かない」と言ってくる
ことも考えられる。
(アフターサポート一切無しという契約でも、電話がかかってきて40分ロスするだ
けで、0.1人日くらいは損をする)

さらに納品書・仕様書や、請求書も作らないといけない。
打ち合わせなり納品時なりの交通費も問題だ。

そう考えると、>>761と同意見で俺は17000円では引き受けない。ペイしないもん。
フォームHTMLとセットで最低4-5万円はもらわないと。
770デフォルトの名無しさん:2006/01/21(土) 12:15:19
>>767-769
まあ、実務経験者と趣味でやってる素人の違いということで。
今頃766は顔真っ赤にしてるだろうから、そろそろ勘弁したれw
771デフォルトの名無しさん:2006/01/21(土) 12:18:52
世間知らずの学生とWeb屋はWebProg板逝け
772デフォルトの名無しさん:2006/01/21(土) 12:28:36
$txt="abcabc";
print $1 if $t=~/(a.*?$)/;
この場合、*? を使用しての最短一致なので abc となると思ったのですが、abcabc となります
なぜでしょうか?
773デフォルトの名無しさん:2006/01/21(土) 12:30:20
そりゃ終端へのマッチを要求してるからね。
774デフォルトの名無しさん:2006/01/21(土) 12:31:38
ああ違うか。どこから一致させるかとかは門外漢なので他の人に。
775デフォルトの名無しさん:2006/01/21(土) 12:36:07
>>772
「欲張りマッチ」でググる
776デフォルトの名無しさん:2006/01/21(土) 12:52:41
>>772
初心者が嵌りがちなとこ。よって、あんたはまっとうな初心者。
今後もまじめにやる気があるなら、推奨書を買いなされ。
777766:2006/01/21(土) 13:51:45
>>756
よくわからんけど暇な業者が必死っぽいのでこっちに張っておいた。
http://pc8.2ch.net/test/read.cgi/php/1036141603/
778デフォルトの名無しさん:2006/01/21(土) 14:23:22
Perlでhtmlファイルを書き出したいんですが、どこか解説サイトないですか?
分かりやすいサンプルでもいいのでお願いします。
779デフォルトの名無しさん:2006/01/21(土) 14:24:08
>>778
Google で検索ぐらいしろよ。
780デフォルトの名無しさん:2006/01/21(土) 14:34:36
open OUT, '>./out.html';
    print OUT '<html>';
close OUT;
781クロエ:2006/01/21(土) 16:34:45
板違いでしたね。ごめんなさい。
777さんありがとうございます。試してみます。
782デフォルトの名無しさん:2006/01/21(土) 16:58:05
>>776
推奨書ってこれ?
http://www.oreilly.co.jp/books/4873111307/toc.html

>>772
最短一致とか最長一致とかいう表現が悪いんだと思うよ。
非欲張りマッチと欲張りマッチって言うとまだマシ。

正規表現エンジンの気持ちになって考える。
1. abcabc に対して /(a.*?$)/ がマッチするか試し、NG なら次
2. bcabc に対して /(a.*?$)/ がマッチするか試す、NG なら次
3. cabc に対して /(a.*?$)/ がマッチするか試す、NG なら次
4. abc に対して /(a.*?$)/ がマッチするか試す、NG なら次
5. bc に対して /(a.*?$)/ がマッチするか試す、NG なら次
6. c に対して /(a.*?$)/ がマッチするか試す、NG なら次

で、1. でいきなり成功しちゃってるから。abcabc になる。

/.*(a.*?$)/ で欲張りマッチの方に余計なもの奪わせるといいんじゃね?
正規表現なんか使わない方が速そうだけど。
783デフォルトの名無しさん:2006/01/21(土) 18:51:42
世の中はライブドアでそうぞうしいわけだが、
こうなるとPerlスレとしては小飼さんの様子が
気になるな。
784デフォルトの名無しさん:2006/01/21(土) 20:11:43
>>783
ふつーに元気そうですが。
ttp://blog.livedoor.jp/dankogai/

この間もEncodeのバージョン上げてたしねぇ。

785デフォルトの名無しさん:2006/01/21(土) 21:25:52 BE:596111696-
な、なんだってー
786デフォルトの名無しさん:2006/01/21(土) 21:34:58
ついにperl、情報処理試験のプログラム問題に出るようになりましたね^^
今パンフレット見てて気づいた。
787デフォルトの名無しさん:2006/01/21(土) 21:36:17
あげ
788デフォルトの名無しさん:2006/01/21(土) 21:37:02
教育用言語としてPerlを出すのは如何な物かと思うが……
789デフォルトの名無しさん:2006/01/21(土) 21:58:08
マジか!情報処理受けるからCやらなきゃと思ってた矢先に超ラッキー
790デフォルトの名無しさん:2006/01/21(土) 22:06:46
でも、perlは高度区分で出題されるみたい
791デフォルトの名無しさん:2006/01/21(土) 22:15:05
なんと言うか、そういう試験にいくらでも書き方があるPerlを使うのは間違ってる気がする
brainfuckとまではいかないが、言語仕様が明確で簡潔な言語を使用するべきだと思う
792デフォルトの名無しさん:2006/01/21(土) 22:17:02
Schemeだな
793デフォルトの名無しさん:2006/01/21(土) 22:18:50
>>790
あれ? 高度区分は疑似言語しか出ないんじゃなかったっけ?
プログラミング言語自体が出題されるのは第二種(今の"基本")だけだったような

まぁ、はるか昔のことなのでもう忘れたが
794デフォルトの名無しさん:2006/01/21(土) 22:45:02
>>793
僕もあまり詳しく無いんですけど、テクカルエンジニア(情報セキュリティ)試験でC++,Java,Perlが使われるみたいです。
巻末にCASLUの仕様書とPerlの仕様書が付いてます。

IPA テクカルエンジニア(情報セキュリティ)
http://www.jitec.jp/1_13download/leaflet_200509-ts.pdf
795デフォルトの名無しさん:2006/01/21(土) 22:47:51
このスレも流行っちゃいそうだな
796デフォルトの名無しさん:2006/01/21(土) 22:50:22
いい事だ
797デフォルトの名無しさん:2006/01/21(土) 23:39:22
Perlの「仕様」wwww
798デフォルトの名無しさん:2006/01/21(土) 23:40:59
試験に申し込むとラクダ本がついてくるならうれしいな。
799デフォルトの名無しさん:2006/01/21(土) 23:49:03
やべ、ラクダ本一時的に売り切れるかもしれんな
下巻今のうちに買っておこう
800デフォルトの名無しさん:2006/01/22(日) 00:13:17
あと2,3ヶ月もすると春やねぇ
801デフォルトの名無しさん:2006/01/22(日) 09:14:00
---hoge.pl---
use strict;
my $hoge = require './abc.pl';
print $hoge->{a};
------

---abc.pl---
$VAR = { a => 123, b => 456};
------

mod_perlの環境で動かすと2回目以降のアクセスで
Can't use string ("1") as a HASH ref while "strict refs" in use at hoge.pl
が出てしまいます。
これは1回目は$hogeには$VARが代入されるが2回目以降はコンパイル済みなのでrequireが1を
返すためだと思われます。
$INC{abc.pl}を意図的に消せば毎回読み直してくれますが他に良いアイディアはありませんでしょうか?
802デフォルトの名無しさん:2006/01/22(日) 09:38:09
>>801
つdo './abc.pl';
ってかrequireの戻り値はエラーが発生したかどうか調べるためのものだから、
そういう風に使うのは避けたほうがいいかと思うが
803デフォルトの名無しさん:2006/01/22(日) 10:07:22
doで解決しました。ありがとうございました。
Data::Dumperで出力した値をよくこの手法でデシリアライズしたりしていたのですが
requireだとファイルに文法エラーや存在しなかったりするとエラーになるので
doの方がいいかもしれませんね。エラー出さない方が良いのかは微妙ですけど。
このような目的では本来はData::Serializerを使うべきなんでしょうけどお手軽なので
やめれません-_-;
804デフォルトの名無しさん:2006/01/22(日) 10:17:04
それは人として正しいです
805ヽ(´ー`)ノ ◆.ogCuANUcE :2006/01/22(日) 11:54:17
普通 Storable じゃね?store/retrieve 使えば手軽だし。
806デフォルトの名無しさん:2006/01/22(日) 12:37:01
>>790
出題「この処理を実現できるモジュールを、CPANからみつけなさい」 とか
807デフォルトの名無しさん:2006/01/22(日) 13:37:54
5.8.8-RC1リリース。問題なければ今月中に正式版出るかな
ttp://use.perl.org/articles/06/01/21/1733227.shtml
808デフォルトの名無しさん:2006/01/22(日) 13:47:48
何が変わったのかしら
わくてか
809デフォルトの名無しさん:2006/01/22(日) 13:57:38
子飼氏、この間バタバタだからEncoding関係の改善は期待できんか
810デフォルトの名無しさん:2006/01/22(日) 14:43:39
>>805
時にはファイルを手で弄りたいときもあるのです。
セキュリティ・速度よりも何よりも手軽さを優先したい時はDumperが便利!
後で他のシリアライザに変更するのもそれほど手間じゃないし。
811デフォルトの名無しさん:2006/01/22(日) 21:08:48
>>809
改善って、どんな希望があるの?
812デフォルトの名無しさん:2006/01/22(日) 21:34:29
webprog板おもすれー( ^ω^)
813デフォルトの名無しさん:2006/01/23(月) 02:11:22
>>812
まぢで。おまえどのスレがおもすれー( ^ω^)のかおしえてけろよん
814デフォルトの名無しさん:2006/01/23(月) 02:13:33
#! c:/perl/bin/perl
#カウントファイルの読み込み
open(IN,"<./count.dat");
$count=<IN>;
close(IN);
++$count;
#カウントファイル書き込み
open(OUT,">./count.dat");
print OUT $count;
close(OUT);
#鯖出力
print<<END;
Content-type:text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>アクセスカウンタ</head></title>
<body>
あなたは$count番目の訪問者
</body></html>
END








文法チェックでは通るんだが
[Mon Jan 23 02:07:40 2006] [error] [client 127.0.0.1] malformed header from script. Bad header=<!DOCTYPE HTML PUBLIC "-//W3C/: 3-3.cgi, referer: http://127.0.0.1/tendaysmyself/3-3/
ってエラーが出ます。
815デフォルトの名無しさん:2006/01/23(月) 02:25:04
Content-type:text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

1行空ける
816デフォルトの名無しさん:2006/01/23(月) 02:33:24
>>813
低レベルすぎておもすれー( ^ω^)なのです
817デフォルトの名無しさん:2006/01/23(月) 03:03:51
( ^ω^)あなたもわたしもVIPPER!(^ω^ )
818デフォルトの名無しさん:2006/01/23(月) 06:53:07
>>815
ありがつございます。
ず〜っとコレで詰まってました。
助かりました。
819デフォルトの名無しさん:2006/01/23(月) 07:37:34
>>818
こういうのはPerlに関する問題じゃないから、次からはCGIの質問はWebProg板行ってくれよ。
>>1
> CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
> CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
> WEBプログラミング板に行って聞いたほうが得ですよ。
820デフォルトの名無しさん:2006/01/23(月) 09:11:17
perl で ビットの扱いに関する質問です。

-------
my $val = 10;
my @result = &hoge( $val );

sub hoge{
 my $val = shift;

 # 2進数に変換し、1がたっている箇所だけ10進数にして返す。
 # (例) 10 => (1010) = 2^3 + 2^1 = 8 + 2
  # return で (8,2) を Array で返したいです。

}
-------
Perlだとこういう場合どういう風にするもんなんでしょうか?
821デフォルトの名無しさん:2006/01/23(月) 09:32:04
>>820
自分が以前に作ったのはこんなん
65536 より小さい数しか扱わないことがわかってたから
for 文での開始数を 16 にしてるけど増やせばまだ大丈夫と思う

sub hoge {
  my $val = shift;
  my @ret = ();

  for (my $i = 16; $i >= 0; $i--) {
    my $power = 2 ** $i;
    if ( int ($val / $power) != 0) {
      $val %= $power;
      push (@ret, $power);
    }
  }

  return @ret;
}
もっといい方法あったら教えてください
822デフォルトの名無しさん:2006/01/23(月) 09:55:47
>>820
何に使うのか知らないけどそれ遠回りしてる気がするなあ

sub hoge {
    my $val = shift;
    my @ret = ();
    my $flag = 1;

    do{
        $val & 1 and push @ret, $flag;
        $flag <<= 1;
    }while( $val >>= 1 );
    return reverse @ret;
}
823デフォルトの名無しさん:2006/01/23(月) 10:10:54
>>822
pushしてreverseならunshiftでいいんじゃないのだろうか。
824デフォルトの名無しさん:2006/01/23(月) 10:39:21
825デフォルトの名無しさん:2006/01/23(月) 10:49:02
sub hoge($){
my $val = shift;
my @retval;
while ($val != 0){
my $ntz = $val&(-$val);
unshift @retval, $ntz;
$val -= $ntz;
}
return @retval;
}
826デフォルトの名無しさん:2006/01/23(月) 11:22:22
>>825
負の数はどうするの?
827デフォルトの名無しさん:2006/01/23(月) 12:29:08
sub hoge {
        my $val = shift;
        my $n = 2**32;
        map { $n/=2; $_ ? $n : (); } split(//,unpack("B32",pack("N",$val)));
}
828デフォルトの名無しさん:2006/01/23(月) 13:13:26
どうもこうも無いよ氏ね
829デフォルトの名無しさん:2006/01/23(月) 14:10:03
入力ストリームの一行読み込み処理で、一行の区切りを \n でなく、
%0A 区切りにして一行ずつ読込みたいのですが、
調べたら「$/」に区切り文字入れろって書いてありました。
ただ、これだと入力ストリーム全部が%0A区切り読み込みになってしまうので困ります。
ストリーム個別に読込区切り文字を指定する方法がないでしょうか?

$/='%0A'; #←ストリームを指定したいができない
print $_=<DATA>; # aiueo%0D%0Aを出力
__END__
aiueo%0D%0Akakikukeko%0D%0Asasi(ryaku
830デフォルトの名無しさん:2006/01/23(月) 14:53:16
その個別のストリームとやらを使用する前に$/に毎回入れてやればいいんじゃ
831デフォルトの名無しさん:2006/01/23(月) 15:34:52
見せてもらおうか、ストリーム前の$/の使い方とやらを!
832デフォルトの名無しさん:2006/01/23(月) 15:57:20
は?
833デフォルトの名無しさん:2006/01/23(月) 16:07:03
>>829
必要なところで local を使って代入するか、
IO::Handle->input_record_separator() を使うか。

perldoc perlvar に書いてあるサンプルを読めば、普通は思い付くと思うんだが…。
834デフォルトの名無しさん:2006/01/23(月) 16:13:33
坊やだからさ
835デフォルトの名無しさん:2006/01/23(月) 16:23:26
無駄に煽るのもこのスレの特徴、と
836デフォルトの名無しさん:2006/01/23(月) 16:27:28
お前だけだバーカ
837デフォルトの名無しさん:2006/01/23(月) 16:28:11
なんかこのスレレベル低下してる気がする
変な奴はwebprog行けよw
838デフォルトの名無しさん:2006/01/23(月) 16:32:20
>>834-839
この辺まとめてだな。俺もかよ
839デフォルトの名無しさん:2006/01/23(月) 16:40:00
さぁ殺伐としたふいんきになって参りました
840デフォルトの名無しさん:2006/01/23(月) 17:22:24
殺伐としたこのスレに珍走団が!!
       ___
       /孕/二                    パラリラパラリラ
     。 / ̄ −    。 −    。 。 。 −    __
    o孕o三     @孕@三  o孕孕孕o三  /孕/   。 −
         。 −                 / ̄ ̄    o孕o三
        o孕o三            _/ ̄ ̄\_//=3
       ___       。 −   ━┷-○ー○ー┘三
       /孕/二     o孕o三      。 −
     。 / ̄ −  。 −           @u@三     。 −
    o孕o三    o孕o三    ワーワー         @孕@三
841デフォルトの名無しさん:2006/01/23(月) 17:23:26
いやつまんないから・・・
842デフォルトの名無しさん:2006/01/23(月) 18:32:18
新宿にPerlだかpearlっていうバーがあったけどオフやるときはここでやろうぜっ!
あとプロピアもバーの近くにあるからラリーも呼んで。
843831:2006/01/23(月) 18:50:18
そろそろWebprog版へ帰ります。探さないで下さい
844 ◆TWARamEjuA :2006/01/23(月) 19:32:38 BE:3812257-
WebProg931実装キボンヌ
845デフォルトの名無しさん:2006/01/23(月) 22:02:26
俺様だけ賢いと思い込んでいる厨がいらっしゃるようでつね。
846829:2006/01/24(火) 01:50:42
>>833
キタコレ!調べてみる!サンクスおにいさん!

>perldoc perlvar に書いてあるサンプルを読めば、普通は思い付くと思うんだが…。
坊やだからさ。サンクスおにいさん!

って、あんだよ!input_record_separatorのソース見たらまんま >>830 じゃねーか
スレッドとかmod_perlとかに弱そうだったからグローバル変数での切替はイヤだったんだよ!うんこ!みたいな。

sub input_record_separator {
  my $old = new SelectSaver qualify($_[0], caller);
  my $prev = $/;
  $/ = $_[1] if @_ > 1;
  $prev;
}

このソース見る限り、ストリームごとに個別に設定は無理そうですね。
ありがとうございます。
847829:2006/01/24(火) 01:53:11
そしてWebprog版へ帰ります。行ったこと無いけど。
848デフォルトの名無しさん:2006/01/24(火) 09:30:06
>>842
そんな名前のバーは世界中にありそうな気がする。
849デフォルトの名無しさん:2006/01/24(火) 09:47:34
そんな名前の楽器会社もありそうな気がする
850デフォルトの名無しさん:2006/01/24(火) 10:01:28
こんなスレ見てないで仕事しろ
851デフォルトの名無しさん:2006/01/24(火) 10:05:15
>>850
まさに今仕事中に見ている俺に、そんな注意をするおまいは俺の上司か!?
それとも俺のディスプレイ見つめてる後ろの席の奴か!?こわいわ!
852デフォルトの名無しさん:2006/01/24(火) 18:00:55
sysopen 使って

Argument "O_RDONLY" isn't numeric in sysopen at HOGE.pl in line 31.

というエラーが出てくるのですが
O_RDONLY ってあってますよね。。。
どなたかこうなる理由に心当たりあるかたお願いします。

# HOGE.pl line 31
sysopen IN, $file, O_RDONLY, 0400 or die "Can't open '$file' : $!";
853852:2006/01/24(火) 18:13:24
『質問すると自己解決できる』の法則。。。
すみません;;
854デフォルトの名無しさん:2006/01/24(火) 19:02:48
>>852
法則?
普段からよく調べもせずに質問するからそうなる。
855デフォルトの名無しさん:2006/01/24(火) 19:26:56
>>853
> 『質問すると自己解決できる』の法則。。。
> すみません;;

質問しようとすると問題点を頭の中で整理するため、
答が見えることがあるわけです。
856デフォルトの名無しさん:2006/01/24(火) 20:10:34
>>852
use Fcntl;
857デフォルトの名無しさん:2006/01/24(火) 23:21:20
ほんとこいつらは難癖付けないと気が済まないんだなw
他人事だと思ってもイライラしてくるわw
周りから嫌われてそう
858デフォルトの名無しさん:2006/01/24(火) 23:39:49
たぶん、先輩とかにやられた過去があるんだよ。多くの人に。
最初はみんな不快だったはずだ。
が、この業界はこんなもの、と慣れてしまった。
そして同じ事を平気でするようになる。
859デフォルトの名無しさん:2006/01/24(火) 23:42:04
>>857
>>746の人? それも難癖のような気が。
860デフォルトの名無しさん:2006/01/24(火) 23:50:50

任意の10進数を16 bitの二進数データに変換したい場合について質問させてください。
下のように記述しても、何故か8bit分の文字列しか帰ってきません。
お手数ですが御教授頂けないでしょうか。


$data = 72;
$out_data=unpack("B16",pack("C*",$data));

$out_dataに、"0000000001001000"が戻ってくることを
期待しますが、"01001000"が戻ってきます。
861デフォルトの名無しさん:2006/01/24(火) 23:53:52
>>858
なるほど

>>859
チガウヨ
862デフォルトの名無しさん:2006/01/25(水) 00:42:24
>>860
pack() の型指定子に 'C' 使ってるから

$out_data = unpack("B16", pack("s*", $data));

以下、perlfunc から引用

s A signed short value.
S An unsigned short value.
 (This 'short' is _exactly_ 16 bits, which may differ from
  what a local C compiler calls 'short'. If you want
  native-length shorts, use the '!' suffix.)
863デフォルトの名無しさん:2006/01/25(水) 01:56:16
>>863

御教授ありがとうございます。
重ねて質問をよろしいでしょうか。

教えて頂いた方法で、例えば
"$out_data = unpack("B16", pack("s*", 511)); "
10進"511"は、2進"111111111"(1x9個)ですので、
出力が

で、実行してみますと、
"1111111100000001"が出力されます。そこで、教えて頂いた事と
エンディアンを考慮してpack()の型数に"n"を使用してみました。
"$out_data = unpack("B16", pack("n*", 511)); "

すると出力は"0000000111111111"となり、所望の結果となりました。
ですが、今度は24bit"000000000000000111111111"で出力させようと思い、
"$out_data = unpack("B16", pack("N*", 511)); "
で実行すると、"000000000000000000000001"と出力されてしまいます。

これを,"000000000000000111111111"と出力させるには如何したらよろしいでしょうか。
御多忙の折に申し訳ありませんが、御教授頂けましたら幸いです。よろしくお願いいたします。
864デフォルトの名無しさん:2006/01/25(水) 01:58:46
>>860 = 863 です。以下、訂正です。

>> 862 様

御教授ありがとうございます。
重ねて質問をよろしいでしょうか。

教えて頂いた方法で、例えば
"$out_data = unpack("B16", pack("s*", 511)); "
10進"511"は、2進"111111111"(1x9個)ですので、
出力がは"0000000111111111"を期待します。

で、実行してみますと、
"1111111100000001"が出力されます。そこで、教えて頂いた事と
エンディアンを考慮してpack()の型数に"n"を使用してみました。
"$out_data = unpack("B16", pack("n*", 511)); "

すると出力は"0000000111111111"となり、所望の結果となりました。
ですが、今度は24bit"000000000000000111111111"で出力させようと思い、
"$out_data = unpack("B16", pack("N*", 511)); "
で実行すると、"000000000000000000000001"と出力されてしまいます。

これを,"000000000000000111111111"と出力させるには如何したらよろしいでしょうか。
御多忙の折に申し訳ありませんが、御教授頂けましたら幸いです。よろしくお願いいたします。
865デフォルトの名無しさん:2006/01/25(水) 02:32:30
substr(unpack('B*', pack('N', 511)), 8)
但しNが32ビットである場合のみ有効。
N は big-endian で unsigned long ということは保障されていても
unsigned long が 32 ビットであることは保障されていない。

866デフォルトの名無しさん:2006/01/25(水) 04:03:37
$data = 72;
$bit = 24; #表示させたいビット数
foreach(1..$bit){
    if($data & 1 << $bit - $_){
        print "1";
    }
    else{
        print "0";
    }
}

これじゃだめか?
867デフォルトの名無しさん:2006/01/25(水) 09:12:07
Perlで書かれたHTTPDってどこかにありますか?
inetdから起動される簡単なものでいいんですが・・・
868デフォルトの名無しさん:2006/01/25(水) 09:19:14
>>865
いつからかはわからないですが今は32bitであることが保証されています。
5.8.7のperlfunc(1)のpackの項から抜き出したものですが、最後のカッコ内
に注目。

n An unsigned short in "network" (big-endian) order.
N An unsigned long in "network" (big-endian) order.
v An unsigned short in "VAX" (little-endian) order.
V An unsigned long in "VAX" (little-endian) order.
(These 'shorts' and 'longs' are _exactly_ 16 bits and
_exactly_ 32 bits, respectively.)

869ヽ(´ー`)ノ ◆.ogCuANUcE :2006/01/25(水) 09:33:36
>>867
> Perlで書かれたHTTPDってどこかにありますか?
HTTP::Daemon とか。

> inetdから起動される簡単なものでいいんですが・・・
こっちはしらね。
870デフォルトの名無しさん:2006/01/25(水) 10:12:50
>>868
あ、本当だ。32ビットは保証されていたのか。
やっぱ互換性を保ちたいということかな。
(そういや昔は Perl バージョンアップしたら
動かなくなるスクリプトあったな…)
871デフォルトの名無しさん:2006/01/25(水) 10:32:30
>>869
ローカルのドキュメントを表示するだけのものが欲しかったんですが、
これだけでOKでした・・・

#!/usr/local/bin/perl
$METHOD=<STDIN>;
$PATH=$1 if $METHOD=~/GET (.+) HTTP/;
if(! -f $PATH){exit}
undef $/;
open FH,"$PATH";
$document=<FH>;
close FH;
print STDOUT $document;

これと/etc/inetd.confに下の一行を追加して、
http stream tcp nowait root /home/junya/bin/httpd.pl httpd.pl

ブラウザからこんな感じで
http://localhost:80/usr/share/doc/...

つか、これならシェルで十分すね・・・
872ヽ(´ー`)ノ ◆.ogCuANUcE :2006/01/25(水) 11:06:50
>>871
それ、
"GET /etc/passwd HTTP/1.1"
とか送り付けられたらヤバくね?
873デフォルトの名無しさん:2006/01/25(水) 11:16:17
>>872
/etc/hosts.allow,/etc/hosts.denyで規制してるし、どうせローカルでしか使わないし。
でもあんまり良くないかな。
874デフォルトの名無しさん:2006/01/25(水) 11:54:54
>>860
>任意の10進数を16 bitの二進数データに変換したい場合について質問させてください。

sprintfを使え。
つーか、これまでそう言った人がいないのは、どうしたわけだろうか?
875デフォルトの名無しさん:2006/01/25(水) 12:04:44
>>874
「○進数を×進数に…」の質問は散々既出なので、sprintf の %b を
知ってる間は質問を読みもしない。
876デフォルトの名無しさん:2006/01/25(水) 12:54:56
すみません教えてください

setenv CLASSPATH…
が羅列されたcshファイルを
シェルのsourceのように
perlの中から読み込んで、環境変数CLASSPATHに設定すること
は出来ますか?
877デフォルトの名無しさん:2006/01/25(水) 13:22:20
878デフォルトの名無しさん:2006/01/25(水) 13:36:13
>>876
$ENV{CLASSPATH} = `csh -c 'source $csh_file >/dev/null ; echo -n \$CLASSPATH'`;
879デフォルトの名無しさん:2006/01/25(水) 13:49:20
出来ました!
ありがとう!

先ほどsage忘れました、ごめんなさい
880デフォルトの名無しさん:2006/01/25(水) 20:49:29
Perl初心者です
UNIXコマンドでのwc -lのようにファイルの中の行数を
出力するにはPerlでどうすればできますか?
881デフォルトの名無しさん:2006/01/25(水) 20:54:09

>Perl初心者です

あっそ、だから何
882デフォルトの名無しさん:2006/01/25(水) 21:01:39
>>880
print `wc -l foo.txt`;
883デフォルトの名無しさん:2006/01/25(水) 21:10:22
人間としての器の差だなw
884デフォルトの名無しさん:2006/01/25(水) 22:04:53
>>880
ファイルを開いて
open my $fh, 'file' or die "Can't open file: $!";

後は数える。
my $c = 0;
$c++ while <$fh>;

富豪的解法
my $c = scalar @{[ <$fh> ]};

閉じるのをお忘れなく
close $fh;

おまけのワンライナー
perl -ne 'END { print $. }' < file

>>881
「初心者」を振りかざして免罪符にしようとするのであれば確かにそれは間違っているが、
あまり詳しくないことを初めに言っておくことは質問方法として重要なことだと思うが?
まあこの場合は質問内容からそれが解るし、自らはどのようにやってみた等が欠けてはいるけど。
この回答でも「Perl初心者です」という一言があるからこそ、
ファイルの開き方を軽く説明しているつもりだし。
885デフォルトの名無しさん:2006/01/25(水) 22:22:13
>>881
は、人生の初心者でした。
886デフォルトの名無しさん:2006/01/25(水) 22:25:02
( ´д)ヒソ(´д`)ヒソ(д` )
887デフォルトの名無しさん:2006/01/25(水) 23:07:19
もうこのスレwebprogと併合しろよ
888デフォルトの名無しさん:2006/01/25(水) 23:08:05
5.9.3はいつでるの?
889860:2006/01/25(水) 23:08:21
865,866,874様

御教授ありがとうございました。
sprintfに "b"があるとは知りませんでした。

866様の例も勉強になりました。
大変ありがとうございました。
890デフォルトの名無しさん:2006/01/25(水) 23:11:04
>>884に同意。
何かこのスレ潰そうってかperlを貶めようってかしてる椰子が
1個流れてるな。
891860:2006/01/25(水) 23:14:07
・・・。










>>」881
氏ねや ゴミはよ!
892デフォルトの名無しさん:2006/01/25(水) 23:14:47
>>872
phfを思い出した
893デフォルトの名無しさん:2006/01/25(水) 23:56:47
ぎゃっはっは
初心者を煽るのを含めて楽しもうぜ
894デフォルトの名無しさん:2006/01/26(木) 01:24:05
VIPでやれ
895デフォルトの名無しさん:2006/01/26(木) 01:31:43
vip以外でvipでやれっていうの始めてみた
896デフォルトの名無しさん:2006/01/26(木) 05:30:04
まんこぉー
897デフォルトの名無しさん:2006/01/26(木) 05:53:23
何なんだこの荒れようは…
898デフォルトの名無しさん:2006/01/26(木) 07:55:42
WebProgのPerl貶しスレ辺りから変なのが沸いてきたんじゃないかな。
長い間いい感じで進行してたのに残念ですな。
899デフォルトの名無しさん:2006/01/26(木) 13:13:29
なんでもかんでもWebProg板のせいにする奴が出てきてから荒れてきた
900デフォルトの名無しさん:2006/01/26(木) 14:16:35
その前に難癖厨が・・
901デフォルトの名無しさん:2006/01/26(木) 14:40:25
一部残っていた卵がふ化したんだろう
902デフォルトの名無しさん:2006/01/26(木) 17:06:37
hashを書いたファイルを作成して、requireで読み込んでそのまま使おうとしています。

---------------------
・ファイルの中身
%s=('id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a));
---------------------
・ソース
if (ろぐいんok) {
 require ふぁいる;
 %mainhash = %s;
}
---------------------

普通に使えていたのですが、use strictを入れたらフォーカスがあいまい?だと怒られた為、
---------------------
・ソース
if (ろぐいんok) {
 my %s;
 require ふぁいる;
 %mainhash = %s;
}
---------------------
のようにしたのですが、これですとエラーは出なくなるのですが、
my %sとrequire内の%sが別扱いになってしまうのか、hashが空で読み込まれるようになってしまいました。

requireを使う前提で、なにか解決策などありますでしょうか。
ファイルのデータ構造を変えて普通にファイルとして読み込んでからハッシュに格納するようにすればいいんでしょうが、
こういう使い方ができないのかどうか激しく疑問です。。

以上、ご教授よろしくお願いします。
903デフォルトの名無しさん:2006/01/26(木) 17:35:01
>>902
our %s=〜 で明示的にグローバルにするか、
ハッシュの中身を返すサブルーチンに替える。
904デフォルトの名無しさん:2006/01/26(木) 17:56:45
>>902
 %mainhash = require ふぁいる;
っていけないのかな?
試してないけど。
905デフォルトの名無しさん:2006/01/26(木) 18:04:21
>>902
この場合は require を使う方が面倒が起きるんだけどな。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq8.html#what_s_the_difference_between_require_and_use

---------------------
・ファイルの中身
{'id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a)};
---------------------
・ソース
if (ろぐいんok) {
  my %mainhash = %{ do ふぁいる };
}
---------------------
906デフォルトの名無しさん:2006/01/26(木) 18:07:58
>>903
ありがとうございます。
ourは気持ちわるいっすね。。
サブルーチンに変えるというのはこういう解釈で問題ないでしょうか。
---------------------
・ファイルの中身
sub fileread() {%s=('id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a));}
---------------------

>>904
それは試したんですが、無理でしたです。
すみません、説明不足でした。
907デフォルトの名無しさん:2006/01/26(木) 18:21:14
>>906
訂正
---------------------
・ファイルの中身
sub fileread() {my %s; %s=('id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a)); return %s;}

>>905
ありがとうございます、できました!
動いてた頃よりもソースが美しいっす!


>>903-905
ありがとうございました。
908デフォルトの名無しさん:2006/01/26(木) 18:21:59
our より、
> hashを書いたファイルを作成して、requireで読み込んでそのまま使おうとしています。
の方がキモいけどなぁ。
909デフォルトの名無しさん:2006/01/26(木) 18:39:11
Visual Perlってもう手に入らないんですか?
インストーラ自体はFTPにあったのですが、インストールしても
ライセンスがないというダイアログが出てはじかれてしまうんですよ。
オフィシャルの
b) provide unlimited licenses for the current 2003/2002 plug-ins;
ってのはKomodoのライセンス持ってる人にだけってことでしょうか?
910デフォルトの名無しさん:2006/01/26(木) 19:18:16
Perlなんてエディタで書けよ・・・
911デフォルトの名無しさん:2006/01/26(木) 19:53:49
TMTOWTDI
912デフォルトの名無しさん:2006/01/26(木) 21:02:13
すいません、質問です。
ある2つの配列のハッシュ(%A, %B)で、各 key に対する値が、A, B ともに
あったら、それを A から削除したいのですが、よい方法ありますでしょうか。

今、思いつくのはこんな感じです・・・
foreach $key ( keys %A ) {
foreach $i ( 0 .. $#{ $A{$key} } ) {
if ($A{$key}[$i] = $B{$key}[$i]) {
ここで削除処理 ?
}
}
}



913デフォルトの名無しさん:2006/01/26(木) 21:18:25
delete $A{$_} for keys %B; とか?
914912:2006/01/26(木) 21:24:40
>>913
ありがとうございます。
でも、それだと、key ごと消えちゃったりしますよね。

key に対する重複する値だけ消したいっす。

915デフォルトの名無しさん:2006/01/26(木) 23:09:14
deleteのかわりにundefにしたら?
916913:2006/01/26(木) 23:36:23
>>914
あ、すまんす。値が配列になってるのね。ちょっとうまい方法が思いつかないなあ。
917デフォルトの名無しさん:2006/01/27(金) 00:45:38
>>912
そういう時は一旦ハッシュに入れてみるのが常套手段
my %A = ( hoge => [1, 2, 3, 5], fuga => [50] );
my %B = ( hoge => [2, 3, 4], piyo => [] );

foreach my $key (keys %B) {
next if !exists $A{$key};

my %e = ();
$e{$_} = 1 foreach @{$B{$key}};

my @newA = ();
$e{$_} or push @newA, $_ foreach @{$A{$key}};

$A{$key} = \@newA;
}
918デフォルトの名無しさん:2006/01/27(金) 01:03:08
>>912
通りすがりの初心者です。間違っていたら指摘よろです。

foreach my $key(keys %B){
$A{$key} = [undef] if($A{$key} != undef);
}
919918:2006/01/27(金) 01:09:03
連書きすいません。

$A{$key}=[undef]
じゃなくて
$A{$key}=[]
でした。
920デフォルトの名無しさん:2006/01/27(金) 01:18:24
>>918
仕様が要件を満たしているかどうかは置いておくとして、
$A{$key} != undefの所はdefined $A{$key};と書かないと。
-wやuse warningsを使うと、そういうことを結構教えてくれるから使ってみることをお勧めする。
921デフォルトの名無しさん:2006/01/27(金) 01:49:36
while (my $key = each(%A)) {
 if (exists($B{$key}) {
  delete($A{$key});
 }
}
922デフォルトの名無しさん:2006/01/27(金) 04:11:30
>>921
each の途中で、delete ってしていいの?
923デフォルトの名無しさん:2006/01/27(金) 06:02:28
(・∀・)イイ!!わけない
924912:2006/01/27(金) 07:09:21
>>912 です。
みなさん、ご助言ありがとうございます。
昼間に試してみて、夜にでも結果報告をします。
感謝感謝です。
925デフォルトの名無しさん:2006/01/27(金) 09:15:38
>>922
一般にはダメだが、eachが最も最近に返した要素のdeleteだけは
安全。perlfunc(1)のeachのとこに書いてある。

If you add or delete elements of a hash while you're
iterating over it, you may get entries skipped or duplicated,
so don't. Exception: It is always safe to delete the item most
recently returned by "each()", which means that the following
code will work:

while (($key, $value) = each %hash) {
print $key, "\n";
delete $hash{$key}; # This is safe
}
926デフォルトの名無しさん:2006/01/27(金) 10:40:20

$ perl hoge.pl -i input_file
または
$ perl hoge.pl < input_file
のように使うスクリプトがあって
引数に -i があるときはファイルを開いて
無いときはSTDINからデータを読んでるのですが

$ perl hoge.pl

とどちらも忘れたときにSTDINで止まってしまって
強制終了以外で止められません

$ perl hoge.pl[enter]
I can't find input file!
$

のようにする方法をずっと考えているのですが
結局思いつきません。。。
どなたかいい方法をお願いします。
927デフォルトの名無しさん:2006/01/27(金) 11:23:16
>>926
よく使われる手は -t STDIN で標準入力がttyかどうか調べる、だな。

リダイレクトで明示的にttyを標準入力につないだときに誤判定するが
それはアキラメで。
928デフォルトの名無しさん:2006/01/27(金) 11:23:46
>926
STDINが、コンソールか、ファイルかなんて、
C言語でも、かなりOSに依存したコード書かないといけないと思うからperlだと難しいんじゃないかな。

一応、seek(STDIN,0,0) してみたら、
コンソールの場合は、0が返ってきて、
ファイルの場合は、1が返ってきたので、
これで判断できると思うけどOSに依存するかもしれん。
929928:2006/01/27(金) 11:26:16
>>927
http://flex.ee.uec.ac.jp/texi/perl/perl_22.html#IDX82
-t ファイルハンドルが tty にオープンされている
こんなファイルテスト演算子があったとはしらんかった (;゚д゚)...
930928:2006/01/27(金) 11:34:10
package が存在する(定義されている)か判定する方法がないでしょうか?

print "defined PackageName" if defined(PackageName);

↑でできるかなと思ったのですが、
defined("PackageName")としていることが
まったく同じような気がするので常に1が返ってきて無駄でした。
931デフォルトの名無しさん:2006/01/27(金) 11:48:37
>>926
馬鹿だなオマエ。そういう時は「引数に何も付けなかった時は
標準入力から入力する。」という仕様にしてしまえばいいじゃ
ないか。実際その方が便利だぞ。
932926:2006/01/27(金) 11:51:25
>>927
-t STDIN
を利用して

$ perl hoge.pl -i input_file
$ perl hoge.pl < input_file
$ cat input_file | perl hoge.pl

で期待通りに動作しました!ありがとうございます!
それと
『リダイレクトで明示的にttyを標準入力につないだとき』
なのですが、というのが分かりません。。。
どういうことでしょうか。。。?
933926:2006/01/27(金) 11:53:42
>>931
あ、本来の仕様は
perl [-i input_file] [-o out_putfile]
なんでそれは無理です。
質問のために省略しました。
ただ、その方法も確かに簡単でいいですね!
934デフォルトの名無しさん:2006/01/27(金) 12:05:01
とりあえずここで・・・ (*Windows版)

紫色を透明色にしたいんだが何か間違ってる?

use Image::Magick;

$image = Image::Magick->new;
$image->Read('test.bmp');

 $image->Set(transparent=>'Purple');
 $image->Set(colorspace=>'Transparent');
 $image->Set(matte=>'True');

$image->Write("test.png");
935デフォルトの名無しさん:2006/01/27(金) 13:27:07
>>932
$ perl hoge.pl < /dev/tty
936デフォルトの名無しさん:2006/01/27(金) 14:55:44
>>934
1. ○○がしたい
2. 自分はこうやった
3. 結果は××になってほしいが△△になってしまった

3 が抜けてて返答のしようがない。
937デフォルトの名無しさん:2006/01/27(金) 16:21:59
ppmでHTML-FormatTextが見つからないのですが、
CPANで拾うとppdが入っていません。かなりググりましたが他に
見つかりませんでした。
自動でインストールできるものはどこで入手できますでしょうか?

あと、みなさん普段どこからモジュールを手に入れてますか?
オススメのリポジトリとかあれば教えてください。
938デフォルトの名無しさん:2006/01/27(金) 16:51:40
ppm とか ppd って何?

cpan -i HTML::FormatText で普通に入るけど。
939デフォルトの名無しさん:2006/01/27(金) 17:27:58
Active Perl5.86で既になかった
古い5.81ので拾った記憶が
既に入らなかった。あきらめたけど
ppmでオフラインで入らないのは古いから対応してないよ警告なんだと思う。

namazuでもそうだったし
野良で使えるとは思うけど

もしかしたらアーカイブ鯖からppmで入れられるのかね?
5.81アーカイブに繋いで入れられるのかな?

不明
940937:2006/01/27(金) 20:23:47
ありがとうございます。CPANでインストールできました。
こんなのがあったんですね・・・(ppmの立場は!?)
いままでppmを使っていたので、モジュールのインストールによく躓いていました。
perlのモジュールって,統一感がある様で結構バラバラな感じですね。
Image::Magickもppmでは入りません。DLLのインストーラでオプション指定
しないといけない現状です。
ウエブにあふれてる解説が古いままなのが、躓く原因だと思います。
941デフォルトの名無しさん:2006/01/27(金) 21:01:05
お前は何を言っているんだ?(画像ry
942デフォルトの名無しさん:2006/01/27(金) 21:59:14
>>940
> ppmの立場は!?
ActivePerlで確実に使えるパッケージである。
コンパイル済みなので、コンパイラを持っていないユーザーでも使える。
943デフォルトの名無しさん:2006/01/27(金) 22:07:57
小飼弾て朝生に出てるんだな。今知ったよ。
944デフォルトの名無しさん:2006/01/27(金) 22:51:06
な、なんだってー
またでんのかよ
945デフォルトの名無しさん:2006/01/27(金) 23:21:31
さて、情報処理申し込みにオフィシャル行ってくっか
946デフォルトの名無しさん:2006/01/28(土) 04:23:46
@list=glob("*.c");
$val=$list[$#list]

これを一文でやる方法はありますか?
あるリストの最後の要素を取得する方法が知りたいです。
947デフォルトの名無しさん:2006/01/28(土) 05:03:24
サンプルなどで
foreach my $key( @list) {
print "$key", "\n";
}
という書き方がよく行われていますが

my $key;
foreach $key( @list) {
print "$key", "\n";
}

とすべきではないのでしょうか?
948デフォルトの名無しさん:2006/01/28(土) 05:09:08
ヒント:

foreach my $key( @list) {
print "$key", "\n";
}
print "$key", "\n";


my $key;
foreach $key( @list) {
print "$key", "\n";
}
print "$key", "\n";
949デフォルトの名無しさん:2006/01/28(土) 05:11:13
>>946
$val=[glob("*.c")]->[-1];
とか?
950デフォルトの名無しさん:2006/01/28(土) 05:15:29
>>946
便乗しての質問なのですが、なぜ
@list=glob("*.c");
$val = pop(@list);

は出来るのに

@list = pop(glob("*.c"));

はType of arg 1 to pop must be array (not null operation) というコンパイル
エラーになってしまうのでしょうか?
951ヽ(´ー`)ノ ◆.ogCuANUcE :2006/01/28(土) 05:23:06
>>946
こうじゃね?

$val=(@list = <*.c>)[-1];

もっとも、俺なら後から見てワケワカメになるので、こうするけどな。

my @list = <*.c>;
my $val = $list[-1];

あと、deprecated というわけじゃないようだが、glob() じゃなくて
File::Glob か <> 演算子を使っとけ。

>>950
pop() は引数を与えた場合、与えられた配列を変更するので、変更できない
(lvalue じゃない) サブルーチンの返り値やリテラルを渡すとエラーになる。
952デフォルトの名無しさん:2006/01/28(土) 05:42:23
[-1]が使えたんですね。アリガトウございます.
953デフォルトの名無しさん:2006/01/28(土) 06:09:16
unlink (sort glob "*.c")[-1];

ところでこのソートって必要だと思いますか?
>as the standard Unix shell /bin/csh would do.
/bin/cshはファイル名でソートしてくれる仕様なのかな、どうなんだろ。
954デフォルトの名無しさん:2006/01/28(土) 06:11:46
unlink +(sort glob "*.c")[-1];
こうだった。
955デフォルトの名無しさん:2006/01/28(土) 10:02:58
>951
>あと、deprecated というわけじゃないようだが、glob() じゃなくて
>File::Glob か <> 演算子を使っとけ。

なんで?
956デフォルトの名無しさん:2006/01/28(土) 11:55:08
>>955
少なくとも 5.6.0 から組込関数の glob() は内部で File::Glob 呼んでるし、
ファイル名グロブ演算子としての <> は行入力演算子としての <> と紛ら
わしいうえ実体は glob() だから、「glob() より <> を使え」って根拠は謎だな。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod#glob_EXPR

まぁ File::Glob::bsd_glob() を直接使えばフラグを与えて細かく制御できるし、
そういう事を言いたいんじゃない? 俺は面倒だから glob() 使うけど。

>>953-954
という事で File::Glob を読むんだ。
http://search.cpan.org/~nwclark/perl-5.8.7/ext/File/Glob/Glob.pm
957ヽ(´ー`)ノ ◆.ogCuANUcE :2006/01/28(土) 12:38:34
>>956
File::Glob の方が細かく制御できるから…と思ったけど、
:globally なら glob() にも <> にも影響あるんだな。
これはスマンカッタ。

>>953-954
unlink() かよ。
958デフォルトの名無しさん:2006/01/28(土) 13:35:54
すみません
Windowsで言う『切り取り→貼り付け』、UNIXで言う『mvコマンド』みたいな事をしたいんですが
モジュールとかありますか?
959デフォルトの名無しさん:2006/01/28(土) 13:45:54
>>958
モジュールって…
rename() でええがな。
960デフォルトの名無しさん:2006/01/28(土) 13:51:37
>>958
あえてモジュールを使いたいならFile::Copyにmvがある。rename直でいいと思うが。
ところでこのスレでPerl6の質問ってしてもOK?
まだ質問があるわけじゃないんだけどさ
961デフォルトの名無しさん:2006/01/28(土) 13:51:46
ファイルをポインタで扱いたいんですが、
ttp://www.rfs.jp/sb/perl/02/08.html#TRY!%20ファイルハンドルを変数に格納する
↑以外で良いサンプルの書いてあるサイトを知ってる人いませんか。

ポイントへの格納の仕方、読み方の二つがわかれば十分なんですが…
962デフォルトの名無しさん:2006/01/28(土) 14:04:48
ポインタって?
963デフォルトの名無しさん:2006/01/28(土) 14:09:24
964デフォルトの名無しさん:2006/01/28(土) 14:34:40
>>963
ありがとうございました!

>>962
すみません、どう表現したらいいのかもよくわかってなくてニュアンスで書きました。
965デフォルトの名無しさん:2006/01/28(土) 16:26:45
>>960
ここいってくらさい。
次世代Webプログラミング言語の大本命Perl6/Parrot [WebProg]
966デフォルトの名無しさん:2006/01/28(土) 21:35:32
Jcode.pmの
[@match = ] $j->m($pattern, $opt);
を使って、以下1行のSJIS文
あいうえお/かきくけこ/さしすせそ
を/でsplitするにはどうしたらいい?
967デフォルトの名無しさん:2006/01/28(土) 23:45:42
>>959
>>960
renameは同一ファイルシステム内でしか移動できないので、
ファイルシステムまたぐ可能性があるならFile::Copyのmvを
使うべし
968デフォルトの名無しさん:2006/01/29(日) 00:54:03
my @list;
my $rec = {
title => '11',
genre => '77',
};
push(@list, \$rec);
&test(\@list);

sub test(\@) {
my ($lst) = @_;
foreach my $aaa (@$lst) {
# ここでデリファレンスする方法をおしえてください。
print $aaa->{title};
}
}
よろしくお願いします。
969デフォルトの名無しさん:2006/01/29(日) 01:26:01
print %$aaa->{title};
970デフォルトの名無しさん:2006/01/29(日) 01:30:58
ハッシュのリファレンスのリファレンスをpushしてしまってるから
push(@list,\$rec) を push(@list,$rec) にするとかは?
971960:2006/01/29(日) 01:36:31
>>965
りょーかいです

>>967
ファイルシステムを超えて移動したことなかったので知らなかったorz
やっぱり一般的な関数もちゃんとドキュメントは読まないと駄目ね・・・

>>968
>>969 書き間違えてますぞい。
print $$aaa->{title};
972デフォルトの名無しさん:2006/01/29(日) 01:39:28
それだとNot a HASH reference といわれてしまうのですが・・・
973968:2006/01/29(日) 01:45:57
ありがとうございます。print $$aaa->{title}; で表示できました。

my @list;
my $rec = {
title => '11',
genre => '77',
};
push(@list, \$rec);
これ「ハッシュのリファレンスのリファレンス」になってしまうのでしょうか?
974968:2006/01/29(日) 01:51:43
理解できました。ありがとうございました。
975969:2006/01/29(日) 02:17:19
おいちょっと待て、
print $$aaa->{title};
これだと
Not a SCALAR reference
になるんだが
976969:2006/01/29(日) 02:18:31
俺の勘違いだったすまん
977デフォルトの名無しさん:2006/01/29(日) 05:01:05
リファレンスのリファレンスって何か嬉しいことあるの?
978デフォルトの名無しさん:2006/01/29(日) 06:31:54
>>967
Winの場合は、rename で内蔵HDDから外付けUSB HDDに移動できたけどな。
979 ◆TWARamEjuA :2006/01/29(日) 06:41:57
え?
980デフォルトの名無しさん:2006/01/29(日) 07:09:22
>>978
それはファイルシステムとは言わないような気がするんだけど気のせい?
981デフォルトの名無しさん:2006/01/29(日) 07:10:07
>>980
はぁ?
982デフォルトの名無しさん:2006/01/29(日) 07:16:47
>>981
アホみたいに煽るだけじゃなくて実のあること書いてよw
FATとかNTFSのことじゃないの?
983デフォルトの名無しさん:2006/01/29(日) 08:32:27
うちでもやってみた。(内蔵IDE HDD→外付けUSB HDDへの rename)
Linux Perl の場合:無効なクロスデバイスリンク と出て失敗。
Win98SE(ActivePerl)の場合:正常に移動できた。

デュアルブートのマシンなので、ハードウェアは全く同じ環境。
誰か理由を説明できる人、よろしく。
984デフォルトの名無しさん:2006/01/29(日) 08:35:05
内部で使ってる関数が違うだけの話じゃないの?
985デフォルトの名無しさん:2006/01/29(日) 08:53:07
windowsは知らんけど、linuxとかのmvもデバイスをまたぐ時は
内部でcpとrmを実行してなかった?
986デフォルトの名無しさん:2006/01/29(日) 09:22:05
Linux-2.4,Glibc-2.3.5で試したけど、
mvで違うファイルシステムにファイルを移動しようとしたら、
renameでエラーを検出した後に、read/writeでファイルをコピーしてる。
987デフォルトの名無しさん:2006/01/29(日) 09:27:05
>>985
その通り。
まず rename を試み、失敗したら自分で移動処理してる。
ActivePerlのrenameは、そういうコードが入ってるってことかな?
988デフォルトの名無しさん:2006/01/29(日) 09:39:52
rename(2)とMoveFileExの挙動違いじゃないのかな。
Windowsの関数の方が親切だよね。
989デフォルトの名無しさん:2006/01/29(日) 09:45:00
MoveFileExじゃない、ただのMoveFileか。
MoveFileExならフラグの制御でUNIXと同じ動作にも
出来たんだろうけど、あえてMoveFileを使う辺りが適当というか。
ユーザーにとっては便利だけど。
990デフォルトの名無しさん:2006/01/29(日) 09:56:30
>>989
Win9xでも動くようにするためじゃない?
991デフォルトの名無しさん:2006/01/29(日) 10:03:21
>>990
MoveFileExってNT系にしかないのか…
992デフォルトの名無しさん:2006/01/29(日) 10:16:34
朝っぱらから小飼弾の喋りはつらいですね
993デフォルトの名無しさん:2006/01/29(日) 10:17:34
誤爆した
994デフォルトの名無しさん:2006/01/29(日) 16:19:14
もう次スレの時期か…また立ててくる
995デフォルトの名無しさん:2006/01/29(日) 16:26:45
my $$self{next} = new BBS2ch::Thread 'Perlについての質問箱 22箱目';

次スレ
http://pc8.2ch.net/test/read.cgi/tech/1138519327/
996デフォルトの名無しさん:2006/01/29(日) 16:56:43
>>995
z
997デフォルトの名無しさん:2006/01/29(日) 17:11:49
ふふっ、くすぐったいですか?
それは、すみません。 でも、ゆっくり味わいたいと思います
(身をよじるはやてに微笑をむけながら)

ふふ、可愛らしいですね……、大人になったらするんですから……
はやてちゃんの場合でしたら、したいって相手がいっぱい居ると思いますよ?
ですから、あまり恥ずかしがらないでくださいね。
(そう話しかけながら、胸の蕾を指で転がしている)

ん、ふ……ちゅ、ぺろぺろ……
(乳房の輪郭を、手で探りながら、胸の蕾を舌先で転がす)
ふふ、どうですか……?
んちゅ……、ちゅ……
(はやての身体に跨り、首筋に顔を伸ばして唇を這わせる)
998デフォルトの名無しさん:2006/01/29(日) 17:11:58
んふ………っ
(ペニスが下腹部に当たると、身体を浮かして)
もう、したいんですか……?ふふ、まだ早いですよ。
(はやてちゃんの胸を揉みながら、微笑む)
んふっ……ぺろっ……
(胸から鎖骨へとゆっくり舌を這わせながら、身体を浮かす)

それでは、私のを、はやてちゃんの唾液で濡らしていただけますか?
(そう言うと、69の体勢になるため、お尻をはやてへ向け
 身体をペニスの方へと寝かせていく)
………………
(ペニスを掴んで扱きながら、はやてからの愛撫を待っている)
999デフォルトの名無しさん:2006/01/29(日) 17:12:07
ひぃぅん……あっ……ん……
(ペニスを扱かれて、腰が動く)
シャマル………うち…頑張る……
ちゅ……ん……
(ペニスへの刺激に耐えながら、懸命にシャマルのアソコをチロチロ舐める)
1000デフォルトの名無しさん:2006/01/29(日) 17:12:13
ふふ、腰が動いてますよ、気持ち良いですか…?
ぁん……、はい、頑張ってくださいね……
ちゅ……ん…、ちゅっ……
(嬉しそうに腰を振りながら、
ペニスの先端を舌先でくすぐる)
ふぁ……ぁ、ん………
(秘部をはやての唾液を、自分の愛液で濡らしながら、腰を揺らす)
ちゅ、ぺろ……ふ、ぁ……
(咥内にペニスを含み、ペニス全体に舌を絡め唾液で濡らす)

ふふ、これは、どうでしょうか……
(上半身を軽く浮かし、はやてのペニスを豊満な胸で挟む)
(そして、挟んだまま胸でペニス扱く)
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。