Perlについての質問箱 25箱目
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/06/02(金) 23:43:29"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
0002デフォルトの名無しさん
NGNGPerlプログラミング講座: 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/
0003デフォルトの名無しさん
NGNGCPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm
[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん
NGNG1 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
0005デフォルトの名無しさん
2006/06/02(金) 23:59:220006デフォルトの名無しさん
2006/06/03(土) 00:16:380008デフォルトの名無しさん
2006/06/03(土) 02:52:27Ζ
0009デフォルトの名無しさん
2006/06/03(土) 07:34:07a.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サブルーチンが見つからないとエラーになります。
どこか間違っていますか?
0010デフォルトの名無しさん
2006/06/03(土) 07:57:36bというモジュール名がまずい。モジュール名を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
00119
2006/06/03(土) 09:16:55use bなのにBが読み込まれちゃうんですね。
ありがとうございます。すっきり解決しました。
おっしゃる通り練習です。
続・初めてのPerlってのに載っていたimportの
練習でした。
0012デフォルトの名無しさん
2006/06/03(土) 09:46:580013デフォルトの名無しさん
2006/06/03(土) 09:53:190014デフォルトの名無しさん
2006/06/03(土) 10:32:360015デフォルトの名無しさん
2006/06/03(土) 12:00:370016デフォルトの名無しさん
2006/06/03(土) 13:14:32>Rubyに完全に取って代わられちゃったね。
>正確に言えば、まともなプログラマはみんなRubyに流れちゃって、
>自分が書いたコードの効率もろくに把握できていないようなアホだけが
>未だにぶら下がっている・・・っていう、ある意味過疎より酷い惨状だけど。
>>999
>>998
>3年前の状況としてなら賛成。
この頃ruby基地からのアラシが少なくなったと思ったらまた出たか。
漏れはPerlの方が速いし、モジュールが充実してるからPerl使ってる。
0017デフォルトの名無しさん
2006/06/03(土) 13:17:16おまえも荒らしに加担してるのわかってんだろうな?
0018デフォルトの名無しさん
2006/06/03(土) 13:50:47お前も俺もな。
遠巻きに眺めながらそっとしておいてあげるのが最高のスルーション。
0019デフォルトの名無しさん
2006/06/03(土) 13:58:35解決済みだろけど書いてみた。
print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ;
一行だ。
0020デフォルトの名無しさん
2006/06/03(土) 13:59:57前スレ>>988
| 988 名前:デフォルトの名無しさん:2006/06/03(土) 00:29:18
| Template Toolkitで使用する
| テンプレートファイルをうまくデバッグする方法はありませんか。
|
| テンプレートに誤りがあるときのエラーメッセージ
| は決まって "Bad file descriptor at ..."であり、
| テンプレート修正の手がかりになりません。
TT使ったこと無いんだけど、簡単なのを書いてみてもエラーの箇所が表示されるし、
モジュール内を検索してもそのエラーメッセージが出てこなかった。
再現用のサンプルを出して貰えると使ったことの無い人でも調べて回答できるかも。
0021デフォルトの名無しさん
2006/06/03(土) 14:01:23my $data = join '', <> ;
$data =~ s/.*?(([^¥n]*?¥n){50})¥Z/$1/s ;
print $data ;
0022デフォルトの名無しさん
2006/06/03(土) 14:06:27>print do { local $/ ; <> } =~ /.*?(([^¥n]*?¥n){1000})¥Z/ ;
{1000} を{1,1000} にすりゃいい話だ罠。
0023デフォルトの名無しさん
2006/06/03(土) 14:54:40これって無名配列なの?
それは単なるリスト(のスライス)
リスト=スカラーコンテキストでは最後の要素を返す
配列=スカラーコンテキストでは要素数を返す
ということで、一応区別はある。
ちなみに無名配列そのものをその場でつくることは出来ないが、あえて書くなら
@{[0, 1, 2]}/${[0, 1, 2]}[0]とか、こんな感じでつくることは出来る。まぁ、リストがあれば事足りるのでする価値はないが。
002523
2006/06/03(土) 15:33:58ありがとうございます
0026デフォルトの名無しさん
2006/06/03(土) 15:34:23| 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.
最後のハードリファレンスが消えたときに、無名の指示物は容赦なく消されます。
って所か?訳の正確性はまったく保障しないが
0027デフォルトの名無しさん
2006/06/03(土) 15:49:440028デフォルトの名無しさん
2006/06/03(土) 16:40:21知らなかった。
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 なのか。
戻り値のリストと配列は、意識の片隅に入れておいた方が良いのかも。
0029デフォルトの名無しさん
2006/06/03(土) 17:13:06どういった時にそんな使い方するのか
片隅に入れるならwantarray
0030デフォルトの名無しさん
2006/06/03(土) 17:43:42whileをいれこにしてやってるんですがもっとこうりつてきなものはありますか?
0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
2006/06/03(土) 18:00:06テンプレートファイルをうまくデバッグする方法はありませんか。
テンプレートに誤りがあるときのエラーメッセージ
は決まって "Bad file descriptor at ..."であり、
テンプレート修正の手がかりになりません。
0033デフォルトの名無しさん
2006/06/03(土) 18:03:030034デフォルトの名無しさん
2006/06/03(土) 18:08:450035デフォルトの名無しさん
2006/06/03(土) 18:29:41これってはてなで全く同じ質問を見たんだけど……
本人? 回答予定者?
0036デフォルトの名無しさん
2006/06/03(土) 18:31:03釣りだろうけど暇だから書く。
>ふたつのふぁいるをひらいてそれぞれのぎょうをひかくして
ここから判断して二つのファイルの行数は一緒。
my @one ; # 一つ目のファイルの中身
my @two ; # 二つ目のファイルの中身
for ( my $i = 0 ; $i <= $#one ; $i ++ ){
# $one[$i] と $two[$i] を比較しろ!
}
0037デフォルトの名無しさん
2006/06/03(土) 19:00:520038酩酊 ◆TWARamEjuA
NGNGでも巨大なファイルだとあぼーんしちゃいそう。。。
0039酩酊 ◆TWARamEjuA
NGNG# キー作成
my $MD5_value = Digest::MD5->new;
my %hash = map {
$MD5_value->add($_);
($MD5_value->hexdigest, 1)
} <FH>;
みたいなみたいな。。。
0040酩酊 ◆TWARamEjuA
NGNGmy %hash = map {
my $MD5_key = $MD5_value;
$MD5_key->add($_);
($MD5_value->hexdigest, 1)
} <FH>;
もちょっと最適化できそうな。。。
0041デフォルトの名無しさん
2006/06/03(土) 20:31:23俺だったら
1.コマンドのsplitかまして、それぞれに>>36
2.素直に両方のファイルをseekして、それに>>36を適用
する。むろん検索ミスがおこらない様にポインタをずらしながら。
行が合ってないとかだったら「条件」によって変わるなあ。
0042デフォルトの名無しさん
2006/06/03(土) 20:49:29一発読み込みは危険。
同じデータを違うソフトで使いまわすときもあるので、同じ行番号って縛りはなくしたほうがいいな。
0043デフォルトの名無しさん
2006/06/03(土) 21:03:57diffを参考にするのはどうよ?
0044デフォルトの名無しさん
2006/06/03(土) 21:14:19open (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|") とやる方法もある。
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
2006/06/03(土) 21:30:260047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
2006/06/03(土) 21:39:18ありがとう。
\nという文字そのものを検索するにはどしたらいい?
0049デフォルトの名無しさん
NGNG0050デフォルトの名無しさん
2006/06/03(土) 21:42:04Bio分野の者だが。
500Mbくらいのテキストだったら平気でまる飲みさせて
るしまる飲みできるぞ。undef $/; して。
1Gを越えた時はさすがにseekしたが。
そんなに何千万行ものデータが出るのか?物理分野って。
#perli.5.005時代はもちろんまる飲みなんてさせてません。
0051デフォルトの名無しさん
2006/06/03(土) 21:45:12ありがとう。
最後に空行にみえてしまう行を検索するにはどうしたらいいですか?
空行を検索するのはできるんですが。
0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
2006/06/03(土) 21:54:55ヒント:メモリ
0054デフォルトの名無しさん
2006/06/03(土) 21:54:55目でみると実際は空行に見えるが、tabが入っていて
実は空行ではない。のを検索するにはどうしたらいいですか?
その他の空行ではない行でtabが入っていても無視する。
というものです。
0055デフォルトの名無しさん
2006/06/03(土) 21:55:34その質問はここでしていい質問じゃない。帰れ。
0056デフォルトの名無しさん
2006/06/03(土) 21:57:160057デフォルトの名無しさん
2006/06/03(土) 21:58:26氏ねキチガイ。
0058デフォルトの名無しさん
2006/06/03(土) 22:02:36すまん失念してた。>メモリの事。
0059デフォルトの名無しさん
2006/06/03(土) 22:02:50自演荒らし乙。
0060デフォルトの名無しさん
2006/06/03(土) 22:06:16なぜ54にレス?
にしても500メガPerlで生で読めるPCって個人で持ってるの?
うちの研究室じゃPCに回す予算なんてないから、メモリ増設したい奴は自費でやれ、だよ。
006154
2006/06/03(土) 22:06:27空行に隠れるタブのみを検索したいんです。
0062デフォルトの名無しさん
2006/06/03(土) 22:15:54レスみすったw
うちは「メモリは消耗品予算で買えるからOK。PCは予算がない!」
てんで5年前のMacに積めるだけのメモリを積んでますw
0063デフォルトの名無しさん
2006/06/03(土) 22:29:19どーしても突っ込みたくなった。
my $val_2=<$in2>;
file2は先頭行しか見ないのか?
0064デフォルトの名無しさん
2006/06/03(土) 22:32:24なんで?file1のwhileループが回ってる間、一行ずつfile2からも引いてると思うが
0065デフォルトの名無しさん
2006/06/03(土) 22:39:10<FH>の意味と使い方を調べてごらん。
006663
2006/06/03(土) 22:43:330067デフォルトの名無しさん
2006/06/04(日) 00:39:09ようとしたんです。
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);
どこが問題なのでしょう?
0068デフォルトの名無しさん
2006/06/04(日) 01:03:320069デフォルトの名無しさん
2006/06/04(日) 01:08:48試したら、サーバがswapし始めて、応答しなくなった。
0070デフォルトの名無しさん
2006/06/04(日) 01:18:450071デフォルトの名無しさん
2006/06/04(日) 01:21:29ヒント:header,start_html
0072デフォルトの名無しさん
NGNGワラタ
0073デフォルトの名無しさん
2006/06/04(日) 01:28:45これはperlでなく、IEの問題。
そのスクリプトをtest.plという名前で保存して
perl test.pl >test.html
ってやってごらん。
perlの処理にはそんなにかかっていないはず。
007473
2006/06/04(日) 01:42:18試したら、perlの処理の問題でした。
IEの問題ってのは忘れてください。
0075デフォルトの名無しさん
2006/06/04(日) 01:50:19ウイルスコード貼り逃げ厨に笑ってもらえて光栄です><
http://pc8.2ch.net/test/read.cgi/php/1149089424/2
0076デフォルトの名無しさん
2006/06/04(日) 03:37:29これはひどい
0077デフォルトの名無しさん
2006/06/04(日) 08:04:020078デフォルトの名無しさん
2006/06/04(日) 09:19:280079デフォルトの名無しさん
2006/06/04(日) 09:34:32どちらで囲んだ方が速いかなと思い
以下のベンチを取ったのですが
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をリファレンス渡ししてるのになんで・・・
一応テストはうまくいっているようなのですが
どこがおかしいですか?
008079
2006/06/04(日) 09:49:340081デフォルトの名無しさん
2006/06/04(日) 10:00:48TEST1: 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の方が速いということなのでしょうか?
いったいどれを見たらよいのでしょうか・・・
0082デフォルトの名無しさん
2006/06/04(日) 10:12:51use encodingはメンテナも推奨していない
と言ってましたが詳しく教えてください
今までjcodeとかでちくちくやっていたのを
(特にwinな環境なので)
ソースの最初にuse encoding 'sjis';
とするだけで漢字を含んだ正規表現も幸せ
に出来ていたので不安になってしまいました
確かソースをeuc-jpに統一しても日本語を含んだ
正規表現に関しては多くの問題は解決するけど
完璧には動かないんですよね?
それをencodingで解決できたと思っていたんですが
それがだめだとすると一体perlでの日本語処理は
どうすればよいのでしょうか?
0083デフォルトの名無しさん
2006/06/04(日) 10:28:04Perlの方向性としては、 ソースコードをUTF8で書き、use utf8 するというのがいいらしいです
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
008467
2006/06/04(日) 10:34:13WebProg板に行ってきます。
同じ質問を違う板に書いても、この場合はマルチじゃないですよね?
0085デフォルトの名無しさん
2006/06/04(日) 10:36:54CGI::Prettyの_prettyPrintというサブルーチンは、@CGI::Pretty::AS_ISにある
タグの間以外はインデントを追加する、という単純な動作なようだが、
かなり効率が悪いアルゴリズムになっている。
@CGI::Pretty::AS_ISに含まれるタグの対で文字列を前半分と後ろ半分に
わけてそれぞれ再帰してインデントつけたのを最後にくっつけるわけだが、
AS_ISに<td>..</td>が含まれているので、<td>の出現数分再帰し、
なおかつ途中経過の文字列が全部スタックに詰まれるので<td>の
数の2乗に比例した計算時間とメモリが使われる。
アルゴリズムを直してもらうかあきらめるかじゃないだろうか。
0086デフォルトの名無しさん
2006/06/04(日) 10:37:10use strict;
と書くのと
use strict;
package hoge;
と書くのは何か違いがあるのでしょうか?
0087デフォルトの名無しさん
2006/06/04(日) 12:04:50use encodingで起こりうる問題を把握して使っていれば問題ないと思うよ。
分かってないとハマる可能性があるから、使わなくて済むなら使わないほうがいいってこと。
>>83の人も言ってるように、ソースはutf8で書いて、
入出力時にcp932その他に変換したほうが望ましいと思います。
ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。
0088デフォルトの名無しさん
2006/06/04(日) 12:57:04はい、違いがあります。
strict プラグマはレキシカルスコープで効きます。
従って use strict; よりも前に書かれた package 宣言は strict によるチェックを受けません。
しかし、package 宣言において厳格さのチェックが必要になるケースはほとんどないのでこれが問題になることは稀です。
実際モジュールなどでは大抵、可読性のためにほとんどのコードに先んじて package 宣言を行うのが半ば慣例化しています。
通常はこの慣例に従うのが良いでしょう。
0089デフォルトの名無しさん
2006/06/04(日) 12:59:38> ついでに言うと、Windowsでsjisを使うのはやめたほうがいいよ。
Mac なら問題ありませんか?
0090デフォルトの名無しさん
2006/06/04(日) 14:08:49どうもありがとうございます。
ところでpackage宣言でstrictを要する場合ってほとんどないにしても
何かあるわけですか?さっぱり思いつかないんですが
どういう場合があるか教えてもらえませんか?
0091デフォルトの名無しさん
2006/06/04(日) 14:11:02どうもありがとう
そのuse encodingで起こり得る問題について
詳しく教えてもらえませんか?
あとWinでは入出力時にsjisではなくてcp932
を使えとのことですが、この二つって同じもの
じゃないのですか?どこが違うのですか?
0093デフォルトの名無しさん
2006/06/04(日) 14:31:22一番大きな問題は encoding の効きが「グローバル過ぎる」こと。
use encoding; したスクリプトから呼び出されたモジュールの類にも見境無しに効く。
依存関係のどこかで、これが問題になるようなコードがあれば、その挙動の予測ができない。
cp932 については文字コード関係の文書をあたってみて。
要するに「両者が完全には一致していない」ということ。
0094デフォルトの名無しさん
2006/06/04(日) 17:21:32比べるべきはTotalだが、ほとんど有意差はみられない。
0095デフォルトの名無しさん
2006/06/04(日) 18:13:102chで#アだと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と同じトリップが出せるのでしょうか?
0096デフォルトの名無しさん
2006/06/04(日) 18:17:580098デフォルトの名無しさん
2006/06/04(日) 20:03:25&foo(%hash);
sub foo {
%hash = $_[0];
print join "\n", keys %hash
}
とやってみたのですが、うまくいかないようです。
0099デフォルトの名無しさん
2006/06/04(日) 20:12:15&foo(@array);
sub foo {
@array = $_[0];
print join "\n", @array
}
とやってみたのですが、うまくいかないようです。
0100デフォルトの名無しさん
2006/06/04(日) 20:14:43じゃなかったら本を読もうね。
0101デフォルトの名無しさん
2006/06/04(日) 20:25:01&foo($scalar);
sub foo {
$scalar = $_[0];
print $scalar
}
とやってみたのですが、うまくいきました。
どう見ても釣りです。本当にありがとうございました
0102デフォルトの名無しさん
NGNG0103デフォルトの名無しさん
2006/06/04(日) 20:49:26はいはい。そうですね。
0104デフォルトの名無しさん
NGNGうぇ
0105デフォルトの名無しさん
2006/06/04(日) 21:19:38Shift_JISとCP932の違いについてはここを参照してちょ。
ttp://legacy-encoding.sourceforge.jp/wiki/
ちなみにeucjpも違うので注意。
>>89
Mac はバージョンによって微妙に違ってた気がするんだよな……。
問題ありそうなら MacJapanese を指定しておけば?
ttp://search.cpan.org/~dankogai/Encode-2.18/JP/JP.pm
0106デフォルトの名無しさん
2006/06/04(日) 21:36:21ありがとうございます。
わざわざ、
&foo(\%hash);
sub foo {
%hash = %{$_[0]};
print join "\n", keys %hash
}
なんてやってましたorz
0107デフォルトの名無しさん
2006/06/04(日) 21:49:45処理がそれだけなら、次のようにも書けるよ。
print &foo(\%hash);
sub foo { join "\n", keys %{ +shift } }
# サブルーチンで値を返すようにして、呼び出し側で print してるのは単に僕の好みだから気にしないで。
0108デフォルトの名無しさん
2006/06/04(日) 22:10:54すごい。
そこまでできる技術があるのに・・・
0109デフォルトの名無しさん
2006/06/04(日) 22:17:44それなんてウイルス?
0110デフォルトの名無しさん
2006/06/04(日) 22:36:43sub foo{
my($first, $second, @other) = @_;
# ...
}
foo(1, 3, 4 .. 10);
0111デフォルトの名無しさん
2006/06/04(日) 22:43:57何かの処理をするような、エレガントな記述を記述を教えてください。
今はこうする方法しか考えつきません。
$flag=1;
for ($i=0;$i<6;$i++)
{ if ($_[$i] ne '')
{ $flag=0; }
}
if ($flag)
{ [何かの処理]; }
よろしくお願いします。
0112デフォルトの名無しさん
2006/06/04(日) 23:24:46でおk
my @flag = grep /.+/ @_;
とかすると@flagには空でない値が全部はいる。
0115デフォルトの名無しさん
NGNG0116デフォルトの名無しさん
2006/06/04(日) 23:46:41@_ = qw( 0 )
>>113, >>114
@_ = qw( : @ # & ! )
0117デフォルトの名無しさん
2006/06/04(日) 23:49:47if ('' eq join('', @_[0 .. 5])) {
}
つーか、そんな6つも引数渡すような関数作の方を
考え直した方が良いと思うけど
0118デフォルトの名無しさん
2006/06/04(日) 23:51:53%hash = map{ $_,1 }@_
if( defined $hash{''}){
#処理
}
0119111
2006/06/04(日) 23:54:38でも、参考になりました。
ありがとうございました。
0120デフォルトの名無しさん
2006/06/04(日) 23:56:400121デフォルトの名無しさん
2006/06/05(月) 00:23:58grepの結果はリストなのでifではスカラコンテキストで評価されて真値を返すのでは?
試してないが>>112で通ると思われ。
0122デフォルトの名無しさん
2006/06/05(月) 00:47:51配列に空文字列を一つでも含む場合に処理をするんだな。
if ( ( grep /.+/ @_ ) < @_ ) {処理}
か
unless ( ( grep /.+/ @_ ) == @_ ) {処理}
でよくね?
添え字が0-5の6個だと分かってるなら
if ( ( grep /.+/ @_ ) < 6 ) {処理}
とか。()付けたから@_ = qw( 0 );でも通るはずだぞ。
0123デフォルトの名無しさん
2006/06/05(月) 00:50:49いや、必死にマニュアル読みましたよ。
釣りじゃないです。。
>>110
ここにあげる例として書いただけで、実際のコードには my を仕様しております。
0124デフォルトの名無しさん
2006/06/05(月) 00:56:13sub hoge { 処理 }
foreach (@_) {
length $_ or hoge() and last;
}
ですっきりするし無駄な評価を避けることが出来る。
ただしhogeは真値を返せよ。
0125デフォルトの名無しさん
2006/06/05(月) 01:28:48>工レガント
っていってるし。
0126デフォルトの名無しさん
2006/06/05(月) 03:58:25の書き方って正しいの?
なんで" eq join("なんてなってんの?
おかしくない?
0127デフォルトの名無しさん
2006/06/05(月) 04:04:35>>117 '' eq join('', @_[0 .. 5])
0128デフォルトの名無しさん
2006/06/05(月) 08:27:010129128
2006/06/05(月) 08:33:190130デフォルトの名無しさん
2006/06/05(月) 10:11:44日本語で頼む。もしくはPerlで。
0131デフォルトの名無しさん
2006/06/05(月) 12:17:42/ || :ヽ
┌|(⌒ヽ :|| ..:⌒: |┐ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::|::ヽ.__:):||(___ノ ::|::| │
|:|: .. :|| .. |:| │
:|: .. || ..|| < ジュワ!(やっぱりウルトラマン語で頼む
:\ [_ ̄] /::| │
:: |\|_|_|_|_/:::| \________
__| | / / :|___
0132デフォルトの名無しさん
2006/06/05(月) 14:10:59unless($_[$i]){ {処理} }
}
0133132
2006/06/05(月) 14:26:01map{ {処理} unless $_;} @_[0..5];
たとえば、空要素の位地に特定の文字列をセットするようなときには使える。
map{ $_='N/A' unless $_;} @_[0..5];
空要素だった時に条件成立なら、要素の値を取得しても意味が無い。
だって空だから。
0134デフォルトの名無しさん
2006/06/05(月) 14:29:02あそっかダブルコーテーションじゃなくてシングルコーテーションだったのね
もういやぽ
0136デフォルトの名無しさん
2006/06/05(月) 21:11:54if ( grep /^$/, @_[0..5] ) {
# 何だか知らんが何かやっとけ
};
0137デフォルトの名無しさん
2006/06/05(月) 21:35:18それじゃあ1つだけでも空の文字列があればtrueにならね?
unless ( grep !/^$/, @_[0..5] ) { }
とか
if ( grep(/^$/, @_[0..5]) == 6 ) { }
とかならわかるけど。
0139デフォルトの名無しさん
2006/06/06(火) 00:42:54if (all {$_ ne ''} @_[0..5]) { }
モジュールに頼るのがエレガントかというと意見が分れると思うがソースとしては美しくなると思う
0140デフォルトの名無しさん
2006/06/06(火) 02:49:03なんか盛り上がってるから読んでみた。インデントが少し変だと思った。
ちなみに俺は、自分用のコードを書く場合必ず my_func.pm ってのを使ってて
その中に「全てが真であるか調べる関数」と「全てが偽であるか調べる関数」が存在してる。
0141140
2006/06/06(火) 02:57:59久しぶりに自分の昔のメモ見たら、
#▼全て偽なら真が返るが、分かりにくく汚め。
($aaa . $bbb . $ccc . $ddd) + 0 ? 0 : 1;
ってゆうのが出てきたんですが、+0って何を考えて+0したんでしょうか?俺は。。。。
なんか思い出せません。orz
数値コンテキストを適用したいっぽいのは想像できるんですけど、なんで数値コンテキストなんでしょうか?
昔のほうの俺が何かアホな勘違いをしたんでしょうか?脳が衰えて判断できない。。。。
0142140
2006/06/06(火) 03:00:31変数の中が0なら0000になって文字列で真になっちゃうってコトかな (恥)
0143デフォルトの名無しさん
2006/06/06(火) 04:07:440144デフォルトの名無しさん
2006/06/06(火) 05:08:43例えば、連結後の文字列が '123.45e-06789' になる場合とか。
0145デフォルトの名無しさん
2006/06/06(火) 16:10:28変数のどれかが一個でも文字列だったら
+0で数値コンテキストで評価されちゃって0と評価されるから
意図した結果にならない
0146デフォルトの名無しさん
2006/06/06(火) 16:56:58while ( read ( FP , $x , 1 ) ) {
処理本体 ;
}
でいいんでしょうか
0147デフォルトの名無しさん
2006/06/06(火) 17:17:57getcっていう便利な関数があるんですね
0148デフォルトの名無しさん
2006/06/06(火) 17:40:430149デフォルトの名無しさん
2006/06/06(火) 17:48:348ビットのビット列がそのまま変数に入っているとして)、それを数字キャラクタで表された
0b00101101というような形に変換して別の変数に格納したいんですが、
そういう仕事をしてくれる関数ってありますか?
0150デフォルトの名無しさん
NGNG0151デフォルトの名無しさん
2006/06/06(火) 18:07:51どうもありがとうございますた
0152デフォルトの名無しさん
2006/06/06(火) 19:48:07理由が書いてありません
どういう理由なのでしょうか?
0153デフォルトの名無しさん
2006/06/06(火) 19:57:510154デフォルトの名無しさん
2006/06/06(火) 23:30:32Perlでは一文字づつ処理しなければならないケースが極端に少ないため、
C的な感覚でのgetc()の使用は、ほとんどの場合もっとずっと簡単な正規表現での処理に置き換えられる。
したがって、getc()でなければならないという強い確信があるとき以外は使わないほうがいい。
という程度のことだと思うよ。
実際、俺は使ったことないし、使ってるコードを見たこともない。
0155152
2006/06/07(水) 07:28:51>>154さんくすです。ということは行バッファリングどうこうって関係ないのね。
0156デフォルトの名無しさん
2006/06/07(水) 15:07:19まあ落ち着け。
入力ストリームから一文字入ってくるたびに何か処理を行いたいのに、一行分貯まるまで渡ってこないと困るケースがあるとは考えないか?
0157デフォルトの名無しさん
2006/06/07(水) 16:30:13}
これってループ毎に$oeeはいちいちmy宣言されてしまうから
my $oee;
while ($oee = <$fh>) {
}
とした方がいいですか?
0158デフォルトの名無しさん
2006/06/07(水) 16:35:47そんなケースってあるの?
例示してくれ
0159デフォルトの名無しさん
2006/06/07(水) 16:46:37コンパイルしたディレクトリだとアイコンが表示されるけど、
違うディレクトリに移動するとアイコンが表示されない。
(ファイル自体のアイコンだけは問題ない!)
他の部分は、ウィンドウズのアイコンになる。
IconResetで内部無理矢理変えても駄目だなあ。
なんで?
0160デフォルトの名無しさん
2006/06/07(水) 18:30:56とても古い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変数より速い」と同じ
程度の差でしかないから、読みやすさを優先した方がいい。
0161デフォルトの名無しさん
2006/06/07(水) 20:00:58そう来たか。w いや、なんでも疑問を持ってみるのはいいことだ。
ひとつ最も端的な例を挙げるとするなら、端末からのユーザ入力ということになる。
# 普段の I/O でバッファリングなどを意識しなくていいというのは言語の成果なんだろうね。
# 十年後にはこういう話題の価値ってなくなってるんだろうなあ。うん、そのほうがいい。
0162デフォルトの名無しさん
2006/06/07(水) 20:53:11というかコンソールツールで。
0163デフォルトの名無しさん
2006/06/07(水) 21:09:08自分のためのスクリプトだったらそんなことしないのに。
0164デフォルトの名無しさん
2006/06/07(水) 22:59:030165デフォルトの名無しさん
2006/06/07(水) 23:09:10大丈夫だ。そこは誰も否定してない。w
移植性や保守性、実行時効率などを考慮すると、いろいろ面倒だから気をつけれ、という話だ。
0166デフォルトの名無しさん
2006/06/08(木) 11:45:01goUp($MAX);
}
0167デフォルトの名無しさん
2006/06/09(金) 12:19:180168デフォルトの名無しさん
2006/06/09(金) 18:50:27について質問です。
Win32::APIで呼び出せるdllの呼び出し規約は何なのでしょうか?
0169デフォルトの名無しさん
2006/06/09(金) 19:29:360170デフォルトの名無しさん
2006/06/09(金) 19:34:430171デフォルトの名無しさん
2006/06/09(金) 20:42:08WINAPI
0173デフォルトの名無しさん
2006/06/10(土) 01:38:31買った本に載ってた問題で「うるう年の判定スクリプトを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";
}
こう書いて実行したんだけどエラーが出て動いてくれません。
エラー内容を見てみると、最後の行がまずいらしいんですけど
どう弄れば動いてくれるようになるのかさっぱり・・・
0174デフォルトの名無しさん
2006/06/10(土) 01:39:450175デフォルトの名無しさん
2006/06/10(土) 01:56:27} が最後に1つ足りない。
0176173
2006/06/10(土) 02:07:33}の数が足りなかったのですね。
ご教授ありがとうございました。
0177デフォルトの名無しさん
2006/06/10(土) 03:16:30print qw( 平年 閏年 )[$flag] , "です";
って書いたあとにifを使う問題だと気付く・・・
my $mes = "平年です";
$mes = "閏年です" if $year % 4 == 0 and $year % 100 != 0 or $year % 400 == 0;
print $mes;
たぶん、問題からすると外れ・・・
0178デフォルトの名無しさん
2006/06/10(土) 04:21:00正しくマッチする正規表現て作れるんですか?
0179デフォルトの名無しさん
2006/06/10(土) 04:43:49$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
がマッチングしてしまいます。
これはどこが間違ってるのでしょうか?
0180179
2006/06/10(土) 04:46:24ですorz
0181179
2006/06/10(土) 04:48:360182デフォルトの名無しさん
2006/06/10(土) 06:04:55再帰的なパターン(??{ 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";
ともかく重要なのはバックトラックを行わないようにした変更.* -> .*?
0183ヽ(´ー`)ノ ◆.ogCuANUcE
2006/06/10(土) 08:40:20Regexp::Common::balenced とか。
中で使ってる原理は >>182 と同じだけどね。
0184デフォルトの名無しさん
2006/06/10(土) 17:59:33if($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」以外にしたいのですが
どのようにしたらいいのでしょうか?
まだまだはじめたばかりなのでアドバイスいただければと思います。
0185デフォルトの名無しさん
2006/06/10(土) 18:13:57判定がYESってなんだよ。判定は$randでやってるじゃねーか。
一回目の判定が $rand == 0 だったときという意味か?
で、そのとき何をするって?
0186デフォルトの名無しさん
2006/06/10(土) 18:20:41例えば、0が出た後は、0以外の値が出るまで乱数を発生させたいとか。
0187デフォルトの名無しさん
2006/06/10(土) 18:21:450 ⇒ 0
0188デフォルトの名無しさん
2006/06/10(土) 18:32:23配列に0から6まで入れてシャッフルしてみれば?
0190デフォルトの名無しさん
2006/06/10(土) 19:02:28do{
$rand = int rand(6);
}while($a eq 'YES_00' and $rand==0);
if($rand <=3 ){
$a = 'YES_0' . $rand;
}else{
$a = 'NO';
}
0191179
2006/06/10(土) 19:18:23まさかここまで丁寧に答えてくれるとは、、ありがとうございました。
おかげさまでうまくいきました
にしてもPerlの正規表現は便利ですねぇ
0192デフォルトの名無しさん
2006/06/10(土) 19:18:55@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以上の単語は表示しないなんてプログラムではだめだと思うのでなんとかしたいです。
よろしくお願いします。
0193デフォルトの名無しさん
2006/06/10(土) 19:19:16while(@a) {
my $rand = splice @a, int(rand(scalar @a)), 1;
print "$rand\n";
}
こういう事じゃね?
0194デフォルトの名無しさん
2006/06/10(土) 19:24:03>>192
1つ勘違いしてると思うけど
@test = split(/[ ,\n,.,\",_,\=,;,:,(,),\',-]/,$i);
じゃなくて
@test = split(/[ \n.\"_\=;:()\'-]/,$i);
でおk
@file から一行取り出した時に最後に改行がついているので
"AAA BBB CCC\n"
この改行を chomp で取り除いてから split すれば多分大丈夫
0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
2006/06/10(土) 19:28:53空白とか(splitの対象文字)が367個入ってるということでは?
あと split で、なんでカンマを入れてるの?
カンマで区切るんじゃないけど…。
0197デフォルトの名無しさん
2006/06/10(土) 19:34:09@test = split(/\W+/,$i);
でよくね?
んで全部ハッシュに入れ終わったら
delete $hash{""};
とか。
0198デフォルトの名無しさん
2006/06/10(土) 19:37:440199184
2006/06/10(土) 19:39:06まだまだ未熟ですが勉強していきたいと思います。
ありがとうございました。
0200192
2006/06/10(土) 20:25:28おかげで意味がわかんないあの367はきえました(T-T )( T-T)ウルウル
あっざーっした!!
0201デフォルトの名無しさん
2006/06/10(土) 22:09:33>>200
頼むから二度と来ないでね。
0202デフォルトの名無しさん
2006/06/10(土) 22:57:25かわいそうに。
初心者の俺が作ったのを使ってみて。
$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; # 今のを前回のとして保存する
0203デフォルトの名無しさん
2006/06/11(日) 03:26:31絶対パス http://domain.com/index.html に置換したくて
$domain = "http://domain.com/";
$tmp =~ s/'./'/$domain/i;
のようなスクリプトを書いてみたのですが、 ./ の部分でエラーがでてしまいます。
./ はどのように記述すればいいのでしょうか?
0204デフォルトの名無しさん
2006/06/11(日) 03:36:28もしくは区切り文字を変えて
s|\./|$domain|;
0205デフォルトの名無しさん
2006/06/11(日) 03:43:15おぉ、なるほど区切り文字って使い分けていいんですねぇ
ありがとうございましたっ
0206デフォルトの名無しさん
2006/06/11(日) 04:20:56s( )( )
s[ ][ ]
s{ }{ }
s{ }( )
とかも可能.
あと、区切り文字と同じ文字を正規表現内で使う時は \ でっせ
クウォートしても意味なっしんぐ
0207デフォルトの名無しさん
2006/06/11(日) 04:49:46ついでに、もう一つ質問なんですが
$data =~ m/.*($key1|$key2|$key3)(.*?)/i
みたいな感じで、いくつかのキーワードを含む物とマッチングしたい場合
keyが増えたときに、めんどくさいことになりますよね。
ここのkeyを配列@keyにいれて
$data =~ m/.*(@key)(.*?)/i
みたいな感じで、@keyの要素のどれかとマッチングを取るようにしたいんですが
なにかスマートな書き方ってないでしょうか
みたいにやりたいんですが、
0208203
2006/06/11(日) 04:51:30「みたいにやりたいんですが、」
は無視してください・・・
0209デフォルトの名無しさん
2006/06/11(日) 05:11:04foreach my $key (@array){
m/.*($key)(.*?)/i
}
0210ヽ(´ー`)ノ ◆.ogCuANUcE
2006/06/11(日) 05:40:59$data =~ m/((??{ join('|', @key) }))(,*?)/i;
0211デフォルトの名無しさん
2006/06/11(日) 13:28:49用途にもよるけど気分的には \Q$key\E しておきたいところ。
0212203
2006/06/11(日) 14:46:22レスありがとうございます。
同じ処理が2カ所にあるんで、可読性があれになりますが
勉強ってことで両方使ってみようと思います(`・ω・´)
0213デフォルトの名無しさん
2006/06/11(日) 15:02:07> 同じ処理が2カ所にあるんで、可読性があれになりますが
関 数 に 括 り 出 せ
0214デフォルトの名無しさん
2006/06/11(日) 15:27:010215デフォルトの名無しさん
2006/06/11(日) 16:01:46こんな複雑な事やった事ない…。orz
0216デフォルトの名無しさん
2006/06/11(日) 18:22:17という本のクロージャという項目に書かれていた
内容について質問です
ちょっと長くなりますがお許し下さい
引用----------------------------------------
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と表示されます。サブルーチン内から
サブルーチン外で宣言された変数には直接アクセスできます。
なのに本では「本来なら直接アクセスできない変数」と書かれ
ています。どういうことなのでしょうか?
0217デフォルトの名無しさん
2006/06/11(日) 18:31:11その比較した例は適切では無いね
{
my $value = 10;
function();
}
sub function {
print $value;
}
こう。$valueは上にあるブロック(=本の例ではファイルのスコープに相当)内でスコープが完結している。
対してfunctionサブルーチンはFile::Findモジュールにあるから、そのスコープからは$valueは見えない。
レキシカル変数については、そのスコープの範囲とか理解してる?
0218デフォルトの名無しさん
2006/06/11(日) 18:44:31無名サブルーチンを定義した際、同じスコープにある変数は
無名サブルーチンからはグローバルに見える。
本来外側にあって見えないはずの my $total_size が
無名サブルーチンからも見える、ということ。
言葉で説明するのむずいな。
0221デフォルトの名無しさん
2006/06/11(日) 18:58:51>>217 は見えない方の説明。
>>218 は見える方(というか無名サブルーチン内からの変数の見え方)の説明。
0222216
2006/06/11(日) 19:06:08test01.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;
}
こういう理解であっているでしょうか?
0223デフォルトの名無しさん
2006/06/11(日) 20:04:01> 本来なら直接アクセスできない変数にアクセスでき
に対する理解としては多分良いと思う。が、
クロージャとコールバックに対する理解の話だとするならば、ずれてるな…
以下、高階関数に関する説明をしようかと思ったけれど上手く纏まらないので略。
ちょっと寄り道してschemeのlambdaと高階関数とか調べてみると確実な理解がしやすいかもね。
schemeのlambdaはクロージャそのものだから。
0224デフォルトの名無しさん
2006/06/11(日) 21:10:480225デフォルャgの名無しさん
2006/06/11(日) 21:37:46すんません、俺もよくわかりません。
my $total_size = 0;
find(sub { $total_size += -s if -f }, "."};
print $total_size, "\n";
>変数$total_sizeが無名
>サブルーチンのスコープの外部で宣言されているにも
>かかわらず、この無名サブルーチンは変数にアクセス
>しています。
>本来なら直接アクセスできない変数
>にアクセスでき
外部で宣言されたmy変数にアクセスできるのは当たり前だと思うのです。
スコープの内側ならサクセスできないけど、なんで自分より外のmyにアクセスできると変なのかわからないです。
find関数の内部実行って意味の話なのかな?
これはリファレンスが送られるから、find関数で値は参照されますが…。
クロージャのスコープは定義した場所で決定して、実行場所とは関係ないから参照できて当たり前と思うのです。
ごめん、なんか問題の意味すらよくわからなくなった orz
0226デフォルトの名無しさん
2006/06/11(日) 21:49:17{
my $hoge = "abc";
$closure = sub { print "$hoge\n"; };
$closure->(); # abc
print "$hoge\n"; # abc
}
$closure->(); # abc
print "$hoge\n"; # エラーになる
$hoge はレキシカル変数なのでブロックの中でのみ有効。
しかし、クロージャの中にレキシカル変数を閉じ込めると、ブロックの外でも参照できる。
こんな感じでわかるかな?
0227デフォルトの名無しさん
2006/06/11(日) 21:50:30>なんで自分より外のmyにアクセスできると変なのかわからないです。
多分、>>216 で挙げられている本の例があまり良くないのだと思う。
外部のmyにアクセスできると変、というか不思議でしょ?とその本が言いたいのは
>>222 で挙げられている例の test() のように、
作成された無名サブルーチンを別のスコープに持って行っても
その無名サブルーチンを定義した時に見えていた my変数がそのまま見える
という所だと思う。
0228225
2006/06/11(日) 22:09:140229216
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は見えないはずなのに、クロージャを使うことで見える
ようになる、ということで間違っていないですか?
0230デフォルトの名無しさん
2006/06/12(月) 01:17:27> 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->();
}
0231デフォルトの名無しさん
2006/06/12(月) 01:42:21何かツール必要なのでしょうか?
色々調べたんですけどわかりませんでした
0232デフォルトの名無しさん
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のスコープを持っているとか表現しる。
#ドコのスコープで実行されるとかは、動的なダイナミックスコープの話で、クロージャとダイナミックスコープは関係ない。
---------------------
0233230
2006/06/12(月) 02:39:00ごめん、確かに表現が悪かった。その上に意図を取り違えてたらしい。
否定した部分も、クロージャ内からfindのローカル変数にアクセスできてしまうかとか
そういう意味で捉えてしまっていたけれど、普通に動的スコープの話だと考えれば合ってたな。
と言うことで230撤回させてくださいorz 申し訳ない
0234216
2006/06/12(月) 09:12:02「間違いを正してくれてありがとうございます
やっと、なんとか一応理解できました」
と思ったら
>>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と表示される。
この理解で大丈夫ですか?
0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
2006/06/12(月) 11:30:33バブルソート?クイックソート?
0237デフォルトの名無しさん
2006/06/12(月) 12:12:28基本はマージソート。設定によりクィックソートも可。
0238デフォルトの名無しさん
2006/06/12(月) 13:51:04Fcntl.pmの:flockの
LOCK_SH LOCK_EX LOCK_NB LOCK_UN
の値は全てのプラットフォームで共通でしょうか
0239デフォルトの名無しさん
2006/06/12(月) 13:57:20らくだ本のsortの項目には書いてないことが
5.8.7のperldoc sortにはたくさん書いてあるね
昔はデフォルトでクイックソートだったが、
5.8からはマージソートになったんだね
勉強んなったありがとー
0240デフォルトの名無しさん
2006/06/12(月) 14:51:30違う値になってるのは見たことはないが、同じである保証はないと
思って書いとけ。
0241デフォルトの名無しさん
2006/06/12(月) 16:21:57表示があかしくなってしましました。
以前は、「total 単位:万」とtを下に横書きで表示されていたのですが、
下記のようになりました。
万
:
位
単
l
a
t
o
t
GDのバージョンを2にしたのが原因かと思われますが、
さくっと解決する方法ありますでしょうか?
フォントとか変えるだけでうまくいかないものでしょうか?
0242デフォルトの名無しさん
2006/06/12(月) 16:37:46perlの問題違うやん
0243デフォルトの名無しさん
2006/06/12(月) 17:14:39知らないけど、文字の描画方向が下から上の縦書きになってんじゃないの?
そんな自然言語見たことないが。(世界は広いからどこかにあるかも知れないな)
0244デフォルトの名無しさん
2006/06/12(月) 20:21:20mod_perl時にPerl/CGIのEND{}と同様の事をしたい場合どうするのが一番良いのでしょうか。
0245デフォルトの名無しさん
2006/06/12(月) 20:41:210246デフォルトの名無しさん
2006/06/12(月) 20:52:11WebProg板にmod_perlのスレがあるのでこちらへどうぞ
http://pc8.2ch.net/test/read.cgi/php/1149505269/
0247デフォルトの名無しさん
2006/06/12(月) 21:04:50for($i=0;$i<100;$i++){
$a=$a-0.1;
print("$a\n");
}
のようにすれば6から0.1ずつ引いていってくれるはずだと思ったのですが、
ある数値を境に、0.99999998などというような数値になってしまいます。
何か間違えている部分はありますでしょうか。
0248デフォルトの名無しさん
NGNGPeerGuardian?
一文字多いか
0249デフォルトの名無しさん
2006/06/12(月) 21:23:59浮動小数点の処理には誤差が伴う。
「正確な値」になることを期待することがそもそも間違い。
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_
0250デフォルトの名無しさん
NGNGuse bignum;
でもしてろってこた
0251デフォルトの名無しさん
2006/06/12(月) 21:31:39因縁みたいなもんなんですね。
0252デフォルトの名無しさん
2006/06/12(月) 21:40:27PerlGuandam
0253デフォルトの名無しさん
2006/06/13(火) 00:26:21ありがとございます。そちらで聞いてみます。
0254デフォルトの名無しさん
2006/06/13(火) 11:49:240255デフォルトの名無しさん
2006/06/13(火) 16:51:440256デフォルトの名無しさん
2006/06/13(火) 17:58:03うん、すごいね。どんどん活用しようぜ!!
0257デフォルトの名無しさん
2006/06/14(水) 22:45:50という願いを込めて、持ってた本を全部処分した。すっきり。
0258デフォルトの名無しさん
2006/06/14(水) 23:23:39はいはいおもしろーいおもしろーい。
0259デフォルトの名無しさん
2006/06/14(水) 23:31:23いままでお疲れさまでした。
これからもHaskell世界でご活躍ください。
0260デフォルトの名無しさん
2006/06/14(水) 23:35:56どうしてperlから足を洗いたいと思ったの?
ま、まさかあんたはてなの中の人じゃないだろうね
0261デフォルトの名無しさん
2006/06/15(木) 01:13:460262デフォルトの名無しさん
2006/06/15(木) 02:59:340263デフォルトの名無しさん
2006/06/15(木) 05:44:14俺は PHP から足を洗った。
おかげでストレスがが溜まりません。
0264デフォルトの名無しさん
2006/06/15(木) 08:42:20普通はどうゆう風に実行するのが一般的っていうか、普通なのでしょうか。
((100 + 200) / 100) + (50 / 10)
evalとかそうゆう話じゃなくて、(カッコ)のネストの解析の話です。
いろいろ考えましたが、
1:開きカッコを見つけ次第、開きカッコの数を数えながら閉じカッコを見つけて、対応するカッコを探していく。
2:正規表現で外側のカッコの中から、式を抜き取ると同時に、適当な重複しない名前を置いておく(置換する)。
3:その際、優先順位は左の開きカッコから順番とする。
4:抜き取ったカッコの中身は抜き取った順が狂わないようにハッシュに入れていく。
5:最後に抜き取った順から、実際の式を計算する。
6:計算が終了するたびに、置いてきた名前と式の結果を置き換えていく。
7:全部終わったら完了。
って手順は変ですか?
0265デフォルトの名無しさん
2006/06/15(木) 10:39:59evalじゃだめですか(´д`;)?
括弧による優先順位がある場合、
普通は再帰を使った解析をします。
ということでevalじゃだめですか(´д`;)?
0266デフォルトの名無しさん
2006/06/15(木) 11:48:42PHPはクソのクソまみれだと確信できる
というかフレームワークいくつもいらないだろ?
その点Perlはホリエさんの遺品があるからばっちぐー
0267デフォルトの名無しさん
2006/06/15(木) 12:56:320268デフォルトの名無しさん
2006/06/15(木) 13:06:53そういえば式の解析は Perl 4 のラクダ本に載ってたなあ。
でもそれはたしか再帰使ったりして散々解説したあとで最後に
全部捨てて
print eval $_,"\n";
の1行にして終わっていた。w
(これはLarry Wall がウケ狙いで書いてたんじゃないかと思う)。
まあ、そういう計算式の解析については再帰使うのが定番なので
普通に再帰でやればいいんじゃないだろうか。Perl なら文字列の
扱いが楽に書けるのでC言語とかとはまた違った分かり易い形で
書けるかも知れない。
0269デフォルトの名無しさん
2006/06/15(木) 13:15:270270デフォルトの名無しさん
2006/06/15(木) 13:49:130271デフォルトの名無しさん
2006/06/15(木) 13:53:53sub calcflat { eval shift } # 括弧の無い式の計算
my $exp = '((100 + 200) / 100) + (50 / 10)';
1 while $exp =~ s{\(([^()]*)\)}{ calcflat $1 }ge;
print calcflat($exp);
0272デフォルトの名無しさん
2006/06/15(木) 15:25:09入出力記号について調べていたらこんな表を目にしました。
┏━━┯━━┯━━┯━━┯━━┯━━┓
┃ │読取│書込│追加│作成│上書┃
┠──┼──┼──┼──┼──┼──┨
┃ < . │ ○ │ × │ × │ × │ × ┃
┠──┼──┼──┼──┼──┼──┨
┃ > . │ × │ ○ │ × │ ○ │ ○ ┃
┠──┼──┼──┼──┼──┼──┨
┃ >> │ × │ ○ │ ○ │ ○ │ × ┃
┠──┼──┼──┼──┼──┼──┨
┃ +< │ ○ │ ○ │ × │ × │ × ┃
┠──┼──┼──┼──┼──┼──┨
┃ +> │ ○ │ ○ │ × │ ○ │ ○ ┃
┠──┼──┼──┼──┼──┼──┨
┃.+>> │ ○ │ ○ │ ○ │ ○ │ × ┃
┗━━┷━━┷━━┷━━┷━━┷━━┛
これを見る限りでは、テキストファイルの読み込みと書き込みを行う時は
いつも+>を使えば済むと思いました。
<と>を使い分ける必要はあるのでしょうか?
0273デフォルトの名無しさん
2006/06/15(木) 15:33:39その「上書」と言うのは、ファイルを作り直す。
つまり、元のファイルの中身が消える、と言う意味。
だから+>は読み取りには使えない。
0274デフォルトの名無しさん
2006/06/15(木) 15:35:32だけで読んでも意味のないファイルから読むというような間違った
コードを書いてしまった場合にエラーが出ないのでそのバグの
発見が遅れる。
0275264
2006/06/15(木) 16:08:20まぁ、短い記述しか読まないと思うのでうまいこと綺麗に見えるように工夫しながら書いてみます。
ありですた。
0276デフォルトの名無しさん
2006/06/15(木) 16:25:24eval部分は括弧ないんだから、自前のルーチンでも何でもいいじゃない。
0278デフォルトの名無しさん
2006/06/15(木) 16:31:42例えperlだったとしても外部から指定された記述をevalするわけありません。
それを一言にまとめると「evalの話じゃない」ってなります。
一応動作する記述は書けたんであとは綺麗になるように書き直します。
0279デフォルトの名無しさん
2006/06/15(木) 16:37:23ちゃんと271さんのも試してみてます。
なんかやってるうちに綺麗にかけそうな気がしてきたんで、とにかくありですた。
0280デフォルトの名無しさん
2006/06/16(金) 00:10:110281デフォルトの名無しさん
2006/06/16(金) 01:32:18まぁそういう風に質問できる奴なら、自分で CPAN のライブラリでも見付けるか。
0282デフォルトの名無しさん
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 .を追加。
0283デフォルトの名無しさん
2006/06/16(金) 01:49:15できませんじゃなくて、まったく考えてもいないのでは。
0284デフォルトの名無しさん
2006/06/16(金) 02:07:11ex9
辞書を読み込んでハッシュに。
そのハッシュを使って文書ファイルを置換でOK。
(辞書にない単語は空文字列で置き換え…か?)
exA
辞書に品詞情報を追加
ex9と同様に置換したあと、品詞情報で動詞なのを最後に持ってくるでOK。
ex8
意味わかんね
これでできなきゃその授業はあきらめたほうがいいかな。
つーか、この授業なに?
0285デフォルトの名無しさん
NGNGPerlでリクに答えるスクリプトを作るスレ
http://pc8.2ch.net/test/read.cgi/tech/1086143976/
0286デフォルトの名無しさん
2006/06/16(金) 10:26:070287デフォルトの名無しさん
2006/06/16(金) 10:33:56力が本当に試されている部分だと思うよ
0288デフォルトの名無しさん
2006/06/16(金) 10:41:54そう、自分でコードを書くなんてバカのやること。
最近は、どうやって人を騙してタダで仕事をさせるかが問われている。
Web2.0っていうやつだな。
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
2006/06/16(金) 11:23:56>>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.
結果:
私は です ファック .
あなたは です プッシー .
0291デフォルトの名無しさん
2006/06/16(金) 11:40:53s/\./ ./g for @target_list;
s/^ //g for @target_list;
追加です
0292デフォルトの名無しさん
2006/06/16(金) 11:43:44s/^ //m for @target_list;
だった
0293デフォルトの名無しさん
2006/06/16(金) 11:51:280294デフォルトの名無しさん
2006/06/16(金) 11:52:55use 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";
やっとできたぽ
0295デフォルトの名無しさん
2006/06/16(金) 11:53:520296デフォルトの名無しさん
2006/06/16(金) 12:10:12#!/usr/local/bin/perl
use warnings;
use strict;
open my $fh, '>>', 'text.txt' or die "$!";
print $fh 'I have this book.';
やったぽ問い3も解けたぽ
0297デフォルトの名無しさん
2006/06/16(金) 12:55:07use 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 ;}
やったぽできたぽ
0298デフォルトの名無しさん
2006/06/16(金) 12:57:24[v]am です
I 私は
you あなたは
[v]are です
fack ファック
pussy プッシー
text.txt---
I am fack.
you are pussy.
結果:
私はファックです.
あなたはプッシーです.
0299デフォルトの名無しさん
2006/06/16(金) 13:52:060300デフォルトの名無しさん
2006/06/16(金) 14:08:17この書込みも同類だろうからあげとこうか
0301デフォルトの名無しさん
NGNG0302デフォルトの名無しさん
2006/06/16(金) 15:48:02プッシー
0303デフォルトの名無しさん
2006/06/16(金) 17:06:24もう来年から教授は授業にperl使わないだろうな
0304デフォルトの名無しさん
2006/06/16(金) 17:07:10短かめを狙ってみた。
#!/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'; <> } ;
これ、このままコピペして宿題として提出したら先生の反応は面白いかも。
0305デフォルトの名無しさん
2006/06/16(金) 18:22:52open 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";
0306デフォルトの名無しさん
2006/06/16(金) 18:24:18だな
0307デフォルトの名無しさん
2006/06/16(金) 19:43:310308デフォルトの名無しさん
2006/06/16(金) 19:51:150309282
2006/06/16(金) 21:20:43このまま提出します!
0310デフォルトの名無しさん
NGNG0311デフォルトの名無しさん
2006/06/16(金) 21:46:39282 「教授、そこがperlの魅力なんですよ!頭の中にあるもやもやした
形にならない思考をコードを書きながら具現化できる、こんなことができるのは
perlぐらいですよ!」
教授 「まぁよくわからんがとりあえず実行してみて確認してみるか」
#perl ex9.pl
あなたはプッシーです.
0312デフォルトの名無しさん
2006/06/16(金) 21:56:52UPDATE SEISEKIHYO
SET HYOKA = '0',
SET RIYU = '私は断じてPUSSYなどではない'
ヒント:WHERE条件を設定し忘れている
0313デフォルトの名無しさん
2006/06/16(金) 23:19:440314デフォルトの名無しさん
2006/06/16(金) 23:57:490315デフォルトの名無しさん
2006/06/17(土) 22:52:020316314
2006/06/17(土) 23:54:03->AddRichEditして、そこでフォント変更するようにした。
0317デフォルトの名無しさん
2006/06/18(日) 17:06:41下位ディレクトリにある、日本語を含むテキストファイルをOPENできませんでした。
スクリプトと同じディレクトリにあるファイルはOPENすることができます。
かれこれ2、3時間ハマってます…。
対処法をご存知の方がいらっしゃいましたらご享受願えませんか?
0318デフォルトの名無しさん
2006/06/18(日) 18:17:120319デフォルトの名無しさん
2006/06/18(日) 18:42:58失礼しました。
メッセージ内容は以下の通りです。
「No such file or directory at EditEnquete.pl line 35.」
ちなみにエラー箇所のソースは以下の通りです。
「open (IN, "<:encoding(jis)", "./email/$file") or die $!」
日本語を含まないファイル名(例:aaa.txt)では問題なくOPENできます。
メールファイル(拡張子.eml)をそのまま入力にしていますので、
エンコード指定はJISとしております。
色々試してはいるんですが中々うまくいきません…。
0320デフォルトの名無しさん
2006/06/18(日) 19:09:20日本語のファイル名でだめなときは、たぶんファイル名の文字コードがお前のシステムが
期待するものと合っていない。
ファイル名をopenに渡す前に適切な文字コードにencodeすればいいと思われる。
0321デフォルトの名無しさん
2006/06/18(日) 19:46:50文字コードcp932を使用していることがネックになっているらしいと判明しました。
※対処法までは調べ切れませんでしたが…
もう少し頑張ってみるつもりですが、
最悪 前処理としてrenameすることも検討してます。
回答ありがとうございました。
0322デフォルトの名無しさん
2006/06/18(日) 22:14:550323デフォルトの名無しさん
2006/06/19(月) 00:21:39そこにある例なんだけど、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しないでもファイルオープンできて、中身もちゃんと読めた。
0324デフォルトの名無しさん
2006/06/19(月) 19:44:020325デフォルトの名無しさん
2006/06/19(月) 21:48:18DBI普通に業務に使っていいよね?
日本語処理に関して致命的な欠陥とかないよね?
文字コードはcp932なら問題ないよね?
0326デフォルトの名無しさん
2006/06/19(月) 23:16:38データベースを使うのにDBIを使わない選択はないと思うが。
というかDBDによるんじゃね?
0327デフォルトの名無しさん
2006/06/20(火) 01:43:34その用途なら use encoding ではなく use open の使い所だと思うよ。
ファイル名は別途、適宜 Encode::(de|en)code して使いましょう。
0328デフォルトの名無しさん
2006/06/20(火) 01:58:17> DBI普通に業務に使っていいよね?
だめです。なぜならあなたはそれをここで訊いているからです。
それを相談できる相手が社内にいないのであれば、いずれ部署内では保守できなくなり、リプレースが行われることになります。
その時にはもう二度と Perl が選択されることはないでしょう。
> 文字コードはcp932なら問題ないよね?
安心してください。cp932 *でも* 問題なく処理できる方法があります。
0329デフォルトの名無しさん
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 ) ;
0330デフォルトの名無しさん
2006/06/20(火) 05:16:35突っ込みどころが恐ろしいくらいに沢山あるけど、とりあえず直接的な原因は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で開いておくとスコープアウトすれば閉じられる
}
0331329
2006/06/20(火) 06:03:49ありがとうございます。
でも、実行するとエラーが出てしまいます・・・
Unrecognized character \x81 at C:\(中略)\copal277\copal.tmp line 6.
最終的には、ファイル名やファイルの中身の表示は不要で、
ファイルの中身を用いた計算結果のみ表示させようと思っています。
0332デフォルトの名無しさん
2006/06/20(火) 06:15:100333329
2006/06/20(火) 06:26:55>>332
成功しました〜。
当方、Excelマクロをほんのちょっとかじったことがあるくらいで、perlは昨日勉強始めたばかりですw
どうみても無謀です。もうね、俺、本当にアボガド。
教えていただいたソースの内容、ネットで検索しながら勉強させていただきます。
ありがとうございましたm(_ _)m
0334デフォルトの名無しさん
2006/06/20(火) 10:02:22Perlは比較的簡単だから、むぼーでもないが、
全角スペースぐらい視覚的にわかるエディタでも使いなさい。
0335デフォルトの名無しさん
2006/06/20(火) 14:16:03$smtp = Net::SMTP->new("yahoo.co.jp");
などとしても自動的にMXレコードから引っ張ってきてくれません。
モジュール等は使わずに
MXレコードのIPアドレスを取得する方法等、ありませんでしょうか。
0336デフォルトの名無しさん
2006/06/20(火) 14:17:23Perlの敷居が低いと言われるのは汚い記述が可能だからなんだけど、
普通汚い記述書かないし、綺麗な記述かこうとすると、初心者には他の言語より敷居が高いですぜ。
0337デフォルトの名無しさん
2006/06/20(火) 14:23:42コンストラクタの第一引数ってhostだよね。
ドメイン渡したらMXレコード自動的に引いてくれるなんてどこに書いてある?
0338デフォルトの名無しさん
2006/06/20(火) 14:28:28書いてませんが何か?
0339デフォルトの名無しさん
2006/06/20(火) 15:02:020340335
2006/06/20(火) 15:09:27あくまで標準モジュールor組み込み関数のみで可能なのかお聞きしたかったのです。
>>337
Net::SMTPと云う名前のモジュールを名乗っているのですから、
それぐらい標準で出来て欲しいなと思いました。
0341デフォルトの名無しさん
2006/06/20(火) 15:23:12突っ込まなきゃ入ってないモジュールを使いたくないとは
これいかに。
0342デフォルトの名無しさん
2006/06/20(火) 15:28:310343デフォルトの名無しさん
2006/06/20(火) 15:29:19ガンバレ。
時間の無駄だけどな。
0344デフォルトの名無しさん
2006/06/20(火) 15:29:45Net::SMTPは標準モジュールですが、何か?
0345335
2006/06/20(火) 15:31:03後出来たら無駄な煽りはやめて欲しいですね。
分からないタコは黙ってて下さい(笑)
0346デフォルトの名無しさん
2006/06/20(火) 15:37:27あああ、まぢ。
気がつかない間に入ってやがる。。。。
これを入れるならNet::Telnetも入れとけってんだ。
0348デフォルトの名無しさん
2006/06/20(火) 15:52:07ああいう馬鹿なこと聞くやつらにはむしろ自分で書かせたほうがいいと思う。
0349335
2006/06/20(火) 15:56:200350デフォルトの名無しさん
NGNG0351デフォルトの名無しさん
2006/06/20(火) 16:26:130352デフォルトの名無しさん
2006/06/20(火) 16:50:130353デフォルトの名無しさん
2006/06/20(火) 17:02:41それらのファイルのすべての組み合わせを作りたいですが、どう作ればよいのか教えていただけないでしょうか?
例えば
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
という結果が欲しいのです。
宜しくお願いします。
0354デフォルトの名無しさん
2006/06/20(火) 17:17:01my %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 ;
って漢字?
0355デフォルトの名無しさん
2006/06/20(火) 17:22:26Set::CrossProduct
0356353
2006/06/20(火) 17:28:51ありがとうございます。しかしすいません、>>353の例の様に、
同じディレクトリのファイル同士の組み合わせは作りたくないのです。
説明が足らなくてすいません。
0357デフォルトの名無しさん
2006/06/20(火) 17:28:550358デフォルトの名無しさん
2006/06/20(火) 17:36:43( 353 の例のように file1_ file2_ ってなってるなら)
next if ( $id =~ /file(¥d+)/)[0] == ( $id2 =~ /file(¥d+)/)[0] ;
を 354 の next ~ の次の行に入れればいい。
ファイル名が違うなら…説明がめんどいので略。
# Set::CrossProduct かあ。メモメモ。
0359デフォルトの名無しさん
2006/06/20(火) 18:02:49use 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; }
}
0360デフォルトの名無しさん
2006/06/20(火) 19:07:05ありがとうございます。こんなモジュールがあったなんて知りませんでした。
早速使ってみます。
0361デフォルトの名無しさん
2006/06/20(火) 19:08:35sub 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散策してるってのにまだまだ知らない便利なモジュールいっぱい
0362デフォルトの名無しさん
2006/06/20(火) 19:22:15単にちょっとした好奇心から質問なんだけど、
あるディレクトリからそれ以下の最新ディレクトリまでの全てのディレクトリを検出するの。
でも再帰は使わないの。
どうすんの?これ?
見たいので見せてください。
俺はできませんでした。
0363デフォルトの名無しさん
2006/06/20(火) 19:46:180364353
2006/06/20(火) 20:04:00ありがとうございました。
>>362
dir (or ls) をパイプ付きで open するとズルができます。
open(DIR, "dir /s /q |");
0365デフォルトの名無しさん
2006/06/20(火) 20:05:040366デフォルトの名無しさん
2006/06/20(火) 20:56:29やってみたら出来た。再起よりコンパクトになった。と言うかループの中3行になった…。
なんだよこの簡単さは…。この前考えた時はすごく苦労して出来なかったのに。
>>364
パイプは使わんのでよくわからんから検索してくる。
0367デフォルトの名無しさん
NGNG0368デフォルトの名無しさん
2006/06/20(火) 21:44:420369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
2006/06/20(火) 21:59:06えー、どうしようかなー
0371デフォルトの名無しさん
2006/06/20(火) 22:58:48見るだけだから。絶対何もしないから。
0372デフォルトの名無しさん
2006/06/21(水) 01:01:59while(@work){
print $_ = shift @work, "\n";
push @work, grep -d && !/^\.\.?$/, glob "$_/*";
}
ワンライナーまでもうちょっと?
0373デフォルトの名無しさん
NGNG0374デフォルトの名無しさん
2006/06/21(水) 02:12:05perl -e "push @ARGV, grep -d&&!/^\.\.?$/&&print($_.$/), glob shift(@ARGV).'/*' while @ARGV" C: D:
>>373
ありがとう。 と言ったそばから(&亀レス)で悪いけど>>47のsオプションいらんからね。
0375デフォルトの名無しさん
2006/06/21(水) 02:58:17printは、
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:
みたいな真似もある気がする。
0376デフォルトの名無しさん
2006/06/21(水) 03:30:36print while <PIPE>;
close PIPE;
0377デフォルトの名無しさん
2006/06/21(水) 05:33:200378デフォルトの名無しさん
2006/06/21(水) 17:00:34widthが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
0379デフォルトの名無しさん
2006/06/21(水) 17:08:08単なる無駄だよ。無駄な文字列生成してる。
0380デフォルトの名無しさん
2006/06/21(水) 17:28:57縦横比変えないなら、ScaleじゃなくてTransform使ったら?
比率の計算も要らないし。
何故黒くなるのかは分からないが
0381デフォルトの名無しさん
2006/06/21(水) 23:53:33俺っちは今んとこ Smart::Comments
汎用性のあるお勧め CPAN モジュールでも可。
0382デフォルトの名無しさん
2006/06/22(木) 00:16:460383デフォルトの名無しさん
2006/06/22(木) 00:28:17ま、惰性で使ってんだけどさ
0384デフォルトの名無しさん
2006/06/22(木) 00:30:22まだ使い込んでないけれど注目してるやつで、Contextual::Return
0385381
2006/06/22(木) 00:41:12Contextual::Return 便利そうだな。メモめも
0386デフォルトの名無しさん
2006/06/22(木) 00:52:12#Inline::rubyってうちの環境だと動かん。まあ、興味だけだからどうでもいいんだが…
0387デフォルトの名無しさん
2006/06/22(木) 01:26:50Inline::Rubyは2002年のだから、もしかして仕様変わっちゃってるんじゃないか?
そういや最近WebProg板のPerlモジュールスレでInline::Rubyと同等のことをやってる人を見たな
http://pc8.2ch.net/test/read.cgi/php/997829243/879-
バージョン番号色々変えてみたら0.10まであるみたい。
0388デフォルトの名無しさん
2006/06/22(木) 01:46:32thx.
頭の片隅に入れとこ
つーかほかの紹介モジュールの方が興味深かったりw
0389デフォルトの名無しさん
2006/06/22(木) 02:41:00寝よ...
0390デフォルトの名無しさん
2006/06/22(木) 03:31:350391デフォルトの名無しさん
2006/06/22(木) 14:12:000392デフォルトの名無しさん
2006/06/22(木) 17:16:10だったら google した方がよいとおも。
0393デフォルトの名無しさん
2006/06/22(木) 17:50:52mysqlバージョン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ど
どうすればいいですか?
0394デフォルトの名無しさん
2006/06/22(木) 18:03:55一画面ずつとかする方法はないの?
0395デフォルトの名無しさん
2006/06/22(木) 18:05:54PageUpとかPageDownとか
0396デフォルトの名無しさん
2006/06/22(木) 18:26:54なんともアドバイスのしようがないと思われる。
0397デフォルトの名無しさん
2006/06/22(木) 18:30:48あれ?なんでだろ?一番最初に試したはずなのに
どうもありがとうございました
0398デフォルトの名無しさん
2006/06/22(木) 20:12:510399デフォルトの名無しさん
2006/06/22(木) 23:05:41クォートで括ってみれば?
それでも駄目ならprogra~1を使うとかスペースを含まないディレクトリにハードリンクを作るとか。
……あれ、testの後ろコンマに見えるけど、いいんだっけ?
database=test;とかにしてみたらどうですかね。
関係ないかもしれないけど気になった。
#ちゃんとドキュメント読めって話ではある。
#たぶん書いてるでしょ。
0400393
2006/06/23(金) 03:21:53dbi: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...
みたいなカンマを使った記述はなかった
どこでこんなの覚えたのやら・・・
で、最初のやつをカンマをセミコロンに直すと別にクォートしなくても通った!
さんくす!!!
しょうもないバッドノウハウ見つけちまったい
0401デフォルトの名無しさん
2006/06/23(金) 09:18:039 -> 0, z -> a とのことなのでこの結果は 10a になると思ったのですが 10 になります。
なぜでしょう?
0402デフォルトの名無しさん
2006/06/23(金) 09:35:560403デフォルトの名無しさん
2006/06/23(金) 09:41:46$++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 。
0404デフォルトの名無しさん
2006/06/23(金) 09:49:38perlopには以下のように書いてある。
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になるのはわかんね。
0405デフォルトの名無しさん
2006/06/23(金) 09:54:11$++a のまま実行したんじゃないのか
0406デフォルトの名無しさん
2006/06/23(金) 09:56:52> cygwinで0になるのはわかんね。
$++a == $+ + a
0407デフォルトの名無しさん
2006/06/23(金) 10:20:240408401
2006/06/23(金) 11:24:53質問自体を間違えてました。(汗
$++a は ++$a の間違いです。
>>403 >>404 で理解できました。ありがとうございました。
0409デフォルトの名無しさん
2006/06/23(金) 13:48:47今月末までにHTML::Parserと、LWP::UserAgentをマスターしろと言われた…
さっぱりわからない
後1週間しか無い訳なんだけど、みんなこの短期間で出来る?初めて2週間で。
この仕事がクリア出来なかったら首が飛ぶことになってるwwwww
orz
0410デフォルトの名無しさん
2006/06/23(金) 13:57:46何もかも初めてなら、身の振り方を考えておけ。
0411デフォルトの名無しさん
2006/06/23(金) 14:04:27いや、プログラミング自体初めてで、
出来るのなんてReshackerで日本語化くらい…
身の振り方は…まだヤングなんでちょっとわからんですたい
0412デフォルトの名無しさん
2006/06/23(金) 14:04:47HTML::Parser と LWP::UserAgent ならとりあえず使えるようになるまでが
数時間で詳細まで調べてかなり使えるようになるのが一週間ぐらいじゃないか?
(人によるか。そんな掛かんないかも)
Perl 初めて2週間か。とりあえず朝も晩も電車乗ってる時もそればかり勉強
してれば何とかなるのでは? もちろん家と会社ではPCを使って延々と実習。
寝るとき以外は休まず7日間な。どうしても分からなくなったらここで聞け。
そのぐらいやればいくら何でも脳に刻み込まれるだろう。(逆に言うと、そこ
までやってもサッパリ分からないとか、そんなことまでしたくない、という
場合はもう一生辞めておけ)。
0413デフォルトの名無しさん
2006/06/23(金) 14:10:060414デフォルトの名無しさん
2006/06/23(金) 14:15:44一週間ですか…もうどこから初めて良いのかわからなくて…
>>413の言う通りお先真っ暗ですよw
会社で勉強だけをするのは無理な状況なんで、深夜に勉強してる。
とりあえず、一週間死ぬ気で勉強してみるよ!!
ありがとうござます
死ぬ気で頑張れば出来る事がわかっただけで、励みになりました。
超ありがとう
0415デフォルトの名無しさん
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);
0416デフォルトの名無しさん
2006/06/23(金) 15:26:53unlink <${w_delf}>;
どっちでもいけた。
unlink <$w_delf>;
これはダメだった。
0417デフォルトの名無しさん
2006/06/23(金) 15:36:38エロヂカラ偉大。
0418デフォルトの名無しさん
2006/06/23(金) 15:44:03ありがとうございます。
試してみます。m(_ _)m
0419デフォルトの名無しさん
2006/06/23(金) 15:48:29俺の場合は、海外アプリの7割書き換えが仕事で、納期は入社して4日後だった。
プログラムできなかったら死んでたと思う。
0420デフォルトの名無しさん
2006/06/23(金) 18:02:120421デフォルトの名無しさん
2006/06/23(金) 19:06:56日本が使えるまともなシェルを別に使ってる人いますかね?
0422デフォルトの名無しさん
2006/06/23(金) 19:06:57低俗は力なり。
0423デフォルトの名無しさん
2006/06/23(金) 19:45:52NYACUS使ってる、けどワンライナーはあまり書かないな。
0424デフォルトの名無しさん
2006/06/23(金) 20:52:25内容を見るために
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 $_;
}
どのようにしたら内容を見ることが出来るのでしょうか?教えてください。
0425デフォルトの名無しさん
2006/06/23(金) 21:02:50Socketなんて生で使うもんじゃあない。
LWPか、せめてIO::Socketにしとけ。話はそれからだ。
0426デフォルトの名無しさん
2006/06/23(金) 21:21:230427デフォルトの名無しさん
2006/06/23(金) 21:38:23これじゃないの?
0428デフォルトの名無しさん
2006/06/23(金) 21:38:45そうなって当たり前。とりあえず、RFC 2616 を読め。
英文が嫌なら、和訳されている
ttp://www5b.biglobe.ne.jp/~type-aya/rfc/rfc2616j.txt
あたりで充分。
0429デフォルトの名無しさん
2006/06/23(金) 22:16:060430デフォルトの名無しさん
NGNG0431デフォルトの名無しさん
2006/06/24(土) 06:03:470432デフォルトの名無しさん
2006/06/24(土) 10:45:46ありがとうございます。まさにそれでした。とーく2ちゃんねるからコピーしたものだったので見逃していました。
>>428
読んでみます。
>>429
とりあえず\nを追加したら見れるようになったのですがほかの2点のミスとは何でしょうか?
欠陥のあるプログラムにはしたくないので教えてください。
0433デフォルトの名無しさん
2006/06/24(土) 15:38:22文字列の配列を渡すと、それらの文字列の共通するプレフィクスを調べてくれるような関数です。
0434デフォルトの名無しさん
2006/06/24(土) 16:15:02おまえは俺か
001.jpg,002.jpgって連番になってる画像を落としてたな
0435433
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;
}
0436デフォルトの名無しさん
2006/06/24(土) 18:30:52コマンドラインオプション-lについてです。
このオプションは-nや-pと一緒に使うと、ループブロックの先頭で
chompをするという機能があるということなので、
perl -lpe "" xxx.txt
とコマンドを実行してみましたが、普通にxxx.txtの内容が出力されました。
特に改行文字が削除されているようでもなく、ファイルの内容がそのままという
感じです。
何ぜに改行文字が消えないのでしょうか?
0437デフォルトの名無しさん
2006/06/24(土) 19:44:28-lは同時に$\を設定するので、元通りになったように見えているだけ。
マニュアルよく嫁。
0438デフォルトの名無しさん
2006/06/24(土) 20:30:12Python全然知らないけど、それだと意図した動作をしないような気がするぞ
("abc", "ab", "cde");
を渡すと、"ab" が返ってきそうだ。
"" にならなきゃいけないんだよね。
0439デフォルトの名無しさん
2006/06/24(土) 20:56:39それはちゃんと "" がかえります。
後半の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'を比較した時点で不一致になるので、
一文字も確定とならずに ""となります。
0440デフォルトの名無しさん
2006/06/24(土) 20:57:04ab が返ってくるみたい。
os.path.commonprefix は知らないんだけど、単純に前方から一致する文字列を
返せばいいのかな。それとも / や \ 等のデリミタも考慮するのかな。
0441440
2006/06/24(土) 20:59:24s/ab が返ってくるみたい/"" が返ってくるみたい/
0442デフォルトの名無しさん
2006/06/24(土) 21:09:24単純に前方の一致部分です。
文字列の最初の数文字だけ比較すれば済む($min_lenで高々何文字かは絞られる)ので、
文字列を全部 split するのは無駄な気がしてます。
splitせずに一文字ずつ見ていければいいのですが、やりかたがわからない。
0443デフォルトの名無しさん
2006/06/24(土) 21:14:030444デフォルトの名無しさん
2006/06/24(土) 23:28:15&npbs;&npbs;my $buf = join "\n", @_;
&npbs;&npbs;my $repeat = scalar(@_) - 1;
&npbs;&npbs;$buf =~ m{(.*)(?:.*?\n\1){$repeat}};
&npbs;&npbs;$1;
}
やりすぎですか、そうですか。
0445デフォルトの名無しさん
2006/06/24(土) 23:30:120446デフォルトの名無しさん
2006/06/24(土) 23:30:55sub get_common_prefix {
my $buf = join "\n", @_;
my $repeat = scalar(@_) - 1;
$buf =~ m{^(.*)(?:.*?\n\1){$repeat}};
$1;
}
0447デフォルトの名無しさん
2006/06/25(日) 02:01:16揚げ足とるようでスマソ・・・・
文字列自体に改行が含まれる場合はまずいかも
例えば ("abc\nabd","zz") だと ab を返してしまう
0448デフォルトの名無しさん
2006/06/25(日) 02:49:09sub get_common_prefix {
my $prefix = shift;
while (length($prefix)) {
last if (grep(!index($_,$prefix),@_) == @_);
chop $prefix;
}
$prefix;
}
0449デフォルトの名無しさん
2006/06/25(日) 03:23:21あら、入ってくるのファイルパスだけだと思ってたけど、よく読んだら"文字列"なのか
0450デフォルトの名無しさん
2006/06/25(日) 07:38:00配列の要素数に上限ってありますか?
0451デフォルトの名無しさん
2006/06/25(日) 08:10:53メモリの許すまでOK。
0452デフォルトの名無しさん
2006/06/25(日) 08:38:07�dクス
0453デフォルトの名無しさん
2006/06/25(日) 09:41:00大量のエロ画像の山を前にした時だったっけか
htmlからリンク抜き出して、urlを加工して、
その過程で正規表現も習得したんだっけか
で、今になってもそのときとレベルはあんまし変わっていない
ちなみにおれが始めて作ったアプリはVBでエロ画像のスライドショー
俺は、一体何のために生まれてきたんだっけ?
0454デフォルトの名無しさん
2006/06/25(日) 10:51:500455デフォルトの名無しさん
2006/06/25(日) 13:14:48英語で記載したセルとハイパーリンクだけは抽出してくれるのですが、日本語部分が文字化けしてしまいます。
モジュール部分には、以下のように記載しています。
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
お判りになる方がいたら、教えてください。
0456デフォルトの名無しさん
2006/06/25(日) 14:24:420457デフォルトの名無しさん
2006/06/25(日) 14:30:59そうですよね。モジュール正しく入れたか、セルの参照の仕方ばかり見ててうっかりしてました。
FmtJapan->new(Code => 'sjis');
で、スムーズに表示されました。何やってんだ、俺。。。
人様の時間まで使って申し訳ありません。ありがとうございました。
0458デフォルトの名無しさん
2006/06/25(日) 16:18:23お前は俺か。ちょど>>434にレスつけようとしてて
スクロールしたら453がw
0459デフォルトの名無しさん
2006/06/25(日) 16:39:18なさけねぇw
0460デフォルトの名無しさん
2006/06/25(日) 17:05:09>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;
です
0461デフォルトの名無しさん
2006/06/25(日) 17:26:03use PerlIO qw(encoding);
を足せっていうのが出て来た。
0462デフォルトの名無しさん
2006/06/25(日) 19:45:13思い立って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.
0463デフォルトの名無しさん
2006/06/25(日) 19:53:10良かったらアドバイスお願いします
2つの配列の内容が同じものがあったら表示するというだけのものです
foreach (@sysList) {
$curName = $_;
foreach (@dirList) {
if ($_ == $curName) {
print "$curName:$_\n";
last;
}
}
}
0464デフォルトの名無しさん
2006/06/25(日) 19:55:41>if ($_ == $curName) {
eq の間違いでしょう
0465デフォルトの名無しさん
2006/06/25(日) 19:55:57foreach (@dirList) {
if ($_ == $curName) {
print "$curName:$_\n";
last;
}
}
}
0466デフォルトの名無しさん
2006/06/25(日) 19:58:18foreach $syslist(@sysList) みたいに、配列が格納されるスカラー変数を分けたらいいんではないでしょうか?
$_ の変わりに$syslistで処理したらうまく行きませんか?
素人推測ですみません。
0467463
2006/06/25(日) 22:15:37主原因は==でした。eqにしたら直りました。
配列を格納する変数もforeachの所で書くようにしたらキレイになりました。
ありがとうございました。
foreach my $curName (@sysList) {
foreach (@dirList) {
if ($_ eq $curName) {
print "$curName:$_\n";
last;
}
}
}
0468デフォルトの名無しさん
2006/06/26(月) 02:56:55タイプするのめんどいだろうに
0469デフォルトの名無しさん
2006/06/26(月) 03:11:520470デフォルトの名無しさん
2006/06/26(月) 07:32:07> foreachじゃなくてforにしときゃいいんじゃね?
それは書く人が選ぶ問題。
もちろん君や僕はどちらであっても問題なく読めるし、またそうでなければ Perl 使いを名乗れないけれど、
世の中には「Perl を使わなければならない Perl 使いでない人」というのが多数いて、それらの人々にとっては一般に foreach のほうが読みやすい、という側面もある。
0471デフォルトの名無しさん
2006/06/26(月) 10:18:34if分で、$hogeの中の文字の頭3文字がテスト以外のものを認識したいのですが、
そう言う判定方法ってありますでしょうか?
0472デフォルトの名無しさん
2006/06/26(月) 10:22:27; ; とか 数字..数字が入るならfor
それが俺のジャスティス。
0473デフォルトの名無しさん
2006/06/26(月) 10:33:17perlと言えば正規表現
if( !($hoge =~ m/^$hage/) ){}
0474デフォルトの名無しさん
2006/06/26(月) 10:35:23志村ー!~、!~
ついでに\Q\Eしたほうが良いかも
if ($hoge !~ m/^\Q$hage\E/) { }
0475デフォルトの名無しさん
2006/06/26(月) 10:45:23だれかスクリプト持ってません?
ディレクトリ内全部変換でも、ファイル名引数わたしでもなんでもいいです。
0476デフォルトの名無しさん
2006/06/26(月) 10:47:340477デフォルトの名無しさん
2006/06/26(月) 11:41:480478デフォルトの名無しさん
2006/06/26(月) 12:20:180479デフォルトの名無しさん
2006/06/26(月) 12:38:19USAGE: 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
0480デフォルトの名無しさん
2006/06/26(月) 12:57:20それだと頭の3文字以外に、
真ん中にテストってあってもひっかからないのでは?
0481デフォルトの名無しさん
2006/06/26(月) 13:19:41問題よく読め
0483デフォルトの名無しさん
2006/06/27(火) 02:33:29use threads::shared;
my $obj :shared;
$obj = MyObject->new();
として、スレッド間でオブジェクトを共有したい場合、どうするべきですか?
Invalid value for shared scalar といわれてしまいます。
0484デフォルトの名無しさん
2006/06/27(火) 09:16:09threads::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
0485デフォルトの名無しさん
2006/06/28(水) 07:20:33例えば
print"おはよう";
sleep 10;
print"ございます";
を実行すると、10秒間何も表示されず、10秒後に”おはようございます”と
全文が表示されてしまいます。段階的に処理を行い、途中に待ち時間を
入れるようにするにはどうしたらいいんでしょうか。
0486デフォルトの名無しさん
2006/06/28(水) 08:13:20my $len_head = length ( my $head = 'good ' );
syswrite STDOUT, $head , $len_head ;
sleep 10 ;
print 'morning' . "¥n" ;
「 print 」はバッファに溜め込むんだよね。
0487デフォルトの名無しさん
2006/06/28(水) 08:13:37local $| = 1;
0488487
2006/06/28(水) 08:19:03ちなみに STDOUT のバッファリングは行単位なので、>>485 のケースでも sleep の前に \n を吐いてやればそのまま出るんだけどね。
0489486
2006/06/28(水) 08:33:34捕捉すまん。うろ覚えで書き込むな>オレ。
# 単純に STDERR に出力するとかって手もある。
# sleep 使うんだったらメッセージ系だろうし。
0490デフォルトの名無しさん
2006/06/28(水) 10:29:49ありがとうございます。
早速実行してみたところ、>>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;
}
0491デフォルトの名無しさん
NGNG0492デフォルトの名無しさん
2006/06/28(水) 10:43:17486,487のやり方はちゃんと応用すればファイルでもうまくいくはずなので、
たぶん理解しないで直して使い方を間違えているとみた。自分が直した
プログラムをさらしてもらわないとこれ以上はおれにはなんとも。
0493デフォルトの名無しさん
2006/06/28(水) 14:10:00環境依存。OSによって違うよ。
0494デフォルトの名無しさん
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" に変更しただけ -
これだと望んだ挙動はしません。未だこのスレ観てたら御一考を。
0495デフォルトの名無しさん
2006/06/28(水) 18:18:21my $io = new IO::Handle;
$io->fdopen(fileno(STDOUT), 'w');
$io->print('foobar');
$io->flush();
でいいんでねぇの?
0496デフォルトの名無しさん
2006/06/28(水) 20:46:44お前正しいですね。
ともあれツッコミサンキュー。
0497485
2006/06/29(木) 04:47:45ありがとうございます。
とりあえず下記のとおり書き換えてみたらいい感じになりました。
一定時間後にファイル開きなおすとちゃんとその都度ファイルが
書き換わってました。
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;
大変助かりました。本当にありがとうございました。
0498デフォルトの名無しさん
2006/06/29(木) 05:07:44ところで、selectしっぱなしで良いのん?
{
my $oldfh = select FILE; # FILEをデフォルトにして、元のを保管
$| = 1; # バッファリングしない設定を変えて
select $oldfh; # デフォルトのハンドルを元に戻す
}
0499デフォルトの名無しさん
2006/06/29(木) 09:14:060500デフォルトの名無しさん
2006/06/29(木) 09:44:43# Effective Perl 60項 より
select((select(FILE), $|=1)[0]);
0501デフォルトの名無しさん
2006/06/29(木) 10:51:49個人用メモて、
ちらしの裏にでも書いておけwww
0502デフォルトの名無しさん
NGNG0503デフォルトの名無しさん
2006/06/29(木) 11:04:570504デフォルトの名無しさん
2006/06/29(木) 11:49:590505デフォルトの名無しさん
2006/06/29(木) 12:01:00常識ではないような気がするが、気がつかなかったことにして置こう。
0506505
2006/06/29(木) 12:03:27$| って現在selectしているハンドルにのみ有効なの?それなら意味わかるんだけど。
0507505
2006/06/29(木) 12:05:470508デフォルトの名無しさん
2006/06/29(木) 12:06:31しかも不親切な形で。
昔、どこに print 文を挟めばいいのかちょっと悩んだ覚えがある。
>>506
リストの中にプリント文を入れる(んだと思う)。
select (( select(STDERR), $| = 1, print "." )[0] ) ;
0509デフォルトの名無しさん
2006/06/29(木) 12:06:58一行で分かりにくく書いただけでしょ。
0510508
2006/06/29(木) 12:08:26>$| って現在selectしているハンドルにのみ有効なの
そうだよ。
0511デフォルトの名無しさん
2006/06/29(木) 12:26:23そう思うなら>>498みたいに無駄に1個変数を用意すればいいじゃないか。
There's more than one way to do it.
0512デフォルトの名無しさん
2006/06/29(木) 12:27:530513デフォルトの名無しさん
2006/06/29(木) 12:38:000514デフォルトの名無しさん
2006/06/29(木) 12:42:37lispっぽいな
0515505
2006/06/29(木) 13:20:08おー、なるほど。それならば結構、実用的。
俺が const char* aho = strcpy( new char[0xBaca], "aaaa" ); //newしつつ文字列代入
を思いついたときのコードに似ているな。
0xBacaはメモリとりすぎだがな。
0516デフォルトの名無しさん
2006/06/29(木) 13:46:10まちまちです。
どのように受け取ればよいでしょうか?
&test($filename, @cvs)
sub test($@) {
my $file = $_[1];
my @cvs = $_[2]; #これだと一行しか受け取らない
}
0517デフォルトの名無しさん
2006/06/29(木) 13:48:04my $file = shift;
my @cvs = @_;
}
0518デフォルトの名無しさん
2006/06/29(木) 13:49:490519デフォルトの名無しさん
2006/06/29(木) 13:53:00あ、そっかぁ。
ありがとうございます。
0520デフォルトの名無しさん
2006/06/29(木) 14:01:49すみません、やってみたのですが、なぜか
$file に Hoge=HASH(0x99b7dg0)
@cvs に
ファイル名
@cvsの中身となってしまいます...
???
0521デフォルトの名無しさん
2006/06/29(木) 14:09:46my($hash, $file, @cvs) = @_;
0522デフォルトの名無しさん
2006/06/29(木) 14:12:16&mara($hoge, $ga, @moe) のように呼ぶのと似たようなもん。
0523デフォルトの名無しさん
2006/06/29(木) 14:14:02崖を転げ落ちてるな、このスレは。
0524デフォルトの名無しさん
2006/06/29(木) 14:14:45んー、ちょっと難しい仕様ですね。
0525デフォルトの名無しさん
2006/06/29(木) 14:21:24適切な回答ができたのだがな。
&test($filename, @cvs)
0526デフォルトの名無しさん
2006/06/29(木) 14:46:47サブルーチンでの値の受け取りが分からないって…。
0527デフォルトの名無しさん
2006/06/29(木) 15:01:58my @cvs = $_[2];
これでまだ$_[0]があることを想像しろなんて無理。
しかもプロトタイプが$@だし。
0528デフォルトの名無しさん
2006/06/29(木) 15:12:530529デフォルトの名無しさん
2006/06/29(木) 15:24:36それに、下ばかり見ていると、自分もどんどん下がっていきます。
上に行くことを目指しましょう。
上に引っ張りあげることを考えましょう。
0530デフォルトの名無しさん
2006/06/29(木) 18:54:27てかそれに、@csvはどう考えても参照渡しにすべき というかなんというか
0531460
2006/06/30(金) 01:13:38>>461で解決しました有難うございました
追記:'shiftjis'等を使うには明示的にuse Encode::JP;が必要なようです
0532デフォルトの名無しさん
2006/06/30(金) 13:08:48勉強不足ですみません。
どうしてこんなあほな質問がでるのか不思議な様子なので説明をば
perlでオブジェクトを使うのは初めてで、PHPの感覚で$obj->method(), method()でも
受渡しは、同じだろうと思っていました。
blessとかは意味はわからんのですが、Perl&CGIリファレンス本に書いてあった
のをそのまま使っています。
でも本を読んでも意味がよくわからんです。
元々オブジェクトとか考えられていなかったから、こういう仕様なのかなと
勝手に思ったのですが、どうなんでしょうか。
0533デフォルトの名無しさん
2006/06/30(金) 14:45:400534デフォルトの名無しさん
2006/06/30(金) 15:08:260535デフォルトの名無しさん
2006/06/30(金) 16:17:550536デフォルトの名無しさん
2006/06/30(金) 16:23:290537デフォルトの名無しさん
2006/06/30(金) 16:54:39当然自分でもPugsでperl6してるんだよなぁ。
じゃなきゃ説得力ないんだけど。
0538デフォルトの名無しさん
2006/06/30(金) 17:33:590539デフォルトの名無しさん
2006/06/30(金) 18:24:40待ちきれないなら Pugs を試してみれば?
っていう、ただの示唆じゃね
0540デフォルトの名無しさん
2006/06/30(金) 18:29:32あろう事に気づけ。
0541デフォルトの名無しさん
2006/06/30(金) 18:34:03何が言いたいかわからんが、受け渡しは同じだと思うが?
PHPってオブジェクトのメソッドである $obj->method(); を method(); って呼ぶとオブジェクト補完してくれるの?
0542デフォルトの名無しさん
2006/06/30(金) 18:35:260543デフォルトの名無しさん
NGNG0544デフォルトの名無しさん
2006/06/30(金) 18:56:57× 取って付けたようなオブジェクト指向だしな
○ 取って付けたオブジェクト指向だしな
0545デフォルトの名無しさん
2006/06/30(金) 19:09:53そんな事はない。
例えばPythonは結構なOOPLだけどメソッドの第一引数にインスタンスをとる。
0546デフォルトの名無しさん
2006/06/30(金) 19:26:46Pythonもそうなのですか。
でもたいていの言語はthisのようなキーワードを用いるか、省略してもいいという風になっていますよね。
0547デフォルトの名無しさん
2006/06/30(金) 21:25:51enclosure url が引っ張り出せません。
XML::RSS では出来ないようなのですが、他に enclosure url が取得できるものは
あるでしょうか。m(_ _)m
0548デフォルトの名無しさん
2006/06/30(金) 21:44:40make test がいつまでも終わらない…。
CPUもほとんど100%使い切ってるし、こんなもんなの?pugsって。
めちゃプロセス重い。
0549デフォルトの名無しさん
2006/06/30(金) 21:55:50環境は OSX 。
インストールが終ったあとバイナリーパッケージみつけてへこんだw
0550デフォルトの名無しさん
2006/06/30(金) 22:20:221時間以上かかってやっと終わった。
バイナリはあったけどコンパイルしたかったw
1万くらいテストがあるから時間がかかるという事のようで…。
セットアップからmake, make test, make installまでで3時間。長かった。
できあがったものを動かす分には、今の所、問題無し。
同じく環境はOSX。
しばらくperl6で遊んでみます。
0551デフォルトの名無しさん
2006/06/30(金) 22:48:26Perl6 スレをはっとく
次世代Webプログラミング言語の大本命Perl6/Parrot
http://pc8.2ch.net/test/read.cgi/php/1065599868/
0552デフォルトの名無しさん
2006/07/01(土) 01:54:020553デフォルトの名無しさん
2006/07/01(土) 04:37:28関数型言語を学ぶメリットはあるのか?
たんなる「頭の良い人」向けの言語っていうだけじゃないの?
Haskellで実用的・業務的なプログラムを書けるの?
何?変数がないんだって?意味わかんないYO
0554デフォルトの名無しさん
2006/07/01(土) 04:51:30生産性は高いんじゃないかな 多分・・・ まあ2ヶ月ってのはAudreyだからだろうけど
0555デフォルトの名無しさん
2006/07/01(土) 06:14:25> スレ違いを承知で聞かせてもらうが
> 関数型言語を学ぶメリットはあるのか?
楽しいから学ぶ。学びたくて学びたいから学ぶのだ。
「おおなるほど!!」「これはすごい!!」「そうだったのか!!」
と驚きたいから学ぶのだ。
0556デフォルトの名無しさん
2006/07/01(土) 11:30:18発想の転換を促すには良いと思われ。
だからどの言語でも同じようにしか書けない人には意味ないかも。
(PerlでCっぽく書く人にはムカつくんだよ!)
関数型言語の中ではHaskellが一番取っ付きやすいように感じたけど、まあその辺は人それぞれだ。
0557デフォルトの名無しさん
2006/07/01(土) 11:31:10まぁ、関数パラダイムが普及することは絶対ないわな
だって難しすぎるから
普段VBとかで適当なアプリ作ってる人たちにHaskelll
習得させようとしたら窓から逃げる人が続出だな
0558デフォルトの名無しさん
2006/07/01(土) 14:57:310559デフォルトの名無しさん
2006/07/01(土) 16:09:50でもさあ、それはプログラミングな業界が今と同じ形態をとっていることを
前提にした意見だろ?
「Haskellおもすれー!」っていう頭の良い人たちが「平均的なプログラマー」に
なったら、それはそれですばらしいと思わないかい?
0560デフォルトの名無しさん
2006/07/01(土) 16:18:41まあ言語が進化したおかげで
プログラマへの要求が低下して底辺が拡大してるからだが。
0561デフォルトの名無しさん
2006/07/01(土) 17:35:52それがプログラマにとって素晴らしい世界か?
頭の良い人たちの絶対数はそうそう変化しないだろう
つまりそういう人たちが平均的なプログラマになるということは
圧倒的大多数の能無しプログラマが死滅したということだ
てか本当にこれからプログラマになろうという若人たちはあわれだよな
Javaにせよ.NETにせよCPANにせよ
既存のモジュールをインクルードしてnewしてメソッド呼び出せば
それですべて事足りて、
何も根本的な技術は身につかずに、
なのに一部の優秀なプログラマさんたちがどんどん新手の概念やモジュールを
発行し続けて、
これじゃまるでブランドのバッグの新作を買いつづけて破綻するOLじゃないか!
搾取され続ける消費者でしかない
みんないいかげん気づこうぜ!
ヨーロッパの革命の時代、庶民は団結して王族をタタッきった
それは王族どもの搾取があまりだったからだ
自らの生存と平定の世のために民衆は立ち上がった
そう、今俺たちプログラマのおかれる状況も同じだ!
誰だ?誰のせいだ?!誰がこんな状況に俺たちを追い込んだ??
そう!!ゴスリングだ!オードリだ!弾だ!!あいつらだ!!
あいつらが悪なのだ!
0562デフォルトの名無しさん
2006/07/01(土) 17:47:17誤解受けるかも知れないけど。
プログラマ的にはプログラムを書きたくない。
プログラムを書かなくて良い世界って素敵だと思う。
だから今のMovableTypeやTypePadでのブログの流行とか、ああいうのは賛成。
プログラムなんて知らない。HTMLなんて知らない。で良いと思う。
Haskellみたいな難しい言語ができて、そういうプログラマ人口が増えるってのは
ちょっと後退かなと考えてる。
チラ裏すまん。
0563デフォルトの名無しさん
2006/07/01(土) 18:21:410564デフォルトの名無しさん
2006/07/01(土) 23:05:47Jcode.pmのソース見るとeval使ってるんだけど実行時コンパイルで遅いから使わない方法を模索してます。
match('abcdefgfedcba', 'b', 'ig');
sub match {
my ($str, $pattern, $opt) = @_;
$str =~ /$pattern/$opt;
}
みたいなことをしたいっす。
XS使ってperl apiを呼ぶしかないかな?
よろすくおねがいします。
0565デフォルトの名無しさん
2006/07/01(土) 23:08:34evalより、XSをリンクするコストの方がかかる。
0566デフォルトの名無しさん
2006/07/01(土) 23:14:05perlreの(?imsx-imsx:pattern)の項嫁
後ついでにperlopのqr/STRING/imosxも読んでおくと良い
0567デフォルトの名無しさん
2006/07/01(土) 23:14:39わけしちゃえば? w
0568デフォルトの名無しさん
2006/07/01(土) 23:20:01http://d.hatena.ne.jp/higepon/20050615/1118829090
これ見る限りXSのリンクコストがそんなに高いとは思えないのですが…。
C分からんのでまだ試してないですけど、うまくできたら後で報告します。
>>566
qrではgは指定できねっす。
>>567
それ一時考えましたけどエレガントさを感じなかった(我侭ですんません)ので自分の中で却下しました:p
0569デフォルトの名無しさん
2006/07/01(土) 23:29:430570デフォルトの名無しさん
2006/07/01(土) 23:32:57いや、XSのコードは、最初にuseする時にコストがかかる。
そのリンク先のベンチは500万回実行してるけど、
回数少なければXSの方がトータルで遅いはず。
evalは2回目以降はコストほぼ一定だし。
何百回も実行されるコードじゃないんだよね。
しかも、やろうとしてる事は単なるインクリメントじゃなくて、
正規表現なんでしょ?
だったらほとんど変わらないと思う。
XSを勉強したいという事なら別に止めはしない。
けど多分、苦労に見合わない。
0571デフォルトの名無しさん
2006/07/01(土) 23:48:220572デフォルトの名無しさん
2006/07/02(日) 00:07:39#g以外にも指定できない演算子があるし置換演算子のeも指定できないので
567さんの意見を却下したのと同じ理由って事で m(_ _)m
>>570
なるほどでっす。
XSは自分でいじったことなくて分かんないんですけど
DynaLoaderからXSLoaderになってコストが安くなったって聞くんですけど
まだまだ重いもんなんっすかね?
perlのインタープリタの起動自体が重いのでロード時の重さってよほどでない限り
気にしたことなかったす。
EncodeやらDBIやらPOEをいつも使ってるから麻痺してるのかも Σ(゚д゚;)
あと、WEBから利用する場合も標準でmod_perlを利用しちゃってるので
起動後はキャッシュされるので気にしたことなかったっス。
丁寧に説明ありがとうございます。
ここまで来たらXSの勉強のつもりで往ってきます。
>>571
おぉ!!XSから正規表現をいじるサンプルコードだ!!
どうもですぅ!!
0573デフォルトの名無しさん
2006/07/02(日) 08:03:35完全に目的と手段を履き違えてるな。
0574デフォルトの名無しさん
2006/07/02(日) 12:47:05って理由がちゃんと書いてるよ
それに同意できるかどうかは別だけどね。
おまいさんはRegexpモジュールも否定すんのか?
まぁ、このモジュールを利用する最大のメリット
coreをhuckせずに機能を自由にオーバーライド出来る点だけどね
0575デフォルトの名無しさん
2006/07/02(日) 21:15:29だけど。
0576デフォルトの名無しさん
2006/07/02(日) 21:16:200577デフォルトの名無しさん
2006/07/02(日) 21:33:54話についてけないなら無理に書きこする必要はないんだよ
おとなしくROMってな、房や
0578デフォルトの名無しさん
2006/07/02(日) 21:59:02中の「 | 」のコスト高はしってると思ってさ。
速度を気にするときの基本って意味でパイプを例にだした
だけなんだ。
0579デフォルトの名無しさん
2006/07/02(日) 22:10:08まあ、そんなに速度は気にしないからパイプもevalも
必要に応じて使ってるけど
0580デフォルトの名無しさん
2006/07/02(日) 22:11:30evalのコストくらい結局吸収されちゃうと思う。
0581デフォルトの名無しさん
2006/07/02(日) 22:28:01ぶっちゃけcgiとしてしか使ってないんじゃない?
俺の周りでperlでWindowsやUNIXや組み込みプログラム組んでるの見た事ないんだけど…
せいぜいインストールスクリプトくらい。
ム板に居座る為に口実であくまで非cgiとして使ってる事にしてるんじゃなかろうな?
0582デフォルトの名無しさん
2006/07/02(日) 22:30:340583デフォルトの名無しさん
2006/07/02(日) 22:32:24ワンライナー多数。
仕事では死ぬ程たくさん書いた。全部CGIじゃなかった。
0584デフォルトの名無しさん
2006/07/02(日) 22:49:54スタンドアロンじゃないがSubversionのフックスクリプトとかPerl製。
Un*x環境では鯖の管理スクリプトを時々頼まれて…CGIも結構作るがね。
最近のスタンドアロン物だと、ウェブから仕入れた法文をPalm用に変換・整形するツールを作ってる。
しかし、こうやって考えてみると、その場で使って棄てるような小物が多いから、
見せられるようなものってあんまり無いなー
0585デフォルトの名無しさん
2006/07/02(日) 23:20:44「evalは2回目以降はコストほぼ一定だし。」
詳細は perldoc -f eval
564がマッチング演算子まで変数で指定できるように
しようとしてるわけだからevalでやろうとすると
eval BLOCKではなく eval EXPRになる。
この場合は毎回式を評価してから実行となる。
>>580
モジュールを沢山使用することによる初期コストは
どんなに大量にデータを処理しても一定なのに対して
evalはデータ処理のループの回数だけ実行されて積み重なる。
perlスクリプトでのCGIで簡単な処理しかしないなら
インタープリタの起動コスト、モジュールのコンパイル
XSへのリンクコストが気になるのかもしれないが
バッチ処理での大量のデータの処理などは初期コストの数秒より
積み重ねの数時間のほうが大いに気になる。
CGIでしか利用していないならWebProg板に往きなさい。
0586デフォルトの名無しさん
2006/07/02(日) 23:28:13evalって評価器の立ち上げにコストがかかるんじゃなかったっけか。
>>570 とかの言ってるコストってそっちじゃないの?
おれの覚え違い?ひょっとして。
0587デフォルトの名無しさん
2006/07/02(日) 23:30:38つか結局 >>564 は、>>572 にある通りwebで使うみたいだから
そんなに同じ処理くり返すとは思えないんだけど。
0588デフォルトの名無しさん
2006/07/02(日) 23:48:47564は572で「あと、WEBで利用する場合も」とついでに説明だしてるだけだし
初期コストより実行時コストを重視してる言い回しだろ。
日本語読めてんか?
0589酩酊 ◆TWARamEjuA
NGNG仕事ではエクセルでちまちま数字打ち込むよりかはテキストファイルですぱぱぱぱと描いて、
適当に変換してエクセルに貼り付けたり。
0590デフォルトの名無しさん
2006/07/03(月) 00:22:11564へのレスがCGIでの使用を前提としたような反応が多いね。
最たるものが>>573は目上からの物言いをしてるけど
実はこいつが見当違いなレスをしている。
0591デフォルトの名無しさん
2006/07/03(月) 00:37:23CGIがメインさ。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";
まあ、↑じゃ使いにくいだろうからちょっと改造が必要だろうが。
0592デフォルトの名無しさん
2006/07/03(月) 00:43:56じゃあこんなのはどうかね。
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);
}
0593デフォルトの名無しさん
2006/07/03(月) 00:46:55テストしてないのがバレバレだな
0594デフォルトの名無しさん
2006/07/03(月) 01:01:39おー、同じマッチ演算子だったらキャッシュするようにしたのね。
でも、正規表現のパターンが違うと毎回正規表現のコンパイルが、
走りそうだけどしょこんとこどうなの?
>>591はそれを考慮してパターンとマッチ演算子をセットにしたコードにしてみたんだけど。
0595デフォルトの名無しさん
2006/07/03(月) 01:13:23元のパターンが文字列埋め込みで変化するものか固定文字列か
わからないので。
それによく考えたらこれじゃoオプションがまともに使えないね。
いまいちでしたorz
0596デフォルトの名無しさん
2006/07/03(月) 01:23:55592のはJcodeのmメソッドに組み込むコード向き。
と、勝手に俺は感想を持った。
0597デフォルトの名無しさん
2006/07/03(月) 12:31:110598デフォルトの名無しさん
2006/07/03(月) 16:56:42Perl.dllとかを自分のアプリに組み込むのはアウトなの?
0599デフォルトの名無しさん
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 が配列値へのリファレンスを評価しようとしましたが、別のものへのリファレンスでした。"
とありましたが,何がおかしくて,どう修正すれば良いのかわかりません.
何かヒントをいただけないでしょうか
0600酩酊 ◆TWARamEjuA
NGNG$data の出所を探してみよう♪
どこかでリファレンスじゃなくなっているところがあるかと♪
Posdata:
5.8.6-2からなかなか更新しないですよね(怒)@膜真珠
leopard(10.5)まで待たなきゃなんだろうか。。。
0601デフォルトの名無しさん
2006/07/03(月) 19:39:53ソースみたけど、ハッシュへのリファレンスを、配列としてデリファレンスしてる。
for my $item (values %$data){
&dump($item);
}
ってすれば多分おk
0602デフォルトの名無しさん
2006/07/03(月) 19:39:56forの前で
warn $data;
ってするとどうなる?
ARRAY(0x8182c30)
とかってでる(括弧の中の16進数は毎回変わる)?
0603601
2006/07/03(月) 19:42:520605599
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.
もう少しヒントをいただけないでしょうか
0606デフォルトの名無しさん
2006/07/03(月) 21:24:25気がする。バージョンアップとかでファイル形式かわっちゃったけど追随
してないとかそんなのを疑ったほうがいいかも。
短いプログラムなのでやろうとしていることを理解してxmlとにらめっこ
すれば修正できるんじゃないか。頑張れ。
0607酩酊 ◆TWARamEjuA
NGNGfor my $item (@$data){
&dump($item);
}
を、、、
&dump($data);
というように直接食わせてみてはどうだろう?
tu-ka、606氏と同じような気がしてきたかも。。。
0608酩酊 ◆TWARamEjuA
NGNGfor my $item_hashref (@$data){
と書いてあると「ハシュのリファレンスを取り出しているんだ」って云うのが、後からでも判るんだけどなぁ。。。
0609602
2006/07/03(月) 21:45:36これでどう(長すぎるから複数回に分けてカキコします)?
----
#!/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};
----
まだ続きます
0610602
2006/07/03(月) 21:46:56----
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;
----
まだ続きます
0611602
2006/07/03(月) 21:50:37----
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);
}
----
まだ続きます
0612602
2006/07/03(月) 21:51:42----
&dump($item->{outline}) if $item->{outline};
}
elsif ( ref($item) eq 'ARRAY' ) {
&dump($item) foreach @$item;
}
print "</ul>\n";
}
__END__
----
ここまで。
うまく動かんかったらサンプルデータをうぷってくれ。
テストできん。
0613デフォルトの名無しさん
2006/07/03(月) 22:13:45できた。OmniOutliner インストールして、リリースノートをOPMLで吐き出して
HTMLを確認したから大丈夫だと思う。
55行目から以下の3行を削除して
for my $item (@$data){
&dump($item);
}
次の一行に書き換える。これだけ。
&dump($data);
一応、diff も置いとく。
55,57c54
< for my $item (@$data){
< &dump($item);
< }
---
> &dump($data);
0614デフォルトの名無しさん
2006/07/03(月) 22:25:24一度アンインストしてからですか?
0615599
2006/07/03(月) 23:04:54>>613
わざわざソフトのインストールまでしていただいてありがとうございます.
diffコマンドで>>613と同じ結果が返ってくるのを確認してリソースノートを
このスクリプトでhtmlに変換できました.
>>602
多くの手直しありがとうございます.
文法は問題ないのに実行すると
Deep recursion on subroutine "main::dump"
とエラーが出て処理が終わりませんでした.
ファイルを読み込ませる時/回している時にエラーが出ているのかもしれません.
もう一度その辺りのスクリプトと読み込ませるファイルを確認してみます.
その他助言を下さった方,ありがとうございました.
私ももっとPerlを理解できる様になったら,皆様の様に人にアドバイス出来るように
したいと思います.
#リソースノートのファイルではうまくいったものの,違う幾つかのファイルはエラーが
#出ました.変換前のファイルとこのスクリプトをもっと見比べてみようと思います.
0616デフォルトの名無しさん
2006/07/03(月) 23:15:28簡単なCGIを作りました。コマンドラインからは実行でき、正常終了します。
ところが、これをブラウザから実行する方法がわかりません・・・_| ̄|○
とりあえず、ブラウザurl(http://hogehoge/cgi-bin/test.cgi)を打ち込むと
スクリプトが実行されず、ブラウザに表示されるだけです・・・
IISの設定、OSの設定などが必要なのでしょうか?つまらない質問ですみませんが
どなたかご教授頂ければ幸いです。
0617デフォルトの名無しさん
2006/07/03(月) 23:22:03IISか・・・。わからん。とにかく設定の必要があるのはOSじゃなくてIISだな。
cgiという拡張子をスクリプトとして登録する必要がある。
その前に、CGIに関する質問はWebProg板というのがあるからそこに池。
http://pc8.2ch.net/php/
0618602
2006/07/03(月) 23:35:47めんご、やっぱテストしてないからRuntimeエラーおこしたかw
最後のほうの
&dump($item) foreach @$item;
って書いてるのを
&dump($_) foreach @$item;
と書き直しておいて。
0619599
2006/07/04(火) 00:12:28ありがとうございます,修正したらちゃんとスクリプトが動きました.
ただ,出力したhtmlに余分な"¥n"という文字が入ってしまっているので,
その部分をsplitすると問題なく表示できます.
みなさん,本当にありがとうございました.
0620デフォルトの名無しさん
2006/07/04(火) 00:20:19OSはWindowsかな?
CGIはサーバー上じゃなきゃ動かない。
Windowsなら、Apacheとかを入れてサーバー環境にしないと動かないよ。
617さんも言ってるけど、WebProg板で聞いた方がいいと思う。
0621デフォルトの名無しさん
2006/07/04(火) 00:33:140622602
2006/07/04(火) 00:40:47自分で1回も動かしてないソースを貼り付けてしまいましてすんません…
0623デフォルトの名無しさん
2006/07/04(火) 04:21:19つ〜か、デバッグする方法と手順をまず教えようぜ。
0624デフォルトの名無しさん
2006/07/04(火) 05:37:00>>623
perl -d
http://homepage3.nifty.com/hippo2000/perltips/perldbg.htm
0625デフォルトの名無しさん
2006/07/04(火) 05:41:09> perl -d
> http://homepage3.nifty.com/hippo2000/perltips/perldbg.htm
それ以前に、「変数の中身をプリントしてみる」ことすらやっていない
人間がぞろぞろ出てきてる。
それが問題だ。
0626デフォルトの名無しさん
2006/07/04(火) 08:03:480627デフォルトの名無しさん
2006/07/04(火) 08:10:32Perlコーディング初心者質問スレ Part 50 http://pc8.2ch.net/test/read.cgi/php/1151250398
0628デフォルトの名無しさん
2006/07/04(火) 08:12:56CGI しねえから WebProg なんて行ってなかったw
0629デフォルトの名無しさん
2006/07/04(火) 13:40:08まあいいではないか。もっと心を広く持とうぞ。
0630デフォルトの名無しさん
2006/07/04(火) 13:47:56のが最近目立つような気がするのも確かだ。
0631デフォルトの名無しさん
2006/07/04(火) 14:07:47DBI1.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();
0632デフォルトの名無しさん
2006/07/04(火) 14:13:35> まあいいではないか。もっと心を広く持とうぞ。
このケースは、「広い心が無数の狭い心を生む」の典型例だ。
0633デフォルトの名無しさん
2006/07/04(火) 16:07:58use base でベースにするモジュールのバージョンチェックはどうやるのが一般的なのでしょうか?
現在は、use base MODULE の他に use MODULE VERSION としています
use Hoge '1.1';
use base 'Hoge';
0634デフォルトの名無しさん
2006/07/04(火) 16:08:04根本的にpsqlで同じユーザでつないだ場合にINSERT DELETEはできるのか?
ってか postgresユーザってDBのrootじゃないんか?
0636デフォルトの名無しさん
2006/07/04(火) 16:22:22ソースだけでなくてなんてエラーメッセージがなんて出てるか貼り付けろよ。
エラーメッセージは意味不明な呪文などではなく、
重要なメッセージなんだぞ。
英語だからって逃げてねぇで辞書使うなりWEB検索するなり調べたり汁。
それとプレースホルダーをちゃんと理解して使ったほうがいい。
SQL文の中に値を直接埋め込んでると
SQLインジェクションで痛い目にあうぞ
0637デフォルトの名無しさん
2006/07/04(火) 16:24:56FedoraCoreスレにて質問しましたところこちらの方が適していると言われましたので質問させて頂きます。
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
0638636
2006/07/04(火) 16:33:59>エラーメッセージ
言い忘れてました。何もでませんでした。
>英語だからって逃げてねぇで辞書使うなり
英語サイトは忘れてました。
>WEB検索するなり調べたり汁。
一週間調べました。(英語サイト以外
>それとプレースホルダーをちゃんと理解して使ったほうがいい。
>SQL文の中に値を直接埋め込んでると
>SQLインジェクションで痛い目にあうぞ
確かにまだ理解して無い。だけど、先走りすぎ。
0639631
2006/07/04(火) 16:34:440640デフォルトの名無しさん
2006/07/04(火) 16:40:40コマンドラインが使えるならコマンドラインからそのスクリプトを
perl -cw filename
ぐらいは試してるんだよね?
>次に /usr/bin/convert と実行するとちゃんとコマンドも通り画像も生成できました。
上の内容でImageMagickがあるのは分かるけど、
ImageMagickのperlバインディングがちゃんとインスコできてるかどうやって確認した?
コマンドラインから
perl -MImageMagick -e'warn Image::Magick->new'
ってやるとなんて出力される?
コマンドラインから
which perl
として出力された結果とスクリプトのshebangは同じ?
0641デフォルトの名無しさん
2006/07/04(火) 16:46:59>>それとプレースホルダーをちゃんと理解して使ったほうがいい。
>>SQL文の中に値を直接埋め込んでると
>>SQLインジェクションで痛い目にあうぞ
>確かにまだ理解して無い。だけど、先走りすぎ。
おまえ質問者なのに助言者に謙虚さがねぇな。
||をorに書き換えてもエラーメッセージでねぇーの?
0642デフォルトの名無しさん
2006/07/04(火) 16:48:39めんご
perl -MImageMagick -e'warn Image::Magick->new'
でなくて
perl -MImage::Magick -e'warn Image::Magick->new'
ね
0643637
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
0644デフォルトの名無しさん
2006/07/04(火) 17:06:30ImageMagickのperlバインディングが入ってるのは
>[root@aa ~]# perl -MImage::Magick -e'warn Image::Magick->new'
>Image::Magick=ARRAY(0x8266c28)
でわかった。
>最後のPerlのパスは「/usr/bin/perl」へもリンクを張っていますので
>どちらでも通ると思います。
そっかー、念のために試しても無駄だった?
漏れの力ではこれ以上は問題のスクリプトの内容をみねぇーとわかんねぇな。
できれば加工しないで貼り付けできる?
長すぎれば同じエラーが出る状態を保ったままなるべく削って貼り付けキボン
0645637
2006/07/04(火) 17:11:35レスありがとうございます。
ソースはそんなに長くないのでそのまま貼り付けてみます。
#!/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のインストール確認で試しています。
0646デフォルトの名無しさん
2006/07/04(火) 17:14:05evalなりなんなりでエラー箇所を特定しろよ
0647デフォルトの名無しさん
2006/07/04(火) 17:15:170648デフォルトの名無しさん
2006/07/04(火) 17:16:370649640
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:-');
}
0650637
2006/07/04(火) 17:24:37コード自体は別のサーバで実行すると表示されるようなので多分大丈夫だと思います
>>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がモジュールを探せられて無いのかイマイチ原因が突き止められません
0651640
2006/07/04(火) 17:31:22してもだめ?
俺のとこでは
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!";
0652637
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が入った別の鯖だと表示されたのに・・・。
0653デフォルトの名無しさん
NGNG0654637
2006/07/04(火) 17:49:18evalで括っても500エラーと同じエラー文が返ってきました・・・。
何が悪いのでしょうか。 Image::Magickに原因があると思ってましたので逆に原因が分からなくなりました
0655640
2006/07/04(火) 17:49:48最新版の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
を入れるのはちょっと・・・
0656637
2006/07/04(火) 17:54:40tarからインスコすることはよくあるので可能ですが、
何か環境が整っていないのか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とは互換性ないのかなーとかって思ってたりしてます。
0657デフォルトの名無しさん
2006/07/04(火) 17:55:27とりあえず
use CGI::Carp qw(fatalsToBrowser);
ってつけて実行してみれ
0658637
2006/07/04(火) 18:01:33Apacheのエラー文も同じままでした。
試しに一般ユーザーとApacheのルートフォルダのどちらでも試してみましたが結果は変わりませんでした。
ついでに余計なプロセスが邪魔してるのではと思って試しにrebootしてみましたが同じでした。
0659640
2006/07/04(火) 18:02:54全部いりしたから入ってるっぽ。
yumでインスコでどうよ?
あと俺のImageMagickは6.2.5
0661640
2006/07/04(火) 18:08:50やべぇ、メンテサボりすぎたw
6.2.5のURL
ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.2.5-5.tar.gz
漏れは最新版のインスコに挑戦してくるガンガレ637
0662637
2006/07/04(火) 18:33:25FCユーザでもしかして同じ症状の方がいらっしゃるかもしれませんので
どういう結果でももう一度報告しに参ります。
どうやら足りないファイルがあるようです。
やはり最新版はFC3は眼中にないのでしょうかTT
0663デフォルトの名無しさん
2006/07/04(火) 18:34:350665637
2006/07/04(火) 18:58:17それぞれ最新版をインスコすると解消されます。
rpm -e ImageMagick*
にてアンインスコして6.2.8-3に挑戦してます。
何故かアンインスコすると500エラーは解けました・・・。
でも画像の作成もされないようです。。。 何がどうなってるのかポルナレフ状態です orz
0666637
2006/07/04(火) 19:26:52結論:Image::Magickがちゃんと入っていなかった。
yum使って入れた前述した3つをアンインスコし、
tarから取ってきた最新版を入れるとちゃんと動くようになりました。
FC3の方は前述の2個のパッケージが不足していますので、
インストール時に先に追加して下さい。(バージョンの関係です)
先ほどのperlのソースで無事表示を確認しました。 スレ汚し失礼しましたm(_ _)m
0667デフォルトの名無しさん
2006/07/04(火) 19:39:400668デフォルトの名無しさん
2006/07/05(水) 03:33:06前回はcatalystだったけど今回は何?
0669デフォルトの名無しさん
2006/07/05(水) 03:59:050670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
2006/07/05(水) 11:05:43> print "Content-type: image/png\0x0D\x0A\x0D\x0A";
じゃねーの?
0672デフォルトの名無しさん
2006/07/05(水) 11:58:36>>666で解決してるようだが。
0673デフォルトの名無しさん
2006/07/05(水) 22:47:03$ perl -Mbigint -le 'print 2**64'
18446744073709551616
$ perl -Mbigint -le 'print eval {2**64}'
18446744073709551616
$ perl -Mbigint -le 'print eval "2**64"'
なぜ三番目のでは表示されないのでしょうか。
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
2006/07/05(水) 23:41:12Constant(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だとコンパイルするタイミングが
変わって実行時になるのでうまく動いてない感じに見えるが詳しくは俺もわからん。
0676デフォルトの名無しさん
2006/07/06(木) 00:13:06urlを新しいブラウザで開きたいのですが記述方法がわかりません。どうすれば良いのでしょうか?
0677デフォルトの名無しさん
2006/07/06(木) 00:21:081を256億回音読して来い。
0678デフォルトの名無しさん
2006/07/06(木) 01:01:53失礼しました。perl初心者質問スレと間違えちゃいました。
0679デフォルトの名無しさん
2006/07/06(木) 07:07:22おまえ1を読んでないだろ
どこに初心者お断りって書いてあるんだよ?
超初心者ってのはperlでのプログラミングのことでなく
日本語読解力とコミュニケーション能力のことか?
0680デフォルトの名無しさん
2006/07/06(木) 07:38:57おまえ・・・最低だな('A`)
0681デフォルトの名無しさん
2006/07/06(木) 08:21:020682デフォルトの名無しさん
2006/07/06(木) 08:33:540683デフォルトの名無しさん
2006/07/06(木) 08:50:180684デフォルトの名無しさん
2006/07/06(木) 09:08:100685デフォルトの名無しさん
2006/07/06(木) 10:03:31XPを使っているのですがLocal SettingsのTemporary Internet Filesに入ってるクッキーを
確認メッセージなしにさくっと消すことって比較的簡単にできますでしょうか?
WSHやVBSで試みてたのですがこのフォルダの中のものはどうもうまく消せず
InvokeVerbを使ってみたのですがそれだと確認メッセージが出て止まってしまうので、
以前少しやったことのあるPerlで作ってみようかなと、
その前にできるかどうかを聞かせていただこうと思った次第にございます
0686デフォルトの名無しさん
2006/07/06(木) 10:12:480687685
2006/07/06(木) 10:18:18も、もしやVBSのコマンドでは!!!??
またがんばってみます!
ありがとうございました!!
0688378
2006/07/06(木) 15:19:50>>380
ScaleをTransformでやってみたもののwidthが1280とかのjpg画像ならリサイズできたけど
2800級になるとリサイズもできませんでしたorz
そもそも画面が真っ黒になってリサイズされないっていうのが謎すぎる・・
マジ行詰りorz
0689デフォルトの名無しさん
2006/07/06(木) 15:38:12元のHPをブラウザで開いて↓をアドレスバーにコピペ、エンター。
javascript:a=document.getElementsByTagName('a');for%20(i=0;%20i<a.length;%20i++)window.open(a[i]);void(0);
0690デフォルトの名無しさん
2006/07/06(木) 15:39:55エラーチェックぜんぜんしてないようなので、エラーでてないか確認してみたら?
メモリ足りないとかその手のがでてるかもしれん。
http://www.imagemagick.org/script/perl-magick.php の最後の方の
Handling Exceptionsの項参照。
0691デフォルトの名無しさん
2006/07/07(金) 11:07:09ローカルな自鯖ではうまくいくの?掲示板に組み込まず、単体の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;
0692デフォルトの名無しさん
2006/07/08(土) 00:34:24<form action="$regist" method="POST" name="myFORM">
とする時nameをもう1個この中にもう1個追加する時どうやって書けばいいのでしょう?
0693デフォルトの名無しさん
2006/07/08(土) 01:01:18人の書き込みを無視する奴が誰かに相手にしてもらえると思ってるの?
1を256億回読め
0694デフォルトの名無しさん
2006/07/08(土) 01:05:250695デフォルトの名無しさん
2006/07/08(土) 01:21:07http://www.google.com/search?num=50&hl=ja&q=%EF%BD%B8%EF%BE%9E%EF%BD%B8%EF%BE%9E%EF%BE%9A%EF%BD%B6%EF%BD%BD&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
0696デフォルトの名無しさん
2006/07/08(土) 10:28:18それはPerlではなく、CGI+Perlの質問なのでWebProg板にいきなさい。(http://pc8.2ch.net/php/)
>>694
その質問はすでにPerlではないので、Win32APIスレに逝きなさい。
↓Win32API質問箱 Build44
http://pc8.2ch.net/test/read.cgi/tech/1151501925/
>>693
落ち着きなさい。
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
2006/07/08(土) 10:49:16Perl5.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;
}
0699デフォルトの名無しさん
NGNGが丁寧に解説してるのに
それを理解出来ないのは君が馬鹿なだけ
0700698
2006/07/08(土) 12:00:15さらにそれで検索してみたところ説明されているページがありました。
decodeは文字列にUTF8フラグを付与するような働きをしているんですね?
検索で出てきたページをもうちょっと読んでみようと思います。
では。お騒がせしました。
0701デフォルトの名無しさん
2006/07/08(土) 12:22:17ありがとうございました
0702デフォルトの名無しさん
2006/07/08(土) 16:44:252行目は余計。
0703デフォルトの名無しさん
2006/07/08(土) 16:46:14>>699
× 2行目は余計。
○ 3行目は余計。
0704デフォルトの名無しさん
2006/07/08(土) 17:00:230705デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
2006/07/08(土) 18:12:580708デフォルトの名無しさん
2006/07/08(土) 23:43:47やめろ698
0709デフォルトの名無しさん
2006/07/09(日) 06:32:140710デフォルトの名無しさん
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.
というエラーでが出て動きません
どうすればいいのでしょうか
0711デフォルトの名無しさん
2006/07/09(日) 07:22:26条件文の配列を
$list=($a > 5,$b =~ /a/,$c <= 300)
として、これを気持ち的にはif($list[0]){〜〜}、if($list[1]){〜〜}という風に
使いたいのですが、うまくいきません。
条件文の配列の要素(=条件)をプログラム中で使いたいのですが、どうすればいいのですか?
0712デフォルトの名無しさん
2006/07/09(日) 07:41:160713デフォルトの名無しさん
2006/07/09(日) 07:55:16具体的にIF文の条件として使うときはどうすればいいんですか(´・ω・`)?
0714デフォルトの名無しさん
2006/07/09(日) 08:07:55if (eval($list[0])) { }
if (eval($list[1])) { }
でも絶対、考え方が間違ってる。普通はこんな事必要ない。
あと、頼むから例だとしても $a と $b は使わないで・・・。
0715デフォルトの名無しさん
2006/07/09(日) 08:30:44レスありがとうございますm(_ _m)
>$a と $b は使わないで・・・。
すいません・・。
> my @list = ('$a > 5', '$b =~ /a/', '$c <= 300');
>if (eval($list[0])) { }
>if (eval($list[1])) { }
>普通はこんな事必要ない。
まじっすか。IF文に色んな条件を使いたいときはどうすればいいんですかね・・?
これ参考にしたんですが、何故かうまくいきません・・。
0716デフォルトの名無しさん
2006/07/09(日) 08:35:02> まじっすか。IF文に色んな条件を使いたいときはどうすればいいんですかね・・?
サブルーチンにする
0717デフォルトの名無しさん
2006/07/09(日) 08:50:05色々ありがとうございます。
ちなみに$a > 5の条件についてはうまくいくんですがパターンマッチの条件$b =~ /a/
はうまく機能してないみたいです・・・。何故だ・・・・orz
0718デフォルトの名無しさん
2006/07/09(日) 09:21:48見ている人もつっこみがしやすいと思うのだが
0719デフォルトの名無しさん
2006/07/09(日) 09:32:43{'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/;
}
0720デフォルトの名無しさん
2006/07/09(日) 09:39:30CPANにあるValidator系のモジュールのソースを利用するんじゃだめなの?
0721デフォルトの名無しさん
2006/07/09(日) 09:45:340722719
2006/07/09(日) 09:47:17sub is_match_substr{
my ($pattern, $str) = @_;
$str =~ /$pattern/;
}
こうだな。
0723719
2006/07/09(日) 09:47:530724デフォルトの名無しさん
2006/07/09(日) 10:15:20条件文を配列にしなければ上手く行かない仕事というのが
全く思いつかないんだけど?(コンパイラでも作ってるんで無いかぎり・・・
0725デフォルトの名無しさん
2006/07/09(日) 10:20:49if(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";}
こんなになってる段階で配列にした意味などないわけだが、
どうしてもやるならサブルーチンリファレンスの配列にする方が
いくない?
0726719
2006/07/09(日) 10:37:22なんで配列にするかは知らない。質問者に聞いて。
0727デフォルトの名無しさん
2006/07/09(日) 11:12:440728デフォルトの名無しさん
2006/07/09(日) 11:47:051)条件文が100万入ってる内容のファイルを受け取って、それを処理しなければならない
2)自動的に条件文が生成されるスクリプトを作った
3)単にそういう風に書いて見たい気がした
3)だったら、考え直す事をおすすめする
0729デフォルトの名無しさん
2006/07/09(日) 20:14:01my $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 );
は?
0730デフォルトの名無しさん
2006/07/09(日) 21:33:06sub 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に同意
は?
0731デフォルトの名無しさん
2006/07/09(日) 21:34:46my %list = @_;
while( my( $key, $value ) = each %list ){
$value->{sub}->() if $value->{eval}(@_);
}
}
だな。
0732デフォルトの名無しさん
2006/07/09(日) 21:38:101,山田,20,男
2,田中,23,女
...
という様なテキストファイルを読み込んで,
%id1 (
id=>1,
name => "山田",
age =>20,
sex => "男",
);
%id2 (
id=>2,
name => "田中",
age =>23,
sex => "女",
);
となる様な%id?というハッシュ変数に代入したいのですが,
@list_oneline =("1,山田,20,男", "2,田中,23,女"...);
とした後どうしたら良いかわかりません.
なにかヒントをいただけないでしょうか?
0733デフォルトの名無しさん
2006/07/09(日) 21:42:13ハ,,ハ
('(゚∀゚∩_ おいらをどこかのスレに送って!
/ヽ 〈/\ お別れの時にはお土産を持たせてね!
/| ̄ ̄ ̄|.\/
| .モツ煮..|/
 ̄ ̄ ̄
現在の所持品:たばこ他48品圧縮.zip・どようび・ドエット
糞スレ・rigel・ギコペ・Jane・ニンバス2000 ・霊的な力
greensleeves
0734デフォルトの名無しさん
2006/07/09(日) 21:58:49%id1, %id2, ... というハッシュに代入するのは、うまいやり方とは言えません。
以下のように、ハッシュの配列を用意した方が処理が簡単だと思います。
@id = (
{
id => 1,
name => "山田",
age => 20,
sex => "男",
},
{
id => 2,
name => "田中",
age => 23,
sex => "女",
},
...
);
それぞれは、$id[0], $id[1] などで取り出せます。
データ内のidの値と配列添字を一致させたいなら、先頭要素を空にして下さい。
0735デフォルトの名無しさん
2006/07/09(日) 22:04:10なるほど,ハッシュの配列という操作の仕方があるのですか.
確かにその方がわかりやすくなりますね.
ありがとうございます.早速試してみます.
0736デフォルトの名無しさん
2006/07/10(月) 13:48:000737デフォルトの名無しさん
2006/07/10(月) 18:27:59やはりだめでした・・画像真っ黒のものが出力されました・・
エラーログをおってみようとおもってますが、レンタルサーバゆえすぐ出力されないのか
そもそもエラー判定されてないのかログ拾えてません。
ちなみに最初にのせたロジック単体CGIでテストしてますorz
0738デフォルトの名無しさん
2006/07/10(月) 18:54:000739デフォルトの名無しさん
2006/07/10(月) 20:11:05レンタルサーバなのですが、それがかかってるのが原因だとしたら
その時点でアウトでしょうか・・
0740デフォルトの名無しさん
2006/07/10(月) 20:32:22共有型のレン鯖では、ulimitかけるのが普通だろうし。
コマンドライン使えるなら、ulimit -a してみたら?
黒画像が出てくるってのは謎だけど。
0741デフォルトの名無しさん
2006/07/10(月) 23:19:1920日近く経って未だに何が起きているのか確認できてないなら、
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 が使えるかどうか確認してみ。
0742デフォルトの名無しさん
2006/07/11(火) 00:25:43RFCでワード検索するときPerl使ってるんだぜ!?
0743デフォルトの名無しさん
2006/07/11(火) 02:01:480744デフォルトの名無しさん
2006/07/11(火) 07:54:09ttp://www.drk7.jp/MT/archives/001059.html
にあるスクリプトを元に…と思い、
このスクリプトのdoTaskのevalとdieの行をコメントアウトして実行してみたのですが、
なぜか終了してくれません。
topで見てみると33のスレッドが残っていて(最大は103くらいまで増えていました)、
752行出力されたところでとまってしまっているようです。
皆さんの環境でも同じようになるのでしょうか。
こうなる原因も教えてもらえるとうれしいです。
0745デフォルトの名無しさん
2006/07/11(火) 16:15:45最近やっとCPANのコードを読んだりして勉強するようになったが
あまりのコードの可読性の悪さにぷっつんした
もはやシンタクスシュガーなんて呼べないような不定形なコードの山
わけのわからないモジュール使って、そのモジュールもわけのわからない
モジュールのエンドレス
考えてみたらperl5はもう十年以上も進化止まってるんだよな
もうperlのメリットなんてハッシュと正規表現が言語レベルで組み込まれてることだけだよな
さりとて今更rubyなんて死んでも言えない
0746デフォルトの名無しさん
2006/07/11(火) 16:26:05PHP厨乙。
0747デフォルトの名無しさん
2006/07/11(火) 16:30:36CもJavaも進化止まってるよ。
でも10年前に俺が書いてたperlのコードと今のコードじゃぜんぜん違う。
10年前は素朴にベタ書きCGIだったのがいまやCatalyst(+TT+DBIx)
だからなぁ。そういう意味では進化しているとも言える。
とはいえ別に強制するようなもんじゃないしrubyがよけりゃrubyでも
いいんでねーの?
0748デフォルトの名無しさん
2006/07/11(火) 16:32:13そう感じたのなら君にはPerlは合わなかったという事だろう。
合わない言語を無理して学ぶこともあるまいよ。
# 合う人には読みやすいんだよ
Python辺りに行ってみれば?英語圏ではPerlよりも人気だぞ
大量にuseされるモジュールの山は…確かにある程度覚えるまで大変だった記憶があるが…
ああ、strictすら何をするものかわからなくて追っかけたら、
さらにCarpが出てきて厭になったのは懐かしい。
今でこそモジュール名を聞いただけでそれが何かわかるし、
わからずとも調べる術を知っているから苦にもならないがなぁ。
0749デフォルトの名無しさん
2006/07/11(火) 16:43:290750デフォルトの名無しさん
2006/07/11(火) 16:48:12@INCじゃなくて@ISAのことだと思うが、どちらでも可能。
ただしuse baseは@ISAの設定以外にもいくつかのことを
やってくれるので詳しくはperldoc base読め。
0751デフォルトの名無しさん
2006/07/11(火) 17:03:21本体に取り込まれてるのやよく使われるモジュールでも可読性が悪いのがあるのは確か。
そういったモジュールはbug潰し等の理由がない限りpodを読んで使い方だけを覚えたほうがいい。
コードの勉強が目的ならそういったモジュールではなくコードをきれいに書く作者を見つけてその人のCPANモジュールで勉強したほうがいい。
>考えてみたらperl5はもう十年以上も進化止まってるんだよな
これは単純に勉強不足だな。
英語が苦手だからってドキュメント読んでないのでは?
0752デフォルトの名無しさん
2006/07/11(火) 17:55:23良い頃だと思う。
0753デフォルトの名無しさん
2006/07/11(火) 23:56:52ラクダ本はPerl6から3分冊されるかもとラリーが冗談半分に行ってたのですが。
0754デフォルトの名無しさん
2006/07/12(水) 01:35:45クリスマス。
ただし何年のかはわからないw
Ruby 2.0と一緒のリリースになったりしてな。
0755デフォルトの名無しさん
2006/07/12(水) 02:20:420756デフォルトの名無しさん
2006/07/12(水) 07:17:45世の中には幸運にも好きな言語だけ勉強すればいい奴もいるわけです。
羨ましいだろ。
0757デフォルトの名無しさん
2006/07/12(水) 12:41:09char x = 'a';
printf("%02x",x);
result:61
だけど
perlでは
my $x = 'a';
printf("%02x",x);
result:00
になるsprintfでも同様です
perlではunpackじゃなきゃだめなの?
0758デフォルトの名無しさん
2006/07/12(水) 13:19:25何をしたいんだ?
0759デフォルトの名無しさん
2006/07/12(水) 13:19:44unpackしなきゃだめ。
そのsyntaxだと数値として解釈されてるんで、
'a' を数値と解釈しようとして0になっている。
その代わり $x = '123' とかが可能になる。
0760デフォルトの名無しさん
2006/07/12(水) 13:25:36ord() ってのもある。
unpack('C', $x) と ord($x) は同じ。
$x が 2 文字以上の場合は先頭の 1 文字に対してだけ処理される。
0761デフォルトの名無しさん
2006/07/12(水) 13:27:11> printf("%02x",x);
printf("%02x",ord($x));
0762757
2006/07/12(水) 13:33:47perlではfileをopenして読み込むときに
crlfがlfに変換されるというので、それを
確認したかった
printでファイルへ書き戻すと今度はlfが
crlfに戻されるため確認するにはperl中で
するしかないが、単純にprintしても改行
コードが何であるかは確認できないため
dumpしたかった
0763デフォルトの名無しさん
2006/07/12(水) 13:35:36ありがとう
できました
それにしてもunpackて奥が深いよね
0764デフォルトの名無しさん
2006/07/12(水) 13:48:030765デフォルトの名無しさん
2006/07/12(水) 13:50:07ていうか改行はOSに合わせて変わるんじゃないか?
(Mac だと CR だけになったりしないか?)
で、その辺気にしなくてもいいように binmode や open での layer 指定がある。
0766デフォルトの名無しさん
2006/07/12(水) 13:52:26@ascii = unpack('C*', $string);
した方がアレだがまあいい。
0767デフォルトの名無しさん
2006/07/12(水) 14:12:15CPANでいいソースみたことない。
非常に興味があるので、きれいに書く作者を一人でもいいのでおすえてほすぃ。
0768デフォルトの名無しさん
2006/07/12(水) 14:13:46はファイルハンドルから$/の値まで($/の値を含む)を
取り出しますが
$/は通常\n(0a)に設定されてますよね?
で、この状態でバイナリファイルを読み込んだら当然
バイナリファイル中の0aで区切られますが、そのバイナリ
ファイル中の0aの出現頻度はばらばらで、たとえば
binmode($fh);
@line = <$fh>;
としたら@line中の各要素の長さは皆ばらばらになってしまいます
かといってslurpしちゃうのはバイナリなんでありえないです
ということで、バイナリを読み込むときってsysreadとかreadじゃ
なきゃだめなの?
なんとか普通の<>の形式でやる方法ってないですか?
0769767
2006/07/12(水) 14:23:28あっ、漏れPerlもやってるけどRubyもやってる。
双方にいいものを持ってると思う。
PerlやってればRubyは非常にとっつきやすいので「今更」などといわずやってみては?
Rubyのブロックの考え方を学ぶと、Perlでも他の言語でも応用できるし色々考えが広がるよ。
0770767
2006/07/12(水) 14:33:44バイナリの中でありえないと思われる文字列を$/に設定しておけばできることはできる。
$/ = "奥さん!奥さぁん!";
$line = <$fh>;
この場合「奥さん!奥さぁん!」という文字列があるとまあ駄目なのだが。
あと速度面を考えるとsysreadとかreadの方がいいかもしれない。
<>は内部的には「奥さん!奥さぁん!」という文字列を検索する処理が走ると思うので。
むっ?よく考えたら$/にundefを設定すればいいのか?
0771デフォルトの名無しさん
2006/07/12(水) 14:43:55$/をundefにするとeofまで読む。
$/に整数のリファレンスを入れるとその整数のサイズまで読む
0772デフォルトの名無しさん
2006/07/12(水) 14:51:19> かといってslurpしちゃうのはバイナリなんでありえないです
あり得なくはない。
> ということで、バイナリを読み込むときってsysreadとかreadじゃ
> なきゃだめなの?
長さをそろえたいのなら、むしろsysread/readを使いたがるのではないのか?
0773768
2006/07/12(水) 15:23:47・・・
>>771
$/=\3333;
みたいなのをレコードモードっていうんですね
こんな素敵な使い方があるなんて感動です
さんくす
0775デフォルトの名無しさん
2006/07/12(水) 16:21:06しかしこの本分厚いなぁちっともページが進まん
今日学んだことを忘れないうちに書き記しておこう!
7/12 晴れ
・ラリーは本田アコードに乗っている
0776デフォルトの名無しさん
2006/07/12(水) 16:59:32CGIの一部ですが,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の様な変数は入れられませんよね?
どうするのが賢い方法なのでしょうか.
0777デフォルトの名無しさん
2006/07/12(水) 17:20:11根本的に考え方を変えたら?
そもそもparamで 'youridX' みたいにXにIDが入ってるのが間違ってる。
前も変数名にIDが入ってた。
IDをそういう所に入れる考え方を変えないと、いつまでも効率悪い。
@value_id としてるのも、ただのハッシュで(keyがID)
%value_id = (
1 => 'yes',
2 => '',
...
);
みたいな構造にしても良いし、ただの配列で作っても良い。
@value_id = (
'',
'yes', # <-- ID:1
'', # <-- ID:2
...
);
ハッシュの配列教えてもらったからって、全部それで行けという訳じゃない。
0778776
2006/07/12(水) 17:43:59はい,たしかに考え方(組み方)が悪いと思います.
もう少しPerlでの処理に向いた方法を考えて組むべきですね.
何をどう変数と置くかなど,もう一度考えてみたいと思います.
ありがとうございます.
0779デフォルトの名無しさん
2006/07/12(水) 23:50:29人間にとってはコードを読み解くヒント。
処理系にとってはメモリ領域を特定するための単なる符号。
それが変数名。
通常変数名はハードコードされているので、変数名に基いた処理がある、ということは即ちマジックナンバーをコード中至る所にばらまいていることになっちゃうんですよう。たいへんきもちわるいよう
0780酩酊 ◆TWARamEjuA
NGNGと宣いつつ、スレッドはないのね、、、
0781デフォルトの名無しさん
2006/07/13(木) 00:27:29なんのCGIかは知らんが、yes、no選択のアンケート質問系CGIなら、
'youridX'とかせず、質問の内容をIDにするといいよ。
'ILoveJackson' => 'no'とか。
ループでやりたいなら、1とか3とか数字IDつけるしかないが。
それにしても句読点がプログラマっぽい。
0782デフォルトの名無しさん
2006/07/13(木) 09:13:14>それにしても句読点がプログラマっぽい。
阿呆っぽいの間違いだろ?
0783デフォルトの名無しさん
2006/07/13(木) 10:41:350784デフォルトの名無しさん
2006/07/13(木) 11:11:260785デフォルトの名無しさん
2006/07/13(木) 11:33:21public_html以下にディレクトリを作成したいのですが
mkdirする場合public_htmlに書き込み権限を与えないとできませんか?
0786デフォルトの名無しさん
2006/07/13(木) 11:37:38あなたはどう思うのか俺は知りたいぞ
0787デフォルトの名無しさん
2006/07/13(木) 11:40:19ありがとう。
だとすると、ディレクトリやcgiファイルなどを新たに作ることは不可能?
(権限与えると可能だけどセキュリティ上不可能?)
0788デフォルトの名無しさん
2006/07/13(木) 11:42:20それはperl固有の話ではないが、書き込み権限は必要。
0789デフォルトの名無しさん
2006/07/13(木) 11:43:46日本語でok
0790デフォルトの名無しさん
2006/07/13(木) 11:48:50俺にはOS,システム管理の話にしか思えないのですが
どう関係すると思って書き込んでるのか
頭の悪い俺にもわかるように教えてください。
あとpublic_htmlってとこからperlのスクリプトを
httpdから利用と推察するのだがあなたは
>>1のテンプレを読んでないのでしょうか?
0791デフォルトの名無しさん
2006/07/13(木) 12:07:01あっちで相手にされないからこっちに来たんだろうが、まずまともな質問が
できるようになるまで勉強してから出直した方がいいと思われる。
0792デフォルトの名無しさん
2006/07/13(木) 12:31:270793785
2006/07/13(木) 13:21:02ありがとう
>>791
初心者の491って?意味不明
なんかマルチ扱いされて迷惑っぽいので
一応、解決済み(マルチ)ってことで終わります。
0794デフォルトの名無しさん
2006/07/13(木) 13:24:500795デフォルトの名無しさん
2006/07/13(木) 14:28:31>>>791
>初心者の491って?意味不明
http://pc8.2ch.net/test/read.cgi/php/1151250398/491
しらばっくれるな。どうみてもお前だろ。
0796デフォルトの名無しさん
2006/07/13(木) 14:35:580797デフォルトの名無しさん
2006/07/13(木) 14:38:36それより次の質問マダー( ・▽・)っ/凵⌒☆チンチン
0798デフォルトの名無しさん
2006/07/13(木) 14:42:120799デフォルトの名無しさん
2006/07/13(木) 15:54:49どこがおもしろんだよ?
たんにsetterとgetter作るだけじゃねぇか
保守の観点からしてClass::Accessorはぼつだろ
0800デフォルトの名無しさん
2006/07/13(木) 16:59:01それなんてギャグ?
0801デフォルトの名無しさん
2006/07/13(木) 17:01:040802デフォルトの名無しさん
2006/07/13(木) 17:11:40Rubyでも使ってろ。
0803デフォルトの名無しさん
2006/07/13(木) 17:22:28∩___∩ ∩___∩ ねぇ、なんでできないの?
♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶| ♪どうしてどうして?
/ (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 ねぇ、どうして?
| ( _●_) ミ :/ :::::i:. ミ (_●_ ) |
___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____
ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/
/ /ヽ < r " .r ミノ~. 〉 /\ 丶
/ /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶
/ / ♪ :|::| ::::| :::|: \ 丶
(_ ⌒丶... :` | ::::| :::|_: /⌒_)
| /ヽ }. :.,' ::( :::} } ヘ /
し )). ::i `.-‐" J´((
ソ トントン ソ トントン
正直なんで「Rubyでも使ってろ。」なのかわからん。
おまえこそperldoc perlbootを読め
0804デフォルトの名無しさん
2006/07/13(木) 17:26:09>保守の観点からしてClass::Accessorはぼつだろ
どう考えても逆だろ???
こっちつかったほうが可読性がいいぞ。
毎回毎回手書きでアクセサーを書いてるの?
0805デフォルトの名無しさん
2006/07/13(木) 17:29:38そういうモジュールがあるだけ便利だけどね。
0806デフォルトの名無しさん
2006/07/13(木) 17:36:51どう飛躍するとRubyとPerlの比較になってるのだろう。
意味分からん。
Rubyがいいのは分かってるけど
それとClass::Accessorは保守性が悪いってのは関係なくね?
0807デフォルトの名無しさん
2006/07/13(木) 17:39:38Class::Accessorを使うとなんで保守性が悪くなるのか教えて
0808デフォルトの名無しさん
2006/07/13(木) 17:39:440809デフォルトの名無しさん
2006/07/13(木) 17:47:41しょうがないのでは。
オブジェクト作った後で、bless使ってクラス変えられちゃったりとか
なかなか面白いけどね。
0810デフォルトの名無しさん
2006/07/13(木) 20:38:31保守性が悪いって話は>>799の妄言?
0811デフォルトの名無しさん
2006/07/13(木) 21:09:10好みによる。
0812デフォルトの名無しさん
2006/07/13(木) 22:43:18俺が持ってるPerl5.003では使えないので却下。
0813デフォルトの名無しさん
2006/07/13(木) 22:53:220814デフォルトの名無しさん
2006/07/13(木) 23:34:06うわ古!!
まだそんな化石のようなバージョン使ってる奴いるの!?
可哀想に。。。
jcode.plとか使ってがんばっちゃってる状態を想像すると失笑ものだねw
0815812
2006/07/14(金) 00:04:30ダウンロードして組み込むのが、ダルイんです…。
>>814
バージョンによって動かなくなるようなPerlスクリプトを書くのは嫌いなのさ。
0816デフォルトの名無しさん
2006/07/14(金) 00:11:460817デフォルトの名無しさん
2006/07/14(金) 00:13:30まぁ別にOOPしないんならどんなバージョンでもいいんじゃね?
バリバリOOPしたいんなら最新のほうが何かと便利だが
0818デフォルトの名無しさん
2006/07/14(金) 00:16:16jcode.pl使っててUTF8とかに変換したいって
要望があったときどうしてるのかが気になる。
0819デフォルトの名無しさん
2006/07/14(金) 00:20:050820デフォルトの名無しさん
2006/07/14(金) 00:23:000821デフォルトの名無しさん
2006/07/14(金) 00:27:12>>818
perl 使いにはエンコーディングと無縁な人間も
いることを知っといた方がいい。
データ解析系だと保守契約の絡みもあってそうそう
command の ver. up なんぞやってくれんのよ orz...
ちなみに俺んとこは perl 5.004 @ solaris
0822デフォルトの名無しさん
2006/07/14(金) 00:27:480823デフォルトの名無しさん
2006/07/14(金) 00:30:320824デフォルトの名無しさん
2006/07/14(金) 00:30:59812はWindows3.1で動かないWin32アプリを否定して
Windows3.1でがんばってるんだから
乙の一言ぐらいねぎらいの言葉投げてやれよ!!
でも799=812だとしたら保守性と
ポータビリティを勘違いしている痛い奴だな。
0825812
2006/07/14(金) 00:34:45ああ、これは書こうと思ったけどだるかった。さすがに4.0以下は考えてないよ…。
でも、5.003もtie関数が一部実装されてないのでさすがに挫折して最近、5.005と5.008入れたんだっけか…。
>>818
ああ、それも書こうと思ったけどだるかった。
jcode.plを使ってUTF-8にしたいってことはCGIだと思うけど、
最近はソースコードをUTF-8にしてるのであんま使ったことないんだよね。
opendirした時くらいか。使ったの。
0826デフォルトの名無しさん
2006/07/14(金) 00:35:40812は「俺が持ってるPerl5.003では使えないので却下」と仰せで
ISPで提供されているのがそうだとか
保守契約先のマシンがそうなってるとかではなく
自分のマシンに自ら進んで5.003を入れている口ぶりです。
0828812
2006/07/14(金) 00:42:59さすがにWinXPだが。799=812じゃないな。
>>826
うーんISPもあるが、以前、自分のマシンで動いて、
会社のsolarisで動かなくて手痛い目にあったので、
古いバージョンでも動かしてみる癖がついたのだが。
0829デフォルトの名無しさん
2006/07/14(金) 00:43:48別に文字コードを変換するのはWEB処理に限ったことではないのだが。
で、ソースコードをUTF8で書いているということはすでに5.005以下で動かないわけで
自分が利用しているバージョンとはあわないと812でおっしゃてるのと
とても話が矛盾しまくりんぐなわけでその辺はどうなってるのでしょうか?
ただ煽りたかっただけ?
0830799
2006/07/14(金) 00:47:11だから、世の中にはClass::Accessorなんて知らない
奴がたくさんいるってこと
そういう奴がClass::Accessor使ったコードをいじりだし
たらどうなると思う?
perlのOOはただでさえ奇妙なのに、それをさらにモジュール
で隠蔽しようとしたら、もうぐちゃぐちゃだろうが
たんなるset,get関数の定義をしているコードだったら
Javaしか使ってないやつにもすんなり理解できる
CPANのdocumentくらい嫁って思うだろうが
たんにsetter,getter自動で作るだけのモジュールの使い方を
いちいちdocument読んで保守するのは間違いのもとじゃないのか?
ダミアンだってbest practiceで
「可能な限りperl組み込みか標準モジュールで済ませろ!」
て書いてあるじゃないか
単にコード2,3行書く手間を減らすためだけに標準じゃないモジュール
使うんじゃねぇ!ってこと
Class::Accessorが標準モジュールに組み込まれたなら話は変わるけど
今はそうじゃないだろ!
0831799
2006/07/14(金) 00:50:18いちいち変更可能なんでしょ?
従えばちゃんとgetterとsetterが分離されるけど
何もfollow指定しないで使えば結合されちゃう
こんな糞モジュールはつかえんだろうが!
0832デフォルトの名無しさん
2006/07/14(金) 00:53:05XMLを処理するのもDBにアクセスするのも
すべて標準モジュールと関数で処理してるんですね!!
すげーーーーーー。
0833812
2006/07/14(金) 00:53:20>ソースコードをUTF8で書いているということはすでに5.005以下で動かないわけで
動かない?ああ、まあ文字列処理するのならまともに動かないのでしょうね。
私の場合はPerlをCGIとしてよく利用するけど、UTF-8はERBのようなテンプレートファイル内に
すべて収めて出力するだけにとどめるので、.plの中ではUTF-8の文字列処理は一切しないので
動作しないなどの問題が発生したことはないです。
0834しつこい799
2006/07/14(金) 00:56:15インタフェースの不変性
だと思ってたんだけど、違うかな?
使う人によってインタフェースが変わっちゃうモジュールなんて
ふぁっきんふぉーゆー
0835812
2006/07/14(金) 00:56:50同じ時間帯に現れると俺の自作自演とか疑われるじゃねーか。
0837デフォルトの名無しさん
2006/07/14(金) 00:57:46ソースコードをUTF8で書いてるのと
UTF8で書いてあるファイルを開いて処理するのはかなり違いますよ。
「ソースコードをUTF8にしているので」って言われたら普通前者で受け取ると思うよ。
0838799
2006/07/14(金) 01:01:32憧れのDan様や宮川さんやなおやが使ってるから、ボクも・・・
ってなとこなんだろ?
そういうジャニーズがかっこいいから俺もなんていう
くだらない思想をperlの文化に持ち込むんじゃねぇ!
0839デフォルトの名無しさん
2006/07/14(金) 01:05:02なにその給料泥棒
0840デフォルトの名無しさん
2006/07/14(金) 01:07:050841デフォルトの名無しさん
2006/07/14(金) 01:07:31あなたが拠り所にしている「可能な限り」というのは
結局線引きが不透明ではないですか?
PurePerlでもMySQLやPostgresやOracleへのアクセス可能ですよ?
結局はそういう線引きというのは関わる仕事・組織によって
ポリシーが異なるわけで、そこにあなたがあなたのポリシーで乱暴に
「保守性が悪くなる」とおっしゃるから否定的なレスがついてるのではないですか?
私は5.008以降を使うことが前提とされる組織にいるので
可能な限りソースの可読性を上げることがポリシーとされて積極的に利用しています。
また、利用したことによって第三者に文句を言われたこともありません。
0842デフォルトの名無しさん
2006/07/14(金) 01:07:540843デフォルトの名無しさん
2006/07/14(金) 01:12:00同じように、勝手に自分とこの組織の話を持ち出されても困るんだが…。
別に他人のポリシーなんて違ってても構わないだろ。
perl4で書いてるKENTだって居るんだし。ほっとけよ。
0844デフォルトの名無しさん
2006/07/14(金) 01:12:46俺は別に子飼氏、宮川氏、伊藤氏になんら憧れなどは持っておりませんが。
ダミアンの名前を出して屁理屈をこねてるあなたのほうがいい加減に失せろ。
0845799
2006/07/14(金) 01:15:33だから、モジュールによっては可読性が向上しないってこと
xmlの解析とか、DBのインタフェースを抽象化するモジュールなら
確実に可読性は上がるけれどClass::Accessorがやっている
ことはそういった'ふつう'のモジュールとは違うでしょ
スクリプトのコード自体に変更を加えてるわけじゃん
そういっちゃ特殊なことをやってるのが果たして可読性を上げるの?
俺は初めてClass::Accessor使ってるコードみたとき
何やってんのかさっぱり理解できなかった
ドキュメント読まなくてもすらすら理解できるのが抽象化なんじゃないの?
0846デフォルトの名無しさん
2006/07/14(金) 01:15:54内容読んでる?スレの流れ読めてる?
799が最初に自分のポリシーを押し付けていちゃもんつけてるんだよ?
人が何していようが関係ないが、
さすがに言われもない内容で自分に因縁つけられれば反撃するでしょ
0847デフォルトの名無しさん
2006/07/14(金) 01:18:00> 俺は初めてClass::Accessor使ってるコードみたとき
> 何やってんのかさっぱり理解できなかった
そんなレベルかよ。。。
どうやら799のレベルが低すぎるから、みんなと話が噛み合っていないようです。
初心者なら初心者らしい振る舞いをした方がいいんじゃないかな。
0848デフォルトの名無しさん
2006/07/14(金) 01:18:55799はドキュメント読まないでもどんなモジュールでも使いこなすんだ。
へー、へー、へー。エスパーですね。とても真似できません。
ドキュメントも読まないではまったからってファビョってるなんてとても真似したくありません。
0849デフォルトの名無しさん
2006/07/14(金) 01:19:59/ /⌒)ノ ペタン
∧_∧ \ (( ∧_∧ おまいら
(; ´Д`))' ))(・∀・ ;) おちけつ!!11
/ ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O ノ ) ̄ ̄ ̄()__ )
)_)_) (;;;;;;;;;;;;;;;;;;;)(_(
0850799
2006/07/14(金) 01:23:21あのね。誰もドキュメント読まずに「使いこなす」なんていってない
「理解する」といっている
>>847
初心者が洋書いちいち買うかよ
0851デフォルトの名無しさん
2006/07/14(金) 01:28:02Class::Accessorを使っててどんなコードを書けば
可読性が下がるのかとっても気になるぞ。
アクセサーが増えれば増えるほど比較したときに可読性に差がでるんだぞ。
それを「単にコード2,3行書く手間を減らすためだけに」とは・・・
コードを減らすのと可読性をあげるゴッチャにしてるし、ホントに大丈夫?
0852デフォルトの名無しさん
2006/07/14(金) 01:34:20なんで洋書を買えって話になるの?
日本語読めてる?日本語理解できてます?
普通にperldocでドキュメント読めばいいだけジャン?
それと「理解する」能力は有してるんですよね?
理解してるのに使いこなせないんですか?
それって理解してるっていえなくないですか?
ねぇ、マジでさあなたのみんなのレス読み直してみ。
話に論理性がないよ。ハッキリいってキミ頭おかしいよ。
0853デフォルトの名無しさん
2006/07/14(金) 01:43:55洋書買っただけで初心者脱出できる思ってるの?哀れだね。。。
0854デフォルトの名無しさん
2006/07/14(金) 01:45:140855デフォルトの名無しさん
2006/07/14(金) 01:52:23ただ、他人に自分の意見を押し付けるのは良くない。他人の自由への侵害になるから。
とここまで思って、あれ? これ何かに似てるな と思ったら宗教論争だった。
宗教の自由は憲法で保障されてるわけだし、コーディングスタイルの自由も保障されればいいのにねw
0856デフォルトの名無しさん
2006/07/14(金) 01:55:020857デフォルトの名無しさん
2006/07/14(金) 02:00:11ラリーだったかだれかもそんな感じの格言を残してるし。
ただ>>799のような自分のポリシーを押し付けてくる奴が
時々出現してファビョってスレに変な空気を残すからうざい。
0858デフォルトの名無しさん
2006/07/14(金) 02:01:290859デフォルトの名無しさん
2006/07/14(金) 02:10:21そんな「簡単な」モジュールを使うのに、なにを躊躇うのか理解できない。
0860デフォルトの名無しさん
2006/07/14(金) 02:13:030861デフォルトの名無しさん
2006/07/14(金) 02:16:56「なんで初心者がいちいち洋書買うかよ」というレスなのか理解不明。
そもそも洋書を買うより付属のドキュメントを読むのが先だろ。
このへんから799の異常性がかいまみえるな
0862799
2006/07/14(金) 02:20:48>>855いったい俺のいっていることのどこが宗教だというのだ
>>853ダミアンの文章は通常のオライリーの他の洋書と比べて読みにくい
これをよみ通せるくらいなら初心者はとっくに脱していると思った
>>850
誰も洋書を買えなんていってないし話に一貫性なんて持たせてない
Class::Accessorのドキュメント読んでみたがやっぱりこれ欠陥品だろ
例えばsetするときに引数の妥当性のチェックができない
通常境界性のチェック等は呼び出す側じゃなくて呼び出される側の担当だろう
いくらperlが型付けされた言語じゃないからってこれは行き過ぎ
とここまで書いてドキュメントでOverriding autogenerated accessorsなんていう
項目が見つかった、あちゃあ
で、この項目読んだが、やはりおれの意見は正しかった
何この引数の妥当性のチェックのトリッキーなやり口は・・・
おいこら>>851これのどこが可読性高いんだよ
0863デフォルトの名無しさん
2006/07/14(金) 02:23:38洋書の話を脈絡も無く持ち出したのはおまえじゃんw
ニワトリより頭悪いなお前w
0864デフォルトの名無しさん
2006/07/14(金) 02:28:03みんながウザイおまえが逃げたと思ってまともなスレに戻そうとしてるのに
戻ってくんなよボケw
0865デフォルトの名無しさん
2006/07/14(金) 02:28:24何のためにsetとgetオーバーライドできると思ってんだよ
つーか setter getter毎回定義してぇんならJavaでもやってろよ
0866デフォルトの名無しさん
2006/07/14(金) 02:29:59「話に一貫性なんて持たせてない 」という書込みでわかるように
799の話には一貫性がなくその場その場を適当に繕って釣りをしているだけです。
もう799にかまうのはやめときましょう
0867デフォルトの名無しさん
2006/07/14(金) 02:35:490868デフォルトの名無しさん
2006/07/14(金) 02:36:070869デフォルトの名無しさん
2006/07/14(金) 02:39:470870デフォルトの名無しさん
2006/07/14(金) 02:40:090871デフォルトの名無しさん
2006/07/14(金) 02:41:31ジタバタ ⊂⌒( `Д´) <ヤーダーヤーダー
`ヽ_つ⊂ノ Class::Accessor::Lvalue ジャナイトヤーダー
0872デフォルトの名無しさん
2006/07/14(金) 02:43:27$obj->hogeとかくとstrictの恩恵にあずかれる。
いちいちオブジェクトのハッシュのキーに生でアクセスしている奴が
引数の妥当性を(ry
0873デフォルトの名無しさん
2006/07/14(金) 02:44:090874デフォルトの名無しさん
2006/07/14(金) 05:31:490875デフォルトの名無しさん
2006/07/14(金) 05:38:15入り / ̄ l
まーす ■■-っ
´∀`/
__/|Y/\.
Ё|__ | / |
0876デフォルトの名無しさん
NGNG0878812
2006/07/14(金) 09:09:11遅レスだけど、たしかに情報が小出しで、色々な解釈できるようなレスだったね。正直すまんかった。
>>877
ちょ、まて、そのネタフリ。なんか俺が全部悪いみたいなオチにしてんじゃねーかw
0879デフォルトの名無しさん
2006/07/14(金) 10:23:350880デフォルトの名無しさん
2006/07/14(金) 11:08:450881デフォルトの名無しさん
2006/07/14(金) 11:42:38CPAN経由でモジュールをインストールする時、
初めて perl -MCPAN -e shell を実行すると初期設定が始まりますよね?
その後の一連の設定(キャッシュはどこに置くとか、ダウンロードサイトはどこのを使うとか。。)
のログというか、設定が記述されているファイルってどこにあるのでしょう?
一応 ~/.cpan 以下とか調べたんですけど、よくわかりませんでした。
おながいします!
0882デフォルトの名無しさん
2006/07/14(金) 12:02:110883デフォルトの名無しさん
2006/07/14(金) 12:15:40CPAN::Config options from C:/Perl/lib/CPAN/Config.pm:
0884デフォルトの名無しさん
2006/07/14(金) 12:27:54lib/CGIの中にはCGI.pmというファイルがありませんでした
Apache.pmとかCarp.pmとかがあるけどこれは違うしなぁ
0885デフォルトの名無しさん
2006/07/14(金) 12:28:460886デフォルトの名無しさん
2006/07/14(金) 12:32:23これは
ハッシュ$selfのキー$paramをデリファレンスして、
それをさらにデリファレンスして配列としてアクセスする
で理解はOK?
0887デフォルトの名無しさん
2006/07/14(金) 12:33:58% perl -e 'use CGI; print $INC{"CGI.pm"},"\n"'
/usr/share/perl/5.8/CGI.pm
0889デフォルトの名無しさん
2006/07/14(金) 12:49:01$ perldoc -ml CGI
/usr/lib/perl5/5.8/CGI.pm
0890デフォルトの名無しさん
2006/07/14(金) 12:54:46おーそんなのもあったのか。でもマニュアル確認したら
-mはいらんのと違う?
% perldoc -l CGI
/usr/share/perl/5.8/CGI.pm
0891デフォルトの名無しさん
2006/07/14(金) 14:03:19ttp://blog.livedoor.jp/nipotan/archives/50146747.html#more
0892デフォルトの名無しさん
2006/07/14(金) 14:05:33なるほど。勉強になった。
0893デフォルトの名無しさん
2006/07/14(金) 15:03:48RedHat ESにリプレースされる事になった。
0894デフォルトの名無しさん
2006/07/14(金) 16:50:01大体あってるけど、ちょっと違う気もする。
$self はハッシュじゃなくてハッシュへのリファレンス。
-> はデリファレンスをしてから添え字アクセスする為の演算子。
まず $self をデリファレンスして得られたハッシュの中からキー $param の要素を取り出してる。
その要素は配列へのリファレンスになっているので、@{ } でデリファレンスしている。
0896デフォルトの名無しさん
2006/07/14(金) 17:41:39( ´д)ヒソ(´д`)ヒソ(д` )
0897デフォルトの名無しさん
2006/07/15(土) 05:43:09ありが十(とう)なら芋虫ゃ二十(はたち)
0898デフォルトの名無しさん
2006/07/15(土) 09:17:400899デフォルトの名無しさん
2006/07/15(土) 09:32:300900デフォルトの名無しさん
2006/07/15(土) 11:05:090901デフォルトの名無しさん
2006/07/15(土) 11:30:300902デフォルトの名無しさん
2006/07/15(土) 12:37:520903799
2006/07/15(土) 12:49:06お詫びにデザパタでしりとりしようぜ
じゃ、おれから
Null Object Pattern
0904デフォルトの名無しさん
2006/07/15(土) 12:49:40おまえのマムコにimport
0905デフォルトの名無しさん
2006/07/15(土) 20:19:350906デフォルトの名無しさん
2006/07/16(日) 00:18:240907886
2006/07/16(日) 09:01:06誠意を素直に表現しただけなのに・・・
0908デフォルトの名無しさん
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
のように出力されます。
どこがおかしいのでしょうか?
複素数を使わない場合は上手くいくのですが…
よろしくお願いします。
0909デフォルトの名無しさん
2006/07/16(日) 09:35:22なので
$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
を参考にしてください。
0910デフォルトの名無しさん
2006/07/16(日) 10:10:280911908
2006/07/16(日) 10:29:33どうもありがとうございます。
overload はブラックボックスとしてか使ってこなかったので、リンク先見てみます。
> $dummy[0] = Math::Complex->make( Re($matrix[0]), Im($matrix[0]) );
> に書き換えると期待されている動きをすると思います。
まさにちゃんと動きました。
ただ、type が面倒なので、
$dummy[0] = $matrix[0] + 0.0;
で Math::Complex->make を自動で呼び出し(多分)させることにしました。
どうもありがとうございました。
0912デフォルトの名無しさん
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};
0913デフォルトの名無しさん
2006/07/17(月) 05:13:120914デフォルトの名無しさん
2006/07/17(月) 11:08:37use 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
0915デフォルトの名無しさん
2006/07/17(月) 11:36:55変数は宣言時に何も代入しなければundefであることが
保障されてるんじゃないの?
0916デフォルトの名無しさん
2006/07/17(月) 11:41:50$value = \3;
$hash = (a, $value);
でこの$valueをデリファレンスしたいんだけど
print ${$hash{a}} ;
以外にもっと見やすい方法ないですか?
0917デフォルトの名無しさん
2006/07/17(月) 11:57:28たんなる癖です。
my $i = 0 ; # 数字
my $i = '' ; # 文字列
my $i = undef ; # 他
って自分に言い聞かせるために代入してます。
0918デフォルトの名無しさん
2006/07/17(月) 12:10:38検索対象文字列にカタカナが含まれている場合対象文字列の中身にかかわらずマッチしているとみなされてしまいます。
どのようにしたら正しくマッチチェックが出来るのでしょうか?
文字コードをEUCに変えたらうまくいきましたが対象文字列がShiftJISなので変えられません。
具体的には
$str='対象文字列タイショウモジレツ';
$serchstr='ポロシャツ';
if($str=~/$serchstr/){
print "match";
}else{
print "nomatch";
}
の結果がmatchになってしまうという状況です。
0919デフォルトの名無しさん
2006/07/17(月) 12:13:11一番みやすくね?つか他の方法をしらんだけだが。
0920デフォルトの名無しさん
2006/07/17(月) 12:25:18use 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/
0921デフォルトの名無しさん
2006/07/17(月) 12:26:03>my $serchstr= decode 'euc-jp', 'ポロシャツ';
my $serchstr= decode 'shiftjis', 'ポロシャツ';
0922デフォルトの名無しさん
NGNG0923デフォルトの名無しさん
2006/07/17(月) 13:15:03> $hash = (a, $value);
が $hash = { 'a', $value }; だとして、
$hash->{a} ではどうでしょう。
0925916
2006/07/17(月) 13:35:16$hash=('a',value);
です
0926916
2006/07/17(月) 13:36:07%hash = ('a', value);
ですすみません
0927デフォルトの名無しさん
2006/07/17(月) 15:29:200928デフォルトの名無しさん
2006/07/17(月) 17:07:42が一番見やすい。
0929デフォルトの名無しさん
2006/07/17(月) 17:10:11なんとなくテンプレートエンジン作ってみました。
(TTよりは文法簡単で、HTML::Templateよりはいろいろできるやつ)
あんまりデバッグしてないので、適当に触ってくれる人募集。
(PODも適当だし)
http://0-9.sakura.ne.jp/perl/modules/spTemplate.pm
0930デフォルトの名無しさん
2006/07/17(月) 19:00:480931デフォルトの名無しさん
2006/07/18(火) 01:00:330932デフォルトの名無しさん
2006/07/18(火) 01:09:520933デフォルトの名無しさん
2006/07/18(火) 01:15:430934デフォルトの名無しさん
2006/07/18(火) 08:49:20> (TTよりは文法簡単で、
そうは思えない俺ガイル
あと、独自のescapeを追加したいときとかどうすんの?
0935デフォルトの名無しさん
2006/07/18(火) 11:21:22=head6 ecp_hoge
[%name="hoge" escape="ecp_hoge"%]
「ecp_hoge」を呼び出す。
(継承先で定義されるていることを想定)
ってあるな。
OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
これはどういう意図でやってるの?>>929
_mk_accessorsもClass::Accessor::Fastでいいような気がした。
0936デフォルトの名無しさん
2006/07/18(火) 12:19:49> >>934 perldocをみるかぎり
> (継承先で定義されるていることを想定)
> ってあるな。
読み落としすまん。そうか、継承するのか・・・。それはちょっとダメじゃねぇ?
> OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
同意
> _mk_accessorsもClass::Accessor::Fastでいいような気がした。
同意
0937デフォルトの名無しさん
2006/07/18(火) 18:26:56検索・抽出・並び替えて一行ずつリスト化したいのですが可能でしょうか?
0938デフォルトの名無しさん
2006/07/18(火) 18:33:20以上
0939デフォルトの名無しさん
2006/07/18(火) 18:36:49ありです。
0940デフォルトの名無しさん
2006/07/18(火) 22:32:51実はttとかHTML::Templateってそんなに使ったことないので
すごく変なものになってる可能性も高い。
どのへんがおかしいか指摘してもらえると喜びます。
>>935
>OutputとかParamとか頭を大文字にしてるのがperlっぽくなくてキモク感じた。
CGI.pmとかttがそんな感じなのでまねてみたんだけど、やっぱりきもいか。
個人的には小文字の方が好きだけど、
組み込み関数とかぶるのを気にしなくて良いのは利点かな?
>_mk_accessorsもClass::Accessor::Fastでいいような気がした。
その辺は前に組んだスクリプトの流用だったり。
(そのときは仕事だったので、他のmodulesに依存したくなかった)
Class::Accessor::Fastにしようかな。。。
>>936
>継承するのか・・・。それはちょっとダメじゃねぇ?
その辺なんとなく組んだだけなので、ダメかも。
ttもHTML::Templateもよく知らんので、
「この辺きもい」とかの指摘はありがたい。
0941935
2006/07/18(火) 22:54:08TTは全部小文字よ。
CGI.pmもcgi-lib.plからの移行の為にVarsを付けてるだけで
他は小文字だと思う(CGI.pmは最近使ってないから自信なし)。
929の「なんとなく」が理由の全てなんだろうけど
HTML::TemplateやTemplateの何が気に入らないとか
アドバンテージを示さないと積極的に乗り換えることはないな・・・
0942デフォルトの名無しさん
2006/07/18(火) 23:23:07個人的には、オブジェクトが $my になってるのがダメ…。
エディタによっては不用意に色が変わっちゃうし。
$self か $this かにして欲しい。
あとクラス名の先頭が小文字ってのも…。
0943929
2006/07/19(水) 00:11:07>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にでもして置いとこうかな)
0944デフォルトの名無しさん
2006/07/19(水) 01:36:25package名は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がいいな。
眠いから変なこといってたらごめん。
0945デフォルトの名無しさん
2006/07/19(水) 01:43:10use 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するべきだと思うのですが、どうすれば良いのでしょうか?
0946デフォルトの名無しさん
2006/07/19(水) 02:14:162.no encoding を使う
3.pack で utf8フラグを取り除く
4.unpack で utf8フラグを取り除く
0947945
2006/07/19(水) 02:20:15私、jcode.plを使っていた時代の人間でして、
最近再びPerlをいじることになり、use encodingで頑張ってる次第です。
ご指摘いただいた内容で調べてみます!
0948デフォルトの名無しさん
2006/07/19(水) 06:43:53互換性のためにuse varsの方がいいと思う
0949デフォルトの名無しさん
2006/07/19(水) 07:31:06コアモジュールでも結構our使ってるし別にいいんでない?
0950デフォルトの名無しさん
2006/07/19(水) 08:13:220951デフォルトの名無しさん
2006/07/19(水) 11:30:24指定した項目に、データが入力されているかを調べるCGIにデータを渡すときに
&ReadParse(*input);
$howto="$input{'howto'}";
&jcode'convert(*howto,'sjis');
を行い、文字コードの変換をしています。
データをメールで送信する前に
&jcode'convert(*howto,'jis','sjis');
でJISに変換し
print MAIL"査定方法:$howto\n";
でメール本文に書き込んでいます。
全部で23項目ほどあります。
テストとして「あ」とデータを入力した場合は正常に出力されるのですが、漢字などを混ぜて入力すると
査定方法:出張無料査定
のようになってしまいます。
ソースをシフトJISで書いてもEUCで書いても化けてしまいます。
どうすれば化けずにデータを送信できるのでしょうか?
0952デフォルトの名無しさん
2006/07/19(水) 11:40:23>>1
0953デフォルトの名無しさん
2006/07/19(水) 11:40:45死ねばいい。
0954935
2006/07/19(水) 12:07:130955デフォルトの名無しさん
2006/07/19(水) 12:54:210956デフォルトの名無しさん
2006/07/19(水) 12:55:23やっぱ、テンプレートエンジンって楽しいから自作で作っちゃうよな。
でも、独自の文法とかだと新しいプログラミング言語覚えるみたいでめんどくさい気がするんだが。
MovableTypeのSmartyだっけ?あれも新しいプログラミング言語覚えるみたいで嫌になるけど。
ASPとかJSPとかERBみたいにシンプルなもののほうがいいのでは?
0957デフォルトの名無しさん
2006/07/19(水) 13:08:26MovableTypeはダイナミック・パブリッシング機能を利用時にPHP+Smartyが必要ってこと。
>ASPとかJSPとかERBみたいにシンプルなもののほうがいいのでは?
ASP,JSP,ERBに対する評価は宗教戦争に発展しかねないのでノーコメントとして
俺は各種プログラミング言語ごとにテンプレートエンジンに互換性がないことが不満で、
最近はClearSilverとかに注目中。
0958デフォルトの名無しさん
2006/07/19(水) 13:16:13@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
セパレータが | の時にも上二つと同じ結果が出るようにしたいのですが、
どうしたらいいんでしょうか?
0959デフォルトの名無しさん
2006/07/19(水) 13:21:40第一引数は文字列ではなくてPATTERN
@x = split('\\|', $str);
0960デフォルトの名無しさん
NGNG0961デフォルトの名無しさん
2006/07/19(水) 13:22:59splitの第一引数は正規表現なので、正規表現のメタ文字はエスケープする必要がある。
また、正規表現を期待されているところに文字列リテラルを書くのは個人的には好きじゃ
ないのでこんなとこ。
@x = split(/\|/, $str);
0962デフォルトの名無しさん
2006/07/19(水) 13:23:570963デフォルトの名無しさん
NGNG0964デフォルトの名無しさん
2006/07/19(水) 13:30:190965デフォルトの名無しさん
2006/07/19(水) 13:40:06次のスレのテンプレでは
perldocで最低限調べろとか入れて欲しい
0966デフォルトの名無しさん
2006/07/19(水) 16:13:13Perlのsplit(他にあるのかは知らないけど)の仕様自体ちょっと嫌だな・・・
0967デフォルトの名無しさん
2006/07/19(水) 16:16:32書いても無駄。
それに本当に鬱陶しいのはそれ以前のレベルの連中だから
・スレ違いの質問はスルーか速やかに誘導すること
の一言を入れて欲しい。
テンプレ読まない連中のための注意書くより、ちゃんと読むであろう真面目な解答者への注意入れたほうが効果的だと思う。
0968デフォルトの名無しさん
2006/07/19(水) 18:04:280969799
2006/07/19(水) 18:24:21しかし作る人の技術向上には貢献するだろう
したがって作る人にはメリットがあるが使う人にはメリットがない
のがテンプレートやフレームワークなのだ
なんという矛盾、皮肉
Javaと一緒である。みんなでStruts使ってればいいものを
難しいとかいちゃもんつけてもっとややこしい仕組みを提案して
金儲けをした屑どものなんとうざいことか
せっかく自転車に乗れるようになったのに
「省スペースだから」という理由で一輪者を押し付けられるようなものだ
テンプレートエンジンの作成は非モテと通ずるものがある
非モテの言論界があんなにかまびすしいのはあれがとても
ユーザフレンドリーだからだ
非モテという経験は誰にもあり、何の前提知識もいらずに
皆が飛び込みわいわいできる
難しいこと考えなくてもそれなりに貢献感が持てる
テンプレートエンジンの作成はまるで無節操なやりマンのようだ
快楽だけとってあとは医療廃棄物だ
まつもとひろゆきさんがいっているようにRailsが優れているのは作者の
マーケティングである。それのみである。
WebServiceなんていう創造性のかけらもない領域で生産性なんてうんぬん
したってしょうがないのである
フレームワークはVSとEclipseとEmacsで十分だ
いっておくが俺が一番うざい
0970デフォルトの名無しさん
2006/07/19(水) 18:47:460972デフォルトの名無しさん
2006/07/19(水) 19:41:03パッケージαに自分が欲しい機能がない場合、そのαにその機能を追加することを
しない。新たにyaαを作って登録することが定常化している。
0973デフォルトの名無しさん
2006/07/19(水) 22:03:42CPAN まで TMTOWTDI だと困るんだけどねぇ…(笑)
0974デフォルトの名無しさん
2006/07/19(水) 23:32:00Tiny-Fooが登場し……
0975929
2006/07/19(水) 23:35:41>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っぽい扱いで修正。
0976929
2006/07/19(水) 23:36:42そういえば、なんで_warnにしたんだ?>自分
_dieへ変更。
>メソッド名もsub _dumperのほうがいいかな。
「sub_」から始まるメソッドはテンプレート内から呼び出すメソッドなので、頭の「sub_」は削れない。
(これはテンプレート内から「[%dumper/%]」って感じで呼び出す)
>GPL/Artistic Licenseがいいな。
Artistic Licenseはいいけど、GPLは文書添付するのが面倒(単一ファイルが好きなので)
改変BSD License/Artistic Licenseかな。
>>957
>各種プログラミング言語ごとにテンプレートエンジンに互換性がないことが不満
同意。なので、一応これはPerlっぽくなくしたつもり。
(言語仕様も簡単なので、正規表現使える言語なら再実装もそんなに手間じゃないと思う)
>>969
>作る人にはメリットがあるが使う人にはメリットがない
同意。正直使う側のことを考えると公開しないほうが良かったかも。
(まぁ、広めるつもりないので、使う人間なんていないと思うが)
Perl勉強中でとにかくソースが読みたい人にはメリットあるかも。
0977デフォルトの名無しさん
2006/07/20(木) 00:12:07957を書いた者だけど、
各種プログラミング言語ごとにテンプレートエンジンに互換がないことと
テンプレートエンジンの文法がPerlっぽくなくすは別問題と思われ
0978ヽ(´ー`)ノ ◆.ogCuANUcE
2006/07/20(木) 00:44:50とりあえず、グローバルに 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.
0979956
2006/07/20(木) 00:45:44他言語と互換を保つってきつくないか?
テーブルタグのような表出力の場合、イテレータやレコードセットオブジェクトみたいなデータ集合も、
テンプレートルールとして考えておかなくてはならんような希ガス。とか。その他、色々めんどくさす。
他言語に入れ替えられるっていってもそんなに用途なさそうだし。
いや、プログラミング手法が統一できるって意味では有用なのか。
0980デフォルトの名無しさん
2006/07/20(木) 01:04:24957にわざわざClearSilverの名前が出てるんだからとりあえず見てから書けば?
0981デフォルトの名無しさん
2006/07/20(木) 07:39:40open (IN, '< '.$path) or die 'file open error'; # 2引数のopen
open IN, '<', $path or die 'file open error'; # 3引数のopen
0982デフォルトの名無しさん
2006/07/20(木) 13:58:28-wで実行されてウザイのですが、-wつかないようにする
にはMakefile.PLにはどう記述すればいいかわからず困って
います。Test::Harnessがつけてるらしく $Test::Harness::switches
をいじればいいっぽいのですが、どう書いていいやら。
自作の部分ははじめからuse warningで書いているので
余計な警告が使用している外部モジュールの中で出るだけ
なので-wはあまりうれしくありません。
0983デフォルトの名無しさん
2006/07/20(木) 19:59:41すまん。ちょっと使い心地をみようかと思ったんだけど 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 として登録されてた。
0984デフォルトの名無しさん
2006/07/20(木) 20:02:31あるファイル(※権限777,ディレクトリも777)に対して
renameを実行したら、権限エラーになってしまいましたが、
unlinkは成功しました
リネームと削除は同等の権限がないと出来ないと思っていたのですが
違うのでしょうか?すみませんが詳しい方理屈を教えてください。
0985デフォルトの名無しさん
2006/07/20(木) 20:52:49renameはrename先についての権限も関係する。
0986929
2006/07/20(木) 23:21:03>各種プログラミング言語ごとにテンプレートエンジンに互換がないことと
>テンプレートエンジンの文法がPerlっぽくなくすは別問題と思われ
そりゃそうだけど、Perlっぽい文法なら他言語じゃ使わんでしょ。
(記述言語っぽいやつって記述言語に依存してること多いし)
>>978
>とりあえず、グローバルに use warnings しておいて、warnings が出る
>箇所だけ、スコープローカルに no するのがいいんでないかい。
そやね。そうしようかな。
>%GLOBAL はパッケージ外から参照する必要がなければ my で良し。
一応%GLOBALは外部から参照されることを考えてる。
たとえば、スクリプトの先頭で「SpTemplate::GLOBAL{'default_escape'} = 'html'」とか書いとけば、
それ以後生成されるオブジェクトに継承される。
>個人的な希望を言うと、[% %] は変更できた方がいいかな。
これは考えたけど、「sub_if」内で「 [ ] 」とか使ってるから「[% %]」だけ変更できても意味ないかなと思ってやめた。
(「sub_if」内の変数まで全体で管理したくないし)
>細かいこと言うと、sub_ とかするぐらいなら、別の名前空間にブチ込んだ方が
>いいかなぁとか、色々あるけど、好みの問題だし。
ほんとは「_conv」内で解析した後、別オブジェクトを作って投げる感じにしたかったんだけど、
結構全体で管理する変数もあるし、何回も呼ぶから遅くなるような気がしてやめた。
(全体的にもうちょっとオブジェクト指向っぽくしたいけど、うまいやり方が思いつかんかった)
0987929
2006/07/20(木) 23:23:02>他言語と互換を保つってきつくないか?
とりあえず、Ruby、PHPなら同じようなもの組めるかなとか考えて作ってます。
hashとarrayと正規表現使える言語なら、同じ仕様のテンプレートを解析するライブラリ組むのは難しくないと思う。
(互換性ってその程度のことよ)
>他言語に入れ替えられるっていってもそんなに用途なさそうだし。
まぁ、テンプレート共通で言語を変えるってほとんどないだろうから、あんまり意味ないとは思うけど。
>>981
>open IN, '<', $path or die 'file open error'; # 3引数のopen
あ〜、そういえばそんな書式も見たことある気がする。こっちのほうが良いなぁ。
>>983
ごめん。思いっきりバグってた。とりあえずPODの通りくらいには動くようにしてみました(まだバグあると思うけど)
0988デフォルトの名無しさん
2006/07/20(木) 23:29:01>たとえば、スクリプトの先頭で「SpTemplate::GLOBAL{'default_escape'} = 'html'」とか書いとけば、
それキモイ。OOスタイルな意味ないじゃん。クラスメソッドで
SpTemplate->default_escape('html');
みたいな呼び出し方を考えるべき。
0989デフォルトの名無しさん
2006/07/21(金) 00:41:23ループのデータセットは、配列参照かハッシュ参照なのか。
DBからのレコードセットとかの場合どう対処するの?
全部、メモリにロードしてから出力?メモリ食いそうだな。
まあ、どんなテンプレートエンジン作る際でも問題となってくる部分ではあるんだが。
0990デフォルトの名無しさん
2006/07/21(金) 01:01:54もう自棄だ。建てて来る
>>967を1の3段落目の最後にこんな感じで混ぜておくか。
| スレ違いの質問にはスルーか、速やかな誘導をお願いします。
異議があったら準備中に宜しく
0991デフォルトの名無しさん
2006/07/21(金) 01:21:54$self->{next}->lead($self);
__END__
次スレ
http://pc8.2ch.net/test/read.cgi/tech/1153412251/
0992デフォルトの名無しさん
2006/07/21(金) 01:24:310993デフォルトの名無しさん
2006/07/21(金) 01:30:24$self->kakikomi("埋め") while $self->count() < 1000;
0994デフォルトの名無しさん
2006/07/21(金) 01:49:430995デフォルトの名無しさん
2006/07/21(金) 01:59:000996デフォルトの名無しさん
2006/07/21(金) 02:31:580997デフォルトの名無しさん
2006/07/21(金) 02:43:200998デフォルトの名無しさん
2006/07/21(金) 02:44:460999デフォルトの名無しさん
2006/07/21(金) 02:45:461000デフォルトの名無しさん
2006/07/21(金) 02:46:2610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。