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

このエントリーをはてなブックマークに追加
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
● 2006/06/02現在の最新版: 5.8.8
● 2006/06/02現在の開発版: 5.9.3

リンク集は>>2-3
過去スレは>>4
2デフォルトの名無しさん:2006/06/02(金) 23:44:10 BE:201136853-
[プログラミング自体の経験が無い奴はまずココを読め]
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.8/
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デフォルトの名無しさん:2006/06/02(金) 23:45:05 BE:375455074-
4デフォルトの名無しさん:2006/06/02(金) 23:45:38 BE:160909643-
5デフォルトの名無しさん:2006/06/02(金) 23:59:22
6デフォルトの名無しさん:2006/06/03(土) 00:16:38
タモリ倶楽部が始まった
7前スレ980:2006/06/03(土) 00:22:36
>>1乙。つかありがとう。普通に気づいてなかった。
8デフォルトの名無しさん:2006/06/03(土) 02:52:27
>>1
Ζ
9デフォルトの名無しさん:2006/06/03(土) 07:34:07
useについて質問です。
a.plとb.pmという二つのファイルは同じディレクトリにあります。

#--a.pl--
use b;

printString();

#--b.pm--
package b;

sub printString(){
  print "aaa";
}

sub import() {
  *{"main::printString"} = \&printString;
}

1;

この状態でa.plを実行すると
&main::printStringサブルーチンが見つからないとエラーになります。
どこか間違っていますか?
10デフォルトの名無しさん:2006/06/03(土) 07:57:36
>>9
bというモジュール名がまずい。モジュール名をhoge等に変えるべし。
標準モジュールにBと言うのがあって、こっちが読み込まれてしまっている。
ttp://search.cpan.org/~nwclark/perl-5.8.8/ext/B/B.pm

ところで、それをやるならExporterを使うのが一般的だけれど、単に練習かな?
ttp://search.cpan.org/~nwclark/perl-5.8.8/lib/Exporter.pm
119:2006/06/03(土) 09:16:55
>>10
use bなのにBが読み込まれちゃうんですね。
ありがとうございます。すっきり解決しました。
おっしゃる通り練習です。
続・初めてのPerlってのに載っていたimportの
練習でした。
12デフォルトの名無しさん:2006/06/03(土) 09:46:58
だから "a" と "b" はまずいとあれほど……
13デフォルトの名無しさん:2006/06/03(土) 09:53:19
"c"以降は問題ないのけ?
14デフォルトの名無しさん:2006/06/03(土) 10:32:36
O.pm ってのもあるし……
15デフォルトの名無しさん:2006/06/03(土) 12:00:37
am.pm ってのもあるな
16デフォルトの名無しさん:2006/06/03(土) 13:14:32
前スレ>>998
>Rubyに完全に取って代わられちゃったね。
>正確に言えば、まともなプログラマはみんなRubyに流れちゃって、
>自分が書いたコードの効率もろくに把握できていないようなアホだけが
>未だにぶら下がっている・・・っていう、ある意味過疎より酷い惨状だけど。
>>999
>>998
>3年前の状況としてなら賛成。
この頃ruby基地からのアラシが少なくなったと思ったらまた出たか。
漏れはPerlの方が速いし、モジュールが充実してるからPerl使ってる。
17デフォルトの名無しさん:2006/06/03(土) 13:17:16
>>16
おまえも荒らしに加担してるのわかってんだろうな?
18デフォルトの名無しさん:2006/06/03(土) 13:50:47
>>17
お前も俺もな。

遠巻きに眺めながらそっとしておいてあげるのが最高のスルーション。
19デフォルトの名無しさん:2006/06/03(土) 13:58:35
前スレ 974 氏
解決済みだろけど書いてみた。
print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ;
一行だ。
20デフォルトの名無しさん:2006/06/03(土) 13:59:57
さあ華麗にスルーして、話題を強制的に質問と回答に戻そう。

前スレ>>988
| 988 名前:デフォルトの名無しさん:2006/06/03(土) 00:29:18
| Template Toolkitで使用する
| テンプレートファイルをうまくデバッグする方法はありませんか。
|
| テンプレートに誤りがあるときのエラーメッセージ
| は決まって "Bad file descriptor at ..."であり、
| テンプレート修正の手がかりになりません。
TT使ったこと無いんだけど、簡単なのを書いてみてもエラーの箇所が表示されるし、
モジュール内を検索してもそのエラーメッセージが出てこなかった。
再現用のサンプルを出して貰えると使ったことの無い人でも調べて回答できるかも。
21デフォルトの名無しさん:2006/06/03(土) 14:01:23
と思ったら 1000 行以下がでないじゃん。

my $data = join '', <> ;
$data =~ s/.*?(([^¥n]*?¥n){50})¥Z/$1/s ;
print $data ;
22デフォルトの名無しさん:2006/06/03(土) 14:06:27
>>21

>print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ;
{1000} を{1,1000} にすりゃいい話だ罠。
23デフォルトの名無しさん:2006/06/03(土) 14:54:40
$list = qw(0 1 2)[2];
これって無名配列なの?
24FLH1Aau016.gnm.mesh.ad.jp:2006/06/03(土) 15:30:03
>>23
それは単なるリスト(のスライス)
リスト=スカラーコンテキストでは最後の要素を返す
配列=スカラーコンテキストでは要素数を返す
ということで、一応区別はある。
ちなみに無名配列そのものをその場でつくることは出来ないが、あえて書くなら
@{[0, 1, 2]}/${[0, 1, 2]}[0]とか、こんな感じでつくることは出来る。まぁ、リストがあれば事足りるのでする価値はないが。
2523:2006/06/03(土) 15:33:58
そっかリストと配列は違うものなんだね
ありがとうございます
26デフォルトの名無しさん:2006/06/03(土) 15:34:23
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perlglossary.pod#anonymous
| Anonymous
無名(匿名)
| Used to describe a "referent" that is not directly accessible through a named "variable".
名前付けられた変数を通して直接的にアクセスできない指示物(=リファレンスの指す物)を言います。
| Such a referent must be indirectly accessible through at least one "hard reference".
そのような指示物は一つ以上のハードリファレンスを通して非直接的にアクセスしなければなりません。
| When the last hard reference goes away, the anonymous referent is destroyed without pity.
最後のハードリファレンスが消えたときに、無名の指示物は容赦なく消されます。

って所か?訳の正確性はまったく保障しないが
27デフォルトの名無しさん:2006/06/03(土) 15:49:44
うほっ、名前間違えた…('A`)
28デフォルトの名無しさん:2006/06/03(土) 16:40:21
>>24
知らなかった。
sub s1 {
 return qw(a b c);
}
sub s2 {
 return my @x=qw(a b c);
}
sub s3 {
 my @x=qw(a b c);
 return @x[0..$#x];
}
とすると、scalar &s1 は c , scalar &s2 が 3 , scalar &s3 が c なのか。
戻り値のリストと配列は、意識の片隅に入れておいた方が良いのかも。
29デフォルトの名無しさん:2006/06/03(土) 17:13:06
>>28
どういった時にそんな使い方するのか
片隅に入れるならwantarray
30デフォルトの名無しさん:2006/06/03(土) 17:43:42
ふたつのふぁいるをひらいてそれぞれのぎょうをひかくしてじょうけんがあえばあたらしいふぁいるにそのぎょうをかこうしたものをかきこんでいくばあい
whileをいれこにしてやってるんですがもっとこうりつてきなものはありますか?
31デフォルトの名無しさん:2006/06/03(土) 17:54:21 BE:212256364-#
ねーよw
32デフォルトの名無しさん:2006/06/03(土) 18:00:06
Template Toolkitで使用する
テンプレートファイルをうまくデバッグする方法はありませんか。

テンプレートに誤りがあるときのエラーメッセージ
は決まって "Bad file descriptor at ..."であり、
テンプレート修正の手がかりになりません。
33デフォルトの名無しさん:2006/06/03(土) 18:03:03
答え=ヒントありましたね。二重質問失礼しました。
34デフォルトの名無しさん:2006/06/03(土) 18:08:45
これからラーメン食べに行きます。
35デフォルトの名無しさん:2006/06/03(土) 18:29:41
>>32
これってはてなで全く同じ質問を見たんだけど……
本人? 回答予定者?
36デフォルトの名無しさん:2006/06/03(土) 18:31:03
>>30
釣りだろうけど暇だから書く。
>ふたつのふぁいるをひらいてそれぞれのぎょうをひかくして
ここから判断して二つのファイルの行数は一緒。
my @one ; # 一つ目のファイルの中身
my @two ; # 二つ目のファイルの中身
for ( my $i = 0 ; $i <= $#one ; $i ++ ){
 # $one[$i] と $two[$i] を比較しろ!
}
37デフォルトの名無しさん:2006/06/03(土) 19:00:52
っていうかよ、ファイルが馬鹿でかかったらどうすんだ?
38酩酊 ◆TWARamEjuA :2006/06/03(土) 19:04:27 BE:3484984-#
片方をハシュキーにしたいよなぁ。
でも巨大なファイルだとあぼーんしちゃいそう。。。
39酩酊 ◆TWARamEjuA :2006/06/03(土) 19:09:04 BE:1960092-#
内容をMD5にしちゃうと、ちょっとはマシかな?
# キー作成
my $MD5_value = Digest::MD5->new;
my %hash = map {
$MD5_value->add($_);
($MD5_value->hexdigest, 1)
} <FH>;
みたいなみたいな。。。
40酩酊 ◆TWARamEjuA :2006/06/03(土) 19:11:06 BE:2287837-#
あ、これじゃ値がおかしゅくなるか(哀)

my %hash = map {
my $MD5_key = $MD5_value;
$MD5_key->add($_);
($MD5_value->hexdigest, 1)
} <FH>;

もちょっと最適化できそうな。。。
41デフォルトの名無しさん:2006/06/03(土) 20:31:23
最初の質間者が臣大ファイルを相手にしてるとは思えないが、
俺だったら
1.コマンドのsplitかまして、それぞれに>>36
2.素直に両方のファイルをseekして、それに>>36を適用
する。むろん検索ミスがおこらない様にポインタをずらしながら。

行が合ってないとかだったら「条件」によって変わるなあ。
42デフォルトの名無しさん:2006/06/03(土) 20:49:29
物理とかの分野だとやたらと巨大なファイルが出来上がるものもあるので、
一発読み込みは危険。
同じデータを違うソフトで使いまわすときもあるので、同じ行番号って縛りはなくしたほうがいいな。
43デフォルトの名無しさん:2006/06/03(土) 21:03:57
>>30
diffを参考にするのはどうよ?
44デフォルトの名無しさん:2006/06/03(土) 21:14:19
>30の言うとおりに書くと、
open (my $in1,'file1') or die
open (my $in2,'file2') or die
open (my $out,'>result') or die;
while (defined(my $val_1=<$in1>){
 my $val_2=<$in2>;
 if (比較条件($val_1,$val_2)){
  print $out 加工($val_1,$val_2);
 }
}
となって、どこでwhileが入れ子になるのかわからんのだが....

いつの間にか、同一かどうかを比較する話になっているが、
2つのファイルの各行の比較というと、 $val_1 > $val_2 といった条件もあるわけですよね?

もし、同一かどうかを比較するなら、open (my $in ,"diff $file1 $file2|") とやる方法もある。
45デフォルトの名無しさん:2006/06/03(土) 21:20:52 BE:212257038-#
エスパーだらけだな
46デフォルトの名無しさん:2006/06/03(土) 21:30:26
perlで\nを検索する正規表現ってどうしたらいい?
47デフォルトの名無しさん:2006/06/03(土) 21:35:30 BE:141504544-#
/\n/s
48デフォルトの名無しさん:2006/06/03(土) 21:39:18
>>47
ありがとう。
\nという文字そのものを検索するにはどしたらいい?
49デフォルトの名無しさん:2006/06/03(土) 21:40:28 BE:247632274-#
\\n
50デフォルトの名無しさん:2006/06/03(土) 21:42:04
>>42
Bio分野の者だが。

500Mbくらいのテキストだったら平気でまる飲みさせて
るしまる飲みできるぞ。undef $/; して。
1Gを越えた時はさすがにseekしたが。
そんなに何千万行ものデータが出るのか?物理分野って。

#perli.5.005時代はもちろんまる飲みなんてさせてません。
51デフォルトの名無しさん:2006/06/03(土) 21:45:12
>>49
ありがとう。
最後に空行にみえてしまう行を検索するにはどうしたらいいですか?
空行を検索するのはできるんですが。
52デフォルトの名無しさん:2006/06/03(土) 21:46:28 BE:424512386-#
sorry, this 2ch is japanese only.
53デフォルトの名無しさん:2006/06/03(土) 21:54:55
>>50
ヒント:メモリ
54デフォルトの名無しさん:2006/06/03(土) 21:54:55
ごめん。質問訂正いたします。

目でみると実際は空行に見えるが、tabが入っていて
実は空行ではない。のを検索するにはどうしたらいいですか?
その他の空行ではない行でtabが入っていても無視する。
というものです。

55デフォルトの名無しさん:2006/06/03(土) 21:55:34
>>54
その質問はここでしていい質問じゃない。帰れ。
56デフォルトの名無しさん:2006/06/03(土) 21:57:16
^\s+$
57デフォルトの名無しさん:2006/06/03(土) 21:58:26
>>56
氏ねキチガイ。
58デフォルトの名無しさん:2006/06/03(土) 22:02:36
>>54
すまん失念してた。>メモリの事。
59デフォルトの名無しさん:2006/06/03(土) 22:02:50
>>56
自演荒らし乙。
60デフォルトの名無しさん:2006/06/03(土) 22:06:16
>>58
なぜ54にレス?
にしても500メガPerlで生で読めるPCって個人で持ってるの?
うちの研究室じゃPCに回す予算なんてないから、メモリ増設したい奴は自費でやれ、だよ。
6154:2006/06/03(土) 22:06:27
タブを検索するのは簡単なんですが、
空行に隠れるタブのみを検索したいんです。
62デフォルトの名無しさん:2006/06/03(土) 22:15:54
>>60
レスみすったw
うちは「メモリは消耗品予算で買えるからOK。PCは予算がない!」
てんで5年前のMacに積めるだけのメモリを積んでますw
63デフォルトの名無しさん:2006/06/03(土) 22:29:19
>>44
どーしても突っ込みたくなった。
my $val_2=<$in2>;
file2は先頭行しか見ないのか?
64デフォルトの名無しさん:2006/06/03(土) 22:32:24
>>63
なんで?file1のwhileループが回ってる間、一行ずつfile2からも引いてると思うが
65デフォルトの名無しさん:2006/06/03(土) 22:39:10
>63
<FH>の意味と使い方を調べてごらん。
6663:2006/06/03(土) 22:43:33
…吊ってくるorz…
67デフォルトの名無しさん:2006/06/04(日) 00:39:09
CGI::Prettyを使って、ちょっと大きめのテーブルを表示し
ようとしたんです。
32文字ぐらい *16列 * 4098行 = 2M 程度。
メモリは2ギガ積んでいます。
しかし、実行するとメモリの使用率がガンガン上がって
いって止まってしまうんです。
use CGI::Pretty をコメントアウトすると問題ありません。
テーブルのサイズが小さいときは問題ありません。
なぜでしょう?
CGI::Pretty は使わないほうが速いというのはわかるんです
が、使わないと、HTMLソースがすごく見にくいので、できれ
ば使いたいんです。
CGI::Pretty って\tと\nを入れているだけにしか見えないの
ですが、そんなにメモリを使用するものなのでしょうか?
Windows,Linuxどちらでも、以下のスクリプトでも再現しました。
use strict;
use CGI qw(:standard);
use CGI::Pretty;
my @trs;
my @tds=qw(0 1 2 3 4 5 6 7 8 9 a b c d e f);
push @trs,td({bgcolor=>'#FFFFFF'}, \@tds) for (0..4097);
print table(Tr \@trs);

どこが問題なのでしょう?
68デフォルトの名無しさん:2006/06/04(日) 01:03:32
WebProg板に行かないところ
69デフォルトの名無しさん:2006/06/04(日) 01:08:48
>>67 はブラクラ。
試したら、サーバがswapし始めて、応答しなくなった。
70デフォルトの名無しさん:2006/06/04(日) 01:18:45
それはブラクラと言わないような…
71デフォルトの名無しさん:2006/06/04(日) 01:21:29
>>67
ヒント:header,start_html
72デフォルトの名無しさん:2006/06/04(日) 01:26:54 BE:353760858-#
>>68
ワラタ
73デフォルトの名無しさん:2006/06/04(日) 01:28:45
IEは巨大なテーブルの表示に時間がかかる。
これはperlでなく、IEの問題。

そのスクリプトをtest.plという名前で保存して
perl test.pl >test.html
ってやってごらん。
perlの処理にはそんなにかかっていないはず。
7473:2006/06/04(日) 01:42:18
スマソ。
試したら、perlの処理の問題でした。
IEの問題ってのは忘れてください。
75デフォルトの名無しさん:2006/06/04(日) 01:50:19
>>72
ウイルスコード貼り逃げ厨に笑ってもらえて光栄です><
http://pc8.2ch.net/test/read.cgi/php/1149089424/2
76デフォルトの名無しさん:2006/06/04(日) 03:37:29
>>75
これはひどい
77デフォルトの名無しさん:2006/06/04(日) 08:04:02
ぬるぽ
78デフォルトの名無しさん:2006/06/04(日) 09:19:28
やっぱりbe付けてる人は荒らしてばっかりだね。
79デフォルトの名無しさん:2006/06/04(日) 09:34:32
openするときの引数は''と""""の
どちらで囲んだ方が速いかなと思い
以下のベンチを取ったのですが
use strict;
use Benchamark;

timethese(100000, { TEST1=>'\sub1', TEST2=>'\sub2'});

sub1 {
open my $fh, "<", "test.txt";
}

sub2 {
open my $fh, '<', 'test.txt';
}

テスト結果が表示された直後
Can't call method "sub2" without a package or object reference at
となってしまいます。ちゃんとsub2をリファレンス渡ししてるのになんで・・・
一応テストはうまくいっているようなのですが
どこがおかしいですか?
8079:2006/06/04(日) 09:49:34
ああ、死んできます
81デフォルトの名無しさん:2006/06/04(日) 10:00:48
Benchmark: timing 100000 iterations of TEST1, TEST2...
TEST1: 27 wallclock secs ( 7.73 usr + 16.20 sys = 23.93 CPU) @ 4178.16/s (n
=100000)
TEST2: 28 wallclock secs ( 8.01 usr + 15.89 sys = 23.90 CPU) @ 4183.23/s (n
=100000)

Bechmarkの結果についてなのですが、
上記のようなBenchmarkの結果はどちらが速いのでしょうか?
wallclockのところを見るとTEST1の方が速いように思いますが
消費したCPU時間を見てみるとTEST2の方が少ないようです
あと、@以降の部分は一秒間に回ったループの回数ですよね?
ということはTEST2の方が速いということなのでしょうか?
いったいどれを見たらよいのでしょうか・・・
82デフォルトの名無しさん:2006/06/04(日) 10:12:51
前スレで誰かが
use encodingはメンテナも推奨していない
と言ってましたが詳しく教えてください
今までjcodeとかでちくちくやっていたのを
(特にwinな環境なので)
ソースの最初にuse encoding 'sjis';
とするだけで漢字を含んだ正規表現も幸せ
に出来ていたので不安になってしまいました

確かソースをeuc-jpに統一しても日本語を含んだ
正規表現に関しては多くの問題は解決するけど
完璧には動かないんですよね?
それをencodingで解決できたと思っていたんですが
それがだめだとすると一体perlでの日本語処理は
どうすればよいのでしょうか?
83デフォルトの名無しさん:2006/06/04(日) 10:28:04
>>82
Perlの方向性としては、 ソースコードをUTF8で書き、use utf8 するというのがいいらしいです
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
8467:2006/06/04(日) 10:34:13
板違いすみませんでした。
WebProg板に行ってきます。

同じ質問を違う板に書いても、この場合はマルチじゃないですよね?
85デフォルトの名無しさん:2006/06/04(日) 10:36:54
>>67
CGI::Prettyの_prettyPrintというサブルーチンは、@CGI::Pretty::AS_ISにある
タグの間以外はインデントを追加する、という単純な動作なようだが、
かなり効率が悪いアルゴリズムになっている。

@CGI::Pretty::AS_ISに含まれるタグの対で文字列を前半分と後ろ半分に
わけてそれぞれ再帰してインデントつけたのを最後にくっつけるわけだが、
AS_ISに<td>..</td>が含まれているので、<td>の出現数分再帰し、
なおかつ途中経過の文字列が全部スタックに詰まれるので<td>の
数の2乗に比例した計算時間とメモリが使われる。

アルゴリズムを直してもらうかあきらめるかじゃないだろうか。
86デフォルトの名無しさん:2006/06/04(日) 10:37:10
package hoge;
use strict;

と書くのと

use strict;
package hoge;

と書くのは何か違いがあるのでしょうか?
87デフォルトの名無しさん:2006/06/04(日) 12:04:50
>>82
use encodingで起こりうる問題を把握して使っていれば問題ないと思うよ。
分かってないとハマる可能性があるから、使わなくて済むなら使わないほうがいいってこと。

>>83の人も言ってるように、ソースはutf8で書いて、
入出力時にcp932その他に変換したほうが望ましいと思います。

ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。
88デフォルトの名無しさん:2006/06/04(日) 12:57:04
>>86
はい、違いがあります。
strict プラグマはレキシカルスコープで効きます。
従って use strict; よりも前に書かれた package 宣言は strict によるチェックを受けません。
しかし、package 宣言において厳格さのチェックが必要になるケースはほとんどないのでこれが問題になることは稀です。

実際モジュールなどでは大抵、可読性のためにほとんどのコードに先んじて package 宣言を行うのが半ば慣例化しています。
通常はこの慣例に従うのが良いでしょう。
89デフォルトの名無しさん:2006/06/04(日) 12:59:38
>>87
> ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。

Mac なら問題ありませんか?
90デフォルトの名無しさん:2006/06/04(日) 14:08:49
>>88
どうもありがとうございます。
ところでpackage宣言でstrictを要する場合ってほとんどないにしても
何かあるわけですか?さっぱり思いつかないんですが
どういう場合があるか教えてもらえませんか?
91デフォルトの名無しさん:2006/06/04(日) 14:11:02
>>87
どうもありがとう
そのuse encodingで起こり得る問題について
詳しく教えてもらえませんか?

あとWinでは入出力時にsjisではなくてcp932
を使えとのことですが、この二つって同じもの
じゃないのですか?どこが違うのですか?
9288:2006/06/04(日) 14:22:11
>>90
ちょっと考えて、思いつかないことに気付いて笑っちゃった。w
うん、たぶんないね。ありがとう。軽く吊ってくるわ。
93デフォルトの名無しさん:2006/06/04(日) 14:31:22
>>91
一番大きな問題は encoding の効きが「グローバル過ぎる」こと。
use encoding; したスクリプトから呼び出されたモジュールの類にも見境無しに効く。
依存関係のどこかで、これが問題になるようなコードがあれば、その挙動の予測ができない。

cp932 については文字コード関係の文書をあたってみて。
要するに「両者が完全には一致していない」ということ。
94デフォルトの名無しさん:2006/06/04(日) 17:21:32
>>81
比べるべきはTotalだが、ほとんど有意差はみられない。
95デフォルトの名無しさん:2006/06/04(日) 18:13:10
トリップを生成するプログラムを作っているんですが、
2chで#アだとtsGpSwX8mo
自分の環境でトリップキーがアだとIApAHNvIKg
になります。なぜかトリップキーが2文字以上あればうまくいきます。
「あ」も「a」もだめでした。
ActivePerl5.8.8 Build 817です。
プログラム内容は
$tripkey="ア";
$salt = substr($tripkey.'HG', 1, 2);
$salt =~ tr/:;<=>?\@[\\]^_`/ABCDEFGabcdef/;
$salt =~ tr/\x80-\xFF/\x00-\x7F/;
$salt =~ tr/\x7B-\x7F/\x2e-\x32/;
$salt =~ tr/\x14-\x2D/\x61-\x7A/;
$salt =~ tr/\x00-\x13/\x47-\x5A/;
$trip = substr(crypt($tripkey, $salt), -10);
print $trip;
です。
何故でしょうか?どのようにしたら2chと同じトリップが出せるのでしょうか?
96デフォルトの名無しさん:2006/06/04(日) 18:17:58
ハードゲイじゃなくてH.
9795:2006/06/04(日) 18:26:36
>>96
ありがとうございます。うまくいきました。
98デフォルトの名無しさん:2006/06/04(日) 20:03:25
サブルーチンの引数にハッシュを渡すことは可能ですか?

&foo(%hash);
sub foo {
%hash = $_[0];
print join "\n", keys %hash
}
とやってみたのですが、うまくいかないようです。
99デフォルトの名無しさん:2006/06/04(日) 20:12:15
サブルーチンの引数に配列を渡すことは可能ですか?

&foo(@array);
sub foo {
@array = $_[0];
print join "\n", @array
}
とやってみたのですが、うまくいかないようです。
100デフォルトの名無しさん:2006/06/04(日) 20:14:43
釣りだよね。
じゃなかったら本を読もうね。
101デフォルトの名無しさん:2006/06/04(日) 20:25:01
サブルーチンの引数にスカラーを渡すことは可能ですか?

&foo($scalar);
sub foo {
$scalar = $_[0];
print $scalar
}
とやってみたのですが、うまくいきました。

どう見ても釣りです。本当にありがとうございました
102デフォルトの名無しさん:2006/06/04(日) 20:41:06 BE:336798847-#
つまんね
103デフォルトの名無しさん:2006/06/04(日) 20:49:26
>>102
はいはい。そうですね。
104デフォルトの名無しさん:2006/06/04(日) 20:54:47 BE:106128634-#
my %hash = @_;
うぇ
105デフォルトの名無しさん:2006/06/04(日) 21:19:38
>>91
Shift_JISとCP932の違いについてはここを参照してちょ。
ttp://legacy-encoding.sourceforge.jp/wiki/

ちなみにeucjpも違うので注意。


>>89
Mac はバージョンによって微妙に違ってた気がするんだよな……。
問題ありそうなら MacJapanese を指定しておけば?
ttp://search.cpan.org/~dankogai/Encode-2.18/JP/JP.pm
106デフォルトの名無しさん:2006/06/04(日) 21:36:21
>>104
ありがとうございます。
わざわざ、
&foo(\%hash);
sub foo {
%hash = %{$_[0]};
print join "\n", keys %hash
}
なんてやってましたorz
107デフォルトの名無しさん:2006/06/04(日) 21:49:45
>>106
処理がそれだけなら、次のようにも書けるよ。

print &foo(\%hash);
sub foo { join "\n", keys %{ +shift } }

# サブルーチンで値を返すようにして、呼び出し側で print してるのは単に僕の好みだから気にしないで。
108デフォルトの名無しさん:2006/06/04(日) 22:10:54
>>106
すごい。
そこまでできる技術があるのに・・・
109デフォルトの名無しさん:2006/06/04(日) 22:17:44
>>104
それなんてウイルス?
110デフォルトの名無しさん:2006/06/04(日) 22:36:43
どうでもいいけどmy使おうね。ついでに、サブルーチン引数は名前をつけるという意味でも以下のようにしたほうがいい。
sub foo{
my($first, $second, @other) = @_;
# ...
}
foo(1, 3, 4 .. 10);
111デフォルトの名無しさん:2006/06/04(日) 22:43:57
配列の$_[0]から$[5]までの変数に文字列が入っていなければ、
何かの処理をするような、エレガントな記述を記述を教えてください。

今はこうする方法しか考えつきません。

$flag=1;
for ($i=0;$i<6;$i++)
  { if ($_[$i] ne '')
     { $flag=0; }
  }

if ($flag)
  { [何かの処理]; }

よろしくお願いします。
112デフォルトの名無しさん:2006/06/04(日) 23:24:46
if ( grep /.+/ @_ ) {処理}
でおk

my @flag = grep /.+/ @_;
とかすると@flagには空でない値が全部はいる。
113酩酊 ◆TWARamEjuA :2006/06/04(日) 23:28:59 BE:2723055-#
>>111
if (scalar(grep /\w/, @_) == scalar @_){
# 処理
}
かな?
114酩酊 ◆TWARamEjuA :2006/06/04(日) 23:31:18 BE:6861097-#
>>113
ちょとちがうか(照)
unless (scalar(grep /\w/, @_[0..5])){
# 処理
}
かな?
115デフォルトの名無しさん:2006/06/04(日) 23:33:22 BE:106128162-#
joinでええやん
116デフォルトの名無しさん:2006/06/04(日) 23:46:41
>>112
@_ = qw( 0 )

>>113, >>114
@_ = qw( : @ # & ! )
117デフォルトの名無しさん:2006/06/04(日) 23:49:47
んじゃ join
if ('' eq join('', @_[0 .. 5])) {
}

つーか、そんな6つも引数渡すような関数作の方を
考え直した方が良いと思うけど
118デフォルトの名無しさん:2006/06/04(日) 23:51:53
あえてひねくれる。
%hash = map{ $_,1 }@_
if( defined $hash{''}){
#処理
}
119111:2006/06/04(日) 23:54:38
もう少し考え直したほうが良いほうです。
でも、参考になりました。
ありがとうございました。
120デフォルトの名無しさん:2006/06/04(日) 23:56:40
2ちゃんのbbs.cgiは引数を8個渡しているそうです
121デフォルトの名無しさん:2006/06/05(月) 00:23:58
>>116
grepの結果はリストなのでifではスカラコンテキストで評価されて真値を返すのでは?
試してないが>>112で通ると思われ。
122デフォルトの名無しさん:2006/06/05(月) 00:47:51
>>112=121だが元投稿をよく読んでなかったw

配列に空文字列を一つでも含む場合に処理をするんだな。
if ( ( grep /.+/ @_ ) < @_ ) {処理}

unless ( ( grep /.+/ @_ ) == @_ ) {処理}

でよくね?
添え字が0-5の6個だと分かってるなら
if ( ( grep /.+/ @_ ) < 6 ) {処理}
とか。()付けたから@_ = qw( 0 );でも通るはずだぞ。
123デフォルトの名無しさん:2006/06/05(月) 00:50:49
>>108
いや、必死にマニュアル読みましたよ。
釣りじゃないです。。
>>110
ここにあげる例として書いただけで、実際のコードには my を仕様しております。
124デフォルトの名無しさん:2006/06/05(月) 00:56:13
6個程度の配列ならgrepでいいけどそれが嫌いなら

sub hoge { 処理 }

foreach (@_) {
length $_ or hoge() and last;
}
ですっきりするし無駄な評価を避けることが出来る。
ただしhogeは真値を返せよ。
125デフォルトの名無しさん:2006/06/05(月) 01:28:48
誰もが考えフいて誰も書かなかっただけじやない?
>工レガント
っていってるし。
126デフォルトの名無しさん:2006/06/05(月) 03:58:25
>>117
の書き方って正しいの?
なんで" eq join("なんてなってんの?
おかしくない?
127デフォルトの名無しさん:2006/06/05(月) 04:04:35
>>126 " eq join(", @_[0 .. 5])
>>117 '' eq join('', @_[0 .. 5])
128デフォルトの名無しさん:2006/06/05(月) 08:27:01
つーか>>111のコードはそんな条件じゃない
129128:2006/06/05(月) 08:33:19
いや、全く逆で俺の勘違いだった。すまん。
130デフォルトの名無しさん:2006/06/05(月) 10:11:44
>>125
日本語で頼む。もしくはPerlで。
131デフォルトの名無しさん:2006/06/05(月) 12:17:42
>>125
    /    ||    :ヽ
   ┌|(⌒ヽ :|| ..:⌒: |┐   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
   |::|::ヽ.__:):||(___ノ ::|::|  │
    |:|: ..   :||    .. |:|  │
    :|: ..   ||    ..|| <   ジュワ!(やっぱりウルトラマン語で頼む
     :\ [_ ̄] /::|   │
::     |\|_|_|_|_/:::|    \________
   __| |   / / :|___
132デフォルトの名無しさん:2006/06/05(月) 14:10:59
for(my $i=0;$i<6;$i++){
unless($_[$i]){ {処理} }
}
133132:2006/06/05(月) 14:26:01
もし配列要素へのインデクスがいらないなら。
map{ {処理} unless $_;} @_[0..5];

たとえば、空要素の位地に特定の文字列をセットするようなときには使える。
map{ $_='N/A' unless $_;} @_[0..5];


空要素だった時に条件成立なら、要素の値を取得しても意味が無い。
だって空だから。
134デフォルトの名無しさん:2006/06/05(月) 14:29:02
>>127
あそっかダブルコーテーションじゃなくてシングルコーテーションだったのね
もういやぽ
135132:2006/06/05(月) 14:31:56
俺も勘違いだ。orz
>>111のコード紛らわしス。
136デフォルトの名無しさん:2006/06/05(月) 21:11:54
>>111
if ( grep /^$/, @_[0..5] ) {
  # 何だか知らんが何かやっとけ
};
137デフォルトの名無しさん:2006/06/05(月) 21:35:18
>>136
それじゃあ1つだけでも空の文字列があればtrueにならね?

unless ( grep !/^$/, @_[0..5] ) { }
とか
if ( grep(/^$/, @_[0..5]) == 6 ) { }
とかならわかるけど。
138136:2006/06/05(月) 21:43:15
>>137
ありがと。
いや笑った笑った。こりゃ混乱するわな。w
139デフォルトの名無しさん:2006/06/06(火) 00:42:54
use List::MoreUtils qw(all);
if (all {$_ ne ''} @_[0..5]) { }
モジュールに頼るのがエレガントかというと意見が分れると思うがソースとしては美しくなると思う
140デフォルトの名無しさん:2006/06/06(火) 02:49:03
>>111
なんか盛り上がってるから読んでみた。インデントが少し変だと思った。

ちなみに俺は、自分用のコードを書く場合必ず my_func.pm ってのを使ってて
その中に「全てが真であるか調べる関数」と「全てが偽であるか調べる関数」が存在してる。
141140:2006/06/06(火) 02:57:59
ところで、ホントすんません。
久しぶりに自分の昔のメモ見たら、

#▼全て偽なら真が返るが、分かりにくく汚め。
($aaa . $bbb . $ccc . $ddd) + 0 ? 0 : 1;

ってゆうのが出てきたんですが、+0って何を考えて+0したんでしょうか?俺は。。。。
なんか思い出せません。orz

数値コンテキストを適用したいっぽいのは想像できるんですけど、なんで数値コンテキストなんでしょうか?
昔のほうの俺が何かアホな勘違いをしたんでしょうか?脳が衰えて判断できない。。。。
142140:2006/06/06(火) 03:00:31
あ、書き込んだ瞬間気付きました。
変数の中が0なら0000になって文字列で真になっちゃうってコトかな (恥)
143デフォルトの名無しさん:2006/06/06(火) 04:07:44
!($aaa || $bbb || $ccc || $ddd);
144デフォルトの名無しさん:2006/06/06(火) 05:08:43
>>141は「全て偽なら真を返す」だけど、「!(全て偽)なら!(真)を返す」ではないね。
例えば、連結後の文字列が '123.45e-06789' になる場合とか。
145デフォルトの名無しさん:2006/06/06(火) 16:10:28
>>141のは変数が全部数値なときしか使えないじゃんか
変数のどれかが一個でも文字列だったら
+0で数値コンテキストで評価されちゃって0と評価されるから
意図した結果にならない

146デフォルトの名無しさん:2006/06/06(火) 16:56:58
ファイルから1バイトずつ読み出したいんですが

while ( read ( FP , $x , 1 ) ) {
処理本体 ;
}

でいいんでしょうか
147デフォルトの名無しさん:2006/06/06(火) 17:17:57
すんません自己解決しました。
getcっていう便利な関数があるんですね
148デフォルトの名無しさん:2006/06/06(火) 17:40:43
local $/ = ¥1 つー手も。
149デフォルトの名無しさん:2006/06/06(火) 17:48:34
1バイトの2進数が変数に入っている場合に(数字キャラクタで入っているのではなく、
8ビットのビット列がそのまま変数に入っているとして)、それを数字キャラクタで表された
0b00101101というような形に変換して別の変数に格納したいんですが、
そういう仕事をしてくれる関数ってありますか?
150デフォルトの名無しさん:2006/06/06(火) 17:58:46 BE:433356577-#
unpack?
151デフォルトの名無しさん:2006/06/06(火) 18:07:51
unpackでググってやり方がわかりました。
どうもありがとうございますた
152デフォルトの名無しさん:2006/06/06(火) 19:48:07
ラクダ本にgetcは使うなって書いてあるんですが
理由が書いてありません
どういう理由なのでしょうか?
153デフォルトの名無しさん:2006/06/06(火) 19:57:51
OSによる行バッファリングが入っちゃうからじゃないかな
154デフォルトの名無しさん:2006/06/06(火) 23:30:32
>>152
Perlでは一文字づつ処理しなければならないケースが極端に少ないため、
C的な感覚でのgetc()の使用は、ほとんどの場合もっとずっと簡単な正規表現での処理に置き換えられる。
したがって、getc()でなければならないという強い確信があるとき以外は使わないほうがいい。

という程度のことだと思うよ。
実際、俺は使ったことないし、使ってるコードを見たこともない。
155152:2006/06/07(水) 07:28:51
>>153どうもです。行バッファリングって具体的にどういう?

>>154さんくすです。ということは行バッファリングどうこうって関係ないのね。
156デフォルトの名無しさん:2006/06/07(水) 15:07:19
>>155
まあ落ち着け。
入力ストリームから一文字入ってくるたびに何か処理を行いたいのに、一行分貯まるまで渡ってこないと困るケースがあるとは考えないか?
157デフォルトの名無しさん:2006/06/07(水) 16:30:13
while (my $oee = <$fh>) {

}

これってループ毎に$oeeはいちいちmy宣言されてしまうから

my $oee;
while ($oee = <$fh>) {

}

とした方がいいですか?
158デフォルトの名無しさん:2006/06/07(水) 16:35:47
>>156
そんなケースってあるの?
例示してくれ
159デフォルトの名無しさん:2006/06/07(水) 16:46:37
parでつくったguiあぷり。

コンパイルしたディレクトリだとアイコンが表示されるけど、
違うディレクトリに移動するとアイコンが表示されない。
(ファイル自体のアイコンだけは問題ない!)

他の部分は、ウィンドウズのアイコンになる。
IconResetで内部無理矢理変えても駄目だなあ。

なんで?
160デフォルトの名無しさん:2006/06/07(水) 18:30:56
>>157
とても古いperlを使うなら Yes
そうでないなら、廃人にとっては Yes かもしれないが、通常は No

例えば、整数値のみを保持しているスカラ変数を文字列中で展開すると
整数値以外に文字列値も持ったり、数値演算を行うとdouble値も持ったり
する事を気にするような場合は Yes かもしれない。

後は、こんな...
perl -e "while(my $x=<STDIN>) {printf '%08x %3d %3d',unpack('lll',unpack('P12',unpack('P4',pack('l',\$x))));}"
真似が普通の人にとっても Yes かも

my(やlocal)の実行時効果は
・ブロック内で最初の実行
  ブロックから抜ける時の変数回復情報に、変数情報と変数実体を登録する
  新しい変数実体を確保・初期化する
・それ以外
  古い実体のリファレンスカウントを減らす
  (リファレンスカウントが0になったら開放される)
  新しい変数実体を確保・初期化する
  (高い確率で同じ実体が再利用される)
だから、負荷自体はかかるけどね。

大雑把に、ループ中のmy(やlocal)は「my変数はlocal変数より速い」と同じ
程度の差でしかないから、読みやすさを優先した方がいい。
161デフォルトの名無しさん:2006/06/07(水) 20:00:58
>>158
そう来たか。w いや、なんでも疑問を持ってみるのはいいことだ。
ひとつ最も端的な例を挙げるとするなら、端末からのユーザ入力ということになる。

# 普段の I/O でバッファリングなどを意識しなくていいというのは言語の成果なんだろうね。
# 十年後にはこういう話題の価値ってなくなってるんだろうなあ。うん、そのほうがいい。
162デフォルトの名無しさん:2006/06/07(水) 20:53:11
perlでインタラクティブなことをするのってバカらしいしな。
というかコンソールツールで。
163デフォルトの名無しさん:2006/06/07(水) 21:09:08
昔、Term::Readline 入れて作らされたなあ。
自分のためのスクリプトだったらそんなことしないのに。
164デフォルトの名無しさん:2006/06/07(水) 22:59:03
getcは便利だよ
165デフォルトの名無しさん:2006/06/07(水) 23:09:10
>>164
大丈夫だ。そこは誰も否定してない。w
移植性や保守性、実行時効率などを考慮すると、いろいろ面倒だから気をつけれ、という話だ。
166デフォルトの名無しさん:2006/06/08(木) 11:45:01
if ( $isDoorOpen ) {
   goUp($MAX);
}
167デフォルトの名無しさん:2006/06/09(金) 12:19:18
$height += 100 unless int rand 10;
168デフォルトの名無しさん:2006/06/09(金) 18:50:27
Win32::API
について質問です。
Win32::APIで呼び出せるdllの呼び出し規約は何なのでしょうか?
169デフォルトの名無しさん:2006/06/09(金) 19:29:36
現在時刻をミリ秒まで拾える方法があれば教えてください。
170デフォルトの名無しさん:2006/06/09(金) 19:34:43
Time::HiRes
171デフォルトの名無しさん:2006/06/09(金) 20:42:08
>>168
WINAPI
172168:2006/06/10(土) 00:30:10
>>171
ありがとうございます。
WINAPI = stdcallであることを確認できました.
173デフォルトの名無しさん:2006/06/10(土) 01:38:31
最近perlの本買って勉強し始めたんだけど
買った本に載ってた問題で「うるう年の判定スクリプトをif文の入れ子の形で書け」
ってのがあって

print "year = ?";
chomp($year = <STDIN>);

if ($year % 400 == 0){
print "uruu doshi desu\n"
} else {
if ($year % 4 == 0){
if ($year % 100 != 0){
print "uruu doshi desu\n"
} else {
print "hei nen desu\n";
}
こう書いて実行したんだけどエラーが出て動いてくれません。
エラー内容を見てみると、最後の行がまずいらしいんですけど
どう弄れば動いてくれるようになるのかさっぱり・・・
174デフォルトの名無しさん:2006/06/10(土) 01:39:45
; 付け忘れだ
175デフォルトの名無しさん:2006/06/10(土) 01:56:27
>>173
} が最後に1つ足りない。
176173:2006/06/10(土) 02:07:33
動きました。
}の数が足りなかったのですね。
ご教授ありがとうございました。
177デフォルトの名無しさん:2006/06/10(土) 03:16:30
my $flag = ( $year % 4 == 0 and $year % 100 != 0 or $year % 400 == 0 );
print qw( 平年 閏年 )[$flag] , "です";

って書いたあとにifを使う問題だと気付く・・・
my $mes = "平年です";
$mes = "閏年です" if $year % 4 == 0 and $year % 100 != 0 or $year % 400 == 0;
print $mes;

たぶん、問題からすると外れ・・・
178デフォルトの名無しさん:2006/06/10(土) 04:21:00
ところで>>173見てて思ったんですけど、対応したカッコ({})に
正しくマッチする正規表現て作れるんですか?
179デフォルトの名無しさん:2006/06/10(土) 04:43:49
perl初めたてであほな質問かもしれないのですが、、

$lineに

<a href="http://***.com/abc/" target="_blank">keyword</a> | <a href="http://***.com/def/" target="_blank">hoge</a>


が格納されているときに、前半のURLだけを取得したくて

$line =~ m/href=['"'](.*)['"'](.*)keyword(.*)/i;
print "match : $1 \n";

のような正規表現を書いてみたのですが、$1には
http://***.com/abc/" target="_blank
がマッチングしてしまいます。
これはどこが間違ってるのでしょうか?
180179:2006/06/10(土) 04:46:24
" → ダブルクォーテーション

ですorz
181179:2006/06/10(土) 04:48:36
あれ、なんか2chのhtmlタグ変換ルールがよくわからん(´A`)
182デフォルトの名無しさん:2006/06/10(土) 06:04:55
>>178
再帰的なパターン(??{ code })を使用
ttp://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen

>>179
条件がわからんのでどの程度の答えを出せば良いのか迷うけれど、
keywordの場所は初めとは決まってなくて、かつ
keywordは行に一つしか出てこない前提での回答。
my $line = q{<a href="http://example.com/abc/" target="_blank">keyword</a> | <a href="http://example.com/fuga/" target="_blank">fuga</a>};
$line =~ m/
.* # 二番目になることもあるかもしれないので余分を喰わせる
href=(['"])(.*?)\1 # \1 = (['"])の部分でマッチした方
.*? # target="_blank">
keyword/ix;
print "match : $2 \n";
ともかく重要なのはバックトラックを行わないようにした変更.* -> .*?
183ヽ(´ー`)ノ ◆.ogCuANUcE :2006/06/10(土) 08:40:20
>>178
Regexp::Common::balenced とか。
中で使ってる原理は >>182 と同じだけどね。
184デフォルトの名無しさん:2006/06/10(土) 17:59:33
$rand = int(rand(6));
if($rand == 0)
{
$a = "YES_00";
}
elsif($rand == 1)
{
$a = "YES_01";
}
elsif($rand == 2)
{
$a = "YES_02";
}
elsif($rand == 3)
{
$a = "YES_03";
}
else
{
$a = "NO";
}

という処理をある条件下で判定させているのですが
1回目の判定が

YES_00

だった際に2回目の判定は「YES_00」以外にしたいのですが
どのようにしたらいいのでしょうか?
まだまだはじめたばかりなのでアドバイスいただければと思います。
185デフォルトの名無しさん:2006/06/10(土) 18:13:57
やりたいことがわからん。
判定がYESってなんだよ。判定は$randでやってるじゃねーか。

一回目の判定が $rand == 0 だったときという意味か?
で、そのとき何をするって?
186デフォルトの名無しさん:2006/06/10(土) 18:20:41
2回続けて同じ値にしたくないということだろうね。
例えば、0が出た後は、0以外の値が出るまで乱数を発生させたいとか。
187デフォルトの名無しさん:2006/06/10(土) 18:21:45
数字が全角になってた。。orz
0 ⇒ 0
188デフォルトの名無しさん:2006/06/10(土) 18:32:23
>>184
配列に0から6まで入れてシャッフルしてみれば?
189184:2006/06/10(土) 18:49:30
申し訳ないです。
>>186さんの言うとおりです。
質問内容おかして混乱させてしまいまして申し訳ありません。
190デフォルトの名無しさん:2006/06/10(土) 19:02:28
>>184
do{
  $rand = int rand(6);
}while($a eq 'YES_00' and  $rand==0);

if($rand <=3 ){
  $a = 'YES_0' . $rand;
}else{
  $a = 'NO';
}
191179:2006/06/10(土) 19:18:23
>>182
まさかここまで丁寧に答えてくれるとは、、ありがとうございました。
おかげさまでうまくいきました
にしてもPerlの正規表現は便利ですねぇ
192デフォルトの名無しさん:2006/06/10(土) 19:18:55
open (DAT,"<sample.txt");
@file = <DAT>;
close (DAT);
%hash;
for $i (@file){
@test = split(/[ ,\n,.,\",_,\=,;,:,(,),\',-]/,$i);
for $i (@test){
$i =~ tr/A-Z/a-z/;
$hash{"$i"} += 1;
}
}
foreach $word (sort {$hash{$b} <=> $hash{$a}} keys %hash){
print "$word $hash{$word}\n";
}

このプログラムでsample.txt内の単語の数をソートして表示するプログラムをつくっているのですが、結果に

367
the 214
in 63
is 60
of 56
and 38
god 33
to 32
that 31

というように「 367」という謎の単語を表示してしまいます。
どうもsplitで記号を消去するときにでてきてしまうらしいのですが、、、どうすればこの謎の記号を%hashに登録しないようできるでしょうか?数が300以上の単語は表示しないなんてプログラムではだめだと思うのでなんとかしたいです。
よろしくお願いします。
193デフォルトの名無しさん:2006/06/10(土) 19:19:16
my @a = (0..5);

while(@a) {
  my $rand = splice @a, int(rand(scalar @a)), 1;
  print "$rand\n";
}

こういう事じゃね?
194デフォルトの名無しさん:2006/06/10(土) 19:24:03
>>193>>184 の返信で

>>192
1つ勘違いしてると思うけど
@test = split(/[ ,\n,.,\",_,\=,;,:,(,),\',-]/,$i);
じゃなくて
@test = split(/[ \n.\"_\=;:()\'-]/,$i);
でおk

@file から一行取り出した時に最後に改行がついているので
"AAA BBB CCC\n"
この改行を chomp で取り除いてから split すれば多分大丈夫
195デフォルトの名無しさん:2006/06/10(土) 19:26:23 BE:353760285-#
もう…終わりだね…
196デフォルトの名無しさん:2006/06/10(土) 19:28:53
>>192
空白とか(splitの対象文字)が367個入ってるということでは?
あと split で、なんでカンマを入れてるの?
カンマで区切るんじゃないけど…。
197デフォルトの名無しさん:2006/06/10(土) 19:34:09
つか
@test = split(/\W+/,$i);
でよくね?

んで全部ハッシュに入れ終わったら
delete $hash{""};
とか。
198デフォルトの名無しさん:2006/06/10(土) 19:37:44
♪なーつのおーわーどぅぃー
199184:2006/06/10(土) 19:39:06
みなさんレスありがとうございます。
まだまだ未熟ですが勉強していきたいと思います。
ありがとうございました。
200192:2006/06/10(土) 20:25:28
皆さんありがとうございました!!
おかげで意味がわかんないあの367はきえました(T-T )( T-T)ウルウル

あっざーっした!!
201デフォルトの名無しさん:2006/06/10(土) 22:09:33
>>199
>>200
頼むから二度と来ないでね。
202デフォルトの名無しさん:2006/06/10(土) 22:57:25
>>199
かわいそうに。
初心者の俺が作ったのを使ってみて。

$zenkai = "NO" if(!defined $zenkai); # $zenkai変数がなければ作る。とりあえず"NO"を代入

do {
$rand = int(rand(6));
if($rand < 4) {
$a = sprintf("YES_%02d",$rand)
} else {
$a = "NO";
}
} while($a eq $zenkai); # 前回と比較して同じなら繰り返す

$zenkai = $a; # 今のを前回のとして保存する
203デフォルトの名無しさん:2006/06/11(日) 03:26:31
相対パス ./index.html を
絶対パス http://domain.com/index.html に置換したくて

$domain = "http://domain.com/";
$tmp =~ s/'./'/$domain/i;

のようなスクリプトを書いてみたのですが、 ./ の部分でエラーがでてしまいます。

./ はどのように記述すればいいのでしょうか?
204デフォルトの名無しさん:2006/06/11(日) 03:36:28
\.\/
もしくは区切り文字を変えて
s|\./|$domain|;
205デフォルトの名無しさん:2006/06/11(日) 03:43:15
>>204
おぉ、なるほど区切り文字って使い分けていいんですねぇ
ありがとうございましたっ
206デフォルトの名無しさん:2006/06/11(日) 04:20:56
いらんお世話かもしらんけど、
s( )( )
s[ ][ ]
s{ }{ }
s{ }( )
とかも可能.

あと、区切り文字と同じ文字を正規表現内で使う時は \ でっせ
クウォートしても意味なっしんぐ
207デフォルトの名無しさん:2006/06/11(日) 04:49:46
なるほど、いくつかパターンがあって都合のいいやつを選べばいいってことか

ついでに、もう一つ質問なんですが

$data =~ m/.*($key1|$key2|$key3)(.*?)/i

みたいな感じで、いくつかのキーワードを含む物とマッチングしたい場合
keyが増えたときに、めんどくさいことになりますよね。

ここのkeyを配列@keyにいれて

$data =~ m/.*(@key)(.*?)/i 

みたいな感じで、@keyの要素のどれかとマッチングを取るようにしたいんですが
なにかスマートな書き方ってないでしょうか

みたいにやりたいんですが、
208203:2006/06/11(日) 04:51:30
最後の行の

「みたいにやりたいんですが、」

は無視してください・・・
209デフォルトの名無しさん:2006/06/11(日) 05:11:04
スマートかどうかは知らんけど、俺は正規表現を複雑にするよりforeachする。
foreach my $key (@array){
  m/.*($key)(.*?)/i
}
210ヽ(´ー`)ノ ◆.ogCuANUcE :2006/06/11(日) 05:40:59
うーん、こうか?

$data =~ m/((??{ join('|', @key) }))(,*?)/i;
211デフォルトの名無しさん:2006/06/11(日) 13:28:49
>>209 のほうが好み。読みやすく、また通常は処理が速い。
用途にもよるけど気分的には \Q$key\E しておきたいところ。
212203:2006/06/11(日) 14:46:22
>>209-210
レスありがとうございます。
同じ処理が2カ所にあるんで、可読性があれになりますが
勉強ってことで両方使ってみようと思います(`・ω・´)
213デフォルトの名無しさん:2006/06/11(日) 15:02:07
>>212
> 同じ処理が2カ所にあるんで、可読性があれになりますが

関 数 に 括 り 出 せ
214デフォルトの名無しさん:2006/06/11(日) 15:27:01
展開は出来ても因数分解は出来ないってあれか?
215デフォルトの名無しさん:2006/06/11(日) 16:01:46
俺Perl使い始めて10年近くなる事に気付いたけど、
こんな複雑な事やった事ない…。orz
216デフォルトの名無しさん:2006/06/11(日) 18:22:17
「Perlオブジェクト、リファレンス、モジュール」
という本のクロージャという項目に書かれていた
内容について質問です
ちょっと長くなりますがお許し下さい
引用----------------------------------------
use File::Find;
my $total_size = 0;
find(sub { $total_size += -s if -f }, "."};
print $total_size, "\n";

この無名サブルーチンが変数$total_sizeにアクセス
している点に注目して下さい。変数$total_sizeが無名
サブルーチンのスコープの外部で宣言されているにも
かかわらず、この無名サブルーチンは変数にアクセス
しています。つまり、findから呼び出されたコールバック
サブルーチンは、「「「本来なら直接アクセスできない変数
にアクセスでき」」」、さらにその変数の値を更新することが
できるのです。
---------------------------------------------------

「「「」」」で囲んだところが理解できません。
たとえば
my $value = 10;
function();
sub function {
  print $value;
}
このコードはちゃんと10と表示されます。サブルーチン内から
サブルーチン外で宣言された変数には直接アクセスできます。
なのに本では「本来なら直接アクセスできない変数」と書かれ
ています。どういうことなのでしょうか?
217デフォルトの名無しさん:2006/06/11(日) 18:31:11
>>216
その比較した例は適切では無いね
{
  my $value = 10;
  function();
}
sub function {
  print $value;
}
こう。$valueは上にあるブロック(=本の例ではファイルのスコープに相当)内でスコープが完結している。
対してfunctionサブルーチンはFile::Findモジュールにあるから、そのスコープからは$valueは見えない。
レキシカル変数については、そのスコープの範囲とか理解してる?
218デフォルトの名無しさん:2006/06/11(日) 18:44:31
>>216
無名サブルーチンを定義した際、同じスコープにある変数は
無名サブルーチンからはグローバルに見える。
本来外側にあって見えないはずの my $total_size が
無名サブルーチンからも見える、ということ。
言葉で説明するのむずいな。
219216:2006/06/11(日) 18:49:19
>>217
を読んで
「理解できました。まじありがとうございます・・・」
と思っていたら
>>218
を読んでもう何もわからなくなりました
220216:2006/06/11(日) 18:50:08
>>217さんと>>218さんは
言い方は違うけど同じことを言っているのですか?
221デフォルトの名無しさん:2006/06/11(日) 18:58:51
>>220
>>217 は見えない方の説明。
>>218 は見える方(というか無名サブルーチン内からの変数の見え方)の説明。
222216:2006/06/11(日) 19:06:08
すみません、ちょっと確認させて下さい

test01.pl--------
#!/usr/bin/env perl
require 'test02.pl';

my $value = 10;
test(sub { print $value; });
---------------

test02.pl--------
sub test {
  $sub = shift;
  &$sub;
}
---------------

実行結果:10

test02.plを以下のようにしてもうまくいかない
test02.pl---------
sub test {
  print $value;
}

こういう理解であっているでしょうか?
223デフォルトの名無しさん:2006/06/11(日) 20:04:01
>>222
> 本来なら直接アクセスできない変数にアクセスでき
に対する理解としては多分良いと思う。が、
クロージャとコールバックに対する理解の話だとするならば、ずれてるな…
以下、高階関数に関する説明をしようかと思ったけれど上手く纏まらないので略。

ちょっと寄り道してschemeのlambdaと高階関数とか調べてみると確実な理解がしやすいかもね。
schemeのlambdaはクロージャそのものだから。
224デフォルトの名無しさん:2006/06/11(日) 21:10:48
そもそも「クロージャ」(closure)って名前はレキシカル変数を「閉じ込める」事から来てるって偉い人が言ってた
225デフォルトの名無しさん:2006/06/11(日) 21:37:46
>>216

すんません、俺もよくわかりません。

my $total_size = 0;
find(sub { $total_size += -s if -f }, "."};
print $total_size, "\n";


>変数$total_sizeが無名
>サブルーチンのスコープの外部で宣言されているにも
>かかわらず、この無名サブルーチンは変数にアクセス
>しています。

>本来なら直接アクセスできない変数
>にアクセスでき

外部で宣言されたmy変数にアクセスできるのは当たり前だと思うのです。
スコープの内側ならサクセスできないけど、なんで自分より外のmyにアクセスできると変なのかわからないです。

find関数の内部実行って意味の話なのかな?
これはリファレンスが送られるから、find関数で値は参照されますが…。
クロージャのスコープは定義した場所で決定して、実行場所とは関係ないから参照できて当たり前と思うのです。

ごめん、なんか問題の意味すらよくわからなくなった orz
226デフォルトの名無しさん:2006/06/11(日) 21:49:17
my $closure;
{
  my $hoge = "abc";
  $closure = sub { print "$hoge\n"; };

  $closure->();      # abc
  print "$hoge\n";  # abc
}
$closure->();        # abc
print "$hoge\n";    # エラーになる


$hoge はレキシカル変数なのでブロックの中でのみ有効。
しかし、クロージャの中にレキシカル変数を閉じ込めると、ブロックの外でも参照できる。
こんな感じでわかるかな?
227デフォルトの名無しさん:2006/06/11(日) 21:50:30
>>225
>なんで自分より外のmyにアクセスできると変なのかわからないです。
多分、>>216 で挙げられている本の例があまり良くないのだと思う。

外部のmyにアクセスできると変、というか不思議でしょ?とその本が言いたいのは
>>222 で挙げられている例の test() のように、
作成された無名サブルーチンを別のスコープに持って行っても
その無名サブルーチンを定義した時に見えていた my変数がそのまま見える
という所だと思う。
228225:2006/06/11(日) 22:09:14
あ、意味がわかりますた。

229216:2006/06/12(月) 00:46:10
みなさんいろいろと勉強になります

>>226の内容は理解できました

>>225
意味わかったのかぁよかったね・・・
俺はまだ理解しきれません
あと少しで理解できそうです
すみません、最後に聞かせて下さい

a.pl--------------------
use File::Find;
my $total_size = 0;
find(sub { $total_size += -s if -f }, "."};
print $total_size, "\n";
-----------------------
これについてなんですが、
上記のfindに渡されるクロージャの無名サブルーチンは
>>225が言うように、
a.plのスコープで実行されるんじゃなくて、
File/Find.pm内のfind関数のスコープで実行されるんですよね?
File/Find.pmのfind関数のスコープからは、a.plのスコープにある
$total_sizeは見えないはずなのに、クロージャを使うことで見える
ようになる、ということで間違っていないですか?
230デフォルトの名無しさん:2006/06/12(月) 01:17:27
>>229
> a.plのスコープで実行されるんじゃなくて、
> File/Find.pm内のfind関数のスコープで実行される
うわぁ、違う。一番肝心なところが違う。
というか最後から7~4行目と2~1行目で言っていることが矛盾していないか。
その本の言いたいことはその後ろに、
「ように思うかもしれないが、クロージャは作られた場所の(静的)スコープが記録されており、
find関数がどうなっているかは関係なく、クロージャの作られたスコープで動作する。」
と続く。

ちなみに、呼び出し元が動的スコープだった場合(つまりこのときはクロージャではない)は
呼び出された関数から見えることもある。File::Findの例ではパッケージが違うので見えないけれど。
{
  local $var = 10;
  function(sub { print "anonymous: $var\n" });
}
sub function {
  print "function: $var\n"; # localだと$varが見える
  $var = 5; # 勿論書き換わる
  shift->();
}
231デフォルトの名無しさん:2006/06/12(月) 01:42:21
.plファイルにpatch.exe diff.exeのパッチをあてたいのですがやり方がわかりません
何かツール必要なのでしょうか?
色々調べたんですけどわかりませんでした
232デフォルトの名無しさん:2006/06/12(月) 01:46:11
んー、このレベルで話す時ドコで実行されるの話は変になってくる。
その本も変だし。
>クロージャの作られたスコープで動作する
この表現も微妙。

あえてドコで実行されるかを言えば、クロージャのリファレンスのアクセス先。
>>229は、クロージャの理解としては正解。
どこで実行されるとかよりも、クロージャがある限りmy変数が消えないで残ってるんだよ、ってところが重要なのであり、べつに「ドコで」とかはもうどうでもいい気が。答えようがないし。

---------------------

{
 my $hoge;
}

#通常、この場所では$hogeは内部的にも消滅してる
#Perlは参照が不可能になった変数は破棄する。

---------------------

{
 my $hoge;
  our $closure = sub {$hoge = $hoge + 1}
}
#この場合、クローバル変数closureを通して$hogeが参照されるので、$hogeは消滅しないし、
#$closureをデリファレンスすると$hogeにアクセスされる。
#レキシカルスコープ(my)は静的なスコープで、コンパイル時に見たまんまのスコープが適用される。
#で、$hogeはこの時みたまんまのレキシカルスコープを持ってるんであって、ドコで実行とかは関係ない。
#だからxxのスコープで実行されるとかの表現も少し変。
#xxはyyのスコープにある、とかyyのスコープを持っているとか表現しる。
#ドコのスコープで実行されるとかは、動的なダイナミックスコープの話で、クロージャとダイナミックスコープは関係ない。
---------------------
233230:2006/06/12(月) 02:39:00
>>232
ごめん、確かに表現が悪かった。その上に意図を取り違えてたらしい。
否定した部分も、クロージャ内からfindのローカル変数にアクセスできてしまうかとか
そういう意味で捉えてしまっていたけれど、普通に動的スコープの話だと考えれば合ってたな。
と言うことで230撤回させてくださいorz 申し訳ない
234216:2006/06/12(月) 09:12:02
>>230
「間違いを正してくれてありがとうございます
やっと、なんとか一応理解できました」
と思ったら
>>233で撤回されてしまいました
もうわけわかめ

>>232すみません。もっかい確認させて下さい

1.pl-------------------
#!/usr/local/bin/env perl
require '2.pl';
my $value = 10;
function( sub { print $value; } );
----------------------
2.pl-------------------
sub function {
shift->();
}
1;
----------------------
$perl a.pl
10

上記において、1.plでmy宣言された$valueは
シンボルテーブルにも登録されずレキシカルスコープを持っているので、
その有効範囲は本来1.pl内にとどまるはず。
たとえ1.pl内でrequire '2.pl';としても2.plの内容は$valueのスコープ、
つまり1.plのファイルスコープには組み込まれない。
だから2.pl内のfunction内で$valueの値をprintしても何も表示されない、
ように思えるが、クロージャの作用でちゃんと$valueは10と表示される。
この理解で大丈夫ですか?
235デフォルトの名無しさん:2006/06/12(月) 10:34:08 BE:636768689-#
至極当然の動作な気が
236デフォルトの名無しさん:2006/06/12(月) 11:30:33
perlのsortって内部ではどういうソートやっているんですか?
バブルソート?クイックソート?
237デフォルトの名無しさん:2006/06/12(月) 12:12:28
perldoc sort に書いてあるです。
基本はマージソート。設定によりクィックソートも可。
238デフォルトの名無しさん:2006/06/12(月) 13:51:04
質問です
Fcntl.pmの:flockの
LOCK_SH LOCK_EX LOCK_NB LOCK_UN
の値は全てのプラットフォームで共通でしょうか
239デフォルトの名無しさん:2006/06/12(月) 13:57:20
>>237
らくだ本のsortの項目には書いてないことが
5.8.7のperldoc sortにはたくさん書いてあるね
昔はデフォルトでクイックソートだったが、
5.8からはマージソートになったんだね
勉強んなったありがとー
240デフォルトの名無しさん:2006/06/12(月) 14:51:30
>>238
違う値になってるのは見たことはないが、同じである保証はないと
思って書いとけ。
241デフォルトの名無しさん:2006/06/12(月) 16:21:57
ぎゃー
表示があかしくなってしましました。

以前は、「total 単位:万」とtを下に横書きで表示されていたのですが、
下記のようになりました。





l
a
t
o
t

GDのバージョンを2にしたのが原因かと思われますが、
さくっと解決する方法ありますでしょうか?
フォントとか変えるだけでうまくいかないものでしょうか?
242デフォルトの名無しさん:2006/06/12(月) 16:37:46
>>241
perlの問題違うやん
243デフォルトの名無しさん:2006/06/12(月) 17:14:39
>>241
知らないけど、文字の描画方向が下から上の縦書きになってんじゃないの?

そんな自然言語見たことないが。(世界は広いからどこかにあるかも知れないな)
244デフォルトの名無しさん:2006/06/12(月) 20:21:20
mod_perl時の場合END{}はプロセスが終了した時のみに実行されますが
mod_perl時にPerl/CGIのEND{}と同様の事をしたい場合どうするのが一番良いのでしょうか。
245デフォルトの名無しさん:2006/06/12(月) 20:41:21
P***Gua****というものを導入しろと言われたのですが*に入る文字って何か分かりますか?
246デフォルトの名無しさん:2006/06/12(月) 20:52:11
>>244
WebProg板にmod_perlのスレがあるのでこちらへどうぞ
http://pc8.2ch.net/test/read.cgi/php/1149505269/
247デフォルトの名無しさん:2006/06/12(月) 21:04:50
$a=6;
for($i=0;$i<100;$i++){
$a=$a-0.1;
print("$a\n");
}

のようにすれば6から0.1ずつ引いていってくれるはずだと思ったのですが、
ある数値を境に、0.99999998などというような数値になってしまいます。
何か間違えている部分はありますでしょうか。
248デフォルトの名無しさん:2006/06/12(月) 21:08:02 BE:106128926-#
>>245
PeerGuardian?
一文字多いか
249デフォルトの名無しさん:2006/06/12(月) 21:23:59
>>247
浮動小数点の処理には誤差が伴う。
「正確な値」になることを期待することがそもそも間違い。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#why_am_i_getting_long_decimals__eg__19_9499999999999__instead_of_the_numbers_i_should_be_getting__eg__19_95_
250デフォルトの名無しさん:2006/06/12(月) 21:26:20 BE:557172397-#
まぁ
use bignum;
でもしてろってこた
251デフォルトの名無しさん:2006/06/12(月) 21:31:39
なるほど。
因縁みたいなもんなんですね。
252デフォルトの名無しさん:2006/06/12(月) 21:40:27
>>245
PerlGuandam
253デフォルトの名無しさん:2006/06/13(火) 00:26:21
>>246
ありがとございます。そちらで聞いてみます。
254デフォルトの名無しさん:2006/06/13(火) 11:49:24
ねぇ、POEってすごくね?
255デフォルトの名無しさん:2006/06/13(火) 16:51:44
ゴノレゴの人?
256デフォルトの名無しさん:2006/06/13(火) 17:58:03
>>254
うん、すごいね。どんどん活用しようぜ!!
257デフォルトの名無しさん:2006/06/14(水) 22:45:50
もうPerlから足を洗いたい、
という願いを込めて、持ってた本を全部処分した。すっきり。
258デフォルトの名無しさん:2006/06/14(水) 23:23:39
>>257
はいはいおもしろーいおもしろーい。
259デフォルトの名無しさん:2006/06/14(水) 23:31:23
>>257
いままでお疲れさまでした。
これからもHaskell世界でご活躍ください。
260デフォルトの名無しさん:2006/06/14(水) 23:35:56
>>257
どうしてperlから足を洗いたいと思ったの?

ま、まさかあんたはてなの中の人じゃないだろうね
261デフォルトの名無しさん:2006/06/15(木) 01:13:46
熊田曜子写真集はどうなりました?
262デフォルトの名無しさん:2006/06/15(木) 02:59:34
プログラム自体やめるのは聞いたことあるけど、言語から足洗うなんて初めて聞いた。
263デフォルトの名無しさん:2006/06/15(木) 05:44:14
> 言語から足洗うなんて初めて聞いた。
俺は PHP から足を洗った。
おかげでストレスがが溜まりません。
264デフォルトの名無しさん:2006/06/15(木) 08:42:20
うまく説明できませんが、以下の文字列を取得して実行する場合、
普通はどうゆう風に実行するのが一般的っていうか、普通なのでしょうか。

((100 + 200) / 100) + (50 / 10)

evalとかそうゆう話じゃなくて、(カッコ)のネストの解析の話です。


いろいろ考えましたが、

1:開きカッコを見つけ次第、開きカッコの数を数えながら閉じカッコを見つけて、対応するカッコを探していく。
2:正規表現で外側のカッコの中から、式を抜き取ると同時に、適当な重複しない名前を置いておく(置換する)。
3:その際、優先順位は左の開きカッコから順番とする。
4:抜き取ったカッコの中身は抜き取った順が狂わないようにハッシュに入れていく。

5:最後に抜き取った順から、実際の式を計算する。
6:計算が終了するたびに、置いてきた名前と式の結果を置き換えていく。
7:全部終わったら完了。

って手順は変ですか?

265デフォルトの名無しさん:2006/06/15(木) 10:39:59
>>264
evalじゃだめですか(´д`;)?
括弧による優先順位がある場合、
普通は再帰を使った解析をします。
ということでevalじゃだめですか(´д`;)?
266デフォルトの名無しさん:2006/06/15(木) 11:48:42
MVCフレームワークの無意味な乱立具合からも
PHPはクソのクソまみれだと確信できる
というかフレームワークいくつもいらないだろ?
その点Perlはホリエさんの遺品があるからばっちぐー
267デフォルトの名無しさん:2006/06/15(木) 12:56:32
逆ポーランド記法最強
268デフォルトの名無しさん:2006/06/15(木) 13:06:53
>>264
そういえば式の解析は Perl 4 のラクダ本に載ってたなあ。
でもそれはたしか再帰使ったりして散々解説したあとで最後に
全部捨てて
print eval $_,"\n";
の1行にして終わっていた。w
(これはLarry Wall がウケ狙いで書いてたんじゃないかと思う)。

まあ、そういう計算式の解析については再帰使うのが定番なので
普通に再帰でやればいいんじゃないだろうか。Perl なら文字列の
扱いが楽に書けるのでC言語とかとはまた違った分かり易い形で
書けるかも知れない。
269デフォルトの名無しさん:2006/06/15(木) 13:15:27
evalをホイホイ使うとwhile (1)入れる馬鹿が必ず湧くからなぁ。
270デフォルトの名無しさん:2006/06/15(木) 13:49:13
汚染チェックどうぞ。馬鹿はお前。
271デフォルトの名無しさん:2006/06/15(木) 13:53:53
普通じゃないと思うけれど、こういうのもありかな
sub calcflat { eval shift } # 括弧の無い式の計算

my $exp = '((100 + 200) / 100) + (50 / 10)';
1 while $exp =~ s{\(([^()]*)\)}{ calcflat $1 }ge;
print calcflat($exp);
272デフォルトの名無しさん:2006/06/15(木) 15:25:09
open関数についての質問です。
入出力記号について調べていたらこんな表を目にしました。
┏━━┯━━┯━━┯━━┯━━┯━━┓
┃    │読取│書込│追加│作成│上書┃
┠──┼──┼──┼──┼──┼──┨
┃ < . │ ○ │ × │ × │ × │ × ┃
┠──┼──┼──┼──┼──┼──┨
┃ > . │ × │ ○ │ × │ ○ │ ○ ┃
┠──┼──┼──┼──┼──┼──┨
┃ >> │ × │ ○ │ ○ │ ○ │ × ┃
┠──┼──┼──┼──┼──┼──┨
┃ +< │ ○ │ ○ │ × │ × │ × ┃
┠──┼──┼──┼──┼──┼──┨
┃ +> │ ○ │ ○ │ × │ ○ │ ○ ┃
┠──┼──┼──┼──┼──┼──┨
┃.+>> │ ○ │ ○ │ ○ │ ○ │ × ┃
┗━━┷━━┷━━┷━━┷━━┷━━┛
これを見る限りでは、テキストファイルの読み込みと書き込みを行う時は
いつも+>を使えば済むと思いました。
<と>を使い分ける必要はあるのでしょうか?
273デフォルトの名無しさん:2006/06/15(木) 15:33:39
>>272
その「上書」と言うのは、ファイルを作り直す。
つまり、元のファイルの中身が消える、と言う意味。
だから+>は読み取りには使えない。
274デフォルトの名無しさん:2006/06/15(木) 15:35:32
全て +> にすると書いちゃいけないファイルに書くとか、書く
だけで読んでも意味のないファイルから読むというような間違った
コードを書いてしまった場合にエラーが出ないのでそのバグの
発見が遅れる。
275264:2006/06/15(木) 16:08:20
「evalの話じゃない」って書いたのに。。。。。

まぁ、短い記述しか読まないと思うのでうまいこと綺麗に見えるように工夫しながら書いてみます。
ありですた。
276デフォルトの名無しさん:2006/06/15(木) 16:25:24
>>271のでいいんじゃないの?
eval部分は括弧ないんだから、自前のルーチンでも何でもいいじゃない。
277272:2006/06/15(木) 16:27:53
>>273>>274
どうもです。目的にあわせて使い分けることにします。
もっとよく実験してみます。
278デフォルトの名無しさん:2006/06/15(木) 16:31:42
別に読み込む記述はperlじゃないし、
例えperlだったとしても外部から指定された記述をevalするわけありません。
それを一言にまとめると「evalの話じゃない」ってなります。

一応動作する記述は書けたんであとは綺麗になるように書き直します。
279デフォルトの名無しさん:2006/06/15(木) 16:37:23
あ、すんません、意味を取り違えました。
ちゃんと271さんのも試してみてます。

なんかやってるうちに綺麗にかけそうな気がしてきたんで、とにかくありですた。
280デフォルトの名無しさん:2006/06/16(金) 00:10:11
自分の伝達能力の低さを他人のせいにするとは。性格悪いね。
281デフォルトの名無しさん:2006/06/16(金) 01:32:18
「構文解析をしたい」って言えば一言で終わったのに。

まぁそういう風に質問できる奴なら、自分で CPAN のライブラリでも見付けるか。
282デフォルトの名無しさん:2006/06/16(金) 01:46:20
宿題で↓が出されました。まったくできません(ノ∀;)
親切な方教えてください。

【辞書ファイル(dic.txt)】
that あれ
is です
my 私の
book 本
you あなた
have 持っている

【文書ファイル(text.txt)】
That is MY book .
You have a book .

ex9.pl:辞書ファイルと文書ファイルを読み込んで翻訳するプログラム
exA.pl:日本語の順番(動詞を最後)に表示するプログラム(辞書ファイル作り直し可)
ex8.pl:文書ファイルにI have this book .を追加。


283デフォルトの名無しさん:2006/06/16(金) 01:49:15
>>282
できませんじゃなくて、まったく考えてもいないのでは。
284デフォルトの名無しさん:2006/06/16(金) 02:07:11
>>282
ex9
辞書を読み込んでハッシュに。
そのハッシュを使って文書ファイルを置換でOK。
(辞書にない単語は空文字列で置き換え…か?)
exA
辞書に品詞情報を追加
ex9と同様に置換したあと、品詞情報で動詞なのを最後に持ってくるでOK。
ex8
意味わかんね

これでできなきゃその授業はあきらめたほうがいいかな。
つーか、この授業なに?
285デフォルトの名無しさん:2006/06/16(金) 08:15:48 BE:35376522-#
こっち池

Perlでリクに答えるスクリプトを作るスレ
http://pc8.2ch.net/test/read.cgi/tech/1086143976/
286デフォルトの名無しさん:2006/06/16(金) 10:26:07
宿題だした先生がここ見たらどう思うだろうね。
287デフォルトの名無しさん:2006/06/16(金) 10:33:56
こういうところで他人をあごで使ってたやすく答えを得る
力が本当に試されている部分だと思うよ
288デフォルトの名無しさん:2006/06/16(金) 10:41:54
>>287
そう、自分でコードを書くなんてバカのやること。
最近は、どうやって人を騙してタダで仕事をさせるかが問われている。
Web2.0っていうやつだな。
289デフォルトの名無しさん:2006/06/16(金) 10:52:51 BE:265320465-#
質問文に『〜ここの人には難しいかもしれませんが〜』とか入れとくと簡単に答えてくれる
290デフォルトの名無しさん:2006/06/16(金) 11:23:56
ex9.pl
>>282
俺もperl勉強中なんで考えてみた
ex9.pl---
#!/usr/bin/perl
use warnings;
use strict;

open my $fh, '<', 'dic.txt' or die "$!";
my %word_list = map { tr/\n/ /;split / /; } do { local $/;<$fh> };
#print %word_list;
open $fh, '<', 'text.txt' or die "$!";
my @target_list = map { tr/\n/ /;s/\./ ./g;split / /; } do { local $/;<$fh> };
foreach (@target_list) { print "$_\n";if(defined($word_list{$_})) { $_ = $word_list{$_}; } }
print "@target_list";

dic.txt---
am です
I 私は
fack ファック
you あなた
are です
pussy プッシー

text.txt---
I am fack.
you are pussy.

結果:
私は です ファック .
あなたは です プッシー .
291デフォルトの名無しさん:2006/06/16(金) 11:40:53
あ、最後の所に
s/\./ ./g for @target_list;
s/^ //g for @target_list;
追加です
292デフォルトの名無しさん:2006/06/16(金) 11:43:44
あ、ちがった
s/^ //m for @target_list;
だった
293デフォルトの名無しさん:2006/06/16(金) 11:51:28
あ、もうだめぽ
294デフォルトの名無しさん:2006/06/16(金) 11:52:55
use warnings;
use strict;

open my $fh, '<', 'dic.txt' or die "$!";
my %word_list = map { tr/\n/ /;split / / } do { local $/;<$fh> };
open $fh, '<', 'text.txt' or die "$!";
my @target_list = map { tr/\n/ /;s/\./ ./g;split / / } do { local $/;<$fh> };
foreach (@target_list) { if(defined($word_list{$_})) { $_ = $word_list{$_}; } }
s/\./.\n/g for @target_list;
my $result = join '', @target_list;

print "$result\n";

やっとできたぽ
295デフォルトの名無しさん:2006/06/16(金) 11:53:52
この調子で他の2問も解いてやるぽ
296デフォルトの名無しさん:2006/06/16(金) 12:10:12
ex8.pl---
#!/usr/local/bin/perl
use warnings;
use strict;

open my $fh, '>>', 'text.txt' or die "$!";
print $fh 'I have this book.';

やったぽ問い3も解けたぽ
297デフォルトの名無しさん:2006/06/16(金) 12:55:07
exA.pl---
use warnings;use strict;
my @verb_list;my %word_list;my @result;
open my $fh, '<', 'dic.txt' or die "$!";
my @word_list = <$fh>;
foreach (@word_list) {
my @a = split;
foreach (@a) {
if (s/\[v\]([^ ].*)/$1/) { push @verb_list, $1; }
}
$word_list{$a[0]} = $a[1];
}
open $fh, '<', 'text.txt' or die "$!";
my @target_list = <$fh>;
foreach my $verb (@target_list) {
$verb =~ s/\.$/ ./;
foreach my $verb2 (@verb_list) {
if ($verb =~ /$verb2/) {
$verb =~ s/(.*)($verb2)(.*)(\.)/$1$3$2 $4/g;
}
}
my @a = split / /, $verb;
foreach (@a) {
if (defined($word_list{$_})) {
push @result, $word_list{$_};
}
else
{push @result, $_;}
}
}
foreach (@result) { print ;}
やったぽできたぽ
298デフォルトの名無しさん:2006/06/16(金) 12:57:24
dic.txt---
[v]am です
I 私は
you あなたは
[v]are です
fack ファック
pussy プッシー

text.txt---
I am fack.
you are pussy.

結果:
私はファックです.
あなたはプッシーです.
299デフォルトの名無しさん:2006/06/16(金) 13:52:06
私はプッシーです
300デフォルトの名無しさん:2006/06/16(金) 14:08:17
ageてる奴の書込みは見る必要がない事に気がついた
この書込みも同類だろうからあげとこうか
301デフォルトの名無しさん:2006/06/16(金) 14:59:52 BE:353760858-#
お前なんとなくuse warnings; use strict;付けとるだけちゃうんかと
302デフォルトの名無しさん:2006/06/16(金) 15:48:02
あなたもわたしもプッシー
プッシー
303デフォルトの名無しさん:2006/06/16(金) 17:06:24
このソースを教授に提出したなら、
もう来年から教授は授業にperl使わないだろうな
304デフォルトの名無しさん:2006/06/16(金) 17:07:10
ex9.pl & exA.pl
短かめを狙ってみた。
#!/usr/bin/env perl -w
use strict ;
my %ha = split /¥s+/, do { local( @ARGV, $/ ) = 'dic.txt'; <> } ;
map { chomp; chop if /¥.$/; s/¥ba¥b/ /;
my @ou = map{ $ha{ lc $_} ? $ha{ lc $_ } : do { die } } split /¥s+/, $_ ;
# exA.pl としてだったら下の行の # を外す。
# push @ou, splice @ou, 1, 1 ;
print join ' ', @ou ; print "¥n" ;
} do { local @ARGV = 'text.txt'; <> } ;

これ、このままコピペして宿題として提出したら先生の反応は面白いかも。
305デフォルトの名無しさん:2006/06/16(金) 18:22:52
俺ならこうするな

open DIC, '<dic.txt' or die "$!";
open TEXT, '<text.txt' or die "$!";
my $DIC = <DIC>;
my $TEXT = <TEXT>;
close DIC;
close TEXT;
my %DICK = /\s/, $DIC;
while ( my ($key, $value ) = each %DICK ) {
eval"$TEXT =~ s/$key/$value/mg";
}
print "Ilovemankonoana\n";
306デフォルトの名無しさん:2006/06/16(金) 18:24:18
my %DICK = split /\s/, $DIC;
だな
307デフォルトの名無しさん:2006/06/16(金) 19:43:31
少し以前から、自分はプッシーなのでは無いかと薄々感づいていました。
308デフォルトの名無しさん:2006/06/16(金) 19:51:15
ワシもワシも
309282:2006/06/16(金) 21:20:43
ありがとうございますm(_ _)m
このまま提出します!
310デフォルトの名無しさん:2006/06/16(金) 21:27:46 BE:35376522-#
ちょw
311デフォルトの名無しさん:2006/06/16(金) 21:46:39
282の先生 「う〜む、ずいぶんスパゲチィなコードだなぁ。」

282 「教授、そこがperlの魅力なんですよ!頭の中にあるもやもやした
形にならない思考をコードを書きながら具現化できる、こんなことができるのは
perlぐらいですよ!」

教授 「まぁよくわからんがとりあえず実行してみて確認してみるか」

#perl ex9.pl
あなたはプッシーです.
312デフォルトの名無しさん:2006/06/16(金) 21:56:52
直後教授が発行したSQL

UPDATE SEISEKIHYO
  SET HYOKA = '0',
  SET RIYU = '私は断じてPUSSYなどではない'

ヒント:WHERE条件を設定し忘れている
313デフォルトの名無しさん:2006/06/16(金) 23:19:44
実力にそわないもの先生に提出したらバレるんちゃうか普通
314デフォルトの名無しさん:2006/06/16(金) 23:57:49
GUI::Loft使ってみたんだけど、Richeditのフォントサイズとフォントってどうやって変えるのか知ってる?
315デフォルトの名無しさん:2006/06/17(土) 22:52:02
ほしゅ
316314:2006/06/17(土) 23:54:03
結局、Loftで作成したものを変更というのは諦めて、
->AddRichEditして、そこでフォント変更するようにした。
317デフォルトの名無しさん:2006/06/18(日) 17:06:41
スクリプト内で「use encoding」を記述したところ、
下位ディレクトリにある、日本語を含むテキストファイルをOPENできませんでした。
スクリプトと同じディレクトリにあるファイルはOPENすることができます。
かれこれ2、3時間ハマってます…。
対処法をご存知の方がいらっしゃいましたらご享受願えませんか?
318デフォルトの名無しさん:2006/06/18(日) 18:17:12
せめてopenに失敗したあとの$!ぐらい晒せよ
319デフォルトの名無しさん:2006/06/18(日) 18:42:58
>>318
失礼しました。
メッセージ内容は以下の通りです。
「No such file or directory at EditEnquete.pl line 35.」
ちなみにエラー箇所のソースは以下の通りです。
「open (IN, "<:encoding(jis)", "./email/$file") or die $!」
日本語を含まないファイル名(例:aaa.txt)では問題なくOPENできます。
メールファイル(拡張子.eml)をそのまま入力にしていますので、
エンコード指定はJISとしております。
色々試してはいるんですが中々うまくいきません…。
320デフォルトの名無しさん:2006/06/18(日) 19:09:20
>>319
日本語のファイル名でだめなときは、たぶんファイル名の文字コードがお前のシステムが
期待するものと合っていない。

ファイル名をopenに渡す前に適切な文字コードにencodeすればいいと思われる。
321デフォルトの名無しさん:2006/06/18(日) 19:46:50
>>320
文字コードcp932を使用していることがネックになっているらしいと判明しました。
※対処法までは調べ切れませんでしたが…
もう少し頑張ってみるつもりですが、
最悪 前処理としてrenameすることも検討してます。
回答ありがとうございました。
322デフォルトの名無しさん:2006/06/18(日) 22:14:55
323デフォルトの名無しさん:2006/06/19(月) 00:21:39
>>322

そこにある例なんだけど、encodeしたあとで再度decodeする必要ってあるんだろうか?

Windows xpでActivePerl使って試してみたんだけど、

use encoding 'cp932';
use Encode qw(encode decode);

my $f = "一覧表.txt";

my $g = encode('cp932', $f);
open my $fh, '<:encoding(cp932)', $g or die @!;

while (<$fh>) {
    print $_;
}

close $fh;

decodeしないでもファイルオープンできて、中身もちゃんと読めた。

324デフォルトの名無しさん:2006/06/19(月) 19:44:02
ディレクトリだってば
325デフォルトの名無しさん:2006/06/19(月) 21:48:18
win2000なんだけど
DBI普通に業務に使っていいよね?
日本語処理に関して致命的な欠陥とかないよね?
文字コードはcp932なら問題ないよね?
326デフォルトの名無しさん:2006/06/19(月) 23:16:38
>>325
データベースを使うのにDBIを使わない選択はないと思うが。
というかDBDによるんじゃね?
327デフォルトの名無しさん:2006/06/20(火) 01:43:34
>>321
その用途なら use encoding ではなく use open の使い所だと思うよ。
ファイル名は別途、適宜 Encode::(de|en)code して使いましょう。
328デフォルトの名無しさん:2006/06/20(火) 01:58:17
>>325
> DBI普通に業務に使っていいよね?

だめです。なぜならあなたはそれをここで訊いているからです。

それを相談できる相手が社内にいないのであれば、いずれ部署内では保守できなくなり、リプレースが行われることになります。
その時にはもう二度と Perl が選択されることはないでしょう。

> 文字コードはcp932なら問題ないよね?

安心してください。cp932 *でも* 問題なく処理できる方法があります。
329デフォルトの名無しさん:2006/06/20(火) 04:20:17
みようみまねでソース書いてる超初心者です。質問させてください。
特定のフォルダ内のテキストファイルのファイル名を配列filesに
取り込んで、ファイル名およびその内容を表示させたいと思っています。
以下のソースを書いてみたのですが、テキストファイルの中身を
表示させる部分がうまくいきません。「←A」の部分がおかしいのでは、と
思っているのですが・・・
正しい記述を教えてください。よろしくお願いします。


$mes = chdir "c:/program files/test";
@files = glob("*.txt");

foreach (@files) {
       print;
       print "\n";
}


$i=0;
do{
open ( FH , " < $files[$i].txt" ) ; #←A

@data = <FH> ;
print @data;

$i++;

}while($files[$i]!="");

close ( FH ) ;
330デフォルトの名無しさん:2006/06/20(火) 05:16:35
>>329
突っ込みどころが恐ろしいくらいに沢山あるけど、とりあえず直接的な原因はPerl以前の話だ。
> $files[$i].txt
.txtは余計だろうがゴルァ

しかし、foreachを知ってるらしいのに、何でわざわざdo-while文で$iを
インクリメントして頑張っているのやら…。もしかして、変数に入れる方法を知らない?
foreach my $scalar (@array) { $scalarをここで使う }
で、$scalarにそれぞれの要素が入る。これを省略すると$_に入る。
myは今の段階では、その{ }の中でだけ$scalarを使うと言う宣言だと思っておけば良いと思う。

以下、漏れが書くとこうなる。ご参考までに。
chdir "c:/program files/test";
my @files = glob "*.txt";

foreach my $file (@files) { print $file, "\n" }
foreach my $file (@files) {
  open my $fh, '<', $file
    or die "Can't open $file: $!\n"; # 開き損ねたらエラーメッセージを吐いて死ぬ
  
  print <$fh>; # そのまま出力するだけなら変数に入れるまでもあるまい
  # open my $fh, (ryで開いておくとスコープアウトすれば閉じられる
}
331329:2006/06/20(火) 06:03:49
>>330
ありがとうございます。
でも、実行するとエラーが出てしまいます・・・

Unrecognized character \x81 at C:\(中略)\copal277\copal.tmp line 6.

最終的には、ファイル名やファイルの中身の表示は不要で、
ファイルの中身を用いた計算結果のみ表示させようと思っています。
332デフォルトの名無しさん:2006/06/20(火) 06:15:10
どう見てもインデントの全角スペースをタブに戻してません。本当に(略
333329:2006/06/20(火) 06:26:55
>>330
>>332
成功しました〜。
当方、Excelマクロをほんのちょっとかじったことがあるくらいで、perlは昨日勉強始めたばかりですw
どうみても無謀です。もうね、俺、本当にアボガド。
教えていただいたソースの内容、ネットで検索しながら勉強させていただきます。

ありがとうございましたm(_ _)m
334デフォルトの名無しさん:2006/06/20(火) 10:02:22
>>333
Perlは比較的簡単だから、むぼーでもないが、
全角スペースぐらい視覚的にわかるエディタでも使いなさい。
335デフォルトの名無しさん:2006/06/20(火) 14:16:03
Net::SMTPを使用しているのですが、
$smtp = Net::SMTP->new("yahoo.co.jp");
などとしても自動的にMXレコードから引っ張ってきてくれません。
モジュール等は使わずに
MXレコードのIPアドレスを取得する方法等、ありませんでしょうか。
336デフォルトの名無しさん:2006/06/20(火) 14:17:23
あんま関係ないけど、始めたばっかの時は汚い記述書かないように注意してね。

Perlの敷居が低いと言われるのは汚い記述が可能だからなんだけど、
普通汚い記述書かないし、綺麗な記述かこうとすると、初心者には他の言語より敷居が高いですぜ。
337デフォルトの名無しさん:2006/06/20(火) 14:23:42
>>335
コンストラクタの第一引数ってhostだよね。
ドメイン渡したらMXレコード自動的に引いてくれるなんてどこに書いてある?
338デフォルトの名無しさん:2006/06/20(火) 14:28:28
>>337
書いてませんが何か?
339デフォルトの名無しさん:2006/06/20(火) 15:02:02
今度はどんなスパムが増えるのかな?w
340335:2006/06/20(火) 15:09:27
Net::DNSを使用すると簡単に出来る事は知っています
あくまで標準モジュールor組み込み関数のみで可能なのかお聞きしたかったのです。

>>337
Net::SMTPと云う名前のモジュールを名乗っているのですから、
それぐらい標準で出来て欲しいなと思いました。
341デフォルトの名無しさん:2006/06/20(火) 15:23:12
突っ込まなきゃ入ってないモジュールを使うのに
突っ込まなきゃ入ってないモジュールを使いたくないとは
これいかに。
342デフォルトの名無しさん:2006/06/20(火) 15:28:31
アホは放置しろよ。
343デフォルトの名無しさん:2006/06/20(火) 15:29:19
出来合いのモジュールなんか使わなくてもたいていのことは自分で一から書けばできますよ。
ガンバレ。

時間の無駄だけどな。
344デフォルトの名無しさん:2006/06/20(火) 15:29:45
>>341
Net::SMTPは標準モジュールですが、何か?
345335:2006/06/20(火) 15:31:03
Socket使ってフルスクラッチで書くしかありませんか。
後出来たら無駄な煽りはやめて欲しいですね。
分からないタコは黙ってて下さい(笑)
346デフォルトの名無しさん:2006/06/20(火) 15:37:27
>>344
あああ、まぢ。
気がつかない間に入ってやがる。。。。
これを入れるならNet::Telnetも入れとけってんだ。
347335 ◆V7hxvfGDVk :2006/06/20(火) 15:40:34
>>345は自分じゃないです
偽りやめてください
348デフォルトの名無しさん:2006/06/20(火) 15:52:07
>>343
ああいう馬鹿なこと聞くやつらにはむしろ自分で書かせたほうがいいと思う。
349335:2006/06/20(火) 15:56:20
おめーら全員かかってこい
350デフォルトの名無しさん:2006/06/20(火) 15:57:41 BE:35376522-#
つまんね
351デフォルトの名無しさん:2006/06/20(火) 16:26:13
はいはい、コンパクトコンパクト。
352デフォルトの名無しさん:2006/06/20(火) 16:50:13
はいはい、テクマクマヤコン テクマクマヤコン。
353デフォルトの名無しさん:2006/06/20(火) 17:02:41
1〜n個のサブディレクトリにいくつかのビットマップファイルが入っているのですが、
それらのファイルのすべての組み合わせを作りたいですが、どう作ればよいのか教えていただけないでしょうか?

例えば
dir1: file1_1.bmp, file1_2.bmp
dir2: file2_1.bmp, file2_2.bmp, file2_3.bmp
なら
file1_1.bmp + file2_1.bmp
file1_1.bmp + file2_2.bmp
file1_1.bmp + file2_3.bmp
file1_2.bmp + file2_1.bmp
file1_2.bmp + file2_2.bmp
file1_2.bmp + file2_3.bmp
という結果が欲しいのです。
宜しくお願いします。
354デフォルトの名無しさん:2006/06/20(火) 17:17:01
まあ、個々のディレクトリからファイル名を取ってくるところは省くとして

my %uniq = () ;
my @data = ( ### ファイル名一覧 ) ;
for my $id ( @data ){
for my $id2 ( @data ){
next if $id eq $id2 ;
$uniq{$id . '.' $id2} ++ if ! defined $uniq{$id . '.' . $id2} and ! defined $uniq{$id2 . '.' . $id} ;
}
}
print $_ . "¥n" for keys %uniq ;

って漢字?
355デフォルトの名無しさん:2006/06/20(火) 17:22:26
>>353
Set::CrossProduct
356353:2006/06/20(火) 17:28:51
>>354
ありがとうございます。しかしすいません、>>353の例の様に、
同じディレクトリのファイル同士の組み合わせは作りたくないのです。
説明が足らなくてすいません。
357デフォルトの名無しさん:2006/06/20(火) 17:28:55
…何でもあるなあ > CPAN
358デフォルトの名無しさん:2006/06/20(火) 17:36:43
ファイル名がディレクトリに木賃と依存するなら
( 353 の例のように file1_ file2_ ってなってるなら)
next if ( $id =~ /file(¥d+)/)[0] == ( $id2 =~ /file(¥d+)/)[0] ;
を 354 の next ~ の次の行に入れればいい。

ファイル名が違うなら…説明がめんどいので略。
# Set::CrossProduct かあ。メモメモ。
359デフォルトの名無しさん:2006/06/20(火) 18:02:49
自分で作ると意外と手間だもんなぁ。
use strict;
my @files = (
[qw(d10, d11, d12, d13)], # dir1
[qw(d20, d21)], #dir2
);
my $nCombi = 1;
for (@files) { $nCombi *= @$_ }
my @combi = (0) x @files;
my @result;
for (0..$nCombi-1)
{
my $i = 0;
push @result, [map $files[$i++][$_], @combi];
#print "@{$result[-1]}\n";
for (1..@files) { ++$combi[-$_] == @{@files[-$_]} ? $combi[-$_] = 0 : last; }
}
360デフォルトの名無しさん:2006/06/20(火) 19:07:05
>>355
ありがとうございます。こんなモジュールがあったなんて知りませんでした。
早速使ってみます。
361デフォルトの名無しさん:2006/06/20(火) 19:08:35
非再帰で書き起こせる人って尊敬するわ
sub cross_product(&@) {
my ($proc, @lol) = @_;
my $rec;
($rec = sub {
my $i = shift;
if (@lol == $i) { $proc->(@_); return }
$rec->($i + 1, @_, $_) foreach @{$lol[$i]};
})->(0);
}
cross_product { print "@_\n" } @files;
# 暇なときにはCPAN散策してるってのにまだまだ知らない便利なモジュールいっぱい
362デフォルトの名無しさん:2006/06/20(火) 19:22:15

単にちょっとした好奇心から質問なんだけど、
あるディレクトリからそれ以下の最新ディレクトリまでの全てのディレクトリを検出するの。
でも再帰は使わないの。
どうすんの?これ?

見たいので見せてください。
俺はできませんでした。

363デフォルトの名無しさん:2006/06/20(火) 19:46:18
配列に入れたり出したり
364353:2006/06/20(火) 20:04:00
できました!CrossProduct超便利ですね
ありがとうございました。

>>362
dir (or ls) をパイプ付きで open するとズルができます。
open(DIR, "dir /s /q |");
365デフォルトの名無しさん:2006/06/20(火) 20:05:04
/q じゃないや /b
366デフォルトの名無しさん:2006/06/20(火) 20:56:29
>>363
やってみたら出来た。再起よりコンパクトになった。と言うかループの中3行になった…。
なんだよこの簡単さは…。この前考えた時はすごく苦労して出来なかったのに。

>>364
パイプは使わんのでよくわからんから検索してくる。
367デフォルトの名無しさん:2006/06/20(火) 21:27:28 BE:557172779-#
コード見せてくれませんか?参考にしたいので
368デフォルトの名無しさん:2006/06/20(火) 21:44:42
なんだ。コンパクトはできないのかw
369デフォルトの名無しさん:2006/06/20(火) 21:47:53 BE:159191892-#
ぼくはばかだから
370デフォルトの名無しさん:2006/06/20(火) 21:59:06
>>367
えー、どうしようかなー
371デフォルトの名無しさん:2006/06/20(火) 22:58:48
>>370
見るだけだから。絶対何もしないから。
372デフォルトの名無しさん:2006/06/21(水) 01:01:59
my @work = ("f:");
while(@work){
 print $_ = shift @work, "\n";
 push @work, grep -d && !/^\.\.?$/, glob "$_/*";
}
ワンライナーまでもうちょっと?
373デフォルトの名無しさん:2006/06/21(水) 01:31:10 BE:106128634-#
凄い…
374デフォルトの名無しさん:2006/06/21(水) 02:12:05
printする位置を見つけたゾ!
perl -e "push @ARGV, grep -d&&!/^\.\.?$/&&print($_.$/), glob shift(@ARGV).'/*' while @ARGV" C: D:

>>373
ありがとう。 と言ったそばから(&亀レス)で悪いけど>>47のsオプションいらんからね。
375デフォルトの名無しさん:2006/06/21(水) 02:58:17
わんらいなー化オメ

printは、
perl -e "print $_,$/ and push @ARGV,grep -d && /[^\.]/,glob qq($_/*) for @ARGV" f:
perl -e "print $_,$/ and splice @ARGV,++$a,0,sort grep -d && /[^\.]/,glob qq($_/*) for @ARGV" f:

みたいな真似もある気がする。
376デフォルトの名無しさん:2006/06/21(水) 03:30:36
open(PIPE, "find @ARGV |") or die();
print while <PIPE>;
close PIPE;
377デフォルトの名無しさん:2006/06/21(水) 05:33:20
www
378デフォルトの名無しさん:2006/06/21(水) 17:00:34
アップロード掲示板にリサイズ機能を持たせたのですがリサイズがうまくいきません。
widthが1600程度ならなんとかなるのですが、2000を超えるものになるとなぜか
リサイズ後の画像が真っ暗になっています・・
コードが悪いのでしょうか・・?
当方レンタルサーバにて、ImageMagick対応とのことでしたのでネットで調べながら
ImageMagickにてリサイズを行いました

以下リサイズロジックです。
use Image::Magick;
$file = "./test.jpg";
$img_w_max = 860;
my $new_image = Image::Magick->new;
$new_image->Read("$file");
my $width = $new_image -> Get('width');
my $height = $new_image -> Get('height');
if ($width > $img_w_max) {
my $ratio = $img_w_max / $width;
my $width_new = $width * $ratio; my $height_new = $height * $ratio;
$new_image->Scale(width=>"$width_new", height=>"$height_new");
$new_image ->Write("$file");
}
print "Content-type: image/jpeg\n\n";
binmode STDOUT;
$new_image->Write('jpeg:-');
undef $new_image;
exit;
アドバイスお願いしますorz
379デフォルトの名無しさん:2006/06/21(水) 17:08:08
関係ないけど "$file" とか "$width_new" とかってダブルクォートで括るのは
単なる無駄だよ。無駄な文字列生成してる。
380デフォルトの名無しさん:2006/06/21(水) 17:28:57
>>378
縦横比変えないなら、ScaleじゃなくてTransform使ったら?
比率の計算も要らないし。
何故黒くなるのかは分からないが
381デフォルトの名無しさん:2006/06/21(水) 23:53:33
暇だったら、お勧めのデバッグ用モジュール教えれ。
俺っちは今んとこ Smart::Comments

汎用性のあるお勧め CPAN モジュールでも可。
382デフォルトの名無しさん:2006/06/22(木) 00:16:46
デバッグ用じゃないけど、地味な所で Config::Simple
383デフォルトの名無しさん:2006/06/22(木) 00:28:17
そっち系だと AppConfig
ま、惰性で使ってんだけどさ
384デフォルトの名無しさん:2006/06/22(木) 00:30:22
汎用性ってのは言語拡張的なものでも良いのん?
まだ使い込んでないけれど注目してるやつで、Contextual::Return
385381:2006/06/22(木) 00:41:12
なんでも wellcome っす。
Contextual::Return 便利そうだな。メモめも
386デフォルトの名無しさん:2006/06/22(木) 00:52:12
Inline::C
#Inline::rubyってうちの環境だと動かん。まあ、興味だけだからどうでもいいんだが…
387デフォルトの名無しさん:2006/06/22(木) 01:26:50
>>386
Inline::Rubyは2002年のだから、もしかして仕様変わっちゃってるんじゃないか?
そういや最近WebProg板のPerlモジュールスレでInline::Rubyと同等のことをやってる人を見たな
http://pc8.2ch.net/test/read.cgi/php/997829243/879-
バージョン番号色々変えてみたら0.10まであるみたい。
388デフォルトの名無しさん:2006/06/22(木) 01:46:32
>>387
thx.
頭の片隅に入れとこ
つーかほかの紹介モジュールの方が興味深かったりw
389デフォルトの名無しさん:2006/06/22(木) 02:41:00
あんまり面白いの紹介されてなかったorz...
寝よ...
390デフォルトの名無しさん:2006/06/22(木) 03:31:35
Menchmark
391デフォルトの名無しさん:2006/06/22(木) 14:12:00
MFPMでぐぐった方が良いのでは
392デフォルトの名無しさん:2006/06/22(木) 17:16:10
能動的に探すんだったら MFPM でもいいかも知らんが、情報少な杉。
だったら google した方がよいとおも。
393デフォルトの名無しさん:2006/06/22(木) 17:50:52
winでperlでmysql5なんだが
mysqlバージョン4.1以降は日本語処理がややこしくなって
DBI->connect時にmysql側の設定ファイルを読み込むよう
指定しなくちゃいけないみたいで
以下のようにやってみたんだけど
Incorrect database name '/program files/mysql/mysql server 5.0/my.ini'
とエラーになってしまう

use DBI;

eval {
my $dbh = DBI->connect('dbi:mysql:test,hostname=localhost;mysql_read_default_file=C:/Program Files/MySQL/MySQL Server 5.0/my.ini;

}

多分ファイルパスに含まれる「:」やスペースがまずいとおもうんだkど
どうすればいいですか?
394デフォルトの名無しさん:2006/06/22(木) 18:03:55
perldocするときエンターキーで一行ずつしか読み方知らないんだけど
一画面ずつとかする方法はないの?
395デフォルトの名無しさん:2006/06/22(木) 18:05:54
スペースは駄目なん?
PageUpとかPageDownとか
396デフォルトの名無しさん:2006/06/22(木) 18:26:54
perldocは適当なページャを呼んでるだけだから何が呼ばれてるかわからないと
なんともアドバイスのしようがないと思われる。
397デフォルトの名無しさん:2006/06/22(木) 18:30:48
スペースでうまくいった・・・
あれ?なんでだろ?一番最初に試したはずなのに
どうもありがとうございました
398デフォルトの名無しさん:2006/06/22(木) 20:12:51
単体テストのモジュールで、お勧めを教えてください。
399デフォルトの名無しさん:2006/06/22(木) 23:05:41
>>393
クォートで括ってみれば?

それでも駄目ならprogra~1を使うとかスペースを含まないディレクトリにハードリンクを作るとか。

……あれ、testの後ろコンマに見えるけど、いいんだっけ?
database=test;とかにしてみたらどうですかね。
関係ないかもしれないけど気になった。

#ちゃんとドキュメント読めって話ではある。
#たぶん書いてるでしょ。
400393:2006/06/23(金) 03:21:53
おまえ天才!!!
dbi:mysql:test,hostname=localhost;mysql_read_default_file=C:/Program Files/MySQL/MySQL Server 5.0/my.ini
この記述からmysql_read_以降を取り去って試してみたら
問題なくテーブルの操作等行えた
DBD::mysqlのperldoc読んでもdbi:mysql:test,hostname...
みたいなカンマを使った記述はなかった
どこでこんなの覚えたのやら・・・

で、最初のやつをカンマをセミコロンに直すと別にクォートしなくても通った!
さんくす!!!

しょうもないバッドノウハウ見つけちまったい

401デフォルトの名無しさん:2006/06/23(金) 09:18:03
$a = "9z"; print $++a, "\n";

9 -> 0, z -> a とのことなのでこの結果は 10a になると思ったのですが 10 になります。
なぜでしょう?
402デフォルトの名無しさん:2006/06/23(金) 09:35:56
うちのcygwinだと、0だった。
403デフォルトの名無しさん:2006/06/23(金) 09:41:46
>401
$++a が ++$a だとして、

<q cite="http://search.cpan.org/~nwclark/perl-5.8.8/pod/perlop.pod#Auto-increment_and_Auto-decrement______">
matches the pattern /^[a-zA-Z]*[0-9]*\z/
</q>

"9z" はマッチしないので、文字列を数値コンテキストで評価した際の
通常の変換 (先頭から数値っぽいところだけを使う) で 9 として扱われる。
それをインクリメントして 10 。
404デフォルトの名無しさん:2006/06/23(金) 09:49:38
>>401
perlopには以下のように書いてある。

The auto-increment operator has a little extra builtin magic to it. If
you increment a variable that is numeric, or that has ever been used in
a numeric context, you get a normal increment. If, however, the vari-
able has been used in only string contexts since it was set, and has a
value that is not the empty string and matches the pattern
"/^[a-zA-Z]*[0-9]*\z/", the increment is done as a string, preserving
each character within its range, with carry:

'9z'は/^[a-zA-Z]*[0-9]*\z/にはマッチしないので普通に数値として解釈される
はずで、数ではじまって後ろに余計なものがついた文字列は余計なものを取り
除いて扱われる(この場合は9)のだから10であってると思われる。

cygwinで0になるのはわかんね。
405デフォルトの名無しさん:2006/06/23(金) 09:54:11
v5.8.7 built for cygwin-thread-multi-64int で10になったが
$++a のまま実行したんじゃないのか
406デフォルトの名無しさん:2006/06/23(金) 09:56:52
>>404
> cygwinで0になるのはわかんね。

$++a == $+ + a
407デフォルトの名無しさん:2006/06/23(金) 10:20:24
ほんとだ。無意識に++$aに補正してたよ...
408401:2006/06/23(金) 11:24:53
>>401
質問自体を間違えてました。(汗
$++a は ++$a の間違いです。

>>403 >>404 で理解できました。ありがとうございました。
409デフォルトの名無しさん:2006/06/23(金) 13:48:47
まだPerl初めて2週間なんだけど、
今月末までにHTML::Parserと、LWP::UserAgentをマスターしろと言われた…
さっぱりわからない
後1週間しか無い訳なんだけど、みんなこの短期間で出来る?初めて2週間で。
この仕事がクリア出来なかったら首が飛ぶことになってるwwwww


orz

410デフォルトの名無しさん:2006/06/23(金) 13:57:46
他の言語をマスターしてる & マークアップ言語を理解しているなら楽勝。
何もかも初めてなら、身の振り方を考えておけ。
411デフォルトの名無しさん:2006/06/23(金) 14:04:27
>>410
いや、プログラミング自体初めてで、
出来るのなんてReshackerで日本語化くらい…
身の振り方は…まだヤングなんでちょっとわからんですたい
412デフォルトの名無しさん:2006/06/23(金) 14:04:47
>>409
HTML::Parser と LWP::UserAgent ならとりあえず使えるようになるまでが
数時間で詳細まで調べてかなり使えるようになるのが一週間ぐらいじゃないか?
(人によるか。そんな掛かんないかも)

Perl 初めて2週間か。とりあえず朝も晩も電車乗ってる時もそればかり勉強
してれば何とかなるのでは? もちろん家と会社ではPCを使って延々と実習。
寝るとき以外は休まず7日間な。どうしても分からなくなったらここで聞け。
そのぐらいやればいくら何でも脳に刻み込まれるだろう。(逆に言うと、そこ
までやってもサッパリ分からないとか、そんなことまでしたくない、という
場合はもう一生辞めておけ)。
413デフォルトの名無しさん:2006/06/23(金) 14:10:06
こんなところで下らん質問している時点で、お先真っ暗。
414デフォルトの名無しさん:2006/06/23(金) 14:15:44
>>412
一週間ですか…もうどこから初めて良いのかわからなくて…
>>413の言う通りお先真っ暗ですよw

会社で勉強だけをするのは無理な状況なんで、深夜に勉強してる。
とりあえず、一週間死ぬ気で勉強してみるよ!!
ありがとうござます
死ぬ気で頑張れば出来る事がわかっただけで、励みになりました。
超ありがとう
415デフォルトの名無しさん:2006/06/23(金) 15:11:29
質問します

下記のようなファイルをまとめて削除したいのですが、
/var/www/cgi-bin/alog/logs/*300.cgi

perlの unlinkを使用して下記のようにいったん、ファイル名をワークに入れて
削除しようとしても消えません。原因が分からず困っていますが、お願いします。


$w_delf = $logdir.'*'.$mon_pre.'00'.'.cgi';
#-----------------------
#$logdirには/var/www/cgi-bin/alog/logs/が格納
#$mon_preには3が格納されている
#------------------------
unlink ($w_delf);
416デフォルトの名無しさん:2006/06/23(金) 15:26:53
unlink <{$w_delf}>;
unlink <${w_delf}>;
どっちでもいけた。

unlink <$w_delf>;
これはダメだった。
417デフォルトの名無しさん:2006/06/23(金) 15:36:38
LWP::UserAgentは、エロサイトから画像をダウンするスクリプト作って覚えた。

エロヂカラ偉大。
418デフォルトの名無しさん:2006/06/23(金) 15:44:03
>>416
ありがとうございます。

試してみます。m(_ _)m
419デフォルトの名無しさん:2006/06/23(金) 15:48:29
仕事で、勉強の時間をほぼ1ヶ月与えられてる訳だから、優しい会社だよね。
俺の場合は、海外アプリの7割書き換えが仕事で、納期は入社して4日後だった。
プログラムできなかったら死んでたと思う。
420デフォルトの名無しさん:2006/06/23(金) 18:02:12
できなかったらそもそも入社できなかったんじゃないの
421デフォルトの名無しさん:2006/06/23(金) 19:06:56
windowsのcmd.exeでワンライナーがくそ使いにくいのだけれど
日本が使えるまともなシェルを別に使ってる人いますかね?
422デフォルトの名無しさん:2006/06/23(金) 19:06:57
>>417
低俗は力なり。
423デフォルトの名無しさん:2006/06/23(金) 19:45:52
>>421
NYACUS使ってる、けどワンライナーはあまり書かないな。
424デフォルトの名無しさん:2006/06/23(金) 20:52:25
Socketモジュールを使って2chのsubject.txtをGETしようとしているのですが、
内容を見るために
while (<SOCKET>){
print $_;
}
を書き加えると動作が途中で止まってしまいます。
コードは以下のとおりです。ActivePerl5.8.8です。ほかのサイトも試してみましたが同じような結果になります。
use Socket;
$server="news20.2ch.net";
$iaddr=inet_aton($server);
$sock_addr=pack_sockaddr_in($port,$iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, $sock_addr);
select(SOCKET); $|=1; select(STDOUT);
print SOCKET "GET /news/subject.txt HTTP/1.1\n";
print SOCKET "Accept-Encoding: gzip\n";
print SOCKET "Host: $server\n";
print SOCKET "User-Agent: Monazilla\n";
print SOCKET "Connection: close\n";

while (<SOCKET>){
print $_;
}
どのようにしたら内容を見ることが出来るのでしょうか?教えてください。
425デフォルトの名無しさん:2006/06/23(金) 21:02:50
>>424
Socketなんて生で使うもんじゃあない。
LWPか、せめてIO::Socketにしとけ。話はそれからだ。
426デフォルトの名無しさん:2006/06/23(金) 21:21:23
ヒント: 設定が一つ足りない。
427デフォルトの名無しさん:2006/06/23(金) 21:38:23
print SOCKET "Connection: close\n\n";
これじゃないの?
428デフォルトの名無しさん:2006/06/23(金) 21:38:45
>>424
そうなって当たり前。とりあえず、RFC 2616 を読め。
英文が嫌なら、和訳されている
ttp://www5b.biglobe.ne.jp/~type-aya/rfc/rfc2616j.txt
あたりで充分。
429デフォルトの名無しさん:2006/06/23(金) 22:16:06
2点のミスと、1点のヌカリがあるわけだな。
430デフォルトの名無しさん:2006/06/23(金) 22:33:52 BE:557172397-#
次はWindowsサーバでコケそうだな
431デフォルトの名無しさん:2006/06/24(土) 06:03:47
七転び六起きに一票
432デフォルトの名無しさん:2006/06/24(土) 10:45:46
>>427
ありがとうございます。まさにそれでした。とーく2ちゃんねるからコピーしたものだったので見逃していました。
>>428
読んでみます。
>>429
とりあえず\nを追加したら見れるようになったのですがほかの2点のミスとは何でしょうか?
欠陥のあるプログラムにはしたくないので教えてください。
433デフォルトの名無しさん:2006/06/24(土) 15:38:22
python の os.path.commonprefix() みたいなことができるモジュールはperlにありますか?
文字列の配列を渡すと、それらの文字列の共通するプレフィクスを調べてくれるような関数です。
434デフォルトの名無しさん:2006/06/24(土) 16:15:02
>>417
おまえは俺か

001.jpg,002.jpgって連番になってる画像を落としてたな
435433:2006/06/24(土) 17:25:31
# なさそうなので作ってみましたが、最適化できそうな部分や、
# もっといい方法あったら教えてください。
# 文字列スプリットして一文字ずつ調べるのって無駄?

sub get_common_prefix{

  return $_[0] if @_ == 1;

  my $min_len = length $_[0];
  my @a = ();

  foreach (@_){
    push @a, [split "", $_];
    my $len = length $_;
    $min_len = $len if $len < $min_len;
  }

  my $first = shift @a;
  my $r = "";

  for(my $i = 0; $i < $min_len; $i++){
    my $c = $first->[$i];
    foreach(@a){
      return $r unless $c eq $_->[$i];
    }
    $r .= $c;
  }
  return $r;
}
436デフォルトの名無しさん:2006/06/24(土) 18:30:52
教えてください。
コマンドラインオプション-lについてです。
このオプションは-nや-pと一緒に使うと、ループブロックの先頭で
chompをするという機能があるということなので、

perl -lpe "" xxx.txt

とコマンドを実行してみましたが、普通にxxx.txtの内容が出力されました。
特に改行文字が削除されているようでもなく、ファイルの内容がそのままという
感じです。
何ぜに改行文字が消えないのでしょうか?
437デフォルトの名無しさん:2006/06/24(土) 19:44:28
>>436
-lは同時に$\を設定するので、元通りになったように見えているだけ。
マニュアルよく嫁。
438デフォルトの名無しさん:2006/06/24(土) 20:30:12
>>435
Python全然知らないけど、それだと意図した動作をしないような気がするぞ
("abc", "ab", "cde");
を渡すと、"ab" が返ってきそうだ。
"" にならなきゃいけないんだよね。
439デフォルトの名無しさん:2006/06/24(土) 20:56:39
>>438
それはちゃんと "" がかえります。

後半のfor に処理が到達した時点で。

$first = ['a', 'b', 'c']
@a = ( ['a', 'b'], ['c', 'd', 'e'] )

となってて、$iが現在注目するindex;
一番内側のforeach で、$c ( = $first->[$i] )と、@aがもつ配列群それぞれの同じindexの文字を比較してます。
unless $c eq $a->[0][0]; を比較した後、チェックするのは、
unless $c eq $a->[0][1]; ではなく $a->[1][0]; です。

「 全ての配列の同じindexの文字が、全部同じ場合にのみ 」 その文字はプレフィクスとして確定。
一つでも異なれば必ず$cとの比較で違いが出るので、そこで終了riturnnです。

挙げてもらった例だと、 $firstの最初の'a' と、3つめの最初の'c'を比較した時点で不一致になるので、
一文字も確定とならずに ""となります。
440デフォルトの名無しさん:2006/06/24(土) 20:57:04
>>438
ab が返ってくるみたい。
os.path.commonprefix は知らないんだけど、単純に前方から一致する文字列を
返せばいいのかな。それとも / や \ 等のデリミタも考慮するのかな。
441440:2006/06/24(土) 20:59:24
おっと、ミス。
s/ab が返ってくるみたい/"" が返ってくるみたい/
442デフォルトの名無しさん:2006/06/24(土) 21:09:24
>>440
単純に前方の一致部分です。
文字列の最初の数文字だけ比較すれば済む($min_lenで高々何文字かは絞られる)ので、
文字列を全部 split するのは無駄な気がしてます。

splitせずに一文字ずつ見ていければいいのですが、やりかたがわからない。
443デフォルトの名無しさん:2006/06/24(土) 21:14:03
substrとかでがんばるしか
444デフォルトの名無しさん:2006/06/24(土) 23:28:15
sub get_common_prefix {
&npbs;&npbs;my $buf = join "\n", @_;
&npbs;&npbs;my $repeat = scalar(@_) - 1;
&npbs;&npbs;$buf =~ m{(.*)(?:.*?\n\1){$repeat}};
&npbs;&npbs;$1;
}
やりすぎですか、そうですか。
445デフォルトの名無しさん:2006/06/24(土) 23:30:12
とても…読みづらいです
446デフォルトの名無しさん:2006/06/24(土) 23:30:55
うお、nbpsの綴り間違えてコピペしたorz ついでに^忘れスマソ
sub get_common_prefix {
  my $buf = join "\n", @_;
  my $repeat = scalar(@_) - 1;
  $buf =~ m{^(.*)(?:.*?\n\1){$repeat}};
  $1;
}
447デフォルトの名無しさん:2006/06/25(日) 02:01:16
>>446
揚げ足とるようでスマソ・・・・
文字列自体に改行が含まれる場合はまずいかも

例えば ("abc\nabd","zz") だと  ab を返してしまう
448デフォルトの名無しさん:2006/06/25(日) 02:49:09
素直にこんな感じで。

sub get_common_prefix {
  my $prefix = shift;
  while (length($prefix)) {
    last if (grep(!index($_,$prefix),@_) == @_);
    chop $prefix;
  }
  $prefix;
}
449デフォルトの名無しさん:2006/06/25(日) 03:23:21
>>447
あら、入ってくるのファイルパスだけだと思ってたけど、よく読んだら"文字列"なのか
450デフォルトの名無しさん:2006/06/25(日) 07:38:00
質問です。
配列の要素数に上限ってありますか?
451デフォルトの名無しさん:2006/06/25(日) 08:10:53
言語仕様的には無い。
メモリの許すまでOK。
452デフォルトの名無しさん:2006/06/25(日) 08:38:07
>>451
dクス
453デフォルトの名無しさん:2006/06/25(日) 09:41:00
俺も初めて真剣にperl勉強しようと思ったのは
大量のエロ画像の山を前にした時だったっけか
htmlからリンク抜き出して、urlを加工して、
その過程で正規表現も習得したんだっけか

で、今になってもそのときとレベルはあんまし変わっていない

ちなみにおれが始めて作ったアプリはVBでエロ画像のスライドショー

俺は、一体何のために生まれてきたんだっけ?
454デフォルトの名無しさん:2006/06/25(日) 10:51:50
エロ画像をスムーズに閲覧するために生まれてきたに決まってるだろ。
455デフォルトの名無しさん:2006/06/25(日) 13:14:48
Spreadsheet::ParseExcelについての質問です。モジュールはPPMで入手しました。

英語で記載したセルとハイパーリンクだけは抽出してくれるのですが、日本語部分が文字化けしてしまいます。
モジュール部分には、以下のように記載しています。

use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
my $oExcel = new Spreadsheet::ParseExcel;
my $oFmtJ = Spreadsheet::ParseExcel::FmtJapan->new(Code => 'euc'); #sjis、jisなどのコード

Googleなどの検索では、これで上手く言っている人が大部分でした。jperlは5.006がreqされる為、使用できません。
PerlでExcelなどいじるな、と言われそうですが、Excelユーザーが周りに多い為に、
このような手法を使うしかない次第です。モジュールに渡す文字コードの問題だと重い調べましたが、どうにも違うようです。

参考URL:
ttp://search.cpan.org/src/KWITKNR/Spreadsheet-ParseExcel-0.2603/README_Japan.htm

お判りになる方がいたら、教えてください。
456デフォルトの名無しさん:2006/06/25(日) 14:24:42
ふつーに考えればeucじゃないんじゃね?
457デフォルトの名無しさん:2006/06/25(日) 14:30:59
>>456 さん

そうですよね。モジュール正しく入れたか、セルの参照の仕方ばかり見ててうっかりしてました。

FmtJapan->new(Code => 'sjis');

で、スムーズに表示されました。何やってんだ、俺。。。
人様の時間まで使って申し訳ありません。ありがとうございました。
458デフォルトの名無しさん:2006/06/25(日) 16:18:23
>>453
お前は俺か。ちょど>>434にレスつけようとしてて
スクロールしたら453がw
459デフォルトの名無しさん:2006/06/25(日) 16:39:18
>>454
なさけねぇw
460デフォルトの名無しさん:2006/06/25(日) 17:05:09
ActivePerl v5.8.4で動作を確認したスクリプトをppでパッケージすると次のようなエラーが出て動きません

>Can't locate PerlIO.pm in @INC (@INC contains: CODE(0xce0534) .) at script/edit.pl line 210.
>BEGIN failed--compilation aborted.

何故なのでしょうか?
取り合えず

>use Tk;
>use File::Basename;
>use Encode;
>use strict;

を使っていてedit.pl line 210は

>open DATAFILE, "<:encoding($code)", $filename;

です
461デフォルトの名無しさん:2006/06/25(日) 17:26:03
ppとか知らないけど、とりあえずそのエラーでぐぐったら
use PerlIO qw(encoding);
を足せっていうのが出て来た。
462デフォルトの名無しさん:2006/06/25(日) 19:45:13
試してみると上記のエラは出なくなりましたが今度は'shiftjis'を知らんと言われます
思い立ってEncode::JPを使うと今度はppの途中でエラーが出ます

>C:\Documents and Settings\main\My Documents\perltool\Trebor_sux>echo "use Encode::JP" >test.pl
>C:\Documents and Settings\main\My Documents\perltool\Trebor_sux>perl test.pl
>C:\Documents and Settings\main\My Documents\perltool\Trebor_sux>pp test.pl
>Can't spawn "C:\Perl\bin\parl.exe": Bad file descriptor at C:\Perl\bin\pp line 372.
463デフォルトの名無しさん:2006/06/25(日) 19:53:10
foreachをネストしてみたらうまくいきませんでした。こういうのはダメなんでしょうか。
良かったらアドバイスお願いします
2つの配列の内容が同じものがあったら表示するというだけのものです

foreach (@sysList) {
$curName = $_;
foreach (@dirList) {
if ($_ == $curName) {
print "$curName:$_\n";
last;
}
}
}
464デフォルトの名無しさん:2006/06/25(日) 19:55:41
>>463
>if ($_ == $curName) {
eq の間違いでしょう
465デフォルトの名無しさん:2006/06/25(日) 19:55:57
foreach my $curName (@sysList) {
foreach (@dirList) {
if ($_ == $curName) {
print "$curName:$_\n";
last;
}
}
}
466デフォルトの名無しさん:2006/06/25(日) 19:58:18
>>463
foreach $syslist(@sysList) みたいに、配列が格納されるスカラー変数を分けたらいいんではないでしょうか?
$_ の変わりに$syslistで処理したらうまく行きませんか?
素人推測ですみません。
467463:2006/06/25(日) 22:15:37
できました!
主原因は==でした。eqにしたら直りました。
配列を格納する変数もforeachの所で書くようにしたらキレイになりました。
ありがとうございました。

foreach my $curName (@sysList) {
foreach (@dirList) {
if ($_ eq $curName) {
print "$curName:$_\n";
last;
}
}
}
468デフォルトの名無しさん:2006/06/26(月) 02:56:55
foreachじゃなくてforにしときゃいいんじゃね?
タイプするのめんどいだろうに
469デフォルトの名無しさん:2006/06/26(月) 03:11:52
っていうか、ハッシュにぶちこめよ。
470デフォルトの名無しさん:2006/06/26(月) 07:32:07
>>468
> foreachじゃなくてforにしときゃいいんじゃね?

それは書く人が選ぶ問題。
もちろん君や僕はどちらであっても問題なく読めるし、またそうでなければ Perl 使いを名乗れないけれど、
世の中には「Perl を使わなければならない Perl 使いでない人」というのが多数いて、それらの人々にとっては一般に foreach のほうが読みやすい、という側面もある。
471デフォルトの名無しさん:2006/06/26(月) 10:18:34
すみません。
if分で、$hogeの中の文字の頭3文字がテスト以外のものを認識したいのですが、
そう言う判定方法ってありますでしょうか?
472デフォルトの名無しさん:2006/06/26(月) 10:22:27
配列をいじるならforeach
; ; とか 数字..数字が入るならfor
それが俺のジャスティス。
473デフォルトの名無しさん:2006/06/26(月) 10:33:17
>>471
perlと言えば正規表現

if( !($hoge =~ m/^$hage/) ){}
474デフォルトの名無しさん:2006/06/26(月) 10:35:23
>>473
志村ー!~、!~
ついでに\Q\Eしたほうが良いかも
if ($hoge !~ m/^\Q$hage\E/) { }
475デフォルトの名無しさん:2006/06/26(月) 10:45:23
ディレクトリにある十個程度のファイルをSJISからutf8に替えたいのだけど、
だれかスクリプト持ってません?
ディレクトリ内全部変換でも、ファイル名引数わたしでもなんでもいいです。
476デフォルトの名無しさん:2006/06/26(月) 10:47:34
nkf でも使えば
477デフォルトの名無しさん:2006/06/26(月) 11:41:48
nkfかあ。やっぱそれがデフォルトなのかな。
478デフォルトの名無しさん:2006/06/26(月) 12:20:18
nkfって utf使えたっけ?
479デフォルトの名無しさん:2006/06/26(月) 12:38:19
$ nkf --help
USAGE: nkf(nkf32,wnkf,nkf2) -[flags] [in file] .. [out file for -O flag]
Flags:
b,u Output is bufferred (DEFAULT),Output is unbufferred
j,s,e,w Outout code is JIS 7 bit (DEFAULT), Shift JIS, AT&T JIS (EUC), UTF-8
J,S,E,W Input assumption is JIS 7 bit , Shift JIS, AT&T JIS (EUC), UTF-8
t no conversion
i_/o_ Output sequence to designate JIS-kanji/ASCII (DEFAULT B)
r {de/en}crypt ROT13/47
h 1 hirakana->katakana, 2 katakana->hirakana,3 both
v Show this usage. V: show version
m[BQN0] MIME decode [B:base64,Q:quoted,N:non-strict,0:no decode]
M[BQ] MIME encode [B:base64 Q:quoted]
l ISO8859-1 (Latin-1) support
f/F Folding: -f60 or -f or -f60-10 (fold margin 10) F preserve nl
Z[0-3] Convert X0208 alphabet to ASCII 1: Kankaku to space,2: 2 spaces,
3: Convert HTML Entity
X,x Assume X0201 kana in MS-Kanji, -x preserves X0201
B[0-2] Broken input 0: missing ESC,1: any X on ESC-[($]-X,2: ASCII on NL
O Output to File (DEFAULT 'nkf.out')
d,c Delete \r in line feed and \032, Add \r in line feed
I Convert non ISO-2022-JP charactor to GETA
-L[uwm] line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
long name options
--fj,--unix,--mac,--windows convert for the system
--jis,--euc,--sjis,--utf8,--utf16,--mime,--base64 convert for the code
--overwrite Overwrite original listed files by filtered result
--help,--version
Network Kanji Filter Version 2.0 (4/0401/Shinji Kono)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW, 2002-2004 Kono,Furukawa
480デフォルトの名無しさん:2006/06/26(月) 12:57:20
>>474
それだと頭の3文字以外に、
真ん中にテストってあってもひっかからないのでは?
481デフォルトの名無しさん:2006/06/26(月) 13:19:41
>>480
問題よく読め
482471:2006/06/26(月) 17:36:56
>>474
上手く動きました。
ありがとうございました。
483デフォルトの名無しさん:2006/06/27(火) 02:33:29
use threads;
use threads::shared;

my $obj :shared;
$obj = MyObject->new();

として、スレッド間でオブジェクトを共有したい場合、どうするべきですか?

Invalid value for shared scalar といわれてしまいます。
484デフォルトの名無しさん:2006/06/27(火) 09:16:09
>>483
threads::sharedのマニュアルぐらい読もうな。

The only values that can be assigned to a shared scalar are other
scalar values, or shared refs, eg

my $var : shared;
$var = 1; # ok
$var = &share([]); # ok
$var = []; # error
$var = A->new; # error
$var = &share(A->new); # ok as long as the A object is not nested
485デフォルトの名無しさん:2006/06/28(水) 07:20:33
定期的に処理を実行させたいと思い、sleep関数使ってテストしてみたのですが
例えば

print"おはよう";
sleep 10;
print"ございます";

を実行すると、10秒間何も表示されず、10秒後に”おはようございます”と
全文が表示されてしまいます。段階的に処理を行い、途中に待ち時間を
入れるようにするにはどうしたらいいんでしょうか。
486デフォルトの名無しさん:2006/06/28(水) 08:13:20
syswrite 使う?もっといい手もありそうだけど。

my $len_head = length ( my $head = 'good ' );
syswrite STDOUT, $head , $len_head ;
sleep 10 ;
print 'morning' . "¥n" ;

「 print 」はバッファに溜め込むんだよね。
487デフォルトの名無しさん:2006/06/28(水) 08:13:37
>>485
local $| = 1;
488487:2006/06/28(水) 08:19:03
>>486
ちなみに STDOUT のバッファリングは行単位なので、>>485 のケースでも sleep の前に \n を吐いてやればそのまま出るんだけどね。
489486:2006/06/28(水) 08:33:34
>488
捕捉すまん。うろ覚えで書き込むな>オレ。

# 単純に STDERR に出力するとかって手もある。
# sleep 使うんだったらメッセージ系だろうし。
490デフォルトの名無しさん:2006/06/28(水) 10:29:49
>>486-489
ありがとうございます。
早速実行してみたところ、>>486>>487さんのやり方両方とも
DOS窓で実行すると順々に表示されて行き、うまく行くのですが、テキストファイルに
出力しようとするとやはり最後にまとめて出力されてしまいます。
(最終的には、データの種類ごとに各テキストファイルに振り分けて、それぞれに定期的に
データの記入を加えていく、というふうにしたいのです。)
sleepとalarmを混ぜて方法もあるようで、以下のスクリプトでテストしてみたのですが
やはり同様に、DOS窓でのみ成功(上の2行を外して実行)、TXTファイルではうまくいきませんでした。

テキストファイルに順次表示していく方法はあるのでしょうか・・・

chdir "c:/program files/files";
open(FILE,">file2.txt")|| die "ERROR\n";

$SIG{ALRM} = sub { print FILE "alarm\n"; alarm 1 };
alarm 1;
while (1) {
print FILE "sleep\n";
sleep 5;
}
491デフォルトの名無しさん:2006/06/28(水) 10:40:51 BE:88440825-#
select(FILE)して$|=1しなはれ
492デフォルトの名無しさん:2006/06/28(水) 10:43:17
>>490
486,487のやり方はちゃんと応用すればファイルでもうまくいくはずなので、
たぶん理解しないで直して使い方を間違えているとみた。自分が直した
プログラムをさらしてもらわないとこれ以上はおれにはなんとも。
493デフォルトの名無しさん:2006/06/28(水) 14:10:00
>>488
環境依存。OSによって違うよ。
494デフォルトの名無しさん:2006/06/28(水) 17:31:55
気になったので
>sleepとalarmを混ぜて方法もあるようで、以下のスクリプトでテストしてみたのですが
$SIG{ALRM} = sub { print "alarm¥t"; alarm 1 };
alarm 1;
while (1) {
print "sleep¥t";
sleep 5;
}
-STDOUT を出力先にし、"¥n" を"¥t" に変更しただけ -
これだと望んだ挙動はしません。未だこのスレ観てたら御一考を。
495デフォルトの名無しさん:2006/06/28(水) 18:18:21
もうuse IO::Handleで
my $io = new IO::Handle;
$io->fdopen(fileno(STDOUT), 'w');
$io->print('foobar');
$io->flush();
でいいんでねぇの?
496デフォルトの名無しさん:2006/06/28(水) 20:46:44
>>493
お前正しいですね。
ともあれツッコミサンキュー。
497485:2006/06/29(木) 04:47:45
>>491-496
ありがとうございます。
とりあえず下記のとおり書き換えてみたらいい感じになりました。
一定時間後にファイル開きなおすとちゃんとその都度ファイルが
書き換わってました。
495さんのやりかたは初心者の私にはまだちょっと分からなくて・・・
申し訳ないです。
追い追い勉強しながら理解していきますです。

chdir "c:/program files/files";
open(FILE,">file2.txt")|| die "ERROR\n";

select(FILE);
$|=1;

print"Good ";
sleep 10;
print"morning\n";
sleep 10;
print"How are you?";
sleep 10;


大変助かりました。本当にありがとうございました。
498デフォルトの名無しさん:2006/06/29(木) 05:07:44
>>497
ところで、selectしっぱなしで良いのん?
{
my $oldfh = select FILE; # FILEをデフォルトにして、元のを保管
$| = 1; # バッファリングしない設定を変えて
select $oldfh; # デフォルトのハンドルを元に戻す
}
499デフォルトの名無しさん:2006/06/29(木) 09:14:06
そういう問題もあるからselect+$|よりIO::Handle使うほうがわかりやすいと思うのだがね。
500デフォルトの名無しさん:2006/06/29(木) 09:44:43
個人用メモ

# Effective Perl 60項 より
select((select(FILE), $|=1)[0]);
501デフォルトの名無しさん:2006/06/29(木) 10:51:49
>>500
個人用メモて、
ちらしの裏にでも書いておけwww
502デフォルトの名無しさん:2006/06/29(木) 10:55:37 BE:318384566-#
ポケットリファレンスのselectの項にも>>500が書いてあって感動した
503デフォルトの名無しさん:2006/06/29(木) 11:04:57
常識をわざわざここに書かれても
504デフォルトの名無しさん:2006/06/29(木) 11:49:59
正解には「常識であるべき(だが、結構知らない人間もいる)書き方」だな。
505デフォルトの名無しさん:2006/06/29(木) 12:01:00
結構知らない人間もいる。ということは、
常識ではないような気がするが、気がつかなかったことにして置こう。
506505:2006/06/29(木) 12:03:27
実は>>500のコードが何をしているのか意味がわからない俺ダルシム
$| って現在selectしているハンドルにのみ有効なの?それなら意味わかるんだけど。
507505:2006/06/29(木) 12:05:47
あっ、「常識であるべき」って書いてたのか。すまん。
508デフォルトの名無しさん:2006/06/29(木) 12:06:31
常識かどうかはともかく、>>500 は O'reilly 系のほとんどに載ってるなあ。
しかも不親切な形で。
昔、どこに print 文を挟めばいいのかちょっと悩んだ覚えがある。

>>506
リストの中にプリント文を入れる(んだと思う)。
select (( select(STDERR), $| = 1, print "." )[0] ) ;
509デフォルトの名無しさん:2006/06/29(木) 12:06:58
どう見ても >>500 のコードが素晴らしいと思えないんだけど…。
一行で分かりにくく書いただけでしょ。
510508:2006/06/29(木) 12:08:26
あ、すまん。508 のポインタは忘れて。
>$| って現在selectしているハンドルにのみ有効なの
そうだよ。
511デフォルトの名無しさん:2006/06/29(木) 12:26:23
>>509
そう思うなら>>498みたいに無駄に1個変数を用意すればいいじゃないか。
There's more than one way to do it.
512デフォルトの名無しさん:2006/06/29(木) 12:27:53
STDOUT以外にprintするときはファイルハンドルを明示するのが俺のジャスティス
513デフォルトの名無しさん:2006/06/29(木) 12:38:00
ああそう
514デフォルトの名無しさん:2006/06/29(木) 12:42:37
ようやく理解した
lispっぽいな
515505:2006/06/29(木) 13:20:08
>>510
おー、なるほど。それならば結構、実用的。
俺が const char* aho = strcpy( new char[0xBaca], "aaaa" ); //newしつつ文字列代入
を思いついたときのコードに似ているな。
0xBacaはメモリとりすぎだがな。
516デフォルトの名無しさん:2006/06/29(木) 13:46:10
関数に次のような引数を渡して受け取りたいのですが、@cvsの配列の数が
まちまちです。
どのように受け取ればよいでしょうか?

&test($filename, @cvs)

sub test($@) {
my $file = $_[1];
my @cvs = $_[2]; #これだと一行しか受け取らない
}

517デフォルトの名無しさん:2006/06/29(木) 13:48:04
sub test($@) {
my $file = shift;
my @cvs = @_;
}
518デフォルトの名無しさん:2006/06/29(木) 13:49:49
my($file, @cvs) = @_;
519デフォルトの名無しさん:2006/06/29(木) 13:53:00
>>517-518
あ、そっかぁ。
ありがとうございます。
520デフォルトの名無しさん:2006/06/29(木) 14:01:49
>>517-518
すみません、やってみたのですが、なぜか

$file に Hoge=HASH(0x99b7dg0)
@cvs に
ファイル名
@cvsの中身となってしまいます...

???
521デフォルトの名無しさん:2006/06/29(木) 14:09:46
正しいかわかりませんが、とりあえず、以下のようにして対応してみました。

my($hash, $file, @cvs) = @_;
522デフォルトの名無しさん:2006/06/29(木) 14:12:16
$hoge->mara($ga, @moe) って呼ぶのは
&mara($hoge, $ga, @moe) のように呼ぶのと似たようなもん。
523デフォルトの名無しさん:2006/06/29(木) 14:14:02
うひ〜

崖を転げ落ちてるな、このスレは。
524デフォルトの名無しさん:2006/06/29(木) 14:14:45
あー、そういうことですか。
んー、ちょっと難しい仕様ですね。

525デフォルトの名無しさん:2006/06/29(木) 14:21:24
お前が最初にこうやって呼ぶとかウソを書かなければ
適切な回答ができたのだがな。

&test($filename, @cvs)
526デフォルトの名無しさん:2006/06/29(木) 14:46:47
しかしまぁ、blessだの何だの知ってるのに
サブルーチンでの値の受け取りが分からないって…。
527デフォルトの名無しさん:2006/06/29(木) 15:01:58
my $file = $_[1];
my @cvs = $_[2];
これでまだ$_[0]があることを想像しろなんて無理。
しかもプロトタイプが$@だし。
528デフォルトの名無しさん:2006/06/29(木) 15:12:53
やっぱこれで「オブジェクト指向で書いてます」とか言っちゃうのかなぁ
529デフォルトの名無しさん:2006/06/29(木) 15:24:36
まあ、下を見てるときりがないです。
それに、下ばかり見ていると、自分もどんどん下がっていきます。

上に行くことを目指しましょう。
上に引っ張りあげることを考えましょう。
530デフォルトの名無しさん:2006/06/29(木) 18:54:27
@_@;

てかそれに、@csvはどう考えても参照渡しにすべき というかなんというか
531460:2006/06/30(金) 01:13:38
>>462は環境の問題だった様で
>>461で解決しました有難うございました

追記:'shiftjis'等を使うには明示的にuse Encode::JP;が必要なようです
532デフォルトの名無しさん:2006/06/30(金) 13:08:48
>>525-530
勉強不足ですみません。
どうしてこんなあほな質問がでるのか不思議な様子なので説明をば

perlでオブジェクトを使うのは初めてで、PHPの感覚で$obj->method(), method()でも
受渡しは、同じだろうと思っていました。

blessとかは意味はわからんのですが、Perl&CGIリファレンス本に書いてあった
のをそのまま使っています。
でも本を読んでも意味がよくわからんです。

元々オブジェクトとか考えられていなかったから、こういう仕様なのかなと
勝手に思ったのですが、どうなんでしょうか。




533デフォルトの名無しさん:2006/06/30(金) 14:45:40
そこでPerl6ですよ。
534デフォルトの名無しさん:2006/06/30(金) 15:08:26
そんないつ出来るか分からないものを挙げられてもなぁ
535デフォルトの名無しさん:2006/06/30(金) 16:17:55
ヒント:Pugs
536デフォルトの名無しさん:2006/06/30(金) 16:23:29
pugsなんて一体何人使ってるんだ…
537デフォルトの名無しさん:2006/06/30(金) 16:54:39
こういう話題になるとすぐ、perl6とかPugsとか言う人は
当然自分でもPugsでperl6してるんだよなぁ。
じゃなきゃ説得力ないんだけど。
538デフォルトの名無しさん:2006/06/30(金) 17:33:59
何で説得力を求めるのか意味不明
539デフォルトの名無しさん:2006/06/30(金) 18:24:40
PerlでOOPやりたいなら、まともに対応するPerl6を待てば?
待ちきれないなら Pugs を試してみれば?

っていう、ただの示唆じゃね
540デフォルトの名無しさん:2006/06/30(金) 18:29:32
おまえら >>532 は十中八九 php でも OOP スクリプトは書けてないで
あろう事に気づけ。
541デフォルトの名無しさん:2006/06/30(金) 18:34:03
>>532
何が言いたいかわからんが、受け渡しは同じだと思うが?
PHPってオブジェクトのメソッドである $obj->method(); を method(); って呼ぶとオブジェクト補完してくれるの?
542デフォルトの名無しさん:2006/06/30(金) 18:35:26
第一引数がオブジェクト自身になるのなんてPerlだけだろ
543デフォルトの名無しさん:2006/06/30(金) 18:47:02 BE:318384094-#
取って付けたようなオブジェクト指向だしな
544デフォルトの名無しさん:2006/06/30(金) 18:56:57
>>543
× 取って付けたようなオブジェクト指向だしな
○ 取って付けたオブジェクト指向だしな
545デフォルトの名無しさん:2006/06/30(金) 19:09:53
>>542
そんな事はない。
例えばPythonは結構なOOPLだけどメソッドの第一引数にインスタンスをとる。
546デフォルトの名無しさん:2006/06/30(金) 19:26:46
>>545
Pythonもそうなのですか。
でもたいていの言語はthisのようなキーワードを用いるか、省略してもいいという風になっていますよね。
547デフォルトの名無しさん:2006/06/30(金) 21:25:51
perl 5.8.6 で XML::RSS を使って Podcast 情報を取得しようとしていますが、
enclosure url が引っ張り出せません。
XML::RSS では出来ないようなのですが、他に enclosure url が取得できるものは
あるでしょうか。m(_ _)m
548デフォルトの名無しさん:2006/06/30(金) 21:44:40
ふとPugsを入れてみようと思い立ったんだが
make test がいつまでも終わらない…。
CPUもほとんど100%使い切ってるし、こんなもんなの?pugsって。
めちゃプロセス重い。
549デフォルトの名無しさん:2006/06/30(金) 21:55:50
俺の場合、メチャメチャ時間くったよ。
環境は OSX 。
インストールが終ったあとバイナリーパッケージみつけてへこんだw
550デフォルトの名無しさん:2006/06/30(金) 22:20:22
>>549
1時間以上かかってやっと終わった。
バイナリはあったけどコンパイルしたかったw
1万くらいテストがあるから時間がかかるという事のようで…。
セットアップからmake, make test, make installまでで3時間。長かった。

できあがったものを動かす分には、今の所、問題無し。
同じく環境はOSX。
しばらくperl6で遊んでみます。
551デフォルトの名無しさん:2006/06/30(金) 22:48:26
おそらく 548,549 は知ってるとは思うがロム専の人で興味が出た人の為に
Perl6 スレをはっとく

次世代Webプログラミング言語の大本命Perl6/Parrot
http://pc8.2ch.net/test/read.cgi/php/1065599868/
552デフォルトの名無しさん:2006/07/01(土) 01:54:02
昔Pugs入れようとおもってソース落としたら、妙にHaskellに興味を持ってしまって今はPerl6どころじゃなくなった。
553デフォルトの名無しさん:2006/07/01(土) 04:37:28
スレ違いを承知で聞かせてもらうが
関数型言語を学ぶメリットはあるのか?
たんなる「頭の良い人」向けの言語っていうだけじゃないの?
Haskellで実用的・業務的なプログラムを書けるの?
何?変数がないんだって?意味わかんないYO
554デフォルトの名無しさん:2006/07/01(土) 04:51:30
PugsってHaskell使って2ヶ月ぐらいで作られたらしいから
生産性は高いんじゃないかな 多分・・・ まあ2ヶ月ってのはAudreyだからだろうけど
555デフォルトの名無しさん:2006/07/01(土) 06:14:25
>>553
> スレ違いを承知で聞かせてもらうが
> 関数型言語を学ぶメリットはあるのか?

楽しいから学ぶ。学びたくて学びたいから学ぶのだ。
「おおなるほど!!」「これはすごい!!」「そうだったのか!!」
と驚きたいから学ぶのだ。
556デフォルトの名無しさん:2006/07/01(土) 11:30:18
>>553
発想の転換を促すには良いと思われ。
だからどの言語でも同じようにしか書けない人には意味ないかも。
(PerlでCっぽく書く人にはムカつくんだよ!)

関数型言語の中ではHaskellが一番取っ付きやすいように感じたけど、まあその辺は人それぞれだ。

557デフォルトの名無しさん:2006/07/01(土) 11:31:10
スレ違いなんだが、
まぁ、関数パラダイムが普及することは絶対ないわな
だって難しすぎるから
普段VBとかで適当なアプリ作ってる人たちにHaskelll
習得させようとしたら窓から逃げる人が続出だな
558デフォルトの名無しさん:2006/07/01(土) 14:57:31
Prologが苦手なのでHaskellもとっつきにくいなぁ
559デフォルトの名無しさん:2006/07/01(土) 16:09:50
>>557
でもさあ、それはプログラミングな業界が今と同じ形態をとっていることを
前提にした意見だろ?
「Haskellおもすれー!」っていう頭の良い人たちが「平均的なプログラマー」に
なったら、それはそれですばらしいと思わないかい?
560デフォルトの名無しさん:2006/07/01(土) 16:18:41
ありえんな。年々馬鹿になってるから。
まあ言語が進化したおかげで
プログラマへの要求が低下して底辺が拡大してるからだが。
561デフォルトの名無しさん:2006/07/01(土) 17:35:52
>>559
それがプログラマにとって素晴らしい世界か?
頭の良い人たちの絶対数はそうそう変化しないだろう
つまりそういう人たちが平均的なプログラマになるということは
圧倒的大多数の能無しプログラマが死滅したということだ

てか本当にこれからプログラマになろうという若人たちはあわれだよな
Javaにせよ.NETにせよCPANにせよ
既存のモジュールをインクルードしてnewしてメソッド呼び出せば
それですべて事足りて、
何も根本的な技術は身につかずに、
なのに一部の優秀なプログラマさんたちがどんどん新手の概念やモジュールを
発行し続けて、
これじゃまるでブランドのバッグの新作を買いつづけて破綻するOLじゃないか!
搾取され続ける消費者でしかない

みんないいかげん気づこうぜ!
ヨーロッパの革命の時代、庶民は団結して王族をタタッきった
それは王族どもの搾取があまりだったからだ
自らの生存と平定の世のために民衆は立ち上がった
そう、今俺たちプログラマのおかれる状況も同じだ!
誰だ?誰のせいだ?!誰がこんな状況に俺たちを追い込んだ??
そう!!ゴスリングだ!オードリだ!弾だ!!あいつらだ!!
あいつらが悪なのだ!
562デフォルトの名無しさん:2006/07/01(土) 17:47:17
個人的には超絶的な人達と、全然プログラムしない人達に別れて行くのが理想。
誤解受けるかも知れないけど。

プログラマ的にはプログラムを書きたくない。
プログラムを書かなくて良い世界って素敵だと思う。
だから今のMovableTypeやTypePadでのブログの流行とか、ああいうのは賛成。
プログラムなんて知らない。HTMLなんて知らない。で良いと思う。

Haskellみたいな難しい言語ができて、そういうプログラマ人口が増えるってのは
ちょっと後退かなと考えてる。
チラ裏すまん。
563デフォルトの名無しさん:2006/07/01(土) 18:21:41
おまいら、ここは質問箱ですよ
564デフォルトの名無しさん:2006/07/01(土) 23:05:47
正規表現でeval使わないでマッチ演算子を変数で指定する方法ってどうすればよかと?
Jcode.pmのソース見るとeval使ってるんだけど実行時コンパイルで遅いから使わない方法を模索してます。

match('abcdefgfedcba', 'b', 'ig');
sub match {
my ($str, $pattern, $opt) = @_;
$str =~ /$pattern/$opt;
}

みたいなことをしたいっす。
XS使ってperl apiを呼ぶしかないかな?
よろすくおねがいします。
565デフォルトの名無しさん:2006/07/01(土) 23:08:34
素直にeval使いなよ。
evalより、XSをリンクするコストの方がかかる。
566デフォルトの名無しさん:2006/07/01(土) 23:14:05
>>564
perlreの(?imsx-imsx:pattern)の項嫁
後ついでにperlopのqr/STRING/imosxも読んでおくと良い
567デフォルトの名無しさん:2006/07/01(土) 23:14:39
マッチ演算子の数は有限なんだから$opt解析して場合
わけしちゃえば? w
568デフォルトの名無しさん:2006/07/01(土) 23:20:01
>>565
http://d.hatena.ne.jp/higepon/20050615/1118829090
これ見る限りXSのリンクコストがそんなに高いとは思えないのですが…。
C分からんのでまだ試してないですけど、うまくできたら後で報告します。

>>566
qrではgは指定できねっす。

>>567
それ一時考えましたけどエレガントさを感じなかった(我侭ですんません)ので自分の中で却下しました:p
569デフォルトの名無しさん:2006/07/01(土) 23:29:43
じゃ、>>566の線でgだけ場合わけてーのはどーよ
570デフォルトの名無しさん:2006/07/01(土) 23:32:57
>>568
いや、XSのコードは、最初にuseする時にコストがかかる。
そのリンク先のベンチは500万回実行してるけど、
回数少なければXSの方がトータルで遅いはず。

evalは2回目以降はコストほぼ一定だし。
何百回も実行されるコードじゃないんだよね。
しかも、やろうとしてる事は単なるインクリメントじゃなくて、
正規表現なんでしょ?
だったらほとんど変わらないと思う。

XSを勉強したいという事なら別に止めはしない。
けど多分、苦労に見合わない。
571デフォルトの名無しさん:2006/07/01(土) 23:48:22
cpanのRegexpというのがまさしくそんな感じのモジュールだがどうよ。
572デフォルトの名無しさん:2006/07/02(日) 00:07:39
>>569
#g以外にも指定できない演算子があるし置換演算子のeも指定できないので
567さんの意見を却下したのと同じ理由って事で m(_ _)m

>>570
なるほどでっす。
XSは自分でいじったことなくて分かんないんですけど
DynaLoaderからXSLoaderになってコストが安くなったって聞くんですけど
まだまだ重いもんなんっすかね?
perlのインタープリタの起動自体が重いのでロード時の重さってよほどでない限り
気にしたことなかったす。
EncodeやらDBIやらPOEをいつも使ってるから麻痺してるのかも Σ(゚д゚;)
あと、WEBから利用する場合も標準でmod_perlを利用しちゃってるので
起動後はキャッシュされるので気にしたことなかったっス。
丁寧に説明ありがとうございます。
ここまで来たらXSの勉強のつもりで往ってきます。

>>571
おぉ!!XSから正規表現をいじるサンプルコードだ!!
どうもですぅ!!
573デフォルトの名無しさん:2006/07/02(日) 08:03:35
eval で出来ることをわざわざ…。
完全に目的と手段を履き違えてるな。
574デフォルトの名無しさん:2006/07/02(日) 12:47:05
>>実行時コンパイルで遅いから
って理由がちゃんと書いてるよ
それに同意できるかどうかは別だけどね。

おまいさんはRegexpモジュールも否定すんのか?
まぁ、このモジュールを利用する最大のメリット
coreをhuckせずに機能を自由にオーバーライド出来る点だけどね
575デフォルトの名無しさん:2006/07/02(日) 21:15:29
>>564が、正規表現中で 「 | 」使ってたりしたら笑えるん
だけど。
576デフォルトの名無しさん:2006/07/02(日) 21:16:20
ああ、あげてしもた。吊ってくる。
577デフォルトの名無しさん:2006/07/02(日) 21:33:54
>>575-576
話についてけないなら無理に書きこする必要はないんだよ
おとなしくROMってな、房や
578デフォルトの名無しさん:2006/07/02(日) 21:59:02
いやevalのコストを気にするくらいだったら当然正規表現
中の「 | 」のコスト高はしってると思ってさ。
速度を気にするときの基本って意味でパイプを例にだした
だけなんだ。
579デフォルトの名無しさん:2006/07/02(日) 22:10:08
おれは最近知った>パイプw
まあ、そんなに速度は気にしないからパイプもevalも
必要に応じて使ってるけど
580デフォルトの名無しさん:2006/07/02(日) 22:11:30
まぁ、他にもいろいろモジュール使ってるみたいだから
evalのコストくらい結局吸収されちゃうと思う。
581デフォルトの名無しさん:2006/07/02(日) 22:28:01
ところでお前ら本当にスタンドアロンで動くプログラム組んでるの?
ぶっちゃけcgiとしてしか使ってないんじゃない?
俺の周りでperlでWindowsやUNIXや組み込みプログラム組んでるの見た事ないんだけど…
せいぜいインストールスクリプトくらい。

ム板に居座る為に口実であくまで非cgiとして使ってる事にしてるんじゃなかろうな?
582デフォルトの名無しさん:2006/07/02(日) 22:30:34
ごめん。おれ cgi 書いたことないw
583デフォルトの名無しさん:2006/07/02(日) 22:32:24
俺の場合CGIはほとんど無し。
ワンライナー多数。
仕事では死ぬ程たくさん書いた。全部CGIじゃなかった。
584デフォルトの名無しさん:2006/07/02(日) 22:49:54
漏れは小物では、日常的なデータ―特に文字列が多いが―の変換とか、
スタンドアロンじゃないがSubversionのフックスクリプトとかPerl製。
Un*x環境では鯖の管理スクリプトを時々頼まれて…CGIも結構作るがね。
最近のスタンドアロン物だと、ウェブから仕入れた法文をPalm用に変換・整形するツールを作ってる。

しかし、こうやって考えてみると、その場で使って棄てるような小物が多いから、
見せられるようなものってあんまり無いなー
585デフォルトの名無しさん:2006/07/02(日) 23:20:44
>>570
「evalは2回目以降はコストほぼ一定だし。」
詳細は perldoc -f eval
564がマッチング演算子まで変数で指定できるように
しようとしてるわけだからevalでやろうとすると
eval BLOCKではなく eval EXPRになる。
この場合は毎回式を評価してから実行となる。


>>580
モジュールを沢山使用することによる初期コストは
どんなに大量にデータを処理しても一定なのに対して
evalはデータ処理のループの回数だけ実行されて積み重なる。
perlスクリプトでのCGIで簡単な処理しかしないなら
インタープリタの起動コスト、モジュールのコンパイル
XSへのリンクコストが気になるのかもしれないが
バッチ処理での大量のデータの処理などは初期コストの数秒より
積み重ねの数時間のほうが大いに気になる。
CGIでしか利用していないならWebProg板に往きなさい。
586デフォルトの名無しさん:2006/07/02(日) 23:28:13
perldocにある通り、評価は毎回かも知れないけど、
evalって評価器の立ち上げにコストがかかるんじゃなかったっけか。
>>570 とかの言ってるコストってそっちじゃないの?
おれの覚え違い?ひょっとして。
587デフォルトの名無しさん:2006/07/02(日) 23:30:38
>>585
つか結局 >>564 は、>>572 にある通りwebで使うみたいだから
そんなに同じ処理くり返すとは思えないんだけど。
588デフォルトの名無しさん:2006/07/02(日) 23:48:47
>>587
564は572で「あと、WEBで利用する場合も」とついでに説明だしてるだけだし
初期コストより実行時コストを重視してる言い回しだろ。
日本語読めてんか?
589酩酊 ◆TWARamEjuA :2006/07/02(日) 23:56:52 BE:1743528-#
Rock54とかBBQ、sv2chはCGIも混在。
仕事ではエクセルでちまちま数字打ち込むよりかはテキストファイルですぱぱぱぱと描いて、
適当に変換してエクセルに貼り付けたり。
590デフォルトの名無しさん:2006/07/03(月) 00:22:11
ここはプログラム板でCGI,WEB以外も範囲に入るのに
564へのレスがCGIでの使用を前提としたような反応が多いね。
最たるものが>>573は目上からの物言いをしてるけど
実はこいつが見当違いなレスをしている。
591デフォルトの名無しさん:2006/07/03(月) 00:37:23
>>581
CGIがメインさ。CGIがメインでもいいじゃないか。メインでもいいじゃないかコノヤロウ。

>>564
つかさ。コストがかからないようにevalすればいいじゃないの?

sub newRegExp{eval("sub{\$_[0] =~ /$_[0]/$_[1]}")}
local *regexp = newRegExp('b', 'ig');
print regexp('abcdefgfedcba'), "\n";
print regexp('AbabaAbabaAbabababa'), "\n";
print regexp('baka! ...demo suki!'), "\n";

まあ、↑じゃ使いにくいだろうからちょっと改造が必要だろうが。
592デフォルトの名無しさん:2006/07/03(月) 00:43:56
無名サブルーチンをevalで作るわけね。
じゃあこんなのはどうかね。

my %opt_hash;

sub match {
my($str, $pattern, $opt) = @_;

unless (defined $opt_hash{$opt}) {
$opt_hash{$opt} =
eval qq{
sub {
my(\$s, \$pat) = @_;
\$s =~ /\$pat/$opt;
}
};
die $@ if $@;
}

$opt_hash{$opt}->($str, $pattern);
}
593デフォルトの名無しさん:2006/07/03(月) 00:46:55
あ、無名サブルーチン内の@_の@をエスケープしてないや。
テストしてないのがバレバレだな
594デフォルトの名無しさん:2006/07/03(月) 01:01:39
>>592
おー、同じマッチ演算子だったらキャッシュするようにしたのね。
でも、正規表現のパターンが違うと毎回正規表現のコンパイルが、
走りそうだけどしょこんとこどうなの?

>>591はそれを考慮してパターンとマッチ演算子をセットにしたコードにしてみたんだけど。
595デフォルトの名無しさん:2006/07/03(月) 01:13:23
うーん、そこ迷ったんだよな。呼ばれたサブルーチン側からは
元のパターンが文字列埋め込みで変化するものか固定文字列か
わからないので。

それによく考えたらこれじゃoオプションがまともに使えないね。
いまいちでしたorz



596デフォルトの名無しさん:2006/07/03(月) 01:23:55
591のはRegexpみたいにそれだけを専用にするモジュールのコード向き。
592のはJcodeのmメソッドに組み込むコード向き。
と、勝手に俺は感想を持った。
597デフォルトの名無しさん:2006/07/03(月) 12:31:11
つい最近デバイスをバシバシ叩くやつを作った。
598デフォルトの名無しさん:2006/07/03(月) 16:56:42
ActivePerlのライセンスってどうなってるの?
Perl.dllとかを自分のアプリに組み込むのはアウトなの?


599デフォルトの名無しさん:2006/07/03(月) 19:27:16
質問をさせてください

当方Mac OS X(10.4)でThis is perl, v5.8.6 built for darwin-thread-multi-2levelを使っています.

ttp://mrmt.net/src/omnioutliner/index.html
omnioutliner-opml2htmlという,OmniOutlinerというアウトラインプロセッサで作ったファイル
をXMLで書き出したものをHTMLに変換するPerlスクリプトなのですが,スクリプトを実行すると,
Not an ARRAY reference at omnioutliner-opml2html.pl line 55.
とエラーが出ます.

line 55周辺を見ると,
for my $item (@$data){ #ここがline 55です
  &dump($item);
}
とあり,@dataにはXMLに手を加えたものを一行ずつ配列にしたものが入っています.

このエラーメッセージで検索をすると,
" Perl が配列値へのリファレンスを評価しようとしましたが、別のものへのリファレンスでした。"
とありましたが,何がおかしくて,どう修正すれば良いのかわかりません.

何かヒントをいただけないでしょうか
600酩酊 ◆TWARamEjuA :2006/07/03(月) 19:34:54 BE:1307243-#
>>599
$data の出所を探してみよう♪
どこかでリファレンスじゃなくなっているところがあるかと♪

Posdata:
 5.8.6-2からなかなか更新しないですよね(怒)@膜真珠
 leopard(10.5)まで待たなきゃなんだろうか。。。
601デフォルトの名無しさん:2006/07/03(月) 19:39:53
>>599
ソースみたけど、ハッシュへのリファレンスを、配列としてデリファレンスしてる。

for my $item (values %$data){
&dump($item);
}

ってすれば多分おk
602デフォルトの名無しさん:2006/07/03(月) 19:39:56
>>599
forの前で
warn $data;
ってするとどうなる?
ARRAY(0x8182c30)
とかってでる(括弧の中の16進数は毎回変わる)?
603601:2006/07/03(月) 19:42:52
あ、ごめ 見間違えたわ $info だと思ったら $data か
604601:2006/07/03(月) 19:44:57
あ、でも どっちにしろ同じ事っぽいから >>601 で動くと思う 連投スマソ
605599:2006/07/03(月) 20:33:58
みなさん,レスありがとうございます.

>>600,601
アドバイスありがとうございます.
ハッシュの値を参照すべき箇所が配列の要素を参照してしまっているという事ですね?

>>601の通り書き換えてみました.すると,
隈鐚") as a HASH ref while "strict refs" in use at omnioutliner-opml2html.pl line 72.
とエラーが出ました.エラーの行は,
print $item->{text};
です.シンボリックリファレンスのエラーの様ですが,何故エラーなのかわかりません.
use strict;をコメントアウトしてもエラーが出ます.

>>602
何度実行しても以下のメッセージになりました.
HASH(0x191c890) at 2omnioutliner-opml2html.pl line 56.

もう少しヒントをいただけないでしょうか
606デフォルトの名無しさん:2006/07/03(月) 21:24:25
どうもこのプログラムが仮定しているのとは違うxmlを食わしているような
気がする。バージョンアップとかでファイル形式かわっちゃったけど追随
してないとかそんなのを疑ったほうがいいかも。

短いプログラムなのでやろうとしていることを理解してxmlとにらめっこ
すれば修正できるんじゃないか。頑張れ。
607酩酊 ◆TWARamEjuA :2006/07/03(月) 21:29:20 BE:3484984-#
HASHのリファレンスになっているようだから、、、
for my $item (@$data){
&dump($item);
}
を、、、
&dump($data);
というように直接食わせてみてはどうだろう?

tu-ka、606氏と同じような気がしてきたかも。。。
608酩酊 ◆TWARamEjuA :2006/07/03(月) 21:31:47 BE:3920966-#
こゆときは、、、
for my $item_hashref (@$data){
と書いてあると「ハシュのリファレンスを取り出しているんだ」って云うのが、後からでも判るんだけどなぁ。。。
609602:2006/07/03(月) 21:45:36
流し込むデータがないからSyntaxしか確認してないけど
これでどう(長すぎるから複数回に分けてカキコします)?
----
#!/usr/local/bin/perl -w

use strict;
use XML::Simple;
use Data::Dumper;
use HTML::Entities;

my $xml;

{
local($/) = undef;
$xml = <>;
}

my $info = XML::Simple::XMLin($xml);
my $data = $info->{body}->{outline};

----
まだ続きます
610602:2006/07/03(月) 21:46:56
PAGE2
----
print qq(
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>$info->{head}->{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css"><!--
div.note { font-size: small; background: #ffd;}
--></style>
</head>
<body>
<h1>$info->{head}->{title}</h1>
\n\n);

&dump($data) if $data;

print "</body></html>\n";

exit;

----
まだ続きます
611602:2006/07/03(月) 21:50:37
PAGE3
----

sub dump{
my $item = shift;

print "<ul>\n";
if ( ref($item) eq 'HASH' ) {

print '<li>';
print $item->{text};
print qq(\n);

if(defined $item->{_note}){
print qq(<div class="note">\n);
local $_ = $item->{_note};
s/\n\n/<p>/g;
s/\n/<br>/g;
unless(s,(http://[!-;=-\177]+),<a href="$1">$1</a>,g){
s|(www\.[!-\177]+)|<A HREF="http://$1">$1</A>|g;
}
print;
print qq(</div>\n\n\n);
}
----
まだ続きます
612602:2006/07/03(月) 21:51:42
PAGE4
----

&dump($item->{outline}) if $item->{outline};

}
elsif ( ref($item) eq 'ARRAY' ) {
&dump($item) foreach @$item;
}
print "</ul>\n";

}

__END__
----
ここまで。
うまく動かんかったらサンプルデータをうぷってくれ。
テストできん。
613デフォルトの名無しさん:2006/07/03(月) 22:13:45
>>599
できた。OmniOutliner インストールして、リリースノートをOPMLで吐き出して
HTMLを確認したから大丈夫だと思う。

55行目から以下の3行を削除して
for my $item (@$data){
 &dump($item);
}
次の一行に書き換える。これだけ。
&dump($data);


一応、diff も置いとく。
55,57c54
< for my $item (@$data){
< &dump($item);
< }
---
> &dump($data);
614デフォルトの名無しさん:2006/07/03(月) 22:25:24
ActivePerlのupdateって上書きインストールでいいんですか?
一度アンインストしてからですか?
615599:2006/07/03(月) 23:04:54
みなさん,本当に親切にありがとうございます.

>>613
わざわざソフトのインストールまでしていただいてありがとうございます.
diffコマンドで>>613と同じ結果が返ってくるのを確認してリソースノートを
このスクリプトでhtmlに変換できました.

>>602
多くの手直しありがとうございます.
文法は問題ないのに実行すると
Deep recursion on subroutine "main::dump"
とエラーが出て処理が終わりませんでした.
ファイルを読み込ませる時/回している時にエラーが出ているのかもしれません.
もう一度その辺りのスクリプトと読み込ませるファイルを確認してみます.

その他助言を下さった方,ありがとうございました.
私ももっとPerlを理解できる様になったら,皆様の様に人にアドバイス出来るように
したいと思います.

#リソースノートのファイルではうまくいったものの,違う幾つかのファイルはエラーが
#出ました.変換前のファイルとこのスクリプトをもっと見比べてみようと思います.
616デフォルトの名無しさん:2006/07/03(月) 23:15:28
アホな質問ですみません。

簡単なCGIを作りました。コマンドラインからは実行でき、正常終了します。
ところが、これをブラウザから実行する方法がわかりません・・・_| ̄|○

とりあえず、ブラウザurl(http://hogehoge/cgi-bin/test.cgi)を打ち込むと
スクリプトが実行されず、ブラウザに表示されるだけです・・・

IISの設定、OSの設定などが必要なのでしょうか?つまらない質問ですみませんが
どなたかご教授頂ければ幸いです。
617デフォルトの名無しさん:2006/07/03(月) 23:22:03
>>616
IISか・・・。わからん。とにかく設定の必要があるのはOSじゃなくてIISだな。
cgiという拡張子をスクリプトとして登録する必要がある。

その前に、CGIに関する質問はWebProg板というのがあるからそこに池。
http://pc8.2ch.net/php/
618602:2006/07/03(月) 23:35:47
>>615
めんご、やっぱテストしてないからRuntimeエラーおこしたかw
最後のほうの
&dump($item) foreach @$item;
って書いてるのを
&dump($_) foreach @$item;
と書き直しておいて。
619599:2006/07/04(火) 00:12:28
>>602
ありがとうございます,修正したらちゃんとスクリプトが動きました.

ただ,出力したhtmlに余分な"¥n"という文字が入ってしまっているので,
その部分をsplitすると問題なく表示できます.

みなさん,本当にありがとうございました.
620デフォルトの名無しさん:2006/07/04(火) 00:20:19
>616
OSはWindowsかな?
CGIはサーバー上じゃなきゃ動かない。
Windowsなら、Apacheとかを入れてサーバー環境にしないと動かないよ。
617さんも言ってるけど、WebProg板で聞いた方がいいと思う。
621デフォルトの名無しさん:2006/07/04(火) 00:33:14
自分でデバッグしてない奴の相手するのやめないか?
622602:2006/07/04(火) 00:40:47
漏れ?
自分で1回も動かしてないソースを貼り付けてしまいましてすんません…
623デフォルトの名無しさん:2006/07/04(火) 04:21:19
>>621
つ〜か、デバッグする方法と手順をまず教えようぜ。

624デフォルトの名無しさん:2006/07/04(火) 05:37:00
622(602)は関係ねーんじゃね?

>>623
perl -d
http://homepage3.nifty.com/hippo2000/perltips/perldbg.htm
625デフォルトの名無しさん:2006/07/04(火) 05:41:09
>>624
> perl -d
> http://homepage3.nifty.com/hippo2000/perltips/perldbg.htm

それ以前に、「変数の中身をプリントしてみる」ことすらやっていない
人間がぞろぞろ出てきてる。
それが問題だ。
626デフォルトの名無しさん:2006/07/04(火) 08:03:48
かといって perl には初心者スレもないしなあ。
627デフォルトの名無しさん:2006/07/04(火) 08:10:32
どぞー
Perlコーディング初心者質問スレ Part 50 http://pc8.2ch.net/test/read.cgi/php/1151250398
628デフォルトの名無しさん:2006/07/04(火) 08:12:56
ああ、あっちにはあったのか。
CGI しねえから WebProg なんて行ってなかったw
629デフォルトの名無しさん:2006/07/04(火) 13:40:08
>>625
まあいいではないか。もっと心を広く持とうぞ。
630デフォルトの名無しさん:2006/07/04(火) 13:47:56
でも大きな塊でうごかねーとか出してきてさっぱり切り分けできてねーじゃんという
のが最近目立つような気がするのも確かだ。
631デフォルトの名無しさん:2006/07/04(火) 14:07:47
どうしてもできないので質問させてください。

DBI1.50、DBD-Pg1.22、ActivePerl5.8.8Build817、PostgreSQL8.1.4
のような環境でPerlを用いてデータベースをいじっているのですが
SELECT はできて、INSERT・DELETE ができません。
以下のクエリをコピペして直接DBをいじった場合はできます。
SELECTが出来ているのでDBIがおかしいとかでもないでしょうし。。。
なぜでしょうか?よろしくお願いします。

以下ソース

#!C:\Perl\bin\perl.exe

use DBI;

$dsn = 'DBI:Pg:dbname=soccer;host=localhost;port=5432';
$user = 'postgres';
$password = 'aaaa';

$dbh = DBI->connect($dsn,$user,$password,{RaiseError => 1, AutoCommit => 0});

$query = "INSERT INTO member VALUES ('イングランド', 'FW', '9', 'ルーニー', '1985/10/24', 'マンチェスター・U')";
$sth = $dbh->prepare($query) || die $dbh->errstr;
$rv = $sth->execute || die $dbh->errstr;

$query = "DELETE FROM member WHERE name = '小野 伸二'";
$sth = $dbh->prepare($query) || die $dbh->errstr;
$rv = $sth->execute || die $dbh->errstr;

$dbh->disconnect();
632デフォルトの名無しさん:2006/07/04(火) 14:13:35
>>629
> まあいいではないか。もっと心を広く持とうぞ。

このケースは、「広い心が無数の狭い心を生む」の典型例だ。
633デフォルトの名無しさん:2006/07/04(火) 16:07:58
質問させてください
use base でベースにするモジュールのバージョンチェックはどうやるのが一般的なのでしょうか?
現在は、use base MODULE の他に use MODULE VERSION としています

use Hoge '1.1';
use base 'Hoge';
634デフォルトの名無しさん:2006/07/04(火) 16:08:04
>>631
根本的にpsqlで同じユーザでつないだ場合にINSERT DELETEはできるのか?
ってか postgresユーザってDBのrootじゃないんか?
635631:2006/07/04(火) 16:17:38
>>634
できます。
PostgresユーザはDBsoccerのオーナーです。
う〜ん。。。
636デフォルトの名無しさん:2006/07/04(火) 16:22:22
>>631
ソースだけでなくてなんてエラーメッセージがなんて出てるか貼り付けろよ。
エラーメッセージは意味不明な呪文などではなく、
重要なメッセージなんだぞ。
英語だからって逃げてねぇで辞書使うなりWEB検索するなり調べたり汁。


それとプレースホルダーをちゃんと理解して使ったほうがいい。
SQL文の中に値を直接埋め込んでると
SQLインジェクションで痛い目にあうぞ
637デフォルトの名無しさん:2006/07/04(火) 16:24:56
こんにちは。
FedoraCoreスレにて質問しましたところこちらの方が適していると言われましたので質問させて頂きます。

FC3にてImage::Magickをインストールしようと思いKDDIのミラーサイトから次のパッケージをインストールしました。
ImageMagick-perl-6.2.2.0-2.fc3
ImageMagick-c++-6.2.2.0-2.fc3
ImageMagick-6.2.2.0-2.fc3

次に /usr/bin/convert と実行するとちゃんとコマンドも通り画像も生成できました。
そこで当初の予定であったPerlで画像処理をしようとしたところ500エラーが出てしまいます。

Apahceのログを見ると、「Premature end of script headers: xxx.cgi」と返ってきます。
試しにソースから「use Image::Magick;」をコメントアウトすると500エラーは出なくなります。

これはImaeg::Magickモジュールに問題があると判断してよいのでしょうか。
またどうすればこれらの問題は解決できますでしょうか。
先ほどから延々色々試していますが皆目検討がつきません。

よろしくお願いします。

■発生環境
FedoraCore3 Apache2+Perl5.8.5
638636:2006/07/04(火) 16:33:59
>>631
>エラーメッセージ
言い忘れてました。何もでませんでした。
>英語だからって逃げてねぇで辞書使うなり
英語サイトは忘れてました。
>WEB検索するなり調べたり汁。
一週間調べました。(英語サイト以外

>それとプレースホルダーをちゃんと理解して使ったほうがいい。
>SQL文の中に値を直接埋め込んでると
>SQLインジェクションで痛い目にあうぞ
確かにまだ理解して無い。だけど、先走りすぎ。
639631:2006/07/04(火) 16:34:44
アンカーと名前間違えた。。。
640デフォルトの名無しさん:2006/07/04(火) 16:40:40
>>637
コマンドラインが使えるならコマンドラインからそのスクリプトを
perl -cw filename
ぐらいは試してるんだよね?

>次に /usr/bin/convert と実行するとちゃんとコマンドも通り画像も生成できました。
上の内容でImageMagickがあるのは分かるけど、
ImageMagickのperlバインディングがちゃんとインスコできてるかどうやって確認した?
コマンドラインから
perl -MImageMagick -e'warn Image::Magick->new'
ってやるとなんて出力される?

コマンドラインから
which perl
として出力された結果とスクリプトのshebangは同じ?
641デフォルトの名無しさん:2006/07/04(火) 16:46:59
>>638

>>それとプレースホルダーをちゃんと理解して使ったほうがいい。
>>SQL文の中に値を直接埋め込んでると
>>SQLインジェクションで痛い目にあうぞ
>確かにまだ理解して無い。だけど、先走りすぎ。

おまえ質問者なのに助言者に謙虚さがねぇな。
||をorに書き換えてもエラーメッセージでねぇーの?
642デフォルトの名無しさん:2006/07/04(火) 16:48:39
>>640
めんご
perl -MImageMagick -e'warn Image::Magick->new'
でなくて
perl -MImage::Magick -e'warn Image::Magick->new'
643637:2006/07/04(火) 17:00:17
即レスありがとうございます。
>>640
コマンドを試した結果以下のように返って来ました。

[root@aa ~]# perl -cw /hoge/xxx.cgi
/hoge/xxx.cgi syntax OK

[root@aa ~]# perl -MImage::Magick -e'warn Image::Magick->new'
Image::Magick=ARRAY(0x8266c28) at -e line 1.

[root@aa ~]# which perl
/usr/local/bin/perl

最後のPerlのパスは「/usr/bin/perl」へもリンクを張っていますので
どちらでも通ると思います。

>perlバインディングがちゃんとインスコできてるかどうやって確認した?
スミマセン; 恥かしながらチンプンカンプンです。
二回目に実行したコマンドが確認したと認識して宜しいのでしょうか。

二つ目のコマンドの返り値がなんとなく怪しい気がします。
ちなみにMagick.pmは次の場所にあるようです。
/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/Image/Magick.pm
/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/Image/Magick.pm
644デフォルトの名無しさん:2006/07/04(火) 17:06:30
>>643
ImageMagickのperlバインディングが入ってるのは
>[root@aa ~]# perl -MImage::Magick -e'warn Image::Magick->new'
>Image::Magick=ARRAY(0x8266c28)
でわかった。

>最後のPerlのパスは「/usr/bin/perl」へもリンクを張っていますので
>どちらでも通ると思います。
そっかー、念のために試しても無駄だった?
漏れの力ではこれ以上は問題のスクリプトの内容をみねぇーとわかんねぇな。
できれば加工しないで貼り付けできる?
長すぎれば同じエラーが出る状態を保ったままなるべく削って貼り付けキボン
645637:2006/07/04(火) 17:11:35
>>644
レスありがとうございます。
ソースはそんなに長くないのでそのまま貼り付けてみます。
#!/usr/bin/perl
use strict;
use Image::Magick;

my $image=Image::Magick->new;
$image->Set(size=>'40x200');
$image->Read("gradient:#ff0000-#0000ff");
$image->Raise('3x3');
$image->Rotate(-90);
$image->Write('temp.png');

print "Content-type: image/png\n\n";
open(IMG,"temp.png");
binmode(IMG);
binmode(STDOUT);
print $_ while (<IMG>);
close(IMG);

unlink "temp.png";
exit;
ちゃんと起動すれば虹色のバナー大サイズの画像が表示される筈です。
Image::Magickのインストール確認で試しています。
646デフォルトの名無しさん:2006/07/04(火) 17:14:05
Image::Magickが問題ないんなら
evalなりなんなりでエラー箇所を特定しろよ
647デフォルトの名無しさん:2006/07/04(火) 17:15:17
書き込み権限を確認しれ
648デフォルトの名無しさん:2006/07/04(火) 17:16:37
temp.pngが作られるディレクトリ問題?
649640:2006/07/04(火) 17:19:02
なにがいかんのかわかんないけど、書き直してみた。

#!/usr/local/bin/perl
use strict;
use Image::Magick;

my $image=Image::Magick->new;
$image->Set(size=>'40x200');
$image->Read("gradient:#ff0000-#0000ff");
$image->Raise('3x3');
$image->Rotate(-90);

{
local $| = 1;
print "Content-Type: image/png\n\n";
$image->Write('png:-');
}
650637:2006/07/04(火) 17:24:37
>>646 >>648
コード自体は別のサーバで実行すると表示されるようなので多分大丈夫だと思います

>>647
755で実行してます。

>>649
やはりだめでした(´・ω・`)
Apacheのログ
[Tue Jul 04 17:22:00 2006] [error] [client 192.168.0.1] Premature end of script headers: xxx.cgi

Image:MagickそのものかPerlがモジュールを探せられて無いのかイマイチ原因が突き止められません
651640:2006/07/04(火) 17:31:22
chmod +x xxx.cgi
してもだめ?
俺のとこでは
chmod -x xxx.cgi
でエラーメッセージの再現はできるけど。。。
apacheのユーザー分かる?wwwとかだったら
sudo -u www -H /usr/local/bin/perl -w xxx.cgi
するとどうなる?

>Image:MagickそのものかPerlがモジュールを探せられて無いのかイマイチ原因が突き止められません

#!/usr/local/bin/perl -w
use strict;
use Image::Magick;
print "Content-Type: text/html\n\nok!";
652637:2006/07/04(火) 17:40:09
レスありがとうございます。

>chmod +x xxx.cgi
500エラーでした(´;ω;`)ブワッ
エラー内容は同様です

>sudo -u www -H /usr/local/bin/perl -w xxx.cgi
試しに nobody apache 所持ユーザ root の四つで試してみましたが、
全て「セグメンテーション違反」と言われました。

>>651のソースを書いて同様の操作をするとprint出力がちゃんと返ってきました。
ちなみに>>651をブラウザで実行すると「ok!」と表示されました。

てことはImage::Magickは利用可能で問題はソース側ということでしょうか。
でも同じソースで同じバージョンのperlが入った別の鯖だと表示されたのに・・・。
653デフォルトの名無しさん:2006/07/04(火) 17:46:01 BE:231821273-#
eval でくくっても何も捕捉できないの?
654637:2006/07/04(火) 17:49:18
>>653
evalで括っても500エラーと同じエラー文が返ってきました・・・。
何が悪いのでしょうか。 Image::Magickに原因があると思ってましたので逆に原因が分からなくなりました
655640:2006/07/04(火) 17:49:48
セグメントフォルトしてる時点でバインディングのImage::Magickっぽいな…。
最新版のImageMagickのtarボール拾ってきてコンパイルするのはきつい?
漏れもFC3なんだけどkernelもperlもapacheもimagemagickも
自前でコンパイルしちゃってるから637の使ってる
>ImageMagick-perl-6.2.2.0-2.fc3
>ImageMagick-c++-6.2.2.0-2.fc3
>ImageMagick-6.2.2.0-2.fc3
を入れるのはちょっと・・・
656637:2006/07/04(火) 17:54:40
>>655
tarからインスコすることはよくあるので可能ですが、
何か環境が整っていないのかtarでやると警告が返ってきます。

PerlMagickを入れるために
perl Makefile.pm
とやるとMAKEFILEが作成され、
makeを実行すると、最初に「ghostscript」が無いとエラーが出ました。

なのでそれのtarを拾ってきて該当のファイルを入れて再度実行すると今度は
Magick.c: In function `XS_Image__Magick_Animate':
Magick.c:2098: 警告: unused variable `ref'
Magick.c:2093: 警告: unused variable `ix'
のようなエラーが延々出てます。

なので諦めてFedoraCoreの公式からrpmを拾って今使ってます。
あと最新版のリリースが昨日てのも、もしかしてFCとは互換性ないのかなーとかって思ってたりしてます。
657デフォルトの名無しさん:2006/07/04(火) 17:55:27
>>637
とりあえず
use CGI::Carp qw(fatalsToBrowser);
ってつけて実行してみれ
658637:2006/07/04(火) 18:01:33
普通は500でもエラー文が出るはずなのに>>657を一番先頭に入れても駄目でした。
Apacheのエラー文も同じままでした。

試しに一般ユーザーとApacheのルートフォルダのどちらでも試してみましたが結果は変わりませんでした。
ついでに余計なプロセスが邪魔してるのではと思って試しにrebootしてみましたが同じでした。
659640:2006/07/04(火) 18:02:54
ghostscriptは俺もインスコした覚えないけど最初のOSインスコ時に
全部いりしたから入ってるっぽ。
yumでインスコでどうよ?
あと俺のImageMagickは6.2.5
660640:2006/07/04(火) 18:04:25
>>657
ランタイムエラーじゃなくてセグメントフォルトだからCGI::Carpじゃ拾えないYO
661640:2006/07/04(火) 18:08:50
ImageMagick6.2.8-3まであるのか…
やべぇ、メンテサボりすぎたw
6.2.5のURL
ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.2.5-5.tar.gz
漏れは最新版のインスコに挑戦してくるガンガレ637
662637:2006/07/04(火) 18:33:25
今tarから再度インスコしてます。
FCユーザでもしかして同じ症状の方がいらっしゃるかもしれませんので
どういう結果でももう一度報告しに参ります。

どうやら足りないファイルがあるようです。
やはり最新版はFC3は眼中にないのでしょうかTT
663デフォルトの名無しさん:2006/07/04(火) 18:34:35
実は今問題となっているスクリプトを実行していない(-300点)
664640:2006/07/04(火) 18:47:59
>>662
漏れは6.2.8-3のmake testが通んなくてログを追ってるよ orz
665637:2006/07/04(火) 18:58:17
lfontcnofig,ltiffの2個が恐らくデフォの状態では足らないと思います。
それぞれ最新版をインスコすると解消されます。

rpm -e ImageMagick*
にてアンインスコして6.2.8-3に挑戦してます。

何故かアンインスコすると500エラーは解けました・・・。
でも画像の作成もされないようです。。。 何がどうなってるのかポルナレフ状態です orz
666637:2006/07/04(火) 19:26:52
無事インスコ完了しました。どうもお騒がせしてスミマセン。

結論:Image::Magickがちゃんと入っていなかった。

yum使って入れた前述した3つをアンインスコし、
tarから取ってきた最新版を入れるとちゃんと動くようになりました。

FC3の方は前述の2個のパッケージが不足していますので、
インストール時に先に追加して下さい。(バージョンの関係です)

先ほどのperlのソースで無事表示を確認しました。 スレ汚し失礼しましたm(_ _)m
667デフォルトの名無しさん:2006/07/04(火) 19:39:40
報告乙!
668デフォルトの名無しさん:2006/07/05(水) 03:33:06
WebDBマガジンの最新刊naoya氏のperlの連載
前回はcatalystだったけど今回は何?
669デフォルトの名無しさん:2006/07/05(水) 03:59:05
mod_perl2.0?
670デフォルトの名無しさん:2006/07/05(水) 07:35:43 BE:540916477-#
宣伝乙
671デフォルトの名無しさん:2006/07/05(水) 11:05:43
>>637の人
> print "Content-type: image/png\0x0D\x0A\x0D\x0A";
じゃねーの?
672デフォルトの名無しさん:2006/07/05(水) 11:58:36
>>671
>>666で解決してるようだが。
673デフォルトの名無しさん:2006/07/05(水) 22:47:03
環境はv5.8.7 built for cygwin-thread-multi-64intです。

$ perl -Mbigint -le 'print 2**64'
18446744073709551616

$ perl -Mbigint -le 'print eval {2**64}'
18446744073709551616

$ perl -Mbigint -le 'print eval "2**64"'


なぜ三番目のでは表示されないのでしょうか。
674デフォルトの名無しさん:2006/07/05(水) 23:11:36 BE:123816072-#
手元のポケットリファレンスには書いてあったー
675デフォルトの名無しさん:2006/07/05(水) 23:41:12
]% perl -Mbigint -le 'print eval "2**64"; print $@ if $@;'

Constant(undef): $^H{integer} is not defined at (eval 5) line 1, at end of line
Constant(undef): $^H{integer} is not defined at (eval 5) line 1, at end of line

コンパイル時になんかやる仕掛けが文字列のevalだとコンパイルするタイミングが
変わって実行時になるのでうまく動いてない感じに見えるが詳しくは俺もわからん。
676デフォルトの名無しさん:2006/07/06(木) 00:13:06
超初心者で困ってます。バッチ処理(これは解決)を実行後に、元のHPでリンクされた
urlを新しいブラウザで開きたいのですが記述方法がわかりません。どうすれば良いのでしょうか?
677デフォルトの名無しさん:2006/07/06(木) 00:21:08
人に聞く前にスレ内に書いてあること読めチンカス。
1を256億回音読して来い。
678デフォルトの名無しさん:2006/07/06(木) 01:01:53
>>677
失礼しました。perl初心者質問スレと間違えちゃいました。
679デフォルトの名無しさん:2006/07/06(木) 07:07:22
>>678
おまえ1を読んでないだろ
どこに初心者お断りって書いてあるんだよ?
超初心者ってのはperlでのプログラミングのことでなく
日本語読解力とコミュニケーション能力のことか?
680デフォルトの名無しさん:2006/07/06(木) 07:38:57
>>679
おまえ・・・最低だな('A`)
681デフォルトの名無しさん:2006/07/06(木) 08:21:02
Webprogのコーディングスレでも日本語に突込みが入っててバロスw
682デフォルトの名無しさん:2006/07/06(木) 08:33:54
>>680 じゃ、おまえが676の質問に答えてやれよ
683デフォルトの名無しさん:2006/07/06(木) 08:50:18
>>682が見えない

684デフォルトの名無しさん:2006/07/06(木) 09:08:10
みんな仲良く
685デフォルトの名無しさん:2006/07/06(木) 10:03:31
私も超初心者ですみません
XPを使っているのですがLocal SettingsのTemporary Internet Filesに入ってるクッキーを
確認メッセージなしにさくっと消すことって比較的簡単にできますでしょうか?

WSHやVBSで試みてたのですがこのフォルダの中のものはどうもうまく消せず
InvokeVerbを使ってみたのですがそれだと確認メッセージが出て止まってしまうので、
以前少しやったことのあるPerlで作ってみようかなと、
その前にできるかどうかを聞かせていただこうと思った次第にございます
686デフォルトの名無しさん:2006/07/06(木) 10:12:48
DeleteUrlCacheEntry
687685:2006/07/06(木) 10:18:18
そ、それはあああああ!!
も、もしやVBSのコマンドでは!!!??
またがんばってみます!
ありがとうございました!!
688378:2006/07/06(木) 15:19:50
亀レススマソ
>>380
ScaleをTransformでやってみたもののwidthが1280とかのjpg画像ならリサイズできたけど
2800級になるとリサイズもできませんでしたorz
そもそも画面が真っ黒になってリサイズされないっていうのが謎すぎる・・
マジ行詰りorz
689デフォルトの名無しさん:2006/07/06(木) 15:38:12
>>676
元のHPをブラウザで開いて↓をアドレスバーにコピペ、エンター。

javascript:a=document.getElementsByTagName('a');for%20(i=0;%20i<a.length;%20i++)window.open(a[i]);void(0);
690デフォルトの名無しさん:2006/07/06(木) 15:39:55
>>688
エラーチェックぜんぜんしてないようなので、エラーでてないか確認してみたら?
メモリ足りないとかその手のがでてるかもしれん。

http://www.imagemagick.org/script/perl-magick.php の最後の方の
Handling Exceptionsの項参照。
691デフォルトの名無しさん:2006/07/07(金) 11:07:09
>688
ローカルな自鯖ではうまくいくの?掲示板に組み込まず、単体のcgiではうまくいくの?
俺の場合は、ローカル・レン鯖で単体cgiは動いたけどね。2112x2816(2.08MB)
あと、リサイズしてファイルを上書きしているんだから、ブラウザ出力時はImage::Magick経由しないほうがいいと思う。
print "Content-type: image/jpeg\n\n";
binmode STDOUT;
# $new_image->Write('jpeg:-');
open(FH,'test.jpg'); binmode(FH); read(FH,$bin,(stat('test.jpg'))[7]); close(FH);
print STDOUT $bin;
undef $new_image;
exit;
692デフォルトの名無しさん:2006/07/08(土) 00:34:24
すいません、質問です。
<form action="$regist" method="POST" name="myFORM">
とする時nameをもう1個この中にもう1個追加する時どうやって書けばいいのでしょう?
693デフォルトの名無しさん:2006/07/08(土) 01:01:18
>>692

人の書き込みを無視する奴が誰かに相手にしてもらえると思ってるの?
1を256億回読め
694デフォルトの名無しさん:2006/07/08(土) 01:05:25
DeleteUrlCacheEntryの使い方を教えてくらはい
695デフォルトの名無しさん:2006/07/08(土) 01:21:07
696デフォルトの名無しさん:2006/07/08(土) 10:28:18
>>692
それはPerlではなく、CGI+Perlの質問なのでWebProg板にいきなさい。(http://pc8.2ch.net/php/)

>>694
その質問はすでにPerlではないので、Win32APIスレに逝きなさい。

↓Win32API質問箱 Build44
http://pc8.2ch.net/test/read.cgi/tech/1151501925/

>>693
落ち着きなさい。
697デフォルトの名無しさん:2006/07/08(土) 10:42:43 BE:70752342-#
ヤサシス
698デフォルトの名無しさん:2006/07/08(土) 10:49:16
すいません。アホな質問ですがお願いします。

Perl5.8では内部の文字コード?がUTF-8であると聞きました。
しかし、日本語のテキストを処理する場合に、
trなどで全角1文字単位で扱おうとすると、
処理対象のテキストがUTF-8であっても、
Encode::decodeを使って
$_ = decode('utf8',$_);
などとする必要があるようです。これは何故なのでしょうか?
このdecodeは何をやってるんでしょう?

具体的には、テキスト中の全角数字を半角数字へ置換するスクリプトとして
以下のような物を書きました。(動きました)

use strict;
use utf8;
use Encode qw/ encode decode /;

while (<>){
$_ = decode('utf8',$_);
tr/0-9/0-9/;
print;
}
699デフォルトの名無しさん:2006/07/08(土) 11:01:38 BE:477576296-#
http://pc8.2ch.net/test/read.cgi/php/1151250398/302
が丁寧に解説してるのに
それを理解出来ないのは君が馬鹿なだけ
700698:2006/07/08(土) 12:00:15
色々検索してうろついてみたらUTF8フラグというキーワードにたどり着きました。
さらにそれで検索してみたところ説明されているページがありました。
decodeは文字列にUTF8フラグを付与するような働きをしているんですね?
検索で出てきたページをもうちょっと読んでみようと思います。
では。お騒がせしました。
701デフォルトの名無しさん:2006/07/08(土) 12:22:17
>>696
ありがとうございました
702デフォルトの名無しさん:2006/07/08(土) 16:44:25
>>699
2行目は余計。
703デフォルトの名無しさん:2006/07/08(土) 16:46:14
間違えた。
>>699
× 2行目は余計。
○ 3行目は余計。
704デフォルトの名無しさん:2006/07/08(土) 17:00:23
>>698>>702-703が馬鹿なだけだろ
705デフォルトの名無しさん:2006/07/08(土) 17:40:42 BE:309540375-#
ワラワラ
706698:2006/07/08(土) 17:44:00
ID出ない板で言っても空しいですが>>702-703さんは私じゃないです。
707デフォルトの名無しさん:2006/07/08(土) 18:12:58
ワラワラ
708デフォルトの名無しさん:2006/07/08(土) 23:43:47
>>707
やめろ698
709デフォルトの名無しさん:2006/07/09(日) 06:32:14
シクシク
710デフォルトの名無しさん:2006/07/09(日) 07:17:58
あるサイトで
#!/usr/bin/perl -w
use Tk;
use Tk::JPEG;
$mw = MainWindow->new;
$mw->title("JPEG image");
# キャンバスを定義
$can = $mw->Canvas(-width => 200,
-height => 200)
->pack();
# GIFイメージの読み込み
$stop_sign = $mw->Photo(-format => 'jpeg',
-file => "stop.jpg");
# イメージの描画
$can-> createImage(100, 100, -image => $stop_sign);
#
MainLoop;

というサンプルを見つけたのですが実行しても
Tk::JPEG object version 800,023 does not match $Tk::JPEG::XS_VERSION 800,024 at
C:/Perl/lib/DynaLoader.pm line 225.
というエラーでが出て動きません
どうすればいいのでしょうか
711デフォルトの名無しさん:2006/07/09(日) 07:22:26
質問です。
条件文の配列を
$list=($a > 5,$b =~ /a/,$c <= 300)
として、これを気持ち的にはif($list[0]){〜〜}、if($list[1]){〜〜}という風に
使いたいのですが、うまくいきません。
条件文の配列の要素(=条件)をプログラム中で使いたいのですが、どうすればいいのですか?
712デフォルトの名無しさん:2006/07/09(日) 07:41:16
eval
713デフォルトの名無しさん:2006/07/09(日) 07:55:16
>>712
具体的にIF文の条件として使うときはどうすればいいんですか(´・ω・`)?
714デフォルトの名無しさん:2006/07/09(日) 08:07:55
my @list = ('$a > 5', '$b =~ /a/', '$c <= 300');
if (eval($list[0])) { }
if (eval($list[1])) { }

でも絶対、考え方が間違ってる。普通はこんな事必要ない。
あと、頼むから例だとしても $a と $b は使わないで・・・。
715デフォルトの名無しさん:2006/07/09(日) 08:30:44
>>714
レスありがとうございますm(_ _m)
>$a と $b は使わないで・・・。
すいません・・。

> my @list = ('$a > 5', '$b =~ /a/', '$c <= 300');
>if (eval($list[0])) { }
>if (eval($list[1])) { }

>普通はこんな事必要ない。
まじっすか。IF文に色んな条件を使いたいときはどうすればいいんですかね・・?
これ参考にしたんですが、何故かうまくいきません・・。
716デフォルトの名無しさん:2006/07/09(日) 08:35:02
>>715
> まじっすか。IF文に色んな条件を使いたいときはどうすればいいんですかね・・?

サブルーチンにする
717デフォルトの名無しさん:2006/07/09(日) 08:50:05
>>716
色々ありがとうございます。

ちなみに$a > 5の条件についてはうまくいくんですがパターンマッチの条件$b =~ /a/
はうまく機能してないみたいです・・・。何故だ・・・・orz
718デフォルトの名無しさん:2006/07/09(日) 09:21:48
あなたが自身のソースをここへ書きだした方が
見ている人もつっこみがしやすいと思うのだが
719デフォルトの名無しさん:2006/07/09(日) 09:32:43
my @list = (
  {'predicate'=>\&is_greater, 'param1st'=>5},        # param1st > param
  {'predicate'=>\&is_match_substr, 'param1st'=>'a'}, # param =~ /param1st/
  {'predicate'=>\&is_less_equal, 'param1st'=>300} ); # param1st <= param
my $n = 10;
my $s1 = 'cat';
my $s2 = 'dog';
if(evaluate($list[0], $n)){ print "TRUE\n";}else{print "FALSE\n";}
if(evaluate($list[2], $n)){ print "TRUE\n";}else{print "FALSE\n";}
if(evaluate($list[1], $s1)){ print "TRUE\n";}else{print "FALSE\n";}
if(evaluate($list[1], $s2)){ print "TRUE\n";}else{print "FALSE\n";}
exit;
sub evaluate{$_[0]->{predicate}($_[0]->{param1st}, $_[1])}
sub is_less{$_[0] < $_[1]}
sub is_less_equal{$_[0] <= $_[1]}
sub is_greater{$_[0] > $_[1]}
sub is_greater_equal{$_[0] >= $_[1]}
sub is_match_substr{
  my ($pattern, $str) = @_;
  return 1 if $str =~ /$pattern/;
}
720デフォルトの名無しさん:2006/07/09(日) 09:39:30
汚いソースだな。。。
CPANにあるValidator系のモジュールのソースを利用するんじゃだめなの?
721デフォルトの名無しさん:2006/07/09(日) 09:45:34
lisp,scheme向けなんじゃないかと
722719:2006/07/09(日) 09:47:17
訂正。

sub is_match_substr{
my ($pattern, $str) = @_;
$str =~ /$pattern/;
}

こうだな。
723719:2006/07/09(日) 09:47:53
ちなみに719は、質問者じゃないっす。
724デフォルトの名無しさん:2006/07/09(日) 10:15:20
>>711
条件文を配列にしなければ上手く行かない仕事というのが
全く思いつかないんだけど?(コンパイラでも作ってるんで無いかぎり・・・
725デフォルトの名無しさん:2006/07/09(日) 10:20:49
if(evaluate($list[0], $n)){ print "TRUE\n";}else{print "FALSE\n";}
if(evaluate($list[2], $n)){ print "TRUE\n";}else{print "FALSE\n";}
if(evaluate($list[1], $s1)){ print "TRUE\n";}else{print "FALSE\n";}
if(evaluate($list[1], $s2)){ print "TRUE\n";}else{print "FALSE\n";}

こんなになってる段階で配列にした意味などないわけだが、
どうしてもやるならサブルーチンリファレンスの配列にする方が
いくない?
726719:2006/07/09(日) 10:37:22
それは動作確認用のテストコード。
なんで配列にするかは知らない。質問者に聞いて。
727デフォルトの名無しさん:2006/07/09(日) 11:12:44
条件文が100万くらいあるんじゃね?
728デフォルトの名無しさん:2006/07/09(日) 11:47:05
考えられる可能性
1)条件文が100万入ってる内容のファイルを受け取って、それを処理しなければならない
2)自動的に条件文が生成されるスクリプトを作った
3)単にそういう風に書いて見たい気がした

3)だったら、考え直す事をおすすめする
729デフォルトの名無しさん:2006/07/09(日) 20:14:01
sub evaluate {
 my $list = shift;
 my %_eval;
 while( my( $key, $value ) = each %$list ){
  $_eval{$key} = 1 if $value->(@_);
 }
 return %_eval;
}

my $list = [
 a => sub{ $_[0] > 5 },
 b => sub{ $_[1] =~ /$_[0]/ },
 c => sub{ $_[2] <= 300 },
];

evaluate( $list, $_a, $_b, $_c );

は?
730デフォルトの名無しさん:2006/07/09(日) 21:33:06
729です。

sub evaluate {
 my %list = @_;
 my %_eval;
 while( my( $key, $value ) = each %$list ){
  $value->{sub}->() if $value->{eval}(@_);
 }
}

evaluate(
 a => { 'eval' => sub{ $_[0] > 5 }, 'sub' => sub{ ... } },
 b => { 'eval' => sub{ $_[1] =~ /$_[0]/ }, 'sub' => sub{ ... } },
 c => { 'eval' => sub{ $_[2] <= 300 }, 'sub' => sub{ ... } },
);

かな?
出来なくはないが>>728に同意


は?
731デフォルトの名無しさん:2006/07/09(日) 21:34:46
sub evaluate {
 my %list = @_;
 while( my( $key, $value ) = each %list ){
  $value->{sub}->() if $value->{eval}(@_);
 }
}
だな。
732デフォルトの名無しさん:2006/07/09(日) 21:38:10
質問です

1,山田,20,男
2,田中,23,女
...
という様なテキストファイルを読み込んで,
%id1 (
id=>1,
name => "山田",
age =>20,
sex => "男",
);

%id2 (
id=>2,
name => "田中",
age =>23,
sex => "女",
);

となる様な%id?というハッシュ変数に代入したいのですが,
@list_oneline =("1,山田,20,男", "2,田中,23,女"...);
とした後どうしたら良いかわかりません.

なにかヒントをいただけないでしょうか?
733デフォルトの名無しさん:2006/07/09(日) 21:42:13
946 名無しさん@お腹いっぱい。 [sage] 2006/07/09(日) 21:07:41 ID:+71JwTPW

         ハ,,ハ  
        ('(゚∀゚∩_ おいらをどこかのスレに送って!
      /ヽ   〈/\ お別れの時にはお土産を持たせてね!
     /| ̄ ̄ ̄|.\/
       | .モツ煮..|/
        ̄ ̄ ̄
現在の所持品:たばこ他48品圧縮.zip・どようび・ドエット
糞スレ・rigel・ギコペ・Jane・ニンバス2000 ・霊的な力
greensleeves
734デフォルトの名無しさん:2006/07/09(日) 21:58:49
>>732
%id1, %id2, ... というハッシュに代入するのは、うまいやり方とは言えません。

以下のように、ハッシュの配列を用意した方が処理が簡単だと思います。
@id = (
 {
  id => 1,
  name => "山田",
  age => 20,
  sex => "男",
 },
 {
  id => 2,
  name => "田中",
  age => 23,
  sex => "女",
 },
 ...
);
それぞれは、$id[0], $id[1] などで取り出せます。
データ内のidの値と配列添字を一致させたいなら、先頭要素を空にして下さい。
735デフォルトの名無しさん:2006/07/09(日) 22:04:10
>>734
なるほど,ハッシュの配列という操作の仕方があるのですか.
確かにその方がわかりやすくなりますね.

ありがとうございます.早速試してみます.
736デフォルトの名無しさん:2006/07/10(月) 13:48:00
ハッシュリファレンスの配列だからな。
737デフォルトの名無しさん:2006/07/10(月) 18:27:59
>>691
やはりだめでした・・画像真っ黒のものが出力されました・・
エラーログをおってみようとおもってますが、レンタルサーバゆえすぐ出力されないのか
そもそもエラー判定されてないのかログ拾えてません。

ちなみに最初にのせたロジック単体CGIでテストしてますorz
738デフォルトの名無しさん:2006/07/10(月) 18:54:00
ulimitでもかけられてるんじゃないの?
739デフォルトの名無しさん:2006/07/10(月) 20:11:05
>>738
レンタルサーバなのですが、それがかかってるのが原因だとしたら
その時点でアウトでしょうか・・
740デフォルトの名無しさん:2006/07/10(月) 20:32:22
本当にそれが原因なら打つ手なしだねぇ。
共有型のレン鯖では、ulimitかけるのが普通だろうし。
コマンドライン使えるなら、ulimit -a してみたら?
黒画像が出てくるってのは謎だけど。
741デフォルトの名無しさん:2006/07/10(月) 23:19:19
>>739
20日近く経って未だに何が起きているのか確認できてないなら、
ulimit がかかってなくても打つ手なし。

use Image::Magick;
my @msg;
my $new_image = Image::Magick->new;
push @msg,"$new_image";
push @msg,$new_image->Read("./test.jpg");
my ($width,$height) = $new_image->Get('width','height');
push @msg," <- ($width,$height)";
push @msg,$new_image->Write("jpeg:./test2.jpg");
($width,$height) = (860,int($height * 860 / $width)) if $width>860;
push @msg," -> ($width,$height)";
push @msg,$new_image->Scale(width=>$width,height=>$height);
push @msg,$new_image->Write("jpeg:./test3.jpg");
undef $new_image;
binmode STDOUT;
print "Content-Type: text/plain\r\n\r\n";
print $_,":",$msg[$_],"\n" for ($[..$#msg);
exit;

後、djpeg が使えるかどうか確認してみ。
742デフォルトの名無しさん:2006/07/11(火) 00:25:43
お前ら知ってたかい?
RFCでワード検索するときPerl使ってるんだぜ!?
743デフォルトの名無しさん:2006/07/11(火) 02:01:48
へーぇ!
744デフォルトの名無しさん:2006/07/11(火) 07:54:09
threadを使って負荷計測ツールを作ろうとしています。

ttp://www.drk7.jp/MT/archives/001059.html
にあるスクリプトを元に…と思い、
このスクリプトのdoTaskのevalとdieの行をコメントアウトして実行してみたのですが、
なぜか終了してくれません。

topで見てみると33のスレッドが残っていて(最大は103くらいまで増えていました)、
752行出力されたところでとまってしまっているようです。
皆さんの環境でも同じようになるのでしょうか。
こうなる原因も教えてもらえるとうれしいです。
745デフォルトの名無しさん:2006/07/11(火) 16:15:45
perlを学びつづけることの意義が揺らいでいる
最近やっとCPANのコードを読んだりして勉強するようになったが
あまりのコードの可読性の悪さにぷっつんした
もはやシンタクスシュガーなんて呼べないような不定形なコードの山
わけのわからないモジュール使って、そのモジュールもわけのわからない
モジュールのエンドレス
考えてみたらperl5はもう十年以上も進化止まってるんだよな
もうperlのメリットなんてハッシュと正規表現が言語レベルで組み込まれてることだけだよな

さりとて今更rubyなんて死んでも言えない
746デフォルトの名無しさん:2006/07/11(火) 16:26:05
>>745
PHP厨乙。
747デフォルトの名無しさん:2006/07/11(火) 16:30:36
言語の基本部分なんてそう変化しないものだ。そんなことを言ったら
CもJavaも進化止まってるよ。

でも10年前に俺が書いてたperlのコードと今のコードじゃぜんぜん違う。
10年前は素朴にベタ書きCGIだったのがいまやCatalyst(+TT+DBIx)
だからなぁ。そういう意味では進化しているとも言える。

とはいえ別に強制するようなもんじゃないしrubyがよけりゃrubyでも
いいんでねーの?
748デフォルトの名無しさん:2006/07/11(火) 16:32:13
>>745
そう感じたのなら君にはPerlは合わなかったという事だろう。
合わない言語を無理して学ぶこともあるまいよ。
# 合う人には読みやすいんだよ
Python辺りに行ってみれば?英語圏ではPerlよりも人気だぞ

大量にuseされるモジュールの山は…確かにある程度覚えるまで大変だった記憶があるが…
ああ、strictすら何をするものかわからなくて追っかけたら、
さらにCarpが出てきて厭になったのは懐かしい。
今でこそモジュール名を聞いただけでそれが何かわかるし、
わからずとも調べる術を知っているから苦にもならないがなぁ。
749デフォルトの名無しさん:2006/07/11(火) 16:43:29
クラスの継承はuse baseと@INC両方可能なんですか?
750デフォルトの名無しさん:2006/07/11(火) 16:48:12
>>749
@INCじゃなくて@ISAのことだと思うが、どちらでも可能。
ただしuse baseは@ISAの設定以外にもいくつかのことを
やってくれるので詳しくはperldoc base読め。
751デフォルトの名無しさん:2006/07/11(火) 17:03:21
>>745
本体に取り込まれてるのやよく使われるモジュールでも可読性が悪いのがあるのは確か。
そういったモジュールはbug潰し等の理由がない限りpodを読んで使い方だけを覚えたほうがいい。
コードの勉強が目的ならそういったモジュールではなくコードをきれいに書く作者を見つけてその人のCPANモジュールで勉強したほうがいい。

>考えてみたらperl5はもう十年以上も進化止まってるんだよな
これは単純に勉強不足だな。
英語が苦手だからってドキュメント読んでないのでは?
752デフォルトの名無しさん:2006/07/11(火) 17:55:23
そろそろ、無名関数では (caller(0))[3] で CV_REF を取り出せるようになっても
良い頃だと思う。
753デフォルトの名無しさん:2006/07/11(火) 23:56:52
Perl6はいつ出るんでしょうか?
ラクダ本はPerl6から3分冊されるかもとラリーが冗談半分に行ってたのですが。
754デフォルトの名無しさん:2006/07/12(水) 01:35:45
>>753

クリスマス。
ただし何年のかはわからないw

Ruby 2.0と一緒のリリースになったりしてな。
755デフォルトの名無しさん:2006/07/12(水) 02:20:42
合う合わないなんてあるの? 必要だからやるだけだが
756デフォルトの名無しさん:2006/07/12(水) 07:17:45
>>755
世の中には幸運にも好きな言語だけ勉強すればいい奴もいるわけです。
羨ましいだろ。
757デフォルトの名無しさん:2006/07/12(水) 12:41:09
cでは
char x = 'a';
printf("%02x",x);

result:61

だけど
perlでは
my $x = 'a';
printf("%02x",x);

result:00

になるsprintfでも同様です
perlではunpackじゃなきゃだめなの?
758デフォルトの名無しさん:2006/07/12(水) 13:19:25
>>757
何をしたいんだ?
759デフォルトの名無しさん:2006/07/12(水) 13:19:44
>>757
unpackしなきゃだめ。

そのsyntaxだと数値として解釈されてるんで、
'a' を数値と解釈しようとして0になっている。
その代わり $x = '123' とかが可能になる。
760デフォルトの名無しさん:2006/07/12(水) 13:25:36
>>757
ord() ってのもある。
unpack('C', $x) と ord($x) は同じ。
$x が 2 文字以上の場合は先頭の 1 文字に対してだけ処理される。
761デフォルトの名無しさん:2006/07/12(水) 13:27:11
>>757
> printf("%02x",x);

printf("%02x",ord($x));
762757:2006/07/12(水) 13:33:47
>>758
perlではfileをopenして読み込むときに
crlfがlfに変換されるというので、それを
確認したかった
printでファイルへ書き戻すと今度はlfが
crlfに戻されるため確認するにはperl中で
するしかないが、単純にprintしても改行
コードが何であるかは確認できないため
dumpしたかった
763デフォルトの名無しさん:2006/07/12(水) 13:35:36
>>759-761
ありがとう
できました

それにしてもunpackて奥が深いよね
764デフォルトの名無しさん:2006/07/12(水) 13:48:03
忌むべき邪悪フレーズ「奥が深い」
765デフォルトの名無しさん:2006/07/12(水) 13:50:07
>>762
ていうか改行はOSに合わせて変わるんじゃないか?
(Mac だと CR だけになったりしないか?)
で、その辺気にしなくてもいいように binmode や open での layer 指定がある。
766デフォルトの名無しさん:2006/07/12(水) 13:52:26
>>762
@ascii = unpack('C*', $string);
した方がアレだがまあいい。
767デフォルトの名無しさん:2006/07/12(水) 14:12:15
>>751
CPANでいいソースみたことない。
非常に興味があるので、きれいに書く作者を一人でもいいのでおすえてほすぃ。
768デフォルトの名無しさん:2006/07/12(水) 14:13:46
$line = <$fh>;
はファイルハンドルから$/の値まで($/の値を含む)を
取り出しますが
$/は通常\n(0a)に設定されてますよね?

で、この状態でバイナリファイルを読み込んだら当然
バイナリファイル中の0aで区切られますが、そのバイナリ
ファイル中の0aの出現頻度はばらばらで、たとえば
binmode($fh);
@line = <$fh>;

としたら@line中の各要素の長さは皆ばらばらになってしまいます
かといってslurpしちゃうのはバイナリなんでありえないです

ということで、バイナリを読み込むときってsysreadとかreadじゃ
なきゃだめなの?

なんとか普通の<>の形式でやる方法ってないですか?
769767:2006/07/12(水) 14:23:28
>>745
あっ、漏れPerlもやってるけどRubyもやってる。
双方にいいものを持ってると思う。

PerlやってればRubyは非常にとっつきやすいので「今更」などといわずやってみては?
Rubyのブロックの考え方を学ぶと、Perlでも他の言語でも応用できるし色々考えが広がるよ。
770767:2006/07/12(水) 14:33:44
>>768
バイナリの中でありえないと思われる文字列を$/に設定しておけばできることはできる。

$/ = "奥さん!奥さぁん!";
$line = <$fh>;

この場合「奥さん!奥さぁん!」という文字列があるとまあ駄目なのだが。
あと速度面を考えるとsysreadとかreadの方がいいかもしれない。
<>は内部的には「奥さん!奥さぁん!」という文字列を検索する処理が走ると思うので。

むっ?よく考えたら$/にundefを設定すればいいのか?
771デフォルトの名無しさん:2006/07/12(水) 14:43:55
perlvarよく読め。

$/をundefにするとeofまで読む。
$/に整数のリファレンスを入れるとその整数のサイズまで読む
772デフォルトの名無しさん:2006/07/12(水) 14:51:19
>>768
> かといってslurpしちゃうのはバイナリなんでありえないです

あり得なくはない。

> ということで、バイナリを読み込むときってsysreadとかreadじゃ
> なきゃだめなの?

長さをそろえたいのなら、むしろsysread/readを使いたがるのではないのか?
773768:2006/07/12(水) 15:23:47
>>770
・・・

>>771
$/=\3333;
みたいなのをレコードモードっていうんですね
こんな素敵な使い方があるなんて感動です
さんくす
774767:2006/07/12(水) 15:57:24
>>770
>・・・
ちょwwwなにその冷ややかな態度ww俺カワイソスwww
775デフォルトの名無しさん:2006/07/12(水) 16:21:06
さぁ!今日から念願のラクダ本を読み始めたぞ!
しかしこの本分厚いなぁちっともページが進まん
今日学んだことを忘れないうちに書き記しておこう!

7/12 晴れ
・ラリーは本田アコードに乗っている
776デフォルトの名無しさん:2006/07/12(水) 16:59:32
以前ハッシュ変数の配列を教えて頂いた者です.
CGIの一部ですが,Perlの問題だと思うのでここで質問させて下さい.

投稿フォームがあるCGIから送信されたデータをuse CGIで,以下の様に受け取っています.
$value_id3 = $form->param('yourid3');
ここで,$value_idnにはyesが入るか空です.

しかし,yourid1,yourid2,yourid3...と個数が定まらないし,効率が悪いので,
@value_id = (
{
ID = 1,
value = 'yes',
},
{
ID = 2,
value = '',
},
...
);
となる様にwhile文を回そうと思うのですが,
while (*1*) {
$value_id[$cnt]{ID} = $cnt;
$value_id[$cnt]{value} = $form->param('yourid*2*')
$cnt++;
}
*1*と*2*の箇所で悩んでいます.
*2*はシングルクオートの中に$cntの様な変数は入れられませんよね?
どうするのが賢い方法なのでしょうか.
777デフォルトの名無しさん:2006/07/12(水) 17:20:11
>>776
根本的に考え方を変えたら?
そもそもparamで 'youridX' みたいにXにIDが入ってるのが間違ってる。
前も変数名にIDが入ってた。
IDをそういう所に入れる考え方を変えないと、いつまでも効率悪い。

@value_id としてるのも、ただのハッシュで(keyがID)
%value_id = (
 1 => 'yes',
 2 => '',
 ...
);
みたいな構造にしても良いし、ただの配列で作っても良い。
@value_id = (
 '',
 'yes', # <-- ID:1
 '', # <-- ID:2
 ...
);
ハッシュの配列教えてもらったからって、全部それで行けという訳じゃない。
778776:2006/07/12(水) 17:43:59
>>777
はい,たしかに考え方(組み方)が悪いと思います.
もう少しPerlでの処理に向いた方法を考えて組むべきですね.

何をどう変数と置くかなど,もう一度考えてみたいと思います.

ありがとうございます.
779デフォルトの名無しさん:2006/07/12(水) 23:50:29
>>778
人間にとってはコードを読み解くヒント。
処理系にとってはメモリ領域を特定するための単なる符号。

それが変数名。

通常変数名はハードコードされているので、変数名に基いた処理がある、ということは即ちマジックナンバーをコード中至る所にばらまいていることになっちゃうんですよう。たいへんきもちわるいよう
780酩酊 ◆TWARamEjuA :2006/07/13(木) 00:25:35 BE:1742382-#
CamelBones1.0.0記念♪

と宣いつつ、スレッドはないのね、、、
781デフォルトの名無しさん:2006/07/13(木) 00:27:29
>>778
なんのCGIかは知らんが、yes、no選択のアンケート質問系CGIなら、
'youridX'とかせず、質問の内容をIDにするといいよ。
'ILoveJackson' => 'no'とか。
ループでやりたいなら、1とか3とか数字IDつけるしかないが。

それにしても句読点がプログラマっぽい。
782デフォルトの名無しさん:2006/07/13(木) 09:13:14
>>781
>それにしても句読点がプログラマっぽい。
阿呆っぽいの間違いだろ?
783デフォルトの名無しさん:2006/07/13(木) 10:41:35
マジレスすると理系っぽい、だろ?
784デフォルトの名無しさん:2006/07/13(木) 11:11:26
「教師っぽい」じゃねえの
785デフォルトの名無しさん:2006/07/13(木) 11:33:21
すみません質問させてください。
public_html以下にディレクトリを作成したいのですが
mkdirする場合public_htmlに書き込み権限を与えないとできませんか?
786デフォルトの名無しさん:2006/07/13(木) 11:37:38
むしろ書き込み権限がないのに書込みできたら
あなたはどう思うのか俺は知りたいぞ
787デフォルトの名無しさん:2006/07/13(木) 11:40:19
>>786
ありがとう。
だとすると、ディレクトリやcgiファイルなどを新たに作ることは不可能?
(権限与えると可能だけどセキュリティ上不可能?)
788デフォルトの名無しさん:2006/07/13(木) 11:42:20
>>785
それはperl固有の話ではないが、書き込み権限は必要。
789デフォルトの名無しさん:2006/07/13(木) 11:43:46
>>787
日本語でok
790デフォルトの名無しさん:2006/07/13(木) 11:48:50
それperlに関係する内容ですか?
俺にはOS,システム管理の話にしか思えないのですが
どう関係すると思って書き込んでるのか
頭の悪い俺にもわかるように教えてください。

あとpublic_htmlってとこからperlのスクリプトを
httpdから利用と推察するのだがあなたは
>>1のテンプレを読んでないのでしょうか?
791デフォルトの名無しさん:2006/07/13(木) 12:07:01
初心者スレの491だろ。聞いてる内容もいまいち意味不明なところも一緒だ。
あっちで相手にされないからこっちに来たんだろうが、まずまともな質問が
できるようになるまで勉強してから出直した方がいいと思われる。
792デフォルトの名無しさん:2006/07/13(木) 12:31:27
マルチポストかよ
793785:2006/07/13(木) 13:21:02
>>788-790
ありがとう

>>791
初心者の491って?意味不明

なんかマルチ扱いされて迷惑っぽいので
一応、解決済み(マルチ)ってことで終わります。
794デフォルトの名無しさん:2006/07/13(木) 13:24:50
図星かよw
795デフォルトの名無しさん:2006/07/13(木) 14:28:31
>>793
>>791

>初心者の491って?意味不明
http://pc8.2ch.net/test/read.cgi/php/1151250398/491
しらばっくれるな。どうみてもお前だろ。
796デフォルトの名無しさん:2006/07/13(木) 14:35:58
マルチ虚言者
797デフォルトの名無しさん:2006/07/13(木) 14:38:36
もうこないって言うんだから放っておいてやれよ。

それより次の質問マダー( ・▽・)っ/凵⌒☆チンチン
798デフォルトの名無しさん:2006/07/13(木) 14:42:12
Class::Accessor て面白いな。よーし、パパPerlでOOPしちゃうぞ〜。
799デフォルトの名無しさん:2006/07/13(木) 15:54:49
>>798
どこがおもしろんだよ?
たんにsetterとgetter作るだけじゃねぇか
保守の観点からしてClass::Accessorはぼつだろ
800デフォルトの名無しさん:2006/07/13(木) 16:59:01
>>799
それなんてギャグ?
801デフォルトの名無しさん:2006/07/13(木) 17:01:04
>>800 つ799はOOPができない
802デフォルトの名無しさん:2006/07/13(木) 17:11:40
>>798
Rubyでも使ってろ。
803デフォルトの名無しさん:2006/07/13(木) 17:22:28
ねぇ、OOP書けないんだって?
        ∩___∩                     ∩___∩      ねぇ、なんでできないの?
    ♪   | ノ ⌒  ⌒ヽハッ    __ _,, -ー ,,    ハッ   / ⌒  ⌒ 丶| ♪どうしてどうして?   
        /  (●)  (●)  ハッ   (/   "つ`..,:  ハッ (●)  (●) 丶   ねぇ、どうして?
       |     ( _●_) ミ    :/       :::::i:.   ミ (_●_ )    |       
 ___ 彡     |∪| ミ    :i        ─::!,,    ミ、 |∪|    、彡____    
 ヽ___       ヽノ、`\     ヽ.....:::::::::  ::::ij(_::●   / ヽノ     ___/
       /       /ヽ <   r "     .r ミノ~.    〉 /\    丶      
      /      /    ̄   :|::|    ::::| :::i ゚。     ̄♪   \    丶    
     /     /    ♪    :|::|    ::::| :::|:            \   丶     
     (_ ⌒丶...        :` |    ::::| :::|_:           /⌒_)     
      | /ヽ }.          :.,'    ::(  :::}            } ヘ /        
        し  )).         ::i      `.-‐"             J´((
          ソ  トントン                             ソ  トントン   

正直なんで「Rubyでも使ってろ。」なのかわからん。
おまえこそperldoc perlbootを読め
804デフォルトの名無しさん:2006/07/13(木) 17:26:09
>>799
>保守の観点からしてClass::Accessorはぼつだろ
どう考えても逆だろ???
こっちつかったほうが可読性がいいぞ。
毎回毎回手書きでアクセサーを書いてるの?
805デフォルトの名無しさん:2006/07/13(木) 17:29:38
んー、Ruby知るとPerlのClass::Accessorはダサいと思ってしまうのは確か。
そういうモジュールがあるだけ便利だけどね。
806デフォルトの名無しさん:2006/07/13(木) 17:36:51
Class::Accessorを使うと保守性が悪いって話から
どう飛躍するとRubyとPerlの比較になってるのだろう。
意味分からん。
Rubyがいいのは分かってるけど
それとClass::Accessorは保守性が悪いってのは関係なくね?
807デフォルトの名無しさん:2006/07/13(木) 17:39:38
>>799

Class::Accessorを使うとなんで保守性が悪くなるのか教えて
808デフォルトの名無しさん:2006/07/13(木) 17:39:44
Ruby厨が紛れ込んでいる模様。
809デフォルトの名無しさん:2006/07/13(木) 17:47:41
まぁPerlのOOPがアレなのは今に始まった事じゃないから
しょうがないのでは。
オブジェクト作った後で、bless使ってクラス変えられちゃったりとか
なかなか面白いけどね。
810デフォルトの名無しさん:2006/07/13(木) 20:38:31
で、結局Class::Accessorを使ったほうが
保守性が悪いって話は>>799の妄言?
811デフォルトの名無しさん:2006/07/13(木) 21:09:10
>>810
好みによる。
812デフォルトの名無しさん:2006/07/13(木) 22:43:18
Class::Accessorって?最近入った標準モジュール?
俺が持ってるPerl5.003では使えないので却下。
813デフォルトの名無しさん:2006/07/13(木) 22:53:22
古いバージョンなら使えるぞ
814デフォルトの名無しさん:2006/07/13(木) 23:34:06
>>812
うわ古!!
まだそんな化石のようなバージョン使ってる奴いるの!?
可哀想に。。。






jcode.plとか使ってがんばっちゃってる状態を想像すると失笑ものだねw
815812:2006/07/14(金) 00:04:30
>>813
ダウンロードして組み込むのが、ダルイんです…。

>>814
バージョンによって動かなくなるようなPerlスクリプトを書くのは嫌いなのさ。
816デフォルトの名無しさん:2006/07/14(金) 00:11:46
>>815が書くスクリプトはバージョン1のperlから動くんですか!?すげーw ぜひそのソースを見てみたい
817デフォルトの名無しさん:2006/07/14(金) 00:13:30
お前らそんなに煽るなよ;
まぁ別にOOPしないんならどんなバージョンでもいいんじゃね?
バリバリOOPしたいんなら最新のほうが何かと便利だが
818デフォルトの名無しさん:2006/07/14(金) 00:16:16
>>815
jcode.pl使っててUTF8とかに変換したいって
要望があったときどうしてるのかが気になる。
819デフォルトの名無しさん:2006/07/14(金) 00:20:05
KENT?
820デフォルトの名無しさん:2006/07/14(金) 00:23:00
セキュリティホール開けまくり危険スクリプト配布所に頼るのか
821デフォルトの名無しさん:2006/07/14(金) 00:27:12
横レス。
>>818
perl 使いにはエンコーディングと無縁な人間も
いることを知っといた方がいい。
データ解析系だと保守契約の絡みもあってそうそう
command の ver. up なんぞやってくれんのよ orz...

ちなみに俺んとこは perl 5.004 @ solaris
822デフォルトの名無しさん:2006/07/14(金) 00:27:48
KENTはperl4だから論外だろう
823デフォルトの名無しさん:2006/07/14(金) 00:30:32
無料レンタルサーバーだと、いまだに5.00系のところもあるね。
824デフォルトの名無しさん:2006/07/14(金) 00:30:59
おまえらそんなに812を苛めるなよ。
812はWindows3.1で動かないWin32アプリを否定して
Windows3.1でがんばってるんだから
乙の一言ぐらいねぎらいの言葉投げてやれよ!!

でも799=812だとしたら保守性と
ポータビリティを勘違いしている痛い奴だな。
825812:2006/07/14(金) 00:34:45
>>816
ああ、これは書こうと思ったけどだるかった。さすがに4.0以下は考えてないよ…。
でも、5.003もtie関数が一部実装されてないのでさすがに挫折して最近、5.005と5.008入れたんだっけか…。

>>818
ああ、それも書こうと思ったけどだるかった。
jcode.plを使ってUTF-8にしたいってことはCGIだと思うけど、
最近はソースコードをUTF-8にしてるのであんま使ったことないんだよね。
opendirした時くらいか。使ったの。
826デフォルトの名無しさん:2006/07/14(金) 00:35:40
>>821,823

812は「俺が持ってるPerl5.003では使えないので却下」と仰せで
ISPで提供されているのがそうだとか
保守契約先のマシンがそうなってるとかではなく
自分のマシンに自ら進んで5.003を入れている口ぶりです。
827821:2006/07/14(金) 00:42:30
>>826
そうみたいですね。エンコーディングの方もやってらっしゃる
みたいだし。俺のレスは単なる的外れw
828812:2006/07/14(金) 00:42:59
>>824
さすがにWinXPだが。799=812じゃないな。

>>826
うーんISPもあるが、以前、自分のマシンで動いて、
会社のsolarisで動かなくて手痛い目にあったので、
古いバージョンでも動かしてみる癖がついたのだが。
829デフォルトの名無しさん:2006/07/14(金) 00:43:48
>>825
別に文字コードを変換するのはWEB処理に限ったことではないのだが。
で、ソースコードをUTF8で書いているということはすでに5.005以下で動かないわけで
自分が利用しているバージョンとはあわないと812でおっしゃてるのと
とても話が矛盾しまくりんぐなわけでその辺はどうなってるのでしょうか?
ただ煽りたかっただけ?
830799:2006/07/14(金) 00:47:11
>>807
だから、世の中にはClass::Accessorなんて知らない
奴がたくさんいるってこと
そういう奴がClass::Accessor使ったコードをいじりだし
たらどうなると思う?
perlのOOはただでさえ奇妙なのに、それをさらにモジュール
で隠蔽しようとしたら、もうぐちゃぐちゃだろうが
たんなるset,get関数の定義をしているコードだったら
Javaしか使ってないやつにもすんなり理解できる
CPANのdocumentくらい嫁って思うだろうが
たんにsetter,getter自動で作るだけのモジュールの使い方を
いちいちdocument読んで保守するのは間違いのもとじゃないのか?
ダミアンだってbest practiceで
「可能な限りperl組み込みか標準モジュールで済ませろ!」
て書いてあるじゃないか
単にコード2,3行書く手間を減らすためだけに標準じゃないモジュール
使うんじゃねぇ!ってこと
Class::Accessorが標準モジュールに組み込まれたなら話は変わるけど
今はそうじゃないだろ!
831799:2006/07/14(金) 00:50:18
それにClass::AccessorはBest Practicesに従うかどうかを
いちいち変更可能なんでしょ?
従えばちゃんとgetterとsetterが分離されるけど
何もfollow指定しないで使えば結合されちゃう
こんな糞モジュールはつかえんだろうが!
832デフォルトの名無しさん:2006/07/14(金) 00:53:05
ということは>>799
XMLを処理するのもDBにアクセスするのも
すべて標準モジュールと関数で処理してるんですね!!
すげーーーーーー。
833812:2006/07/14(金) 00:53:20
>>829
>ソースコードをUTF8で書いているということはすでに5.005以下で動かないわけで
動かない?ああ、まあ文字列処理するのならまともに動かないのでしょうね。
私の場合はPerlをCGIとしてよく利用するけど、UTF-8はERBのようなテンプレートファイル内に
すべて収めて出力するだけにとどめるので、.plの中ではUTF-8の文字列処理は一切しないので
動作しないなどの問題が発生したことはないです。
834しつこい799:2006/07/14(金) 00:56:15
モジュールやオブジェクトが最も考慮しなきゃいけないのは
インタフェースの不変性
だと思ってたんだけど、違うかな?
使う人によってインタフェースが変わっちゃうモジュールなんて
ふぁっきんふぉーゆー
835812:2006/07/14(金) 00:56:50
799はすごいな・・・。とってもすごいな・・・。モチツケと。
同じ時間帯に現れると俺の自作自演とか疑われるじゃねーか。
836799:2006/07/14(金) 00:57:17
>>832
ちゃんと読めよ
「可能な限り」
って書いてあるだろうが!
837デフォルトの名無しさん:2006/07/14(金) 00:57:46
>>812
ソースコードをUTF8で書いてるのと
UTF8で書いてあるファイルを開いて処理するのはかなり違いますよ。
「ソースコードをUTF8にしているので」って言われたら普通前者で受け取ると思うよ。
838799:2006/07/14(金) 01:01:32
なぁぶっちゃけお前らがClass::Accessor使ってる理由なんて
憧れのDan様や宮川さんやなおやが使ってるから、ボクも・・・
ってなとこなんだろ?
そういうジャニーズがかっこいいから俺もなんていう
くだらない思想をperlの文化に持ち込むんじゃねぇ!
839デフォルトの名無しさん:2006/07/14(金) 01:05:02
え? Class::Accessor 使わずにいちいちゲッタセッタ作ってるの・・・?
なにその給料泥棒
840デフォルトの名無しさん:2006/07/14(金) 01:07:05
いや 楽だから。
841デフォルトの名無しさん:2006/07/14(金) 01:07:31
>>836
あなたが拠り所にしている「可能な限り」というのは
結局線引きが不透明ではないですか?
PurePerlでもMySQLやPostgresやOracleへのアクセス可能ですよ?
結局はそういう線引きというのは関わる仕事・組織によって
ポリシーが異なるわけで、そこにあなたがあなたのポリシーで乱暴に
「保守性が悪くなる」とおっしゃるから否定的なレスがついてるのではないですか?
私は5.008以降を使うことが前提とされる組織にいるので
可能な限りソースの可読性を上げることがポリシーとされて積極的に利用しています。
また、利用したことによって第三者に文句を言われたこともありません。
842デフォルトの名無しさん:2006/07/14(金) 01:07:54
つーか Perl使いなら人の書き方にガタガタ文句つけんじゃねーよ
843デフォルトの名無しさん:2006/07/14(金) 01:12:00
>>841
同じように、勝手に自分とこの組織の話を持ち出されても困るんだが…。
別に他人のポリシーなんて違ってても構わないだろ。
perl4で書いてるKENTだって居るんだし。ほっとけよ。
844デフォルトの名無しさん:2006/07/14(金) 01:12:46
>>838
俺は別に子飼氏、宮川氏、伊藤氏になんら憧れなどは持っておりませんが。
ダミアンの名前を出して屁理屈をこねてるあなたのほうがいい加減に失せろ。
845799:2006/07/14(金) 01:15:33
>>841
だから、モジュールによっては可読性が向上しないってこと
xmlの解析とか、DBのインタフェースを抽象化するモジュールなら
確実に可読性は上がるけれどClass::Accessorがやっている
ことはそういった'ふつう'のモジュールとは違うでしょ
スクリプトのコード自体に変更を加えてるわけじゃん
そういっちゃ特殊なことをやってるのが果たして可読性を上げるの?
俺は初めてClass::Accessor使ってるコードみたとき
何やってんのかさっぱり理解できなかった
ドキュメント読まなくてもすらすら理解できるのが抽象化なんじゃないの?
846デフォルトの名無しさん:2006/07/14(金) 01:15:54
>>842-843
内容読んでる?スレの流れ読めてる?
799が最初に自分のポリシーを押し付けていちゃもんつけてるんだよ?
人が何していようが関係ないが、
さすがに言われもない内容で自分に因縁つけられれば反撃するでしょ
847デフォルトの名無しさん:2006/07/14(金) 01:18:00
>>845
> 俺は初めてClass::Accessor使ってるコードみたとき
> 何やってんのかさっぱり理解できなかった
そんなレベルかよ。。。
どうやら799のレベルが低すぎるから、みんなと話が噛み合っていないようです。
初心者なら初心者らしい振る舞いをした方がいいんじゃないかな。
848デフォルトの名無しさん:2006/07/14(金) 01:18:55
>>845
799はドキュメント読まないでもどんなモジュールでも使いこなすんだ。
へー、へー、へー。エスパーですね。とても真似できません。
ドキュメントも読まないではまったからってファビョってるなんてとても真似したくありません。
849デフォルトの名無しさん:2006/07/14(金) 01:19:59
     /\⌒ヽペタン
   /  /⌒)ノ ペタン
  ∧_∧ \ (( ∧_∧  おまいら
 (; ´Д`))' ))(・∀・ ;) おちけつ!!11
 /  ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O   ノ ) ̄ ̄ ̄()__   )
 )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
850799:2006/07/14(金) 01:23:21
>>848
あのね。誰もドキュメント読まずに「使いこなす」なんていってない
「理解する」といっている
>>847
初心者が洋書いちいち買うかよ
851デフォルトの名無しさん:2006/07/14(金) 01:28:02
>>845
Class::Accessorを使っててどんなコードを書けば
可読性が下がるのかとっても気になるぞ。
アクセサーが増えれば増えるほど比較したときに可読性に差がでるんだぞ。
それを「単にコード2,3行書く手間を減らすためだけに」とは・・・
コードを減らすのと可読性をあげるゴッチャにしてるし、ホントに大丈夫?
852デフォルトの名無しさん:2006/07/14(金) 01:34:20
>>850
なんで洋書を買えって話になるの?
日本語読めてる?日本語理解できてます?
普通にperldocでドキュメント読めばいいだけジャン?

それと「理解する」能力は有してるんですよね?
理解してるのに使いこなせないんですか?
それって理解してるっていえなくないですか?
ねぇ、マジでさあなたのみんなのレス読み直してみ。
話に論理性がないよ。ハッキリいってキミ頭おかしいよ。
853デフォルトの名無しさん:2006/07/14(金) 01:43:55
>>850
洋書買っただけで初心者脱出できる思ってるの?哀れだね。。。
854デフォルトの名無しさん:2006/07/14(金) 01:45:14
夏ってことかねぇ・・・
855デフォルトの名無しさん:2006/07/14(金) 01:52:23
使いたい人が使えば良いし、可読性が下がると思うなら使わなければ良い。自由。
ただ、他人に自分の意見を押し付けるのは良くない。他人の自由への侵害になるから。

とここまで思って、あれ? これ何かに似てるな と思ったら宗教論争だった。
宗教の自由は憲法で保障されてるわけだし、コーディングスタイルの自由も保障されればいいのにねw
856デフォルトの名無しさん:2006/07/14(金) 01:55:02
>>799のプログラムの汚さが想像できるな
857デフォルトの名無しさん:2006/07/14(金) 02:00:11
コーディングは書きたいように書けばいいのは同意。
ラリーだったかだれかもそんな感じの格言を残してるし。
ただ>>799のような自分のポリシーを押し付けてくる奴が
時々出現してファビョってスレに変な空気を残すからうざい。
858デフォルトの名無しさん:2006/07/14(金) 02:01:29
巻き添えを喰った812に合掌
859デフォルトの名無しさん:2006/07/14(金) 02:10:21
Class::Accessor って洋書を熟読しなきゃ理解できないような高等なものじゃないのだが。
そんな「簡単な」モジュールを使うのに、なにを躊躇うのか理解できない。
860デフォルトの名無しさん:2006/07/14(金) 02:13:03
もういいからこの話題やめようよ
861デフォルトの名無しさん:2006/07/14(金) 02:16:56
>>799>>847へのレスで
「なんで初心者がいちいち洋書買うかよ」というレスなのか理解不明。
そもそも洋書を買うより付属のドキュメントを読むのが先だろ。
このへんから799の異常性がかいまみえるな
862799:2006/07/14(金) 02:20:48
はぁ・・・おまえらこそ大丈夫かよ
>>855いったい俺のいっていることのどこが宗教だというのだ

>>853ダミアンの文章は通常のオライリーの他の洋書と比べて読みにくい
これをよみ通せるくらいなら初心者はとっくに脱していると思った

>>850
誰も洋書を買えなんていってないし話に一貫性なんて持たせてない


Class::Accessorのドキュメント読んでみたがやっぱりこれ欠陥品だろ
例えばsetするときに引数の妥当性のチェックができない
通常境界性のチェック等は呼び出す側じゃなくて呼び出される側の担当だろう
いくらperlが型付けされた言語じゃないからってこれは行き過ぎ
とここまで書いてドキュメントでOverriding autogenerated accessorsなんていう
項目が見つかった、あちゃあ

で、この項目読んだが、やはりおれの意見は正しかった
何この引数の妥当性のチェックのトリッキーなやり口は・・・
おいこら>>851これのどこが可読性高いんだよ
863デフォルトの名無しさん:2006/07/14(金) 02:23:38
>>799
洋書の話を脈絡も無く持ち出したのはおまえじゃんw
ニワトリより頭悪いなお前w
864デフォルトの名無しさん:2006/07/14(金) 02:28:03
>>799がファビョって「やはりおれの意見は正しかった」と根拠もなく述べていますw
みんながウザイおまえが逃げたと思ってまともなスレに戻そうとしてるのに
戻ってくんなよボケw
865デフォルトの名無しさん:2006/07/14(金) 02:28:24
>>862
何のためにsetとgetオーバーライドできると思ってんだよ
つーか setter getter毎回定義してぇんならJavaでもやってろよ
866デフォルトの名無しさん:2006/07/14(金) 02:29:59
>>799-864
「話に一貫性なんて持たせてない 」という書込みでわかるように
799の話には一貫性がなくその場その場を適当に繕って釣りをしているだけです。
もう799にかまうのはやめときましょう
867デフォルトの名無しさん:2006/07/14(金) 02:35:49
うわぁ、真性だ。
868デフォルトの名無しさん:2006/07/14(金) 02:36:07
いわゆる [sg]etter が必要な状況ってあんの?
869デフォルトの名無しさん:2006/07/14(金) 02:39:47
obj->{hoge} っていちいち書かなくていいから楽。
870デフォルトの名無しさん:2006/07/14(金) 02:40:09
今日ほど会話が成立しない相手が世の中にはいるということを思い知らされたことはない
871デフォルトの名無しさん:2006/07/14(金) 02:41:31
ジタバタ 〃∩ _, ,_
ジタバタ ⊂⌒( `Д´) <ヤーダーヤーダー
      `ヽ_つ⊂ノ  Class::Accessor::Lvalue ジャナイトヤーダー
872デフォルトの名無しさん:2006/07/14(金) 02:43:27
そもそも$obj->{hoge}って書いてるとハッシュのキーにstrictのチェックが聞かない。
$obj->hogeとかくとstrictの恩恵にあずかれる。
いちいちオブジェクトのハッシュのキーに生でアクセスしている奴が
引数の妥当性を(ry
873デフォルトの名無しさん:2006/07/14(金) 02:44:09
>>871 Class::Accessor::Lvalue::Fastじゃないとやーだー
874デフォルトの名無しさん:2006/07/14(金) 05:31:49
さぁ、盛り上がってまいりました。
875デフォルトの名無しさん:2006/07/14(金) 05:38:15
一旦CM  ,一-、
  入り   / ̄ l
 まーす ■■-っ 
      ´∀`/
    __/|Y/\.
  Ё|__ | /  |
876デフォルトの名無しさん:2006/07/14(金) 07:38:16 BE:309540757-#
わらわら
877799:2006/07/14(金) 08:27:51
すいませんおちが思いつきませんでした
ごめん>>812
878812:2006/07/14(金) 09:09:11
>>837
遅レスだけど、たしかに情報が小出しで、色々な解釈できるようなレスだったね。正直すまんかった。

>>877
ちょ、まて、そのネタフリ。なんか俺が全部悪いみたいなオチにしてんじゃねーかw
879デフォルトの名無しさん:2006/07/14(金) 10:23:35
韓国人が数名騒いでいたようだな。
880デフォルトの名無しさん:2006/07/14(金) 11:08:45
ちょっと参考になった。
881デフォルトの名無しさん:2006/07/14(金) 11:42:38
ども、お世話になります。
CPAN経由でモジュールをインストールする時、
初めて perl -MCPAN -e shell を実行すると初期設定が始まりますよね?
その後の一連の設定(キャッシュはどこに置くとか、ダウンロードサイトはどこのを使うとか。。)
のログというか、設定が記述されているファイルってどこにあるのでしょう?
一応 ~/.cpan 以下とか調べたんですけど、よくわかりませんでした。
おながいします!
882デフォルトの名無しさん:2006/07/14(金) 12:02:11
Config.pm
883デフォルトの名無しさん:2006/07/14(金) 12:15:40
cpan> o conf
CPAN::Config options from C:/Perl/lib/CPAN/Config.pm:
884デフォルトの名無しさん:2006/07/14(金) 12:27:54
CGI.pmの本体てどこにあるんでしょうか?
lib/CGIの中にはCGI.pmというファイルがありませんでした
Apache.pmとかCarp.pmとかがあるけどこれは違うしなぁ
885デフォルトの名無しさん:2006/07/14(金) 12:28:46
あったバカでした失礼
886デフォルトの名無しさん:2006/07/14(金) 12:32:23
@{$self->{$param}}
これは
ハッシュ$selfのキー$paramをデリファレンスして、
それをさらにデリファレンスして配列としてアクセスする

で理解はOK?
887デフォルトの名無しさん:2006/07/14(金) 12:33:58
自己解決したようだが、正常にuseできるんなら%INCみりゃわかるよ。

% perl -e 'use CGI; print $INC{"CGI.pm"},"\n"'
/usr/share/perl/5.8/CGI.pm
888885:2006/07/14(金) 12:36:15
>>887
それ使えますね!めもっときますありがとう!!
889デフォルトの名無しさん:2006/07/14(金) 12:49:01
>>888
$ perldoc -ml CGI
/usr/lib/perl5/5.8/CGI.pm
890デフォルトの名無しさん:2006/07/14(金) 12:54:46
>>889
おーそんなのもあったのか。でもマニュアル確認したら
-mはいらんのと違う?

% perldoc -l CGI
/usr/share/perl/5.8/CGI.pm
891デフォルトの名無しさん:2006/07/14(金) 14:03:19
892デフォルトの名無しさん:2006/07/14(金) 14:05:33
>>891
なるほど。勉強になった。
893デフォルトの名無しさん:2006/07/14(金) 15:03:48
私もPerl 5.005 Solaris 2.4でやらさせてたけどこの夏ついに
RedHat ESにリプレースされる事になった。
894デフォルトの名無しさん:2006/07/14(金) 16:50:01
>>886
大体あってるけど、ちょっと違う気もする。
$self はハッシュじゃなくてハッシュへのリファレンス。
-> はデリファレンスをしてから添え字アクセスする為の演算子。

まず $self をデリファレンスして得られたハッシュの中からキー $param の要素を取り出してる。
その要素は配列へのリファレンスになっているので、@{ } でデリファレンスしている。
895886:2006/07/14(金) 16:53:38
>>894
よくわかりました
ありが十匹ありがとう
896デフォルトの名無しさん:2006/07/14(金) 17:41:39
>>895
( ´д)ヒソ(´д`)ヒソ(д` )
897デフォルトの名無しさん:2006/07/15(土) 05:43:09
>>894
ありが十(とう)なら芋虫ゃ二十(はたち)
898デフォルトの名無しさん:2006/07/15(土) 09:17:40
perlerが210人集まってニート
899デフォルトの名無しさん:2006/07/15(土) 09:32:30
あれ?ここってperlのスレじゃないの?
900デフォルトの名無しさん:2006/07/15(土) 11:05:09
ニート雑談スレだけど?
901デフォルトの名無しさん:2006/07/15(土) 11:30:30
perlってなに?
902デフォルトの名無しさん:2006/07/15(土) 12:37:52
ティンコに埋める奴じゃね?
903799:2006/07/15(土) 12:49:06
ごめんなんかスレが殺伐としてきたね
お詫びにデザパタでしりとりしようぜ
じゃ、おれから

Null Object Pattern
904デフォルトの名無しさん:2006/07/15(土) 12:49:40
漏れのティンコはperl入り
おまえのマムコにimport
905デフォルトの名無しさん:2006/07/15(土) 20:19:35
仕様とおもたらimpo...orz
906デフォルトの名無しさん:2006/07/16(日) 00:18:24
これはもうだめかもわからんね。
907886:2006/07/16(日) 09:01:06
おれか?おれがまずったのか?
誠意を素直に表現しただけなのに・・・
908デフォルトの名無しさん:2006/07/16(日) 09:13:33
複素数を使った関数を作っているのですが、どうも上手くいきません。

#!/usr/bin/perl -w
use Math::Complex;
use strict;

my(@mat) = ( 1+i );
func(@mat);

sub func {
my( @matrix ) = @_;
my( @dummy );
print("$mat[0]\n");
$dummy[0] = $matrix[0];
$dummy[0] += 100;
print("$mat[0]\n");
}

を実行すると、二つの print 文で、同じ値 (1+i)を出力されるべきと
思うのですが、引数の配列がなぜか上書きされて、

1+i
101+i

のように出力されます。
どこがおかしいのでしょうか?
複素数を使わない場合は上手くいくのですが…
よろしくお願いします。
909デフォルトの名無しさん:2006/07/16(日) 09:35:22
$matrix[0]に入ってるのは文字列ではなくてオブジェクトです。
なので
$dummy[0] = $matrix[0];
だとリファレンスのコピーになるので$dummy[0]を書き換えると$matrix[0]も書き換わります。
Math::Complexを使ったことないのでざっとしかpodを見てないんですけどコピーするところを
$dummy[0] = Math::Complex->make( Re($matrix[0]), Im($matrix[0]) );
に書き換えると期待されている動きをすると思います。

PS
オブジェクトが文字列に見えるしかけはoverloadプラグマです。
perldoc overload
もしくは
http://search.cpan.org/~nwclark/perl-5.8.8/lib/overload.pm
を参考にしてください。
910デフォルトの名無しさん:2006/07/16(日) 10:10:28
組み込み関数のオーバーライドめんどくせー
911908:2006/07/16(日) 10:29:33
>>909
どうもありがとうございます。
overload はブラックボックスとしてか使ってこなかったので、リンク先見てみます。

> $dummy[0] = Math::Complex->make( Re($matrix[0]), Im($matrix[0]) );
> に書き換えると期待されている動きをすると思います。

まさにちゃんと動きました。
ただ、type が面倒なので、
$dummy[0] = $matrix[0] + 0.0;
で Math::Complex->make を自動で呼び出し(多分)させることにしました。
どうもありがとうございました。
912デフォルトの名無しさん:2006/07/17(月) 04:57:07

質問、ハッシュのスライスなんですが。

ハッシュスライスを使って、複数要素を一気に設定するには

my %hash = (a=>1, b=>2, c=>3, d=>4, e=>5);
@hash{'a', 'd', 'e'} = (100,200,300);

とできますが、同じことをハッシュリファレンスでやるにはどう記述するんでしょうか?

my $hash = {a=>1, b=>2, c=>3, d=>4, e=>5};
913デフォルトの名無しさん:2006/07/17(月) 05:13:12
@$hash{'a', 'd', 'e'} = (100,200,300);
914デフォルトの名無しさん:2006/07/17(月) 11:08:37
#!/usr/bin/env perl -w
use strict ;
my $ref = '' ;
no strict 'refs' ;
@$ref{'a','d','e'} = ( 10, 20, 30 ) ;
print ref $ref , "¥n" ;
で暫し悩んだオレ、アホす。寝惚けてるw
( my $ref = undef ; にしたら HASH が返ってきた。)
----
最初のコードで、
print ref ¥$ref , "¥n" ;
したら SCALAR が返ってくる。当たり前。それでいて、
$ref->{a} とかにはきちんと代入されてると。気持わる。
use strict 'refs' した瞬間に怒られてわかったw
915デフォルトの名無しさん:2006/07/17(月) 11:36:55
そもそもなんでmy $refで$refを初期化しようとしてるの?
変数は宣言時に何も代入しなければundefであることが
保障されてるんじゃないの?
916デフォルトの名無しさん:2006/07/17(月) 11:41:50
リファレンスで便乗質問
$value = \3;
$hash = (a, $value);
でこの$valueをデリファレンスしたいんだけど
print ${$hash{a}} ;
以外にもっと見やすい方法ないですか?
917デフォルトの名無しさん:2006/07/17(月) 11:57:28
>>915
たんなる癖です。
my $i = 0 ; # 数字
my $i = '' ; # 文字列
my $i = undef ; # 他
って自分に言い聞かせるために代入してます。
918デフォルトの名無しさん:2006/07/17(月) 12:10:38
正規表現でマッチチェックするとき、検索文字列にポが含まれていると
検索対象文字列にカタカナが含まれている場合対象文字列の中身にかかわらずマッチしているとみなされてしまいます。
どのようにしたら正しくマッチチェックが出来るのでしょうか?
文字コードをEUCに変えたらうまくいきましたが対象文字列がShiftJISなので変えられません。
具体的には
$str='対象文字列タイショウモジレツ';
$serchstr='ポロシャツ';
if($str=~/$serchstr/){
print "match";
}else{
print "nomatch";
}
の結果がmatchになってしまうという状況です。
919デフォルトの名無しさん:2006/07/17(月) 12:13:11
>>916
一番みやすくね?つか他の方法をしらんだけだが。
920デフォルトの名無しさん:2006/07/17(月) 12:25:18
>>918
use Encode ;
my $str1 = decode 'shiftjis', '対象文字列タイショウモジレツ';
my $str2 = decode 'shiftjis', '対象文字列ポロシャツ';
my $serchstr= decode 'euc-jp', 'ポロシャツ';
if($str1 =~/$serchstr/){ print "match" . "¥n" ; }
else{print "nomatch" . "¥n"; }
if($str2 =~/$serchstr/){ print "match" . "¥n" ; }
else{print "nomatch" . "¥n"; }

$str1 とかを出力したくなったら、
print encode 'shiftjis', $str1 ;
とかしなきゃならなくなるが。
# encode がらみはこのスレでもシタのスレでも話題になってるので
# 検索して参考にすれば?
Perlコーディング初心者質問スレ Part 50
ttp://pc8.2ch.net/test/read.cgi/php/1151250398/
921デフォルトの名無しさん:2006/07/17(月) 12:26:03
>>920
>my $serchstr= decode 'euc-jp', 'ポロシャツ';
my $serchstr= decode 'shiftjis', 'ポロシャツ';
922デフォルトの名無しさん:2006/07/17(月) 12:42:57 BE:106128634-#
index使えよ
923デフォルトの名無しさん:2006/07/17(月) 13:15:03
>>916
> $hash = (a, $value);

が $hash = { 'a', $value }; だとして、
$hash->{a} ではどうでしょう。
924918:2006/07/17(月) 13:32:37
>>920
ありがとうございます!うまくいきました。
925916:2006/07/17(月) 13:35:16
あ、間違ってました
$hash=('a',value);
です
926916:2006/07/17(月) 13:36:07
がああ頭が壊れてる
%hash = ('a', value);
ですすみません
927デフォルトの名無しさん:2006/07/17(月) 15:29:20
>>916が特に見づらいと感じない俺はPerlに侵されてる?
928デフォルトの名無しさん:2006/07/17(月) 17:07:42
print ${ $hash{a} };

が一番見やすい。
929デフォルトの名無しさん:2006/07/17(月) 17:10:11
ども。
なんとなくテンプレートエンジン作ってみました。
(TTよりは文法簡単で、HTML::Templateよりはいろいろできるやつ)
あんまりデバッグしてないので、適当に触ってくれる人募集。
(PODも適当だし)
http://0-9.sakura.ne.jp/perl/modules/spTemplate.pm
930デフォルトの名無しさん:2006/07/17(月) 19:00:48
私はプッシーです
931デフォルトの名無しさん:2006/07/18(火) 01:00:33
私もプッシーです
932デフォルトの名無しさん:2006/07/18(火) 01:09:52
Perl Best PracticeとPerl Hacks注文した私もプッシーです
933デフォルトの名無しさん:2006/07/18(火) 01:15:43
プッシーと言えば冷凍エキスモー
934デフォルトの名無しさん:2006/07/18(火) 08:49:20
>>929
> (TTよりは文法簡単で、
そうは思えない俺ガイル
あと、独自のescapeを追加したいときとかどうすんの?
935デフォルトの名無しさん:2006/07/18(火) 11:21:22
>>934 perldocをみるかぎり

=head6 ecp_hoge

[%name="hoge" escape="ecp_hoge"%]

「ecp_hoge」を呼び出す。
(継承先で定義されるていることを想定)

ってあるな。
OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
これはどういう意図でやってるの?>>929

_mk_accessorsもClass::Accessor::Fastでいいような気がした。
936デフォルトの名無しさん:2006/07/18(火) 12:19:49
>>935
> >>934 perldocをみるかぎり
> (継承先で定義されるていることを想定)
> ってあるな。
読み落としすまん。そうか、継承するのか・・・。それはちょっとダメじゃねぇ?

> OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
同意

> _mk_accessorsもClass::Accessor::Fastでいいような気がした。
同意
937デフォルトの名無しさん:2006/07/18(火) 18:26:56
Perlで指定する連番アドレスから文字列を
検索・抽出・並び替えて一行ずつリスト化したいのですが可能でしょうか?
938デフォルトの名無しさん:2006/07/18(火) 18:33:20
「文字列操作か?」? 「可能」: 「時と場合により可能」;
以上
939デフォルトの名無しさん:2006/07/18(火) 18:36:49
>>938
ありです。
940デフォルトの名無しさん:2006/07/18(火) 22:32:51
>>934

実はttとかHTML::Templateってそんなに使ったことないので
すごく変なものになってる可能性も高い。
どのへんがおかしいか指摘してもらえると喜びます。

>>935
>OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。

CGI.pmとかttがそんな感じなのでまねてみたんだけど、やっぱりきもいか。
個人的には小文字の方が好きだけど、
組み込み関数とかぶるのを気にしなくて良いのは利点かな?

>_mk_accessorsもClass::Accessor::Fastでいいような気がした。

その辺は前に組んだスクリプトの流用だったり。
(そのときは仕事だったので、他のmodulesに依存したくなかった)
Class::Accessor::Fastにしようかな。。。

>>936

>継承するのか・・・。それはちょっとダメじゃねぇ?

その辺なんとなく組んだだけなので、ダメかも。


ttもHTML::Templateもよく知らんので、
「この辺きもい」とかの指摘はありがたい。
941935:2006/07/18(火) 22:54:08
>>940
TTは全部小文字よ。
CGI.pmもcgi-lib.plからの移行の為にVarsを付けてるだけで
他は小文字だと思う(CGI.pmは最近使ってないから自信なし)。

929の「なんとなく」が理由の全てなんだろうけど
HTML::TemplateやTemplateの何が気に入らないとか
アドバンテージを示さないと積極的に乗り換えることはないな・・・
942デフォルトの名無しさん:2006/07/18(火) 23:23:07
>>940
個人的には、オブジェクトが $my になってるのがダメ…。
エディタによっては不用意に色が変わっちゃうし。
$self か $this かにして欲しい。
あとクラス名の先頭が小文字ってのも…。
943929:2006/07/19(水) 00:11:07
>>941
>TTは全部小文字よ。
ぉ。そうだったか。どこで見たんだ?>自分
と、言うわけで小文字に変更。

>HTML::TemplateやTemplateの何が気に入らないとか
>アドバンテージを示さないと積極的に乗り換えることはないな・・・

実は、前から似たようなものを自分で自作してて、その後HTML::TemplateやTTを知った。
「なんとなく」公開してみる気になったので、適当に組み替えて公開してみた。
ってのが正直なとこだったり。
(ただ、HTML::Templateは機能少ないと思うし、TTはPerlっぽすぎると思う)
なので、「これが売り」ってのはあんまりないなぁ。。。(コードが短いとか?)

>>942
>個人的には、オブジェクトが $my になってるのがダメ…。

とりあえず$thisにしてみた。($myもkey数少なくて好きだけど)

>あとクラス名の先頭が小文字ってのも…。

とりあえず大文字に変えてみた。(けど、ほんとは名前自体を変えたい)
http://0-9.sakura.ne.jp/perl/modules/SpTemplate.pm


いろいろレスくれてありがとう。まわりにPerlの話できる人間おらんので参考になります。
でも、「TTはPurePerlでも動く」とか聞いて、そっちでも良いかもとか思い出したり。
(BSD Licenseにでもして置いとこうかな)
944デフォルトの名無しさん:2006/07/19(水) 01:36:25
>>943
package名はHTML::SpTemplateのほうがいいんじゃない?
use warningsがないのがキモイ。
use vars qw($VERSION %GLOBAL);よりもour ($VERSION %GLOBAL);のほうが。
ていうか%GLOBALってmy変数じゃダメなの?教えて偉い人。
693行目の2引数のopenキモイ。古いPerlのこと考えたらしょうがないかもしれないけど。
sub Outputが大文字で始まるのキモイ。PODは小文字で書いてあるのに。
sub _warnだけど、dieするんなら$thisを返さなくてもいいんじゃないの? sub sub_dumperもそう。
というか、俺ならこうする(動くか試してないけど)
sub _warn {
my $this = shift;
require Carp;
goto &Carp::croak;
}
たしかモジュールの中でdieすると、「SpTemplateモジュールのn行目でdieしました」ってエラーメッセージのはず。
ユーザ側からすると、自分のプログラムの何行目でエラーになったかのほうが重要だから&Carp::croakのほうがいい。
Carpは標準モジュールだし依存してもいいと思う。
ついでにいうとdieしてるのに_warnっていうメソッド名なのがキモイ。_dieのほうがふさわしい。
Data::Dumperも標準モジュールだから
sub sub_dumper {
my ($this, $param, $attrs) = @_;
require Carp;
require Data::Dumper;
Carp::croak(Data::Dumper::Dumper [$param, $attrs]);
}
って書きたいかも。つーかメソッド名もsub _dumperのほうがいいかな。
あとBSD Licenseよりも、GPL/Artistic Licenseがいいな。
眠いから変なこといってたらごめん。
945デフォルトの名無しさん:2006/07/19(水) 01:43:10
use encoding 'utf8', STDOUT => 'shiftjis', STDIN => 'shiftjis';
use Encode qw(decode encode);
とやって、shiftjisのフォームページから文字を以下のように受け取ると
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$value = decode('shiftjis', $value);
$FORM{"$name"} = $value;
}

decode処理でエラーがでます…。
decodeしないと、\x{fffd}\x{fffd}\x{fffd}\x{fffd}\x{fffd}\x{fffd}
みたいになってしまいます。
「use encoding」で色々調べてみて、utf8フラグが立っていない
文字列をdecodeするべきだと思うのですが、どうすれば良いのでしょうか?
946デフォルトの名無しさん:2006/07/19(水) 02:14:16
1.encoding を使わない
2.no encoding を使う
3.pack で utf8フラグを取り除く
4.unpack で utf8フラグを取り除く
947945:2006/07/19(水) 02:20:15
回答ありがとうございます。
私、jcode.plを使っていた時代の人間でして、
最近再びPerlをいじることになり、use encodingで頑張ってる次第です。
ご指摘いただいた内容で調べてみます!
948デフォルトの名無しさん:2006/07/19(水) 06:43:53
>use vars qw($VERSION %GLOBAL);よりもour ($VERSION %GLOBAL);のほうが。
互換性のためにuse varsの方がいいと思う
949デフォルトの名無しさん:2006/07/19(水) 07:31:06
>互換性のためにuse varsの方がいいと思う
コアモジュールでも結構our使ってるし別にいいんでない?
950デフォルトの名無しさん:2006/07/19(水) 08:13:22
5.6.1以下を気にするのを互換性と言っておるのか?
951デフォルトの名無しさん:2006/07/19(水) 11:30:24
フォームに入力したデータを、メールとして送信するCGIを作っているのですが、入力したデータだけ文字化けしてしまいます。
指定した項目に、データが入力されているかを調べるCGIにデータを渡すときに
&ReadParse(*input);
$howto="$input{'howto'}";
&jcode'convert(*howto,'sjis');
を行い、文字コードの変換をしています。
データをメールで送信する前に
&jcode'convert(*howto,'jis','sjis');
でJISに変換し
print MAIL"査定方法:$howto\n";
でメール本文に書き込んでいます。
全部で23項目ほどあります。
テストとして「あ」とデータを入力した場合は正常に出力されるのですが、漢字などを混ぜて入力すると
査定方法:出張無料査定
のようになってしまいます。
ソースをシフトJISで書いてもEUCで書いても化けてしまいます。

どうすれば化けずにデータを送信できるのでしょうか?
952デフォルトの名無しさん:2006/07/19(水) 11:40:23
953デフォルトの名無しさん:2006/07/19(水) 11:40:45
>>951
死ねばいい。
954935:2006/07/19(水) 12:07:13
平日の昼12時にアルタ前でオナってくればいい。
955デフォルトの名無しさん:2006/07/19(水) 12:54:21
PerlはC with classes が誕生する何年前に産声をあげましたか?
956デフォルトの名無しさん:2006/07/19(水) 12:55:23
>>929
やっぱ、テンプレートエンジンって楽しいから自作で作っちゃうよな。
でも、独自の文法とかだと新しいプログラミング言語覚えるみたいでめんどくさい気がするんだが。
MovableTypeのSmartyだっけ?あれも新しいプログラミング言語覚えるみたいで嫌になるけど。
ASPとかJSPとかERBみたいにシンプルなもののほうがいいのでは?
957デフォルトの名無しさん:2006/07/19(水) 13:08:26
SmartyはPHPでしょ…。
MovableTypeはダイナミック・パブリッシング機能を利用時にPHP+Smartyが必要ってこと。

>ASPとかJSPとかERBみたいにシンプルなもののほうがいいのでは?
ASP,JSP,ERBに対する評価は宗教戦争に発展しかねないのでノーコメントとして
俺は各種プログラミング言語ごとにテンプレートエンジンに互換性がないことが不満で、
最近はClearSilverとかに注目中。
958デフォルトの名無しさん:2006/07/19(水) 13:16:13
$str = 'AxBxC';
@x = split('x', $str);
print join('-', @x),"\n";

$str = 'A/B/C';
@x = split('/', $str);
print join('-', @x),"\n";

$str = 'A|B|C';
@x = split('|', $str);
print join('-', @x),"\n";

上を実行すると、以下のように3つ目だけ異なる結果になります。

A-B-C
A-B-C
A-|-B-|-C

セパレータが | の時にも上二つと同じ結果が出るようにしたいのですが、
どうしたらいいんでしょうか?
959デフォルトの名無しさん:2006/07/19(水) 13:21:40
perldoc -f split 汁
第一引数は文字列ではなくてPATTERN
@x = split('\\|', $str);
960デフォルトの名無しさん:2006/07/19(水) 13:22:47 BE:424512768-#
@x = split('\|', $str);
961デフォルトの名無しさん:2006/07/19(水) 13:22:59
>>958
splitの第一引数は正規表現なので、正規表現のメタ文字はエスケープする必要がある。
また、正規表現を期待されているところに文字列リテラルを書くのは個人的には好きじゃ
ないのでこんなとこ。

@x = split(/\|/, $str);
962デフォルトの名無しさん:2006/07/19(水) 13:23:57
三人が三人とも書き方が違うのが面白いな
963デフォルトの名無しさん:2006/07/19(水) 13:24:40 BE:106128162-#
更新すれば良かった
964デフォルトの名無しさん:2006/07/19(水) 13:30:19
splitでパターンの部分をシングルクォートで囲んでる奴らはキモイ
965デフォルトの名無しさん:2006/07/19(水) 13:40:06
調べなさ過ぎる奴多すぎるから
次のスレのテンプレでは
perldocで最低限調べろとか入れて欲しい
966デフォルトの名無しさん:2006/07/19(水) 16:13:13
>>964
Perlのsplit(他にあるのかは知らないけど)の仕様自体ちょっと嫌だな・・・
967デフォルトの名無しさん:2006/07/19(水) 16:16:32
>>965
書いても無駄。
それに本当に鬱陶しいのはそれ以前のレベルの連中だから
・スレ違いの質問はスルーか速やかに誘導すること
の一言を入れて欲しい。
テンプレ読まない連中のための注意書くより、ちゃんと読むであろう真面目な解答者への注意入れたほうが効果的だと思う。
968デフォルトの名無しさん:2006/07/19(水) 18:04:28
標準外だが知っておくべきな便利なCPANモジュールを教えてください。
969799:2006/07/19(水) 18:24:21
テンプレートエンジンとかフレームワークの乱立はうざい
しかし作る人の技術向上には貢献するだろう
したがって作る人にはメリットがあるが使う人にはメリットがない
のがテンプレートやフレームワークなのだ
なんという矛盾、皮肉

Javaと一緒である。みんなでStruts使ってればいいものを
難しいとかいちゃもんつけてもっとややこしい仕組みを提案して
金儲けをした屑どものなんとうざいことか

せっかく自転車に乗れるようになったのに
「省スペースだから」という理由で一輪者を押し付けられるようなものだ

テンプレートエンジンの作成は非モテと通ずるものがある
非モテの言論界があんなにかまびすしいのはあれがとても
ユーザフレンドリーだからだ
非モテという経験は誰にもあり、何の前提知識もいらずに
皆が飛び込みわいわいできる
難しいこと考えなくてもそれなりに貢献感が持てる

テンプレートエンジンの作成はまるで無節操なやりマンのようだ
快楽だけとってあとは医療廃棄物だ

まつもとひろゆきさんがいっているようにRailsが優れているのは作者の
マーケティングである。それのみである。
WebServiceなんていう創造性のかけらもない領域で生産性なんてうんぬん
したってしょうがないのである

フレームワークはVSとEclipseとEmacsで十分だ

いっておくが俺が一番うざい
970デフォルトの名無しさん:2006/07/19(水) 18:47:46
そんなお前が好きだ
971956:2006/07/19(水) 19:26:46
>>957
>SmartyはPHPでしょ…。
スィマッターソーダッター!

>>969
やりマンとやりたいまで読んだ。
そんなお前が好きだ
972デフォルトの名無しさん:2006/07/19(水) 19:41:03
乱立と言えば、CPANも乱立状態が定常化しているね。
パッケージαに自分が欲しい機能がない場合、そのαにその機能を追加することを
しない。新たにyaαを作って登録することが定常化している。
973デフォルトの名無しさん:2006/07/19(水) 22:03:42
>>972
CPAN まで TMTOWTDI だと困るんだけどねぇ…(笑)
974デフォルトの名無しさん:2006/07/19(水) 23:32:00
モジュールFooがあると、Fast-Fooが登場し、Foo-Liteが登場し、
Tiny-Fooが登場し……
975929:2006/07/19(水) 23:35:41
>>944
>package名はHTML::SpTemplateのほうがいいんじゃない?
そうするとHTML/SpTemplate.pmって感じで保存することになるのでちょっといや。
(分類としてはまったくその通りだと思うが)
CPANにあげるとかなら変更するかも。

>use warningsがないのがキモイ。
前につけては見たけど、正規表現置き換え周りのwarningが消えなかったので諦めました。(ほんとはつけたい)

>use vars qw($VERSION %GLOBAL);よりもour ($VERSION %GLOBAL);のほうが。
>ていうか%GLOBALってmy変数じゃダメなの?教えて偉い人。
実はこの辺の使い分けがわかってないです。
どう使いわけるん?教えて偉い人。

>693行目の2引数のopenキモイ。古いPerlのこと考えたらしょうがないかもしれないけど。
ごめん。2引数以外のopenがわからん。最近のperlってどう書くの?

>sub Outputが大文字で始まるのキモイ。PODは小文字で書いてあるのに。
直し忘れ。PODが正しいです。

>sub _warnだけど、dieするんなら$thisを返さなくてもいいんじゃないの? sub sub_dumperもそう。
あ〜、サブルーチンは定型で作ってるから考えてなかったな。紛らわしいけど、実害ないのでこれはいいや。

>&Carp::croakのほうがいい。
同意。ただ、できるだけ依存したくないので、Data::Dumperっぽい扱いで修正。
976929:2006/07/19(水) 23:36:42
>_dieのほうがふさわしい。
そういえば、なんで_warnにしたんだ?>自分
_dieへ変更。

>メソッド名もsub _dumperのほうがいいかな。
「sub_」から始まるメソッドはテンプレート内から呼び出すメソッドなので、頭の「sub_」は削れない。
(これはテンプレート内から「[%dumper/%]」って感じで呼び出す)

>GPL/Artistic Licenseがいいな。
Artistic Licenseはいいけど、GPLは文書添付するのが面倒(単一ファイルが好きなので)
改変BSD License/Artistic Licenseかな。

>>957
>各種プログラミング言語ごとにテンプレートエンジンに互換性がないことが不満
同意。なので、一応これはPerlっぽくなくしたつもり。
(言語仕様も簡単なので、正規表現使える言語なら再実装もそんなに手間じゃないと思う)

>>969
>作る人にはメリットがあるが使う人にはメリットがない
同意。正直使う側のことを考えると公開しないほうが良かったかも。
(まぁ、広めるつもりないので、使う人間なんていないと思うが)
Perl勉強中でとにかくソースが読みたい人にはメリットあるかも。
977デフォルトの名無しさん:2006/07/20(木) 00:12:07
>>976
957を書いた者だけど、
各種プログラミング言語ごとにテンプレートエンジンに互換がないことと
テンプレートエンジンの文法がPerlっぽくなくすは別問題と思われ
978ヽ(´ー`)ノ ◆.ogCuANUcE :2006/07/20(木) 00:44:50
>>975
とりあえず、グローバルに use warnings しておいて、warnings が出る
箇所だけ、スコープローカルに no するのがいいんでないかい。
コメントあれば尚良し。

use vars と our は大体同じ役割だけど、our は確か 5.6.0 以降に追加された。
それより前のバージョンでも動作するスクリプトやライブラリなら、
use vars にするのが良いだろう。
%GLOBAL はパッケージ外から参照する必要がなければ my で良し。

個人的な希望を言うと、[% %] は変更できた方がいいかな。

細かいこと言うと、sub_ とかするぐらいなら、別の名前空間にブチ込んだ方が
いいかなぁとか、色々あるけど、好みの問題だし。

# Carp::croak() って、メッセージの最後に . が付かないんだよね。
# とても細かいんだけど、それが気に入らない。
# user@localhost:~$ perl -MCarp=croak -e 'croak("Died")'
# Died at -e line 1
# user@localhost:~$ perl -e 'die()'
# Died at -e line 1.
979956:2006/07/20(木) 00:45:44
>>976-977
他言語と互換を保つってきつくないか?
テーブルタグのような表出力の場合、イテレータやレコードセットオブジェクトみたいなデータ集合も、
テンプレートルールとして考えておかなくてはならんような希ガス。とか。その他、色々めんどくさす。
他言語に入れ替えられるっていってもそんなに用途なさそうだし。

いや、プログラミング手法が統一できるって意味では有用なのか。
980デフォルトの名無しさん:2006/07/20(木) 01:04:24
>>979
957にわざわざClearSilverの名前が出てるんだからとりあえず見てから書けば?
981デフォルトの名無しさん:2006/07/20(木) 07:39:40
>975

open (IN, '< '.$path) or die 'file open error'; # 2引数のopen
open IN, '<', $path or die 'file open error'; # 3引数のopen
982デフォルトの名無しさん:2006/07/20(木) 13:58:28
ExtUtils::MakeMakerで生成したMakefileでmake testすると
-wで実行されてウザイのですが、-wつかないようにする
にはMakefile.PLにはどう記述すればいいかわからず困って
います。Test::Harnessがつけてるらしく $Test::Harness::switches
をいじればいいっぽいのですが、どう書いていいやら。

自作の部分ははじめからuse warningで書いているので
余計な警告が使用している外部モジュールの中で出るだけ
なので-wはあまりうれしくありません。
983デフォルトの名無しさん:2006/07/20(木) 19:59:41
>>976
すまん。ちょっと使い心地をみようかと思ったんだけど podの通りに

use SpTemplate;
my $tmpl = SpTemplate->new(
 'param' => { 'test' => 'hoge' },
 'file_path' => './test.tmpl'
);
print $tmpl->output();

と書いたがエラーで動かない…。
file open error at SpTemplate.pm line 693.
file_path をいろいろ変えてみたが一緒。

とりあえず、オブジェクトの中身を見てみたら、
file_path => param
になっていて、'./test.tmpl' 自体は key として登録されてた。
984デフォルトの名無しさん:2006/07/20(木) 20:02:31
一般ユーザー権限でperlから、
あるファイル(※権限777,ディレクトリも777)に対して
renameを実行したら、権限エラーになってしまいましたが、
unlinkは成功しました

リネームと削除は同等の権限がないと出来ないと思っていたのですが
違うのでしょうか?すみませんが詳しい方理屈を教えてください。


985デフォルトの名無しさん:2006/07/20(木) 20:52:49
>>994
renameはrename先についての権限も関係する。
986929:2006/07/20(木) 23:21:03
>>977
>各種プログラミング言語ごとにテンプレートエンジンに互換がないことと
>テンプレートエンジンの文法がPerlっぽくなくすは別問題と思われ
そりゃそうだけど、Perlっぽい文法なら他言語じゃ使わんでしょ。
(記述言語っぽいやつって記述言語に依存してること多いし)

>>978
>とりあえず、グローバルに use warnings しておいて、warnings が出る
>箇所だけ、スコープローカルに no するのがいいんでないかい。
そやね。そうしようかな。

>%GLOBAL はパッケージ外から参照する必要がなければ my で良し。
一応%GLOBALは外部から参照されることを考えてる。
たとえば、スクリプトの先頭で「SpTemplate::GLOBAL{'default_escape'} = 'html'」とか書いとけば、
それ以後生成されるオブジェクトに継承される。

>個人的な希望を言うと、[% %] は変更できた方がいいかな。
これは考えたけど、「sub_if」内で「 [ ] 」とか使ってるから「[% %]」だけ変更できても意味ないかなと思ってやめた。
(「sub_if」内の変数まで全体で管理したくないし)

>細かいこと言うと、sub_ とかするぐらいなら、別の名前空間にブチ込んだ方が
>いいかなぁとか、色々あるけど、好みの問題だし。
ほんとは「_conv」内で解析した後、別オブジェクトを作って投げる感じにしたかったんだけど、
結構全体で管理する変数もあるし、何回も呼ぶから遅くなるような気がしてやめた。
(全体的にもうちょっとオブジェクト指向っぽくしたいけど、うまいやり方が思いつかんかった)
987929:2006/07/20(木) 23:23:02
>>979
>他言語と互換を保つってきつくないか?
とりあえず、Ruby、PHPなら同じようなもの組めるかなとか考えて作ってます。
hashとarrayと正規表現使える言語なら、同じ仕様のテンプレートを解析するライブラリ組むのは難しくないと思う。
(互換性ってその程度のことよ)

>他言語に入れ替えられるっていってもそんなに用途なさそうだし。
まぁ、テンプレート共通で言語を変えるってほとんどないだろうから、あんまり意味ないとは思うけど。

>>981
>open IN, '<', $path or die 'file open error'; # 3引数のopen
あ〜、そういえばそんな書式も見たことある気がする。こっちのほうが良いなぁ。

>>983
ごめん。思いっきりバグってた。とりあえずPODの通りくらいには動くようにしてみました(まだバグあると思うけど)
988デフォルトの名無しさん:2006/07/20(木) 23:29:01
>>986

>たとえば、スクリプトの先頭で「SpTemplate::GLOBAL{'default_escape'} = 'html'」とか書いとけば、

それキモイ。OOスタイルな意味ないじゃん。クラスメソッドで
SpTemplate->default_escape('html');
みたいな呼び出し方を考えるべき。
989デフォルトの名無しさん:2006/07/21(金) 00:41:23
>>929
ループのデータセットは、配列参照かハッシュ参照なのか。
DBからのレコードセットとかの場合どう対処するの?
全部、メモリにロードしてから出力?メモリ食いそうだな。
まあ、どんなテンプレートエンジン作る際でも問題となってくる部分ではあるんだが。
990デフォルトの名無しさん:2006/07/21(金) 01:01:54
誰も次スレ立てないのかよつд`)
もう自棄だ。建てて来る

>>967を1の3段落目の最後にこんな感じで混ぜておくか。
| スレ違いの質問にはスルーか、速やかな誘導をお願いします。
異議があったら準備中に宜しく
991デフォルトの名無しさん:2006/07/21(金) 01:21:54
$self->{next} = new BBS2ch::Thread 'Perlについての質問箱 26箱目';
$self->{next}->lead($self);
__END__
次スレ
http://pc8.2ch.net/test/read.cgi/tech/1153412251/
992デフォルトの名無しさん:2006/07/21(金) 01:24:31
埋め
993デフォルトの名無しさん:2006/07/21(金) 01:30:24
>>991 乙

$self->kakikomi("埋め") while $self->count() < 1000;
994デフォルトの名無しさん:2006/07/21(金) 01:49:43
$self->kakikomi('埋め') for 994 .. 1000;
995デフォルトの名無しさん:2006/07/21(金) 01:59:00
うめ
996デフォルトの名無しさん:2006/07/21(金) 02:31:58
$self->kakikomi("埋め");
997デフォルトの名無しさん:2006/07/21(金) 02:43:20
ume
998デフォルトの名無しさん:2006/07/21(金) 02:44:46
998
999デフォルトの名無しさん:2006/07/21(金) 02:45:46
999
1000デフォルトの名無しさん:2006/07/21(金) 02:46:26
セン
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。