"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2006/01/29現在の最新版: 5.8.7, 5.8.8 RC1
● 2006/01/29現在の開発版: 5.9.2
リンク集は
>>2-3 過去スレは
>>4-5
RubyがあればPerlなんて要らないから もうスレ立てなくていいのに
^^;
>>9 やっぱり5.9.3出てたか
出たと聞いたような気がして一度5.9.3と書いたんだけど、
ソースを探しても見つからなくて結局戻したんだ。スマソ
前スレ埋め方ワロスwwwwwwww
12 :
デフォルトの名無しさん :2006/01/29(日) 20:42:12
質問です。 $hoge->{hage1} = { 'date' => '1234'; 'value' => 'nanika1'; }; $hoge->{hage2} = { 'date' => '5678'; 'value' => 'nanika2'; }; $hoge->{hage3} = { 'date' => '9012'; 'value' => 'nanika3'; }; というハッシュを、{date}のvalueを基準にソートしたいのですが どうすれば良いでしょうか? 多次元ハッシュで検索したんですがうまくいかず困ってます
13 :
12 :2006/01/29(日) 20:43:43
訂正
>>12 $hoge->{hage1} = {
'date' => '1234',
'value' => 'nanika1',
};
$hoge->{hage2} = {
'date' => '5678',
'value' => 'nanika2',
};
$hoge->{hage3} = {
'date' => '9012',
'value' => 'nanika3',
};
「ハッシュをソート」
15 :
12 :2006/01/29(日) 21:02:49
Data::Dumperを使えということですか。どうもありがとうございました。
16 :
デフォルトの名無しさん :2006/01/29(日) 21:11:14
ハッシュは順序無しの構造なのでソートできませんよ
17 :
12 :2006/01/29(日) 21:12:38
>>16 ならば@hogeに変更してやってみます。
単純にARGVをPrintするプログラムを作りました。
'\d'はそのまま出力されるのですが、 '(\d'が'(d'になってしまうのはなぜか教えてもらえませんか。
20 :
デフォルトの名無しさん :2006/01/29(日) 21:30:09
あなたの言っていることはウソなので答えようがありません
21 :
12 :2006/01/29(日) 21:31:03
でけました。どうもありがとうございました。
前スレの続きを書けw
23 :
19 :2006/01/29(日) 22:00:26
すみません自己解決しました…のかなぁ? cmdでは問題なく出力できましたのでzshが原因だと思うのですが、 echo '(\d'と打ってもちゃんと'(\d'と出力されるのです。 環境はMsys版Perlです。
24 :
デフォルトの名無しさん :2006/01/30(月) 00:21:59
シェルを通さずに試してみるという発想はないのか…
>>23 > zshが原因だと思うのですが、
わかってるんじゃん。 Perl の問題じゃないよ。
use strict; my @nextlist; my $rec = { exist => 1, path => 'XXX', }; push(@nextlist, $rec); my $rec = { exist => 0, path => 'AAA', }; push(@nextlist, $rec); # ここで exist が 0 以外のものだけのリストが欲しいです @nextlist = grep($_->{'exists'}, @nextlist); foreach my $a (@nextlist) { print ">>$a->{'path'}\n"; } これだと空のリストしか受け取れません。 grep の判定が悪いのだと思いますが、他に書きかたが浮かびません。 よろしくお願いします。
単なるスペルミスでした...スイマセン...orz
EUC-JPからマイクロソフトマッピングのUTF-8に変換する方法を教えてください。 5.8と5.6それぞれでお願いします。一応、これまで調べたことを書いておきます。 ・5.8 Encode::from_toで変換しようとしたが、EUC-JP-msのようなENCNAMEが見あたらない。 euc-jp⇒cp932⇒utf8ならできそうですが、それはちょっと……。 ・5.6 Jcodeで変換しようとしたが、マッピングが単一っぽい。utf8化後に置換するしかない?
29 :
デフォルトの名無しさん :2006/01/30(月) 09:12:16
pipe 関数の使い方を教えてください。 pipeって↓のように使うのではないのでしょうか? pipe READFH, WRITEFH; print WRITEFH "aho"; print "douyo =>", <READFH>, "\n"; <READFH>の部分で止まってしまいます。 やりたいことは上記のようにストリーム(WRITEFH)に、 出力した結果をスカラー変数で受け取りたいのです。
31 :
28 :2006/01/30(月) 11:07:11
>>29 thx!! イケますた。
perl -MEncode::EUCJPMS -Mencoding=euc-jp-ms,STDOUT,utf8 -e 'print "〜"' | od -tx1
0000000 ef bd 9e
32 :
28 :2006/01/30(月) 11:11:32
5.6についてはまだ募集中。
>>29 よさそうじゃん。自前のへんてこモジュールがいらなくなりそう。
>>30 マルチスレッドにするとか、selectを使うとかして、
さらにバッファのフラッシュだなんだを注意深く
行わないとまともには動かないだろうね。
IO::Scalarでも使っとけ。
35 :
デフォルトの名無しさん :2006/01/30(月) 13:07:19
perlでテーブルの中の枠線の太さを1にしたいんですけど borderの値を1にしても線の太さが見た感じ2になってしまいます どうすればをちゃんと表示できるんでしょうか?
>>35 CGI? そうならWEBプログラミング板で聞いた方が
>>34 >IO::Scalarでも使っとけ。
そ、そんなものが。ありがとうございます。調べてみます。
39 :
デフォルトの名無しさん :2006/01/30(月) 18:23:30
型グロブのスコープ?について質問です。
-----------------
my $tmp;
sub hoge {
my ($filename) = @_;
local *FILE;
open FILE, "+>> $filename";
@*TMP = *FILE;
A$tmp = *FILE;
}
-----------------
この例での@とAの違いとはなんなのでしょうか。
ttp://www.site-cooler.com/kwl/perl/2.htm#2-7 ↑によると、@はアクセス名を変えるだけ?のリファレンス?になっているように読めます。
localとはグローバル変数の内容をサブルーチン(下層含む)の中限定で変更する物と
このスレのリンクにあるperl5.8.xのドキュメントに書いてあったのですが、
その定義ならば仮に@のリファレンスに代入したとしても、このサブルーチンが終わった時点で
ここで作ったファイルハンドルにアクセスできなくなるような気がします。
localで設定したハンドルにサブルーチンを抜けてからもアクセスしたいのですが。。
補足 個人的な目標としては、 サブルーチンを用いてfileAを開き、続けてfileBを開いた状態で、 fileAにアクセスするような状態に対応できるようにしようと思ってます。 現状ですと、fileBを開いた段階でハンドルはBになってしまうと思われる為、 Aにはアクセスできなくなってしまうような気がしてます。
>>39 ファイルハンドルのリファレンスがあるので、
sub hoge {
my ($filename) = @_;
open my $fh, "+>> $filename";
$tmp = $fh;
}
でいいとおもうが。$tmpがundefであることが確実なら
open $tmp, "+>> $filename";
でも可。
forkについて質問させて下さい。 カウントダウンを表示しながら、キー入力を待ち、入力ある無しで分岐してまた戻ってくるものを書いています。 その部分は省いています。 FORK: print "fork開始\n"; if ($pid = fork) { print "親開始\n"; my $count = 0; while (1) { sleep (1); print + $count ++; last if $count > 5; } print "親終了\n"; } elsif (defined $pid) { print "子開始\n"; while (<STDIN>) { print "入力確認\n"; last if $_; } print "子終了\n"; } print "fork終了\n"; goto FORK; forkを抜けて頭に戻ると「fork開始」で止まってしまいます。 子プロセスを途中で止める方法とか、killも調べたけどよくわからなくて。 よければヒントお願いします。
>>41 レス遅れてすみません。
perl5.6以前でも動くモジュールにしたいため、型グロブなんぞ使ってます。
プロバイダによっては古いパール使ってるところもあるような気がするので…
>>43 あれ、5.005あたりから使えなかったっけ?
open my $fh, $filename
構文って。
FileHandie モジュール必須だっけ?
>>44 5.8のドキュメントには、5.6以前の場合は〜の記述がありました。
微妙なんですよね。。使ってるとこありそうで。
46 :
42 :2006/01/30(月) 23:07:04
使い方間違えているのでしょうか?
48 :
デフォルトの名無しさん :2006/01/30(月) 23:21:10
多次元配列をperl5で使用しようと考えています。 @test[a][b]という多次元配列に値を追加代入したいのですが どのように行えばよいか悩んでおります。 以下のソースは動きませんが、このような動作をするにはどうしたら 良いでしょうか? while(10 > $count){ push(@DATA_A1[$count][A1], $count); $count++; }
>>46 うん。
何を実現したいかをもうちょっと具体的に。
push($DATA_A1[$count]->[A1], $count); これはどうよ
>>48 perlでは、多次元配列は、「配列リファレンスの配列」で実現できる。
my @marray = ();
my $count = 0;
while($count < 10){
push @{$marray[$count]}, $count; # $marray[$count] を配列リファレンスとみなして、新規データをプッシュ
$marray[$count][0] = 0xffff; # 要素へ直接アクセスするならこう。
$count++;
}
>>39 sub hoge { local *x; @x = @_; return *x;}
*c = hoge(1);
$d = hoge(2);
$e = hoge(3);
*f = hoge(4);
print "\\\*c = ",\*c," , \*c = ",*c," [",@c,"]\n";
print "\\\$d = ",\$d," , \$d = ",$d," [",@$d,"]\n";
print "\\\$e = ",\$e," , \$e = ",$e," [",@$e,"]\n";
print "\\\*f = ",\*f," , \*f = ",*f," [",@f,"]\n";
>>39-40 ↓なんかでどう?同じファイルを同時オープンしたとき駄目だけど。これならperl4.0でも動くよ
sub myopen{
open($_[0], ">".$_[0]);
return $_[0];
}
my $fileA = myopen("a.txt");
my $fileB = myopen("b.txt");
print $fileA "aaaaaaaaa";
print $fileB "bbbbbbbbb";
close($fileA);
close($fileB);
それか、randとかで常に一意なファイルハンドル名を作り続けるか
>>48 @test[a][b]が間違い。
$test[a][b]は、
多次元配列@testのa番目の要素である$test[a]という配列のb番目の要素
であるってこと分かってる?
配列のキーは数字であって文字でないことも分かってる?
キーが文字の場合は、ハッシュにしなきゃだめだって事も。
55 :
30 :2006/01/31(火) 01:08:29
56 :
デフォルトの名無しさん :2006/01/31(火) 01:19:47
別に止めないけど、正直そういう組み立て方は Perlには向いてないと思う
57 :
デフォルトの名無しさん :2006/01/31(火) 03:25:58
pipe は昔ながらの UNIX では普通は fork した子プロセスとの 通信で使っていた。シェルで | 記号使った時はシェルが pipe() で繋げてくれる。 今ではマルチスレッドでも使えるが、とにかく pipe は 子プロセスとか別スレッドとかとやりとりをしたい場合に 使うものだ。同一プロセスでやりたいなら pipe は使うな。 普通に変数使ってメモリに保持するか、あるいはそれで どうしてもやり辛いというのであればファイルを使っておけ。 File::Temp モジュールのやつで作業用ファイル作るとかな。
58 :
39 :2006/01/31(火) 12:51:29
>>52-53 ありがとうございます。遅レスすみません。
今お客さんのところで朝早くから夜遅くまで納品検証で動けないため(始めの質問はトイレに逃亡中に書きました)、
週末辺りに参考にさせて頂きますです。
59 :
42 :2006/01/31(火) 13:09:15
>>57 ありがとうございます。
いろいろ調べてみたけど、作業用ファイルに行き着きました。
でも、別のプロンプトから書き込まないとだめってことですよね。
あまりスマートじゃないので、悩んでいます・・・
子プロセスの終了を待つ関数はあるのに、
強制で中断させる関数はないのでしょうか。
killもいまいち使い道がわからないorz
>>42 子プロセス側でexitしてないけど・・・?
というか、alarmではだめなの?forkするほどのことじゃないような気が。
ちなみにkillの書式は
kill シグナル番号, プロセスID
なので、親プロセス側で kill 9, $pid とすればok。
いきなり9はやめとけって。15にしとけよ。 OSによっては全然意味違うかも知れないけど。
というか、selectではだめなの?
63 :
42 :2006/01/31(火) 16:29:31
レスありがとうございます。
ちょっとこんがらがってます。
>>60 のやりかたでも、gotoで戻るとやはり止まってしまいます。
まず、シグナルを送る、とは実際何をするのか?
alarm、selectでどうやるのか?
もうちょっと脳みそコネコネしてきます。
これは Fedora Core 4 固有の問題かも知れないが。perl 5.8.6 で use encoding 'euc-jp', STDIN => 'Shift_JIS'; がうまく行かない。 以下のようになる。なんで? $ echo $LANG ja_JP.eucJP $ echo 'シフトJIS' | nkf -s >sj.txt $ perl p sj.txt "\x{0083}" does not map to euc-jp at p line 7, <> line 1. "\x{0083}" does not map to euc-jp at p line 7, <> line 1. "\x{0083}" does not map to euc-jp at p line 7, <> line 1. \x{0083}V\x{0083}t\x{0083}gJIS $ od -Ax -tx1 sj.txt 000000 83 56 83 74 83 67 4a 49 53 0a 00000a $ cat p #!/usr/bin/perl -w use strict; use encoding 'euc-jp', STDIN => 'Shift_JIS'; while (<>) { print; } $
>>65 その <> は <STDIN> ではなく <ARGV> だ。
66 :
42 :2006/01/31(火) 17:52:39
親と子を逆にしたら思い通りに動きました。 if ($pid = fork) { print "親開始\n"; while (<STDIN>) { last if $_; } kill 9, $pid; &post; print "親終了\n"; } elsif (defined $pid) { print "子開始\n"; &reload; print "子終了\n"; } 色々ありがとうございました。 もうちょっと精進しますです。
ちょっと気になるんだけど elsif (defined $pid) って用を為してる?
69 :
64 :2006/01/31(火) 18:45:34
>>65 おおお。ありがとう! <STDIN>で読んだらできた。
なるほど。そういうことか。
70 :
42 :2006/01/31(火) 18:56:11
>>67 elsif (defined $pid) { }が子プロセスになるんじゃないんですか?
動いてるとはいえ、理解してないのは気持ち悪いですが・・・。
if ($pid = fork) で $pid が定義されてるから (defined $pid) は必ず真になるよね? else で十分だと思う。
72 :
42 :2006/01/31(火) 19:28:28
>>71 ありがとうございます。
上のだと、fork失敗の次のelse { print 'fork失敗'; }がいりますね。
すっかり忘れてました。
>>71 fork は子には 0、親には PID を返すが、fork 失敗の時は undef を返す。
なので defined による判別は必要だ。
Spreadsheet::ParseExcelとencodingは共存できないんでしょうか。 use encoding 'ENCNAME';した上でExcelファイルをparseさせると、 CPU食いっぱなしで帰ってこないです。 とりあえず、encoding指定なしでEncode::from_toで逃げましたが……。
だからその手の用途に encoding を使うなと何度言(ry
>>75 per mailing listにその話題を投げてみたら?
78 :
デフォルトの名無しさん :2006/02/01(水) 09:39:02
@array=("aaa","bbb","ccc","bbb","aaa","bbb","aaa");という配列がある場合 この配列で重複している要素だけを取り出すにはどうしたらいいんでしょうか? aaaが3個、bbbが3個、cccが1個だから 答えはaaaとbbbになればいいわけです
未検証書き殴りだが my @array=("aaa","bbb","ccc","bbb","aaa","bbb","aaa"); my %hash; my @answer; $hash{$_}++ for( @array ); for (sort keys %hash){push @answer,$_ if $hash{$_} > 1} print join "\n", @answer; たぶんこれで。。
>>78 ハッシュで個数数えて2個以上あるのを抽出。
$count{$_}++ for @array;
@dup = grep { $count{$_} >= 2 } keys %count;
出揃ったよころで後出し。。。 my @array=("aaa","bbb","ccc","bbb","aaa","bbb","aaa"); my $result, %tmp; for(@array) { push @result,$_ if $tmp{$_}++ > 1 };
>>78 my @array = qw(aaa bbb ccc bbb aaa bbb aaa);
my %saw;
my @result = sort grep ++$saw{$_} == 2, @array;
result もハッシュにした方が結果に重複がなくなっていいんじゃないか?
コンパクトだが良い命題だったなw それぞれ『やり方は何通りもある』が信条のPerlらしい解答たちだ。
$a = "1..4"; print foreach $a を実行したら 1234 と結果が出たら嬉しいんですけど そのようにすることはできないのでしょうか?
>>85 > コンパクトだが良い命題だったなw
こんな低レベルの命題でスレを埋めるのは勘弁な。
88 :
デフォルトの名無しさん :2006/02/01(水) 15:59:47
>>86 foreachを再定義したいってこと?
なぜそんな事したいの?
89 :
86 :2006/02/01(水) 16:11:30
>>88 $a = "10..60,100..500"
というデータがあって
例えば32がその中にあるかどうか?
を調べるたいんです。
まあ、できないなら普通にやりますが
できたらかっこいいかなと^^;
>>86 もしかすると、こうゆうことがしたいの?
foreachはいらんけど。
my $test = join '', 1..4;
print foreach $test;
それから、sortする場合以外で$a, $bを使うのは感心せんな。
eval "print foreach $a";
print foreach eval $array
print foreach eval "$a"; こうでいいのか
94 :
86 :2006/02/01(水) 16:25:01
>>91 >>92 >>93 3人さんのを参考にして
print foreach eval $a;
が一番好みの書き方なんでこうしました。
ありがとうございます!
>>90 実際は$aではありません。
前も質問用に簡略化したらつっこまれましたーー;
96 :
デフォルトの名無しさん :2006/02/01(水) 17:02:50
>>89 > $a = "10..60,100..500"
> というデータがあって
> 例えば32がその中にあるかどうか?
> を調べるたいんです。
> まあ、できないなら普通にやりますが
> できたらかっこいいかなと^^;
Set::IntSpan
Array::IntSpan
あたり。
>>89 そうだなあ。無駄が多そうだけどこれでもできるだろうな。
%hash = map {$_=>1} (eval $a);
if ($hash{32}) {
print "32 はある。\n";
}
98 :
デフォルトの名無しさん :2006/02/02(木) 00:36:38
このコードがなぜ機能するのか分かりません。 my $F = "xxx.dat"; open($F, $F) or die; my @data = <$F>; print @data; print $F,"\n"; 明らかにスカラー値は文字列とファイルハンドルの2値を同時に持つことが 可能らしいのですが、perlのデータ型について色々な解説を読んだのですが 「そういうことが出来ますよ」と明言した解説が見つかりません。
99 :
デフォルトの名無しさん :2006/02/02(木) 00:40:42
ファイルハンドルなどというものは幻想
>>98 $fh = "hoge";
open $fh, $fh;
$str = "hoge";
print <$str>;
# 又は print <hoge>;
とやってみるとどういうことかわかると思う。
ファイルハンドルなどというものは男の妄想
> スカラー値は文字列とファイルハンドルの2値を同時に持つことが可能
>>99 が言う通り、その解釈はおかしいんだけど…。
>>100 だけじゃなくて、%{main::} を Data::Dumper で見ると良いかも。
>>98 > 「そういうことが出来ますよ」と明言した解説が見つかりません。
open関数のマニュアルエントリに書いてあるやん。
> スカラー値は文字列とファイルハンドルの2値を同時に持つことが可能 俺もあんまりファイルハンドルはよく知らんのだけど、 経験的に「一意なハンドル名」をPerlに登録する感じなんじゃね? その「一意なハンドル名」を元にPerlがどのハンドルなのかを特定して、 入出力の処理をすると。
>>98 つ らくだ本 (Perl4について書かれた初版にも載っている)
つーか、use strict 使えよ。
間接ファイルハンドルはPerl4時代からの機能で、以下
>>53 openでは(シンボリックリファレンス扱いなので) use strict 下だとエラーになる。
念の為、open my $fh,$filename; とした場合の $fh は無名グロブへのリファレンスな。
sub hoge() { haehae, kakaka; } サブルーチン書くときに用もないのに()付けちゃってるのはDQNですか? プロトタイプをちゃんとしようとしてるうちに変な癖が付いちゃったみたいで… orz
どうでもいいけどcloseしないの?
>>109 > 無駄な処理をする事になる。
今時、処理系のほんの僅かのオーバーヘッドと
人間にとっての理解性と、どっちが大事なんだ?w
ま、どうしても気になるなら そういう選択肢もあるって程度? そこより先に根本的なロジックの見直し。
112 :
98 :2006/02/02(木) 11:30:51
>>100 なるほど、分かりやすい例をありがとうございます。妄想を解いていただいて感謝。
>>106 本当に引数を取らないのでなければ、サブルーチン宣言に空の括弧を付けないでください。
O・NE・GA・I♪
115 :
デフォルトの名無しさん :2006/02/02(木) 13:31:32
shift JIS のスクリプトを扱う必要があるのですがたとえば use encoding 'Shift_JIS'; $str1 = "鼻毛"; $str2 = "三日"; print "俺の$str1は$str2以内に伸びてくる。\n". "したがって二日以内に切ることが望ましい\n"; のようにすると一行目が「俺の。」と表示されてしまいます。これを print "俺の$str1\は$str2\以内に伸びてくる。\n". のようにして、変数名の後に \ を入れると正しく表示されるのですが、 こういう処理方法は正しいのでしょうか? それとも最初のやり方でうまくいかないのはPerl側の不具合とみるべきでしょうか
引数とるサブルーチンに空のプロトタイプつけたらエラーで呼べないと 思うのだが... &つければ別だが。
encodingプラグマは廃止した方がよさそう
>>115 バグだろうな。
取りあえず、「俺の${str1}は${str2}以内に」のように { } を付ければ回避できる。
\ を付けるよりはスマートだろ?
>>113 バグというより、そもそも
>>115 のようなコードがおかしい。
もし $str1 の後に続く文字が英数字だったらどうするの?
120 :
119 :2006/02/02(木) 13:55:13
アンカーミスった、>118 だ。
122 :
デフォルトの名無しさん :2006/02/02(木) 14:11:31
O'ReillyのSpaidering Hackに
% perl -MLWP::Simple -e "getprint '
http://cpan.org/RECENT '" | grep "/by-
module/Acme" | mail -s "New Acme modules! Joy!" $USER
ていう例文が出るのですが、これをDosプロンプトで入力するとエラーがでます。
$USERのところにメールアドレスを入れるのかと思ってやってみたのですが
同様の結果でした。
何が間違ってるのでしょうか?
訂正 cpanのアドレスはそのままでは404なので、適宜修正して入力してます。
'grep' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とか 'mail' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 とかいうエラーだったら潰すぞ?
>>122 > ていう例文が出るのですが、これをDosプロンプトで入力するとエラーがでます。
で、そのエラーを隠蔽するのは嫌がらせか?
すいません。コマンドまたはファイル名が違います。が出ます。
了解。 webprog池
128 :
122 :2006/02/02(木) 14:39:35
% perl -MLWP::Simple -e "getprint '
http://cpan.org/RECENT.html '" | grep "/by-
module/Acme"
までのコマンドなら正常に実行できるので
| mail -s "New Acme modules! Joy!" $USER
でこけてるんだと思うのですが。
そもそも $USERって何でしょうか?検索してもuserばっかりヒットして良く分からない。
| mail -s "New Acme modules! Joy!" $USER
って"New Acme modules! Joy!"の題名で$USERのアドレスにメールを送るって命令なんですよね?
メールアドレスの指定もしてないのに自分宛に送れたらスゴイ便利だけど、
$USERには自動的に自分宛のアドレスが格納されてるわけないから、
ここにアドレス自分で入れる必要があると思うんですがやり方がよくわかりません。
mail は UNIX のコマンド。 $USER は UNIX なら自分のアカウント名がセットされる。 なので、 UNIX なら自分宛にメールが届くが、 Windows なんだから諦めれ。
130 :
122 :2006/02/02(木) 14:46:06
>>129 そうなんですか。。どうもありがとうございました。
仮にmailコマンドが実装されてたとしても $USER → %USERNAME% だな
>>131 UNIX じゃないので %USERNAME% がメールアドレスに対応したものとは限らないし、
あまり変なこと教えるのはどうかと。
なんでそんな突っかかってくるんだよ^^;
134 :
デフォルトの名無しさん :2006/02/02(木) 15:00:25
>>133 すまん、心配性なもので、他所に変なメール出しちゃったらとかいろいろ気になってしまって。
>>121 お前、微笑ましいな。
言いたい事はわかるが、完全に勘違いしてるぞ。
Filter => 1にしてないのに識別子に英数字以外が使えてるのが おかしいという理解でいいでしょうか。でもqq()とqr()の中はdecode されるとあるので、ちょっと微妙ですね。どっちにしろわかりにくい からドキュメントに問題あると言ってもいいとは思う。
でもこの時期忙しそうだしなあ>the (J|En)code Maintainer
>>139 イヤイヤ、ドキュメントは彼が書くんだから向こうに投げるのは価値ありだよ。
まあ、彼はスルーの名人だから反応無しかもしれんがw
Encodeって、En code ってことだったのかー!ひとつの単語かとおもてたー!
確定申告以外は忙しくないんでは? blog見てるとそんな気がする。
とりあえず投げれば? 忙しくて放置食らったら、その後考えればよい。
これは良い英語の時間ですね
>>144 のツッコミワロスw
147 :
デフォルトの名無しさん :2006/02/03(金) 14:53:06
リャマ本4版の日本語版っていつ出版されるんだろ?
148 :
144 :2006/02/03(金) 15:43:23
>>146 どこが笑いどころなのかわからないのですが・・・
ひとつの単語なのは間違ってないですよね?
win2kでActivePerl v5.8.7を入れています。 コマンドプロントでtest.plが置いてあるディレクトリまで移動して、 perl test.plと打つと問題なく動くのですが、 perl test.pl pause と、同一ディレクトリにバッチファイルを作り、起動させると、 'perl' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出てしまいます。 他のディレクトリでも試してみたところ、C:\Documents and Settings\Administrator\デスクトップ でのみ正常に動きました。 バッチファイルでperlのパスを絶対パスでC:\usr\local\bin\perlと指定すれば エラーは出なくなったのですが、何故ディレクトリの位置によって コマンドを認識したりしなかったりするのでしょうか?
150 :
デフォルトの名無しさん :2006/02/03(金) 16:26:30
use open OUT => ':encoding(euc-jp)'; use IO::File; となっているプログラムで、 my $fh = new IO::File('test.txt', 'w'); $fh->print(...); という感じで utf8 フラグの立った文字列を書こうとすると Wide character を書いたという警告が出て、結果として utf8 が書かれるのですが、IO::File に対しては use open は効かないということでしょうか? (しょうがないから binmode $fh, ':encoding(euc-jp)'; でやることにしま したが)。
もう馬鹿は encoding 使うなよ。 Encode.pm 書いた人間がお勧めしないって言ってんだから、 何も知らん馬鹿が使うな。
153 :
150 :2006/02/03(金) 17:57:09
なるほど。そういうことでしたか。
これはできるんだけど open(F, '<&DATA') or die; while (<F>){print} __DATA__ abc def これはできません。どうやったら DATA をリダイレクトできるんでしょうか? use IO::File; my $fh = new IO::File('<&DATA'); die "$!\n" unless ($fh); while (<$fh>){print} __DATA__ abc def
>>154 何故そんなに IO::* を使いたがるんだ?
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#Scalar_value_constructors > __END__ および __DATA__ というトークンは、実際のファイルの終端より
> 前にある論理的なスクリプトの終端を示すために使うことができます。
> これらの後にあるテキストは無視されますが、ファイルハンドル DATA を
> 通して読み出すことができます。__END__ に対しては main::DATA 、
> __DATA__ に対しては PACKNAME::DATA (ここで PACKNAME はカレント
> のパッケージ名です) を使います。
IO::File::new() の中で IO::File::open() が呼ばれ、その中で
open($fh, '<&DATA') されるから、君の渡した '<&DATA' は
*IO::File::DATA をコピーしている。
#!/usr/local/bin/perl -w
use strict;
my $fh = \*DATA;
print <$fh>;
__DATA__
blah, blah, blah...
日記で2/3と時間表示させました。 これを同じ日にもう一つ記事を書く時に2/3 -1 2/3 -2って感じにしたいんですがどうすれば・・・。
157 :
154 :2006/02/03(金) 20:51:23
>>155 これでできました。ありがとうございます。
使いたい理由は open する個所だけ条件分岐してファイルまたは DATA を
読みたかったからです。(まあ IO::File じゃなくてもいいんですが…)
#!/usr/bin/perl -w
use strict;
use IO::File;
my $fh = new IO::File('<&main::DATA');
die "$!\n" unless ($fh);
while (<$fh>) {
print;
}
$fh->close();
__DATA__
abc
def
>>149 それはPerlではなくてDOSやUNIXの基礎知識だから
↓の単語で調べてみな
path
(ちなみに「パス」と読む。「パスを通す」も合わせてググってみて)
無い文字が変換できるw 弾さん、スンバラシイーwww use strict; use Encode qw(from_to); my $str = "\e\$B-5\e(B"; from_to($str,'iso-2022-jis','cp932'); print $str,"\n";
>>161 俺は 'iso-2022-jis' なんて指定を通しちゃうザル加減の方が
弾の人らしく思うけどな。Encode::Aias::init_aliases() のこれ。
define_alias( qr/\bjis$/i => '"7bit-jis"' );
define_alias( qr/\beuc.*jp$/i => '"euc-jp"' );
define_alias( qr/\bjp.*euc$/i => '"euc-jp"' );
define_alias( qr/\bujis$/i => '"euc-jp"' );
define_alias( qr/\bshift.*jis$/i => '"shiftjis"' );
define_alias( qr/\bsjis$/i => '"shiftjis"' );
'not jis' でも通るし 's-jis' なんて書いた日には bug fix に悩みそうだ。
mod_perlで全てのリクエストから共有可能な変数を作ることは出来ないでしょうか。 通常のやり方ですと同プロセス間でしか共有出来ないのでMaxSpareServersを1等に して常に1個のプロセスを使いまわさないと実現できません。 fastCGIの場合、出来ると聞いたことがあります。 2chはCで静的メモリを確保しperl/CGIで静的メモリをreadして記事を表示している と聞いたことがあるのでperlでも静的メモリread(writeも?)をサポートしているのかと 思った次第です。
164 :
163 :2006/02/04(土) 01:02:29
自己レスです。 shmop関数関連ですね。 もうちょっとググって情報集めしてみます。
165 :
デフォルトの名無しさん :2006/02/04(土) 01:16:00
168 :
141 :2006/02/04(土) 02:48:56
>>144-146 すんません。早とちりレスしました。en=Englishの事かーと思ってアホな感動してた自分にテラワロス
ところで、関数宣言(?)について質問したいです。
クロージャなどを受け取って処理したい関数をつくりたいとして、
sub try{
〜処理〜;
&{$_[0]};
}
などと宣言して、使うほうでは、sub{}を使って、
try sub{
print "aho";
}
などとなりますが、関数宣言の部分で、sub try(&;$){ } のように書くと
呼び出しで、subを省略して↓のように関数呼び出しできるようなのですが、
try {
print "aho";
}
これはなんなのでしょう?今まで関数宣言の括弧は無意味なのかと思ってましたが、
なにやら意味があるみたいで興味津々です。
なにか文献があると助かるのですが、そういったものとかないでしょうか。
169 :
141 :2006/02/04(土) 02:50:56
と思ったら、
>>109 に書いてありまくりですよこれが。
なんかもう新しい言語が作れますね。Perlは。
クラスのサブルーチンにプロトタイプ宣言しても無視されてるみたいなんですが できないんでしょうか? Perl v5.8.7
>>160 以前、別のフォルダにインスコした時のパスが残っていたようで、重複登録されてました。
重複部分を削ったら無事、動くようになりましたthx。
173 :
デフォルトの名無しさん :2006/02/04(土) 09:17:30
あるメソッド呼び出しが実際にどのサブルーチンに対応 するかは実行時まで決まらないので、クラスのメソッドに 対するプロトタイプ宣言は効果がありません。 型保証が欲しいならC++やJavaなどの静的型付けの言語を 使いましょう。
174 :
デフォルトの名無しさん :2006/02/04(土) 10:47:14
まあそうなんだけど、Perlでは全然できないんだっけ? 何かでできたような気がするんだが。 まあ、変数関係は use strict; だ。 あと使ってない変数があると警告を出すとか、何かあったよね? 忘れたけど。
perldoc コマンドを実行したときの結果を perldoc.jp のものに置き換えるにはどうしたらいいでしょうか?
177 :
デフォルトの名無しさん :2006/02/04(土) 12:14:56
そんなことしてどうするの? 手元にインストールされてるのと違うバージョンの マニュアル見ても意味無いよ
178 :
39 :2006/02/04(土) 16:17:21
超遅レスですが 基本のつくりを↓のような感じにして、意図どおりの動きをさせることができました。 ありがとうございました。 -------------------- use strict; package p_test; sub open { my ($id, $file) = @_; local *FILE = $id; open(FILE, "+>>$file"); } sub close { my ($id) = @_; local *FILE = $id; close(FILE); } sub write { my ($id, $tmp) = @_; local *FILE = $id; print FILE $tmp; } sub read { my ($id) = @_; local *FILE = $id; seek(FILE, 0, 0); @tmp = <FILE>; } -------------------- &p_test::open("LOGINIDLIST", $globalpath."loginlist.dat");
キモ…
180 :
デフォルトの名無しさん :2006/02/04(土) 18:04:22
ディレクトリ毎の使用量をPerlで取得したいのですがそういう ライブラリありますでしょうか? du -sの結果みたいなやつです。`du -s`するしかないでしょうか? 何卒宜しくお願い申し上げます。
WinXPでActivePerl Build 5.8.7です。 PerlでSCSIデバイスの情報を知りたくてDLL呼び出しを書いたのですが、 my $SendCmd = new Win32::API('wnaspi32.dll', 'SendASPI32Command', 'P', 'N'); my $sBuff = "\x00" x 58; my $nHA = $SendCmd->Call($sBuff); としたら異常終了のダイアログが出てきます。 my $SendCmd = new Win32::API('wnaspi32.dll', 'SendASPI32Command', 'V', 'N'); としたら上記ダイアログは出てこずに終了するのですが、どうも引数が渡されていないっぽいです。 こういう場合DLL呼び出しができないと諦めるしかないんでしょうか?
>>183 まず、Cから呼び出して正常に動作するかどうかが問題。
Perl の話はその後でしょう。
>>184 ありがとうございます。
Cからの呼び出しはできます。
EXEをコールし、ファイルに結果を吐かせ、
それをPerlで読み込むということはできています。
回避策というか、これで一応はやろうと思ってることは達成できてるんですが。
でもあまりスマートでは無いのでPerlで直接DLLをコールしたいんですね。
じゃあいいじゃん。 プログラミングは手段であって、目的じゃないぞ。
>>183 諦めるのが手軽だけど、原因を特定できれば他の方法もとれるよ。
この場合は、WINAPI , PASCAL , C形式(STDCALL) の違いが原因なので、
・ラッパーDLLを使う
・Win32::APIのメンテナに頼み込む
あたりも選択肢に入る。
>>183 おもしろそうな話なんで、もうちょっといろいろやってみてほしい。
>186-189 ありがとうございます。 やっぱり呼び出し規約の違いですかね。 もう少し粘ってみます。
191 :
180 :2006/02/05(日) 10:48:11
>>181 誠にありがとうございました。遅くなりましてすみません。感謝です。
192 :
デフォルトの名無しさん :2006/02/05(日) 11:49:32
バイナリファイルをプレフィックス(0x)を付けた16進ヘキサのテキストに変換する方法をお教え下さい。 或いは、bin2hex.exeを使用するとバイナリから以下のように変換できますので、このファイルを読んでPerlで0xとカンマを付加する方法をお教え下さい。 52 49 46 46 F8 FD 00 00 57 41 56 45 66 6D 74 20 10 00 00 00 01 00 01 00 A0 8C 00 00 40 19 01 00 これを最終的に 0x52,0x49,0x46,0x46,0xF8,0xFD,0x00,0x00,0x57,0x41,0x56,0x45,0x66,0x6D,0x74,0x20, 0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0xA0,0x8C,0x00,0x00,0x40,0x19,0x01,0x00 のように0xを付けて,で区切ったヘッダファイルにしたいのです。 ファイルサイズは1Mbyte程度です。 Perl v5.8.7 build 815 WinXP です。宜しくお願い致します。
>>192 1) 1行読み込む
2) スペースでsplitして配列に格納
3) 各要素を、頭に"0x"、お尻に"," を付けて出力
4) 次の行を読み込む
>>192 sub hex2hextext($) {
my $result; my @line = split("\n", $_[0]);
for (0 .. $#line) { $result .= '0x' . join(',0x', split(" ", $line[$_])) . ($#line==$_?'':",\n"); }
return $result;
}
>>192 bin2hex.exeなんかわざわざ使わなくてもふつうに16文字ずつ読みこんで
unpackすりゃよくね?
use strict;
open R,"test.dat";
open W,">hex.dat";
binmode(R); #winだからな
while(not eof(R)){
read(R,my $tmp,16);
my @line = ();
for (split //,$tmp){
push @line,'0x'.unpack("H2",$_);
}
print W join(',',@line),"\n";
}
196 :
192 :2006/02/05(日) 13:42:13
>>193 さま、
>>194 さま、
>>195 さま
早速の回答ありがとうございます。m(__)m
bin2hex使わなくても出来るのですね!すばらしい!!感謝です。
197 :
デフォルトの名無しさん :2006/02/06(月) 01:35:14
すいません、ちょっと質問です。 WindowsXP に ActivePerl 5.8.7 をインストールしたのち GD をインストールできません。 準備は以下の通り Cコンパイラとして、VisualC Toolkit をインストール NMAKE.EXE を Microsoft からダウンロードしてパスの通ったファイルに入れる。 CYGWIN をインストール。 その他、tar.exe, gzip.exe を入れておき、Perlに事前に設定。 手順は以下の通り 1) Perl -MCPAN -e shell をコマンドプロンプトから入力 2) install GD を入力すると、2.30 のモジュールをダウンロードしてくる(これは正常) ただし、途中で ' gdlib-config' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。 (なんだか怪しい雰囲気) 3) Where is libgd installed? に gdwin32 を展開後のパスを入力。 → コンパイルエラーでnmake が停止。 gd-2.0.33 の展開後のパスを入力しても同様に コンパイルエラーで nmake が停止。 他のモジュール IO, DBI, HTML はインストールできたのに、 GD はなかなか曲者です。
なるほど、曲者ですね。
最後の一文で爆笑してしまったw
201 :
197 :2006/02/06(月) 01:50:01
>>199 質問を質問で返すなあーっ!!
疑問文には疑問文で答えろと学校で教えているのか!?
わたしが聞いているんだッ!
質問になってないから。
>>201 > 質問を質問で返すなあーっ!!
嘘つけ。質問なんかしてないくせに。
分かったからwebprog行けよ
ほうほう曲者ですね
208 :
Real197 :2006/02/06(月) 09:34:01
ニセモノが現れたようですが、
具体的には、GDのインストール方法が知りたいということです。
>>204 板違いの質問でしたか?
おまいら質問者をあんまり虐めるなよ(・∀・)
>>208 ActivePerlなら自前でコンパイルするまでもなく
ppmを使ってコンパイル済みのものを貰ってきた方が楽
ppm install GD
>>209 それじゃ回答者をいじめてやろう
1.33を入れてどうすんじゃ。質問者は2.3が欲しいんだけど
212 :
209 :2006/02/06(月) 12:05:55
>>210 スマソ先日Catalystを入れるのにTheoryx5を追加してあったから
ActiveStateに無いの気づかなかった。
次からはどこのリポジトリに入ってるのかちゃんと調べるよ('A` ;)
>>211 フォローthx
>>211 それだけじゃ駄目だよん、インストールの前に rep up theory5 としなきゃ。
ppmは最新のモジュールを探してインストールしてくれない、まだ阿呆。
http://ppm.activestate.com/BuildStatus/5.8-G.html を見ると
ActiveStateにはGDはないみたいだからそれでOKかもね。
下のようなinstall.txtを用意して ppm --file install.txtとすると
perlをver upしたとき便利だ四。
--- install.txt
## repository
rep add theoryx5
http://theoryx5.uwinnipeg.ca/ppms/ rep add BdP
http://www.bribes.org/perl/ppm/ ##install
install GD
## UPGRADE in theorx5
rep off ActiveState Package Repository
rep off BdP
upgrade -install -precious *
rep del theoryx5
## UPGRADE in BdP
rep on BdP
upgrade -install -precious *
rep del BdP
rep on ActiveState Package Repository
---$
それだけじゃ駄目だよん、まだ阿呆。
ていうかググれば大量の情報が・・
216 :
Real197 ◆xJZzeRrr.U :2006/02/06(月) 22:05:58
>>209-213 さん
ありがとうございます、
無事にGD と GD::Graph, GD::Text がインストールできました。
cgi-bin にパイチャートのスクリプトを措いて
<image src="hogehoge.cgi"> すると、もう・・・(´Д`;)ハアハア
で、/x11 のフォントを参照しているスクリプトが動かなかったけど、
これは Windows 上では諦めた方がいいのでしょうか?
それとも、まだ何かいい手があるのでしょうか?
GD::Text->font_path( "/usr/lib/X11/fonts/truetype/" );
$graph->set_title_font( "luximr", 16 );
$graph->set_legend_font( "luximr", 10 );
$graph->set_x_axis_font( "luximr", 9 );
$graph->set_x_label_font( "luximr", 11 );
$graph->set_y_axis_font( "luximr", 9 );
$graph->set_y_label_font( "luximr", 11 );
>>215 Windows の場合もフォントパスを指定してやればいいんじゃないか?
手元に環境がないから試せないが、\Windows\Fonts とかなかったっけ。
218 :
Real197 ◆xJZzeRrr.U :2006/02/07(火) 21:53:21
>>217 その通りですた。
GD::Text->font_path( "C:\\WINNT\\Fonts" );
$graph->set_title_font( "Courier New", 16 );
$graph->set_legend_font( "Courier New", 10 );
$graph->set_x_axis_font( "Courier New", 9 );
$graph->set_x_label_font( "Courier New", 11 );
$graph->set_y_axis_font( "Courier New", 9 );
$graph->set_y_label_font( "Courier New", 11 );
とかで、無事フォントが表示されますた。
日本語は utf8 に変換して
$graph->set_title_font( "msgothic.ttc", 16 );
でOKですた。
219 :
デフォルトの名無しさん :2006/02/07(火) 22:54:54
会社で仕事を楽にするためのツールをperlで作成しました。 思いの外いいできだったので他の人にも使ってもらおうと思い、配布用に Windows 用のexeファイルに出来ないかと思いました。 会社の人にActiveParlをインストールさせる、というのだと多分めんどくさがって使ってくれません。 調べたところPARというのがある事がわかり、ppmを使ったインストールの解説ページも見つけ 自宅のマシンで試したところ無事exeファイルが作成出来ました。 で、会社のマシンにもインストールしようとしたのですが、どうやら会社では ファイアーウォールか何かでppmが弾かれるようでインストールできません。 ppmを使わない場合は、どうやらnmakeとかgzipを用意しないといけないらしいとはわかったのですが そこからどうすればいいのかが分かりません。 ネットで説明してるページも見つけたんですが、すでに分かってる人向けみたいな感じで 結局よく理解できませんでした。 ppmを使わずPARをインストールする方法を教えて頂けないでしょうか。
>>219 漏れの経験上、せっかくそういうツールを作っても、たとえexeでもみんなメンドくさがって
使ってくれないよ。入れるのすらメンドいんだよ。
(しかもそのexeって、コマンドラインアプリでしょ? そりゃみんな使わないよ……)
CGIにしてボタン押すだけのとこまで用意して、社内メールでURLを送りつけたら使ってくれた。
っつーわけで社内鯖でCGIにすることをオススメする(それなら自動的にGUIになるしね)
>>218 の意見も一理あるけど
>>219 ppmのリポジトリからアーカイブを拾ってきて、ローカルでインストールできる。
ttp://ppm.activestate.com/PPMPackages/zips/8xx-builds-only/Windows/ ここからPAR-0.90.zipと、依存している以下のパッケージもダウンロード。
PAR-Dist-0.07
Module-ScanDeps-0.54
Archive-Zip-1_11
で、これらのzipファイルの中身を展開して、
中に入っているppdファイルを依存関係の子からppmでinstall。
(又はリポジトリをローカルディレクトリになるよう設定してPARをinstallでもOK)
ppm install Module-ScanDeps.ppd
ppm install PAR-Dist.ppd
ppm install Archive-Zip.ppd
ppm install PAR.ppd
レスアンカー間違えた('A`) 218じゃなくて220だったスマソ
224 :
デフォルトの名無しさん :2006/02/08(水) 00:34:42
>>219 そんなもんなテキストのまま配れ。
で、使いたいやつだけ Perl インストールして使えと書いておけ。
参照で受け取ったリストのアイテム数を知りたいのですが sub aaa { my ($list) = @_; if (@$#list < 3) { ・・・↑ここどうやって書けばいいのでしょうか? } } my @list; push(@list, 'xxx'); &aaa(@list);
226 :
デフォルトの名無しさん :2006/02/08(水) 00:52:03
ケータイで撮った画像をケータイメールで自分のwebサーバーの imgフォルダーに送り、その画像を自動的に自分のHP上に 貼り付けるにはどうしたらよいか、知っている人教えてください。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
>>225 $#$list
後、それ参照になってないから
&aaa(\@list);
にするなり
sub aaa(\@) {...}
aaa(@list);
にするなり
>>226 ケータイメールと言うのが解らんが普通のE-MailならNet::POP3でも使ってメールを受け取って、
そのウェブサイトがリモートサーバにあるならNet::FTPあたりでアップロードするなり、
ローカルにあるなら直接書き換えるなりすれば良いんじゃね?
直接CGIと言うわけではないがWebProg板行った方が良いと思われ
229 :
デフォルトの名無しさん :2006/02/08(水) 04:44:27
230 :
225 :2006/02/08(水) 08:43:21
>>219 CGIで使えそうだったらCGI化して自分のマシンにapache入れて公開してみれ。
ブラウザからならなんとか使ってくれるだろ。CGI化が無理だったら
>>231
>>219 >で、会社のマシンにもインストールしようとしたのですが、どうやら会社では
>ファイアーウォールか何かでppmが弾かれるようでインストールできません。
なら、ファイアーウォールか何かを管理しているシステム管理者がいるんだろ?
システム管理者に相談して物事を進めてゆくのが、組織の基本というものだろう。
ちょこっとスクリプトを使ってもらうためにそこまでしなきゃならないなんて、 本当に Perl って使えないプログラムですね。
>>234 そうだな。
かまけているの時間ももったいないから、
Perlのことは忘れてほか行こうぜ。
236 :
219 :2006/02/08(水) 20:54:16
いろいろなアドバイスありがとうございました。
>>221 の方法で成功しました。
>>234-235 それをいったらjavaなんてどうするんだおい。100Mくらいするインストーラ実行だぞ。
RubyなんてLinux標準インストールじゃないかもしれな(略
やっぱVBScript最強
ウチは社内にMacintosh多いから不可>VBScript
Macintoshwwwwwwwwwwwww
batファイル最強説
>>240 そんなウンコ構文使うくらいならJScriptにするよ。
242 :
デフォルトの名無しさん :2006/02/09(木) 10:21:45
終わりから3文字を取り出すのに、 substr($strin, length($strin) - 3, 3) という風にlength関数を使わない方法ってありまする?
$strin =~ m/(...)$/; print $1
正規表現使うよりはsubstr+lengthの方は速いよね。やっぱこれしかないのね。
substr( $str, -3 ); これできなかったっけ?
substr( $str, -3, 3 ); ね
基本的なことで申し訳ないですが、質問です A.pl、B.pm、C.pm、D.plとあって、全て同じディレクトリにおいています。 @INCには、Aの先頭で、use libで絶対パスを入れています。 AはBを「use B」しています。BはCを継承(use C かつ @ISA)しています。 BとCは、Dを「require 'D.pl'」しています。 この状態で、Aを./A.plで起動し、Bの関数をコールします。 Bはそのコールされた関数から、D内部の関数をコールしますが、見つからないと怒られます しかし、Bが継承したCの関数をAからコール、または、B内部でCの関数をコールした場合 そのコールされたCの関数からは、D内部の関数がちゃんと見つかるようです これはなぜなのでしょうか? また、Bでの「require 'D.pl'」を「require './D.pl'」または 「require '/xxx/xxx/D.pl'」のように変更すると BからもDの関数がみえるようです。 これも疑問です。 そもそも問題は関数が見えないことだったので DをD.pmに変更し、BとCのrequireをuseに変えて D内部でExpoterすることで対処しています。 問題は解決していますが?、出来れば上記の疑問を 解消するためのヒントなりをいただければと思います。
>>248 すみません。説明が足りませんでした。
正確には、A・B・C・Dはちゃんとした名前が
ついています。
関係あるかどうかはわかりませんが
Cから継承しているメソッドの中に
Bを生成するためのnewも定義しています
内容は単純にblessをするのみです。
>>249 説明で書いたこととプログラムに書いてあることは食い違って
いることも多いので、現象が確認できる出来るだけコンパクトな
コードを書いて晒した方がいいと思われ。
よくわからんがnewを定義してるってことはpackageも使って
いるんだろうしその辺がどうなってるかわからないとなんとも
言えん。
251 :
デフォルトの名無しさん :2006/02/09(木) 12:46:24
>>245-246 それ素晴らしいです><
ところでその二つは意味的にどうちがうんでしょうか??
後から3バイト目から最後まで取り出す 後から3バイト目から3バイト取り出す
>>247 同じファイルを2回requireすると、2回目は無視される。理由はらくだ本参照。
日本語をsplitしたいのですが、普通にやるとsplitできません 文字化けというかバイトごとにきられます ご教授お願いします
言いたい事は分からんでもないが 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。
>>254 >>2-3 #!/usr/local/bin/perl -w
require 5.008001;
use strict;
my $str = "UTF-8の文字列";
utf8::decode($str); # UTF-8フラグを付ける
my @chr = split //, $str; # 文字単位で処理される
utf8::encode($_) for @chr; # UTF-8フラグを外す
print join '/', @chr;
__END__
$ perl -Mencoding=utf8 -e '$s="あいう";@d=split//,$s;print join("/",@d),"\n";' あ/い/う $
258 :
257 :2006/02/09(木) 15:04:57
>>257 は Linux (Fedora Core 4) の bash で LANG=ja_JP.UTF8 で Perl 5.8.6 の場合な。
他の環境では同じ 5.8 でもエンコーディングとかクォートのしかたとか変えないと駄目かも。
>>254 の問題はsplit だけではないだろう。
日本語の取り扱い全般について基礎を学ぶべきだろうな。
Perlの正規表現で foo, bar, zoo以外の半角英数という正規表現って 実現可能ですか?
>>260 君が何を言っているのか、サッパリ分からない。
>>260 こんな感じ?
/\A(?!foo|bar|zoo)[\w]+\z/
263 :
262 :2006/02/09(木) 20:15:21
ごめん、これじゃだめだった。
>>260 これは?↓
/(?=^(?:(?!foo).)*$)(?=^(?:(?!bar).)*$)(?=^(?:(?!zoo).)*$)/s
それなんのAA?
!~ でいいのではないかと
267 :
デフォルトの名無しさん :2006/02/09(木) 23:06:22
share属性を指定しないパッケージスコープの変数は、 スレッドで共有しないCopy on Writeなデータという認識であってる?
>>250 >>253 レスありがとうございます。
253さんのヒント(答え)でわかりました。
「同じファイルを2回requireすると、2回目は無視される」というのは
読んでいたのですが、私の理解が足らなかったようです。
私が247で書いた例でいくと
Cが最初にコンパイルされて、Dを取り込む
Bはその後にコンパイルされるが、Dは既に取り込んであるので
取り込まれない。その結果、CからはDがみえるが
Bからはみえないと。
Bでrequire './D.pl'に変えた場合にDがみえたのは
Cのrequire 'D.pl'の「D.pl」とBのrequire './D.pl'の「./D.pl」は
perl的には名前が違うから、同じファイルとは扱われず
Bのrequireでも、「D.pl」が取り込まれるからなんですね。
すっきりしました。
どうもありがとうございました。
telnet, ftp 等でリモートホストの操作をするのではなく、 ローカル内の作業で画面に表示された内容(ログ)に従って 自動的にコマンドを実行してくれる方法、ライブラリがありましたら、 お教え頂けないでしょうか 宜しくお願いします
>269です 例えば、gdb を動かしていて 最初の (gdb) という画面が表示されたら、 r a.txt というようにコマンドを入力してくれる、といったものです ご教授のほどよろしくお願いいたします
>>268 >Cが最初にコンパイルされて、Dを取り込む
>Bはその後にコンパイルされるが、Dは既に取り込んであるので
>取り込まれない。その結果、CからはDがみえるが
>Bからはみえないと。
ちょっと違うな。Dに独立した名前空間を与えていないから、
最初にrequire したときに、Cと同じ名前空間が
与えられる。だから、別の名前空間を持つBからは、
そのままでは読み出せない、つーこと。
>>271 なるほど。
そういうことなんですね。
ありがとうございます。
Win2000 Perl5.8.7
ソースをすべてUTF-8で保存して、use utf8 プラグマを付けているのですが、
use utf8;
my $dir = 2バイト文字入りのディレクトリ名を代入;
while (glob($dir\\*)) {
これだとマルチバイトのディレクトリ名を見つけてくれないのですが、
どうしたらよいのでしょうか?
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html#encode ここを読むとEncodeとは一緒に使うべきではないような気がしますし
いまだにJCodeしかないのでしょうか?
ディレクトリ名に2バイトを使うなってのは無しの方向でよろしくお願いします・・・
275 :
274 :2006/02/10(金) 12:01:15
Encode と encoding を混同していたみたいです。 解決しました。
ディレクトリ名に [ が含まれているとグロブが失敗するんですが どうしたら [ 付きでも成功できるでしょうか?(Win2000 Perl5.8.7) $dir = "c:\[test]"; if (-d $s) { print "exists \n"; # ここには来る while (glob("$s\\*")) { print "$_\n"; # ここにはこない } }
277 :
276 :2006/02/10(金) 13:41:03
$dir = "c:\[test]"; は$s = "c:\[test]"; の間違いです。
278 :
276 :2006/02/10(金) 13:43:05
また間違えた… $s = "c:\\[test]"; です。
File::Globとか?
[test] の部分が、文字リストとして解釈されるからじゃないか。 $dir =~ s/\[/\\[/; $dir =~ s/\]/\\]/; print join(', ', glob("$dir/*")) . "\n"; みたいにエスケープしてやれば大丈夫なんだけど、スマートな方法は 思い付かないな。glob_escape() とかあればいいんだが…。
$s = "c:\\[test\\]"; でもダメなの?
ああ、勘違い。
>>280 の言ってること分かってなかった。
$s = "c:\\\[test\]" でもダメみたい
"C:\\\\[test\\]" でしょ?
bsd_glob($dir, GLOB_QUOTE); これは?
286 :
276 :2006/02/10(金) 15:22:38
皆様ありがとうございました。 今回の処理ではディレクトリ名に必ず [ が入っているので 先にchdirするかopendirを使う事で回避する事にしようと思います。
287 :
276 :2006/02/10(金) 15:29:32
my $s = "e:\\\\[test\\]\\*"; while ($_ = bsd_glob($s, GLOB_QUOTE)) { print "$_\n" } なぜか延々と同じファイルが表示されます bsd_glob は DOS形式のパスだとうまくいかない?
File::DosGlobでメタキャラクタを禁止にしちゃうとか それなら"e:/[test]/*"でいけそうだけど。
>>287 lib/File/Glob.pm の191行目以降に目を通せ。
>>289 $ wc -l `locate /Glob.pm`
190 /usr/lib/perl/5.8.4/File/Glob.pm
…(゚Д゚;)?
>>276 ガラッと話は変わるが、File::Find じゃ駄目かね。
opendir() で構わないなら別にいいが。
今きてるよね? opendirの時代が・・
つFile::Find::Iterator
293 :
デフォルトの名無しさん :2006/02/10(金) 20:01:46
File::Slurpのread_dirサイコー!! @files = read_dir('/foo/bar') だぜ!!
@f = `ls`;
>>294 志村ー改行、改行
@f = map { chomp; $_ } `ls`;
OS依存の上シェルを起動するコードで対抗、と。
>>295 @f = `ls`;
chomp(@f);
>>296 @f=`ls.exe`;
chomp(@f);
どうでもいいかもしれないが、 find(\&boobar, '.'); ↑のように開始パスを相対パスで渡すと、サブディレクトリに入ったときに強制終了するんだよなぁ。 そんなわけで、use Cwd 'abs_path';のabs_path()で絶対パスに変換するなどしてから渡す必要がある。
>269,270です >273さん、ありがとうございます ローカルPC内の作業を想定しておりますので expectでは処理できないと考えております expectはリモートホストの処理に使用するもので、 telnet, tip等で接続する必要があるという認識でおりますが、 expectはローカルPC内の作業でも使用できるのでしょうか 質問攻めで申し訳ありませんが、 ご教授願いたく思います
>>300 対話的なプログラムなら何でも使えるよ。
302 :
デフォルトの名無しさん :2006/02/11(土) 00:01:01
>>300 > expectはリモートホストの処理に使用するもので、
> telnet, tip等で接続する必要があるという認識でおりますが、
おまえ、馬鹿だろ。
> expectはローカルPC内の作業でも使用できるのでしょうか
はい。
>301,302,さん どうもありがとうございます 早速、webで調べつつ作成しますー
しかしいつも思うのだがなぜexpectに相当することをtcl無しに直接perlから出来るような モジュールでもないのだろうか? 需要はありそうな気がするのだが。
↑ 需要あると思う人が作らない限りない
このスレって、現役以外の人も回答してるんだな。
所詮は匿名掲示板だから字引きがわりには使えないってことか。
>>304-305 みたいな浦島太郎みたいな書き込み見るとつい思ってしまう。
そうだな。
308 :
デフォルトの名無しさん :2006/02/11(土) 11:06:46
直リンクが不可能なアップローダー cgi あったら便利だと思う 直リンクされたことによって消滅するアップローダは多いからな perl で書かれたものキボン
310 :
デフォルトの名無しさん :2006/02/11(土) 11:31:58
画像分割の技術を応用すれば直リンクはふせげる
CGIじゃなくて.htaccessじゃ
312 :
デフォルトの名無しさん :2006/02/11(土) 12:46:11
リファラとか使えばいいんじゃないか?
>>299 再現しない。abs_path() も必要ないな。環境依存のバグかも。
>>313 Referer でもいいけど、セッションを発行するのはどうだろう。
どっちにしろ、WebProg 行きのネタな気がするが。
「車輪の再発明」予備軍が集うスレはここですか?
>269 270です cygwinにてexpectを使った自動入力処理を作成しております 下記のように gdb を使って a.exe を動かす処理を作り、 r を入力するところまでは出来たのですが、動作してくれません 単にコンソールに r を表示しているだけのような感じがします (出力先の設定、もしくはIO Tty,Pty以外のIO関連のライブラリが必要なのでしょうか) #!/usr/bin/perl use Expect; $exefile = "gdb ./a.exe"; $command=Expect->spawn($exefile); $command->expect(5,'(gdb) '); sleep(1); print "r\n"; < 識者の皆様 > 再三の初歩的な質問かもしれませんが、 ご教授のほど宜しくお願いいたします もちろん私自身でも調べます
まぁ生活も困難な負け組貧乏人にとっちゃ 再発明してるゆとりなんて無いだろうなw
318 :
デフォルトの名無しさん :2006/02/11(土) 15:51:16
>>316 > 単にコンソールに r を表示しているだけのような感じがします
どう見ても単に端末にrを表示しているだけです。
本当にありがとうございました。
まさかとは思うが、子プロセスと入出力ハンドルで通信したかっただけ?
>318さん >319さん ご確認ありがとうございます >318 確かに単に表示しているだけのようです 試しにですると実行してくれました #!/usr/bin/expect -- set timeout -1 spawn gdb ./a.exe expect "(gdb) " send "b main\n" expect "(gdb) " send "r\n" >319 はい
use IPC::Open2;
>>316 print は $command に対してしなきゃ。
$command->print("r\n");
Windowsで使えるExpectの代わりになるようなモジュールってありませんか?
325 :
323 :2006/02/11(土) 17:43:01
便乗して質問しただけで俺は
>>269 でもなんでもないよ
>>323 Cygwin の Perl なら Expect がそのまま使えるよ。
327 :
デフォルトの名無しさん :2006/02/11(土) 21:22:51
$foo[$i] = split( /\./, "aaa.bbb.ccc") みたいなことはできますか? どう説明したらいいのかわからないので申し訳ないです。。
$foo[$i] = [split( /\./, "aaa.bbb.ccc")] か?
できましたーーー! ほんとありがとうございます!
>269>270です >321さん、ありがとうございます 皆様のおかげで、一応動作するようになりました #!/usr/bin/perl use Expect; $exefile = "gdb ./a.exe"; $command=Expect->spawn($exefile); #$command->log_stdout(0); $command->expect(5,'(gdb) '); print $command "b main\n"; $command->expect(5,'(gdb) '); print $command "r\n"; $command->expect(5,'(gdb) '); print $command "q\n"; $command->expect(5,'The program is running. Exit anyway? (y or n)'); print $command "y\n"; それでは失礼します
>>330 ……これはテストなんだよな?
本当はバッチモードで対応できない処理をやるんだよな?
>331さんへ 今、「バッチモード」という語句を初めて耳にしましたので 少し調べてみましたが、gdbの場合.gdbinit, gdb.iniへ記述といったように、 ファイルに処理を書き込んでおくというものでしょうか? バッチモードの意味がわかっておらず申し訳ないです 今回のgdbはテスト用です しかし、.gdbinit、gdb.iniでは"時間待ち”が出来ないと思っておりました
>332です perlから話が逸れますので、無視してください 失礼しました
334 :
デフォルトの名無しさん :2006/02/12(日) 06:06:40
>>311 htacessを使用しなくっても、リファラでチェックすることで、直リンクを防止できないか?
このスレのコードではリファラのチェックは出来ません。
リファラー使うのはおかしいだろ。。偽装なんていくらでも出来る。
>>314 の通りセッション使うのが正解。
リファラやらセッションやらの話題はWebProg板へどぞん
PerlスレらしくCGI::Sessionなんかを使わず独自技術症候群に陥って セッションを独自実装しちまうコーディングについて話せばおk。 リファラは環境変数読むだけだからダメポ。
20-80だと思うけどな。
340 :
デフォルトの名無しさん :2006/02/12(日) 13:57:51
いや、リファラでいいだろ。擬装はできるがそれをするのは分かっている人だけだ。 大半の人はふつーにアクセスするからほとんど防げるんじゃないか? それとも何か問題あるのか? IE だとリファラちゃんと返さないとか?
>>340 >>338 は
>>337 に答える形で、「CGI::Session を置き換えるような実装についての話題ならテーマとして可」という話をしている。
今回の問題に対する解としてのリファラチェックという手法を直接に否定しているわけじゃない。
どちらにしろ今回のような件でリファラを使う気にはならんけれど、そーゆー話は WebProg 池、と。
皆さん結局最後には自分の意見入れるんですね><
リファラって、なんか原因は分からないが 普通に辿ってきているにも関わらず 思うように入ってないことがあるんだよね。 これで何回か苦情が来た。 なので、うちは必ずセッション使うようにしてる。
教えてください。 Windows XPにてActive perl 5.8.7.815を使っています。 PerlにText::CSV_XSというモジュールをインストールしたくて さっきはじめてモジュールのインストールを行いました。 perl -MCPAN -e shellとやって適当にEnterを叩いて設定したのち install Text::CSV_XSを実行しました。初期設定がおかしかったのか Test実行で失敗していたようですが、インストールはうまくいったような 感じでした。しかし、Perlプログラムでuse Text::CSV_XSを実行すると Can't locate Text/CSV_XS.pm in @INC というエラーが出てしまいます。 @INCにパスを追加しなければならないのでしょうか? それともインストール失敗しているのでしょうか? c:\.cpanというフォルダができていて、そこにText::CSV_XS関連の ファイルは作成されたようですが・・・
>>347 スタートメニューのプログラムから、
「ActiveState ActivePerl 5.8」→「Perl Package Manager」を実行。
開いたppmのコンソールで
install Text-CSV_XS
KENTの掲示板YY-boadではギャル系顔文字が#9999のように表示されてしまいす。 Mixiではそれが対策されている王ですが、どのようにすればよいでしょうか。 長文になる場合はサイトUROでもいいのでよろしくお願いします。
351 :
347 :2006/02/12(日) 23:02:57
>>350 KENTの掲示板ならKENTのサポートに頼めばいいがな。
>>352 いまKENT以外でも試してみましたが、どれも文字が#9999のように表示されてしまいす。
よろしければお願いいたします。
>>353 仕事で必要ならコンサルタントを雇いなさい。
>>354 ニートですから、コンサルタントを雇う金がありません。
よろしければお願いいたします。
ヒマなら自分で調べたらいい
357 :
デフォルトの名無しさん :2006/02/12(日) 23:54:32
ニートがいっちょまえにプログラミングなんかするんじゃねえ
携帯の絵文字の事かな? まあ、PerlでもRubyでもJavaサーブレットでできた掲示板でもそうなるだろうから、 WebProg池
>>358 いや、記号を組み合わせた顔文字
&を&に置き換えていることが原因だったから置き換えた。
=~ s/&#//g;
ごめん、引きこもりで時間だけは有るからプログラミングやってる。
あっ、そうそう 356と357は氏ね
SDBM_File のデータベースが読めません tieは問題ないようなのですが。 panic: sv_setpvn called with negative strlen というメッセージを吐きます データベースを作った環境が5.005_03 + mod_perlで 読もうとしている環境が5.8.2なのですが データに互換性がないのでしょうか?
364 :
デフォルトの名無しさん :2006/02/13(月) 10:01:57
モジュールのBUGでしょ ご愁傷様
>>363 こういう質問の時は関係ないと思っても一応OS書いた方がいいよ。
な、わけで直接の回答になるかどうかは知らんが一応コメント5.005_03当時のSDBM_FileのコードはUnixの
> notes of lseek(2)
> Seeking far beyond the end of a file, then writing, may
> create a gap or "hole", which occupies no physical space and
> reads as zeros.
動作を前提に書かれていました。これが保障されていないOSでのSDBM_Fileにはバグがあったのです。
また、ソースをみると昔、5.005_03当時にはなかった関数が新たに書き加えられたりしてます。
今回の現象がバグかどうかは分らないが、データに互換性がない可能性もあります。
5.005_03なSDBM_Fileの適当に名前を変えてソースをコンパイルして、過去のデーラベースを読み込める
ようにして変換するのが現実的だと思います。
すみません。 質問なのですが、 特定の関数の中の変数の一覧を取得することってできないでしょうか? sub hoge { my $a; my $b; my $c; fuga(); } sub fuga { # ここで、呼び出し元のhoge()内に変数 $a $b $cを参照したい } 普通に引数で渡したり、グローバル、オブジェクト等使え と思うかもしれませんが、 fuga(); だけの呼び出しで実現したいのです。 %{パッケージ名::}で関数一覧は取得できるので、似たような方法でできる気がするのですが・・・
気のせいです。
カプセル化の危機!
> 普通に引数で渡したり、グローバル、オブジェクト等使え と思うかもしれませんが、 思いません。
デバッガとかかな?
foreach (keys %ENV) { print; } こういうことかな
>>372 まさにそんな感じです。
常駐型のアプリケーションを作っているのですが、
毎回再起動するのが非常に面倒なので、
sub fileeval {
open(FILE, $_[0]);
my $data = <FILE>;
eval($data);
print "error : $@" if($@);
}
といった変数を作り、
sub hoge {
my $a;
.... #コード
fileeval('hogehoge.pl');
.... #コード
}
というふうに使いたいのですが
当然fileevalの中からは関数hogeのスコープじゃないので、
$aが見えないのです。
375 :
デフォルトの名無しさん :2006/02/13(月) 19:14:27
教えてください。ブラケットで囲まれ、かつその後に特定のキーワードが来る文字列のリストを作成したいのですが... 例えば、キーワードを "定食","弁当"...と仮定して、入力ファイル内の [うなぎ]定食 [焼肉]ランチ [さば]弁当 をリストアップしたいのです。素人考えでしょうが、以下のように書きました。 #! usr/locsl/bin/per @keyword = ("定食","弁当","ランチ","セット"); #キーワードのリストを配列に。 while (<>) { $sentence = $_; #入力の各行を、変数$sentenceに。 if ($sentence =~ /\[[^\[]*?\]/ ) { #ブラケットがある行を、正規表現で探す(一行に複数あるかもしれない)。 foreach (@keyword) { #キーワードをひとつずつ当てはめ。 if ($sentence =~ /(\[[^\[]*?\]$keyword)/g) { #ブラケット+キーワード ptint "&$\n"; # &$で、前の行で取り出した行を印刷。 }}} どうしても ]定食 ]ランチ と、後部ブラケット以下しか、表示されません。print $1にしても同じです。 自分でも考えてみたつもりです。どなたか、教えてください。
>>375 ptintとか&$とか...コピペ汁
my @keyword = qw(定食 弁当 ランチ セット);
my $keywords_regex = '(?:' . join('|', map { "\Q$_\E" } @keyword) . ')';
while (my $sentence = <>) {
while ($sentence =~ /\[.*?\]$keywords_regex/g) { print "$&\n" }
}
>>374 sub fileeval {
my ($file, $a, $b, $c) = @_;
open(FILE, $file);
my $data = <FILE>;
eval($data);
print "error : $@" if($@);
}
sub hoge {
my $a;
.... #コード
fileeval('hogehoge.pl', $a, $b, $c);
.... #コード
}
じゃだめなん?
>>375 それしたから2行目の正規表現を
/(\[[^\[\]]*?\]$keyword)/g
にすればうまく行くんじゃね?
>>378 その場合は、もともと sub hogeにある変数を全てfileevalに渡さないとダメですよね?
fileeval関数自体はいろんなところではさむので、どんな変数があるかわからないのです。
sub fileeval {
my $data = <FILE>;
return $data;
}
sub hoge {
eval(fileeval('hogehoge.pl'));
print "error : $@" if($@);
}
って感じにすれば実現できるんですが、fileevalの呼び出しだけで済ませたいなぁ と・・・・
381 :
デフォルトの名無しさん :2006/02/13(月) 19:38:59
>>375 です。
レス有難うございました!! 早速試してみます。
なんとなく OO でキチンと設計し直す方が良い気がする。
おっと、ENVのままじゃないよ。一応。keysでゴリゴリできるって話しね。
>>374 そういう構造にするならstrict varsは捨ててダイナミックスコープ変数にするのも手。
というかスコープ外のレキシカル変数に無理やりアクセスするくらいならこっちの方がよっぽどマシだと思う。
sub hoge {
no strict 'vars'
local $a;
fileeval('hogehoge.pl');
}
myとlocalの違いは適当にググっとくれ
本当にデバッガのように呼び出し元に手を加えられないというケースなら
>>370 のPadWalkerのようなものもあるけどさ…
our
387 :
デフォルトの名無しさん :2006/02/13(月) 22:50:23
>>375 です
>>376-7 ,379 さん、ありがとうございました。
>>377 さんの2行目、
my $keywords_regex = '(?:' . join('|', map { "\Q$_\E" } @keyword) . ')';
変数my $keywords_regexには、具体的に何を入れてるのでしょうか?
どうして私のチョンボ.perl
>>375 の if ($sentence =~ /(\[[^\[\]]*?\]$keyword)/g) で
grepして、$&で引っこ抜けないのでしょうか?根本的な誤解があるように思えてなりません。
お願いします。お時間あれば、初心者の私に教えてください。
>>387 勉強する気があるのかないのか、困った子ですね。
389 :
デフォルトの名無しさん :2006/02/13(月) 23:08:43
>>388 「初めてのPerl」は、スミからスミまでもう一度読み返しました。
とりあえず、どこかで膨大な勘違いがあると思うのです。
foreachで、$keywordに@keywordをひとつずつ入れる、それに正規表現の
ブラケット \[[^\[\]]*?\] (←でいいのですよね?)をjoinし、カッコ内を$&で
$sentenceに挿入....どこが、間違っているのか...ヒントだけでも教えてください。
390 :
デフォルトの名無しさん :2006/02/13(月) 23:22:55
やってみりゃ分かることを・・・。
391 :
デフォルトの名無しさん :2006/02/13(月) 23:39:23
>>390 もう、何度も書き直してるのにこのザマです。閉じブラケット以降しか拾ってくれません。
...確かに、他人に聞くようなレヴェルじゃないですよね。
貴重なお時間、ありがとうございました。もう一度、自分で調べてみます。
392 :
デフォルトの名無しさん :2006/02/13(月) 23:39:43
すいません質問させてください
Perlで作ったおみくじCGIをサイトに置いたんですが
わたしのサイトに来てくださる人の携帯(DoCoMo)では動作しないって言われました
それでわたしも携帯で動作を確認するとやっぱり動きませんでした
PCでは問題なく動作するのですが携帯向けには何かしなければならないのでしょうか?
>>2-3 で紹介されているサイト様も見てみたんですが書いてありません
詰まってしまいました
どなたか原因が分かりますでしょうか?
393 :
デフォルトの名無しさん :2006/02/13(月) 23:42:33
>>389 ところが$keywords_regexはエスケープしてるからマルチバイト部分が
ぐちゃぐちゃでとても一目でわかるとは思えないものなんだよねこれが。
>>391 そもそも君の提示したソースだとこっちじゃ、ぜんぜん違うバグが出るか、
それらを修正しても
>>375 の問題は再現しないんだが...。
とりあえずgオプションを使いながら中の正規表現を動的に変えるのは間違ってる。
$keywords_regexには列挙されたキーワードのすべてにマッチする正規表現が入る。
map { "\Q$_\E" } @keywordでキーワードをエスケープ([や\みたいなメタキャラクタは入っていると困るため)
join '|',で正規表現の「選択」つまり複数にマッチするように並べる。
で、それらを(?:)で括ってグルーピングしている。
つまりエスケープを除くとこういうこと(?:定食|弁当|ランチ|セット)
>>392 >>1 CGIはWebProg板行き
396 :
394 :2006/02/14(火) 00:09:23
ウボァ('A`)
一つ目のアンカー間違えた
>>390 宛
397 :
デフォルトの名無しさん :2006/02/14(火) 00:14:43
>>394 本当に、ありがとうございます!!!!!
勉強させていただきました。
>>382 >>383 >>384 >>385 ホントデバッグというか、開発中専用の機能なので、できるだけ本体のコードは触りたくないんですよね。
開発中は鯖立てっぱなしにして、hogehoge.plに実装していく。
↓
出来上がったらfileeval('hogehoge.pl')の部分にhogehoge.plを貼り付ける。
って感じで使いたいのです。
PodWalkerは・・・ fileevalを呼び出したスコープにどんな変数があるかわからないとダメっぽいですね・・
>>398 そういう目的・・・なら許せるかもしれない。
> PodWalkerは・・・ fileevalを呼び出したスコープにどんな変数があるかわからないとダメっぽいですね・・
Lexical::Utilとかの中から一覧を得られるやつを選んで探してきたつもりですが(´・ω・`)
use PadWalker qw(peek_my);
use Data::Dumper;
sub hoge {
my $foo = "HOGE";
print Dumper peek_my(1);
}
sub fuga {
my $foo = "FUGA";
my %bar = (a => 1);
hoge();
}
my $foo = "MAIN";
fuga();
>>399 う、うおおおお そういうことか!!!
ありがとうございます!!!
やってみます!!!
PadWalkerで手に入れたハッシュを、 キーを変数名としてeval使って現在のスコープにとりこもうと思ったんですが・・・ evalの中ってスコープかかってるんですね_no
my $h = peer_my(1); my $valiable_code; foreach my $key (keys(%{$h})) { $valiable_code .= "my $key = \$h->{'$key'};\n"; } eval($valiable_code . $from_file_code); といった感じで実現できました! 皆々様ありがとうございました!!!
>>386 orzがひっくり返っただけだと思ったw
>>402 重箱の隅で大変恐縮なのだけれども。
variable …。
Perlのフリーの統合開発環境ってなんかないの?
Epic とか
emacsでもつかってろ
"ヽ(・∀・)/" =~ "ヽ(・∀・)/" が偽になって "舞同" =~ "蒼" が真になってしまうんですけど こんな不具合を回避する方法って、ありますでしょか?
文字列の比較は eq ですよ
情報を小出しにして、すみませんOTL 実際は左辺の部分を文字列にしてるんです。 $a = "いろはにほへと舞同ちりぬるを"; if($a =~ /蒼/){ print "真\n"; } else{ print "偽\n"; } 具体的には、こんな感じです。
そこであなたEclipseですよ!
IDEすら、知らなかったですけど これは、便利そうですね。早速試してみます。 ありがとうございました。
けど、かなり重いので落胆しないようにね、と
そこであなたOpen Perl IDEですよ!
画面への出力と同じ内容を、ファイルにも出力したいと思っています。 とりあえず今はこんなクラスを作って対応してみましたが sub new { open(OutHandle, ">$fileame") || die $!; my $self = { Handle => *OutHandle, }; } sub print($) { print "$s"; my $fh = $self->{'Handle'}; print $fh "$s"; } my $prn = new DebugPrint("debug.log"); $prn->print("aaa"); これだと他のサブルーチンを使うときに渡さないといけないので不便です。 何かもっと良い方法がありましたら教えてください。(WinXP Perl 5.8.7)
418 :
416 :2006/02/14(火) 14:21:01
>>417 おおっ!まさしく欲しかったものです!
ありがとうございます!
パスを通したフォルダにPerlのスクリプトを置いてあるとき、 そのスクリプトの置いてあるパスの取得はどうやってできますか? カレントフォルダのパスはgetcwdで取得できるんだけど…
print が行われる前に、自動的に指定のサブルーチンが実行されるようにできないでしょうか?
>>409 前者は quotemeta
後者は Encode や encoding で回避できる。
前者の補足
(や)はメタ文字なので、(や)自身を表すにはクォートする必要がある。
"ヽ\(・∀・\)/" で充分だが、 quotemeta "ヽ(・∀・)/" だとクォート忘れが無いし、
実行時にならないとパターンが分らないときに楽が出来る。
パターンが\Eを含まない事が保障されているならば、"\Qヽ(・∀・)/\E" も楽。
後者の補足
Perlは1文字1バイトを想定するので、(sjisの)"舞同" , "蒼" は \x95\x91\x93\x9f の
4文字と \x91\x93 の2文字として扱い、マッチが成立する。
(iso2022-jp,euc-jp,utf-8/16/32では、"舞同"は"蒼"にマッチしない)
Encodeやencodingを使うと "舞同" を2文字,"蒼"を1文字として扱うようになるので、
多バイト文字の途中からのマッチ成立は発生しなくなる。
425 :
デフォルトの名無しさん :2006/02/14(火) 18:21:14
Perlプログラミングの質問をさせて頂きます。 utf-8の文字の置換がうまく出来ません。 当方はja_JP.UTF-8なLinux環境でPerl5.8.5です。 最終的にやりたいことは、 いわゆる”にょろ”とか”から”と呼ばれる、あの文字がLinux上で二種類あるので、 一方に置換したいと思っています。 文字化けする可能性大ですが、一応その二種類を書いておきます。 Source: 〜 Dest: 〜 ただ、今のところ、他の特別じゃないnon-asciiな文字の置換さえ、おこなえていません。 ですから、とにかく、utf-8文字の置換を教えていただければありがたいです。 ソースをutf-8で書いて、 =~ s/Source/Dest/g; とかしても全くヒットしません。 use utf8とか書いても同じです。 初歩的な質問かもしれませんがよろしくお願い致します。
426 :
409 :2006/02/14(火) 18:21:16
>>420 >>423 >>424 詳しい解説ありがとうございます。
両方とも、テンプレサイトに書いてあったんですね。
俺みたいなテンプレサイト流し読みしかしないアホには
一文入れてもらったほうが良いかもしれませんorz
>>425 このスレを utf で検索して目を通せ。
過去ログ・テンプレを見ない馬鹿は、ホント死ねばいいのにと思う。
そういう言葉はやめておこうぜよ
>>425 その二種類のチルダについてはよく知らないのだけど
http://ja.wikipedia.org/wiki/Unicode のWAVE DASH - FULLWIDTH TILDE問題のことでいいのかな。
まさかそのスクリプトを書いたエディタが二つを同じものに変えてたりしないだろうね…
それが原因なら、対象の文字列にutf8::decodeを使うなりPerlIOレイヤを使うなりして
utf8フラグを立てて(このあたりはテンプレの[Perl5.8Unicodeメモ]参照)
tr/\x{FF5E}/\x{301C}/
とでもやれば行けるはず。
>>428-429 どちら様もありがとうございます。
私が悪いんです。あまりに久しぶりのPerlプログラミングだったので、ついやっちゃいました。
>>256 だけで解決しました。もっとシームレスにutf-8に対応してくれないのかな
というのが素直な感想であります。
>>430 SourceのはLinux上で通常使われている”にょろ”です。
Destのはsamba経由でWindows側から書き込むと出来る”にょろ”です。
(Windows仕様に統一しようかなと考えているわけです。)
432 :
422 :2006/02/14(火) 20:00:19
>>427 ありがとうございました。
perlの懐の深さは驚くばかりです。
>>430 先ほど書きませんでしたが、
そうです。私の言っている”にょろ”とは
そのWAVE DASH - FULLWIDTH TILDE問題の文字です。
先ほども書きましたが、decode,encodeすることで当初の目的の置換はおこなえています。
>>425 プログラムの始めの方で use encoding 'utf8'; を入れてみたらどう?
最近は utf-8 関連の質問が増えてきましたね
それ系のサイトのテンプレを充実させておいた方が良いかもしれないね。
おれもいちいち面倒くさくなって、今は全部UTF-8にしてる。 どうせ将来use utf8が標準なんだし。
use utf8; と use encoding "utf8"; って何が違うの?
メールはjis、これだけはガチ
WindowsでActivePerlの最新を使っています。 ppmでモジュールをインストールしようとすると、 会社のPCだからなのか、DLがうまくいきません。 セキュリティか何かの関係かもしれませんが。 他にモジュールをインストールする方法ってありますか?
エラーメッセージを。。。 よりも、会社のPC使うな。
>>441 >>219-
ここまで質問内容が一致するとむしろ驚きというかなんと言うか
正直正規表現わかりにクス while($s =~ /^(.).*/g) とか $a =~ s/^(.)//; とか 意味わからなす・・ これをわかりやすーく日本語で教えてくれないか?
>>439 にある
>use encoding 'euc-jp', Filter => 1;
で、変数や、関数名を日本語で記述できるっておもろいね。
これってネタとはなってるけど、実用的にはどうなん?
入力する時に IME を on/off するの、面倒じゃないか? 日本語で書いたら、日本語読める奴しかコードが読めなくなるし。 デメリットしか思い付かない。
>>444 AAだとおもえば
むずかしいせいきひょうげんも
ちょっとかわいくみえるよ!
ハ_ハ
('(゚∀゚∩ みえるよ!
ヽ 〈
ヽヽ_)
>>444 詳説正規表現を読み切れば日本語のごとく正規表現を読めるようになるよ!
449 :
447 :2006/02/15(水) 01:15:03
あー、で ■while($s =~ /^(.).*/g) これはー、なにやりたいんだろうか? まあ$sの最初の一文字目をとってきて、 その一文字目に対してなんか処理するのだろう。 ■$a =~ s/^(.)//; これは初めの一文字目を、空白に置き換えてるんだな。 $aの、初めの一文字目を消してるだけ。 というか正規表現スレがあるのでそっちで。
while($s =~ /^(.).*/g) パターンマッチだけなので無限ループ $a =~ s/^(.)//; substr ($a, 0, 1)のが速いかも
>>445 仕様書からscriptを自動生成するのに使ったことがある。
/^(.).*/ って、初心者にありがちな、必要ないのに文字列全体にマッチする正規表現を書いちゃうってパターンだな
コマンドライン引数って自分でdecodeしないといけないの? それとも何かいい方法とかありますか?
>>450 g付きならマッチした文字列の配列返すだけだから無限ループにゃならんだろ。
^が付いてるから、一個の要素の配列返して終了じゃね?
ごめんなさい。書き忘れました。コマンドライン引数の文字コードのことです。 shift_jisとかutf8とか環境によって違いますが、環境に合わせてうまくdecodeする方法があるのかな?と
my $tee = new IO::Tee( \*STDOUT, # 標準出力 ">debug.txt" # ログファイル ); select($tee); # $tee を選択 tie($tee, ???); # ここで tie したい こういう場合は何で tie すれば良いのでしょうか?TIEHANDLE? TIESCALAR? やってみた事 tie(*$tee, 'MyTieHandle'); はアプリケーションエラーになってしまいます。 tie($tee, 'MyTieScalar'); で print で STORE がコールされるのかと思ったのですが違いました。 よろしくお願いします。(WinXP, Perl 5.8.7)
>>457 うーん、tieはかなり日本じゃ探しても文献すくなかったから、
それを答えられる奴は、少ない&ここにはいないかも試練。
やりたいことは IO::Tee の機能を残しつつ、自分で作った MyTieHandle を関連付けたいんだろうが、
ひとつのハンドルにはひとつのTIEHANDLEクラスしか関連付けられないと思うので、
その方法だと$teeハンドルに関連付けられたIO::TeeがMyTieHandleで上書きされて、
MyTieHandleのメソッドしか呼ばれなくなると思う。
漏れもtieは勉強中で詳しくはわからんのだけど。
IO::TeeとかIO::Scalarを参考にして自作するしかwww
459 :
457 :2006/02/15(水) 16:53:14
>>458 IO::Tee自身もTIEHANDLEなんですね。
2つともtieすると無限ループするし…
このままでは仕方がないのでMyTieHandleだけで解決させようと思います。
ありがとうございました。
>>459 IO::Tieの中身を確認しないで書くけど、
IO::Tieを継承したクラスでも作れいいじゃん
とか思った。
正規表現分からない人って、保存もグループ化も要らないのに やたら丸括弧つかってる事あるよね。 あれ無駄だなーと思う。 あと何でもかんでも .* で行けると思ってる。 別にどうでも良い所も .* でマッチさせてる。 これも無駄だよね。 正規表現てそんなに分かりにくいか? 参考書が悪いのかな。
大して多くないが
464 :
デフォルトの名無しさん :2006/02/16(木) 02:45:13
ちょっと質問です。 Excel に喰わせる CSV ファイルを前処理するスクリプトを組んでいるのですが、 こういうデータを配列に入れる、(・∀・)イイ技はないでしょうか? $line = "2003/04/05,abc,4000,\"hogehoge ha hogehoge detu, sosite hamehame ha fumefume desu.\""; @lines = split ",",$line; すると以下になりますが、これは期待したものではありません。 @lines[0] = "2003/04/05"; @lines[1] = "abc"; @lines[2] = "4000"; @lines[3] = "\"hogehoge ha hogehoge detu"; @lines[4] = "sosite hamehame ha fumefume desu.\""; こういう風にしたいのです。 @lines[0] = "2003/04/05"; @lines[1] = "abc"; @lines[2] = "4000"; @lines[3] = "\"hogehoge ha hogehoge detu, sosite hamehame ha fumefume desu.\"";
465 :
デフォルトの名無しさん :2006/02/16(木) 02:49:03
>>464 > ちょっと質問です。
> Excel に喰わせる CSV ファイルを前処理するスクリプトを組んでいるのですが、
> こういうデータを配列に入れる、(・∀・)イイ技はないでしょうか?
考え方:
この問題には、多くの人が取り組んだはずだ。
したがってすでにモジュールが作られているだろう。
466 :
デフォルトの名無しさん :2006/02/16(木) 02:57:55
>>465 おっ、それは(・∀・)イイ考え。
ところで、データは日本語ベースなんですが、大丈夫でせうか?
467 :
デフォルトの名無しさん :2006/02/16(木) 02:59:16
いまは暫定で、split したもののうち、 まちがって切ったものを繋げる処理を入れてます。 我ながらダサい orz
>>466 Text::CSVはASCII以外喰ってくれない。
Text::CSV_XSのオプションにbinaryをセットすればOK
469 :
デフォルトの名無しさん :2006/02/16(木) 04:50:45
正規ヒョゲンで質問したものだが・・・ なんか他のスレとちがってwwwこのスレの住人やさしいなwww ちょっとうれしかったぞwwww まぁ話は戻るが・・・ 一応ソースを張る・・・ Main: {if($#ARGV < 0) {print STDERR "usage: lister.pl <search_host> \n";exit;}$make_uniq = 1;$search_host = shift(@ARGV); print STDERR "[+] Search host : $search_host\n\n"; while($searchwords =~ /^(.).*/g) { $searchwords =~ s/^(.)//; print STDERR "Search[$1] ... "; $arrsize = $#ulist; if($#ulist != $arrsize) { $arrsize = $#ulist; push(@ulist, search_google($search_host, $1, 100, 100)); } $arrsize = $#ulist - $arrsize; print STDERR "$arrsize username found\n" } @ulist = sort(@ulist); open(OUT, ">$search_host.txt") or die "open: $!"; foreach $name (@ulist) { unless($seen{$name} && $make_uniq) { $seen{$name}++; print OUT "$name\n";}}close(OUT); } 一応こんな感じで掲載してあった・・・これをCで書こうと思っている・・・サーチグーぐるはサブルーチンとして存在している。。。今のところ一番意味不明なのは my ($search_host, $search_word, @ulist, $name, %seen, $make_uniq); my ($arrsize); push(@ulist, search_google($search_host, $1, 0, 100));かな マジCで言うところのこんな漢字って説明してくれ。
>>469 Cは知らないけど、時間だけに誰もいないだろうから日本語で回答してみる。
上2つは変数のスコープ宣言。
PerlはCのように型の宣言がないけど、変数等が使える場所を制限できる。
3つ目は、search_googleの戻り値を配列ulistの末尾へ追加する。
STDERRの一文はdieで済むと思ふ
>>464 split /,/, $line, 4ってことじゃなくて?
deleteやexistsの構文が納得できません。 通常の法則なら「exists $hash{example};」はexampleというキーが生成されてその後undefがexists演算子に渡されるように見えます。 デフォルトのハッシュでも内部的なtieがあってFETCHに「exists演算子下では動作を変える」機能があると考えたらいいのでしょうか? それともperlが exists(\%hash, "example") 的なコードに置き換えているのでしょうか? それとも同じundefでも内部では識別可能ないくつかのundefがあり「キーが無いことによるundef」とかが渡されてるのでしょうか?
ヒント 未定義という定義
まぁ確かに浮いてるよね、この構文。
Encode::from_toで "〜" を UTF-8 に変換すると コードの違う 〜 に似た文字になってしまうんですが 日本人は今後もJCode使うしかないんですかねぇ・・・
むしろそれはWindowsの問題
477 :
475 :2006/02/16(木) 14:14:45
ファイルのリストをUTF-8で取りたいと思い、以下の様にしてみたのですが、
どうしてもSHIFT_JISでしか取れません。どうしたらできるのでしょうか?
環境は、Win2000 で Perl5.8を使っています。
use open IN => ":encoding(shift_jis)";
use open ":std";
while (<*>) {
print $_;
print utf8::is_utf8($_) ? " UTF-8 Flag\n" : " not UTF-8 Flag\n";
}
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html ここの"UTF8フラグとPerlIOレイヤ"とにらめっこしながら、ああでもないこうでもないともう1時間以上トライしているのですが・・・
よろしくお願いします。
IO::Fileでファイルを書き込む時、 $fh = new IO::File( $file, $mode ); print $fh $value; みたいなことをしています。 ファイルが無い時勝手に作ってくれるのはいいのですが、 その時ファイル属性は指定できないのでしょうか。 それとも書き出す前にファイルテスト演算子でファイルの有無状態を取得しておいて、 ファイル作成後、そのフラグをで新規作成を判別し、chmodを使うしかないのでしょうか。 なんとなくスマートじゃないきがしたので…。
481 :
478 :2006/02/16(木) 16:03:47
>>480 では479で書いたようなことを実装しても問題ありませんよね
最近モジュールを勉強しだしたので、
どの辺までモジュールを使ってできるかとかやっていて、詰まることがあるんです
>>483 第三引数に'0666'とやってみたところ705のファイルが出来ました
8進数変換の数字渡しても変わらない…
まちがえました、655のファイルでした どちらにしろ希望のパーミッションじゃない…
umask でできないんだっけ?
>>484-485 MODEを数値(O_WRITE 等)で渡してないか、umaskの設定を忘れてるかしてない?
>>472 簡単にいうと Perl コンパイラがバイトコードを生成するときに
exists $hash{key}
というプログラムを
OPCODE: exists
ARG1: hash
ARG2: "key"
というコードにコンパイルするから.そーゆう意味でいくと 2 番目の理解が近いのかな.
確認したけりゃ perl -MO=Terse -e 'exists $hash{key}' とバイトコードをみてみるといい.
490 :
デフォルトの名無しさん :2006/02/16(木) 22:49:24
ぺrl
ファイルハンドルをローカルなものにするにはどうすればいいですか
492 :
デフォルトの名無しさん :2006/02/17(金) 08:11:08
>>491 ファイルハンドル名を GUIDGEN.EXE で毎回生成してはどうよ。
皆様レスありがとうございます。 ということは構文上 $hash{key} の形がオペランドとして存在してもFETCHとしては扱われず、 実行時まで識別子とキーは分離したままなのですね。 バイトコードはオペコードが分からないんですが役立ちそうなので勉強してみます。
あ、3行目は普通に引いてもそうですね。失礼しました。
>>487 #!/usr/local/bin/perl
use strict;
use IO::File;
sub main {
my $fh;
unless( $fh = new IO::File( './test.txt', 'a', '0666' ) ) {
print "$!\n";
}
print $fh "test\n";
$fh->close;
}
main;
>>483 ではデフォルト0666になるとか書いてあるのですが、上記のようにやっても
644にしかなりません(昨日の0655もまちがえでした)
うーん・・・
496 :
デフォルトの名無しさん :2006/02/17(金) 11:23:46
>>495 umask umask umask umask umask umask umask
umask umask umask umask umask umask umask
umask umask umask umask umask umask umask
umask umask umask umask umask umask umask
umask umask umask umask umask umask umask
>>495 つーか、そこの君。 '0666' って文字列は何だ? 0666 じゃないのか?
>>496 umaskはunix依存コマンドらしいので、つかってないです
>>497 数字も文字列もoct後も試しました
張ったのはたまたま文字列の時のです
>>498 文字列じゃ普通だめだろ。パーミッションなんだから。
(Perlってそんなの解釈してくれないよな? まさか新しい
バージョンではするのか?)。
ま、しかし、umask の問題だよ。OSに依存する部分をPerl
スクリプトの中に書きたくないのならスタートアップ用シェル
スクリプトを作ってその中で umask コマンドで設定してから
動かせばいい。
>>498 自分で使ったつもりがなくてもumaskの値はだれかがどこかで設定した値に
なっているわけで... たぶん755とかになってるんじゃねーの?
linuxのopen(2)より:
The argument mode specifies the permissions to use in case a new file
is created. It is modified by the process's umask in the usual way: the
permissions of the created file are (mode & ~umask).
unix依存って設定がって事なんですね システムによって動かないコマンドかと思ってました それなら単純にumaで取得後任意に設定し戻す方法をとります ただ、IO::Fileの説明で第三引数にPERMというものがありながら使えなかったというのが心残りですが
>>501 > ただ、IO::Fileの説明で第三引数にPERMというものがありながら使えなかったというのが心残りですが
使えるわ、 ぼけッ!!
使えるわ、 ぼけッ!!
使えるわ、 ぼけッ!!
使えるわ、 ぼけッ!!
使えるソースよろ
使えるけど君の望んだものではなかったということだな。
#!/usr/local/bin/perl use strict; use IO::File; sub main { my $filename = './text.txt'; my $fh; print "実行開始時のumask : ".sprintf( "%03o", umask ), "\n"; umask( 0070 ); print "セットしたumask : ".sprintf( "%03o", umask ), "\n"; unless( $fh = new IO::File( $filename, 'a', 0644) ) { print "$!\n"; } print $fh "test\n"; $fh->close; my @st = stat( $filename ); print "ファイルの属性 : ".substr( sprintf( "%03o", $st[2] ), -3 ), "\n"; unlink( $filename ); } main; 実行開始時のumask : 022 セットしたumask : 070 ファイルの属性 : 606 グループを見ると分かりますがumaskは利いています。 IO::Fileで指定したのが反映されていません。 かりにされていたら604になるはずですよね? umask強制かもしれないので、逆にumask使わない場合を。 うちの環境ではデフォが644になり区別がつかないので、 IO::Fileの指定で606としたところ、結局644に…
バカにはムリ
あれ? 変だぞ? 何が起こってるんだ? $ cat x #!/usr/bin/perl -w use strict; use IO::File; umask 0; my $fn = 'testfile.txt'; my $fh = new IO::File($fn, 'w', 0400); die "$fn: $!\n" unless ($fh); $fh->print("テスト\n"); $fh->close(); $ perl x $ ls -l testfile.txt -rw-rw-rw- 1 xxxx xxx 10 2月 17 15:53 testfile.txt $
分かった。デバッガで IO::File の open まで追いかけてったら モードが数値の場合だけ sysopen でパーミッションをセットしてて モードがコロン始まりの時とその他の時は普通の open 使ってて パーミッションセットしてねえ。 …これもしや perldoc に書いてあった?
ああ。あるな。あるある。やっぱ英語はもっと勉強せんといかんな。 これだな。numeric mode。 If "IO::File::open" is given a numeric mode, it passes that mode and the optional permissions value to the Perl "sysopen" operator. The permissions default to 0666.
あー結果もはっておきます O_WRONLY|O_APPEND|O_CREAT でいけました。
>>510 ひとのアドバイスもマトモに聞かず、散々引っ掻き回した挙げ句がそれかよ、って感じですな。
>MODEを数値(O_WRITE 等)で渡してないか
これを
>MODEを数値(O_WRITE 等)で渡してないか?渡してたらダメだぞ
と思ってた俺
>>512 で煽られてようやくorな文章だと気がついた俺
そして結局
>>511 がでるまで分からなかった俺
O_WRONLYとかみたことないよ…
次から文章じゃなくperlで答えてやろうぜ ぶんもー☆多いみたいだし
print 'こうですか?わかりません!';
local $/ = undef とかの$/ってなんですか?
>>513 perldoc IO::File →
>>509 → perldoc -f sysopen
だけですぐに O_WRONLY とかに辿り着くじゃん。
ちゃんとドキュメント見れと。
>>517 perldocなんてコマンド初めて知った
>>516 > local $/ = undef
> とかの$/ってなんですか?
定義済み変数です。
>>518 perldoc のことも書いてない入門書は焼いてよし。
今日はperl入門サイト炎上だな
perl入門サイトの大半は燃えて無くなってもらった方がいいんじゃね?
せめて検索に引っかからないようにやってて欲しいと思うところはいっぱいあるな。
526 :
デフォルトの名無しさん :2006/02/17(金) 18:01:18
>>525 名前:性帝トーマス◆13ThomasYo
紹介文:俺の子を産んでくれる繁殖可能な女性を広く募集中。
beポイント:116
登録日:2005-02-06
初心者は半年ROMっててね。
このユーザーの投稿にbeポイントとメッセージが贈れます。 beポイントを送る 名前:性帝トーマス◆13ThomasYo 紹介文:俺の子を産んでくれる繁殖可能な女性を広く募集中。 beポイント:116 登録日:2005-02-06
safe
excel vba Sheets("xSheet").Copy After:=Sheets(1) をperlに変換するにはどうすればいいですか? Sheets("xSheet")->Copy After:=Sheets(1) ↑ ここから分からん…
Perl側からコンソールを閉じる方法、 もしくはコンソールを×ボタンで閉じるときに処理を噛ませる方法があったら教えてください。 batファイルから開く必要があるので、exitではウィンドウが閉じません。宜しくお願いします。
batでexitすれば?
OSくらいはっきりしてくれんことには。
535 :
デフォルトの名無しさん :2006/02/19(日) 02:47:27
>>532 Windowsならショートカットのプロパティで設定しておきゃいいじゃねえか。
>>532 batで開いたものをexitすると、plファイルを再実行します。これは仕様ですよね?
>>534 WindowsXP SP2/perl5.8.4です申し訳ありません。
>>535 試しにショートカットを作ってプロパティを見てみましたが、特に見当たりませんでした。どう設定すれば良いんでしょうか?
最初からwperl.exeで実行してコンソールを出さないのはダメなのかい
Perlから直接呼び出してつかう JRA-VAN Data labo用のDOSソフト作ったんだけども、 どうよ?? とりあえず、IISのWebサーバーでcgi実行して、 今日のレース一覧とか現在のオッズとかみるcgiサンプルつけた
ファイルをリネームするためにrename()を使って一括処理をした。 ファイル名に日本語を含んでいたため地獄を味わった。 ActivePerlさん、本当にありがとうございました。
どうみてもperlの問題なわけだが・・・
そうか?
543 :
デフォルトの名無しさん :2006/02/19(日) 15:46:29
どんな問題か書いてないのによくそんな議論ができるな
544 :
539 :2006/02/19(日) 15:54:44
環境は、XPHome Perl v5.8.4 使ってるライブラリは以下。 use File::Find; use MP3::Info; use Audio::WMA; 原因がわからん。 仕方ないので、今はsystem()でrenameコマンドを呼び出して対処。
>>544 どういうファイル名がどんな風になって、ActiveStateに感謝してるか書けよw
その程度の状況説明しかできないようだとガキの言い掛かりとしか受け取れないよ。
547 :
539 :2006/02/19(日) 16:12:36
今も作業中なので、不具合再現作業はまだやらない。 48個のファイルが文字化けしたため、 dirリダイレクト→表計算ソフト→txt→bat編集でリネームとやってなんとかfuck youさせた。
文字コード間違ってるだけと言うしょーもない原因だったら死んでいいよ。
なにやってもダメなやつはダメ
>>547 > 不具合再現作業はまだやらない。
まだ原因が自分にあるのか ActivePerl にあるのか切り分けもできてないんでしょ?
その状況で
>>539 みたいな言い掛かり的レスをする神経がわからない。
ソース出せよ
mp3のトラック番号取得直後にそのmp3をリネームすると文字化けが発生する。 MP3::Infoを1.1.xから1.2に更新することで回避。
554 :
デフォルトの名無しさん :2006/02/19(日) 18:24:55
>>547 encode の使い方間違えただけじゃねえか?
555 :
539 :2006/02/19(日) 18:40:04
>>553 ですでに解決した。MP3::Info 1.2未満で発生する。
全角文字を含みトラック情報をもつmp3ファイルを引数に渡すこと。
このテストでは引数で渡したmp3ファイルをリネームするので注意。
use strict;
use MP3::Info;
MAIN:{
my $filename = shift or die;
die unless (-f $filename && $filename=~m/\.mp3$/);
my $tag = get_mp3tag($filename);
my $tracknum = $tag->{TRACKNUM};
rename($filename, $filename.'----'.$tracknum.'.mp3');
}
だから、どういう風に文字化けするのかと
557 :
デフォルトの名無しさん :2006/02/19(日) 20:50:11
ファイルの最終更新がローカル時間で今日より以前に作られたものかどうか判定したい。 一番簡単だと思うのが今日の始めのエポック秒と比較すると思ったのだが、その 計算がこんなふうになった。 もっとスマートな方法ある?localtimeとgmtimeを 呼ぶのが醜い気がするのだが、他に時間帯情報を得る方法あります? use integer; $now = time; my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($time); my ($gsec,$gmin,$ghour,$gmday,$gmon,$gyear,$gwday) = gmtime($time); my $startofday = $now / 86400 * 86400 + ($hour - $ghour) * 3600;
>>557 あ、途中の$timeは$nowの間違い
560 :
557 :2006/02/19(日) 21:39:53
>>559 あ、なるほど。 こんな感じかな?
my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
$startofday = timelocal(0, 0, 0, $mday, $mon, $year);
>>557 「今日」より前か。昨日作ったファイルだったら、なにかしたいわけか。
うーん、むずいなぁ。こんなんでどう?
my ($sec,$min,$hour) = localtime(time);
$kyou = time - ($sec+$min*60+$hour*60*60);
print $kyou > (stat($filename))[9];
テストしてないけど
最終更新が今日かどうか判定するなら、年月日が同じかどうか比較するだけのこと
563 :
557 :2006/02/20(月) 01:57:35
>>562 そ〜〜〜〜〜〜〜りゃそーでしたね。 じゃ、これでいいか:
my ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
my ($sec2,$min2,$hour2,$mday2,$mon2,$year2) = localtime(time);
if ("$year$mon$mday" eq "$year2:$mon2:$mday") {
}
564 :
デフォルトの名無しさん :2006/02/20(月) 02:18:20
判定条件逆じゃね? 「今日の場合の処理」になっとる。 my ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime); my ($sec2,$min2,$hour2,$mday2,$mon2,$year2) = localtime(time); if ("$year$mon$mday" ne "$year2:$mon2:$mday") { #昨日以前の場合の処理 }
565 :
564 :2006/02/20(月) 02:28:48
しかも if 文間違いを継承・・・orz my ($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime); my ($sec2,$min2,$hour2,$mday2,$mon2,$year2) = localtime(time); if ("$year$mon$mday" ne "$year2$mon2$mday2") { # 昨日以前の場合の処理 }
567 :
557 :2006/02/20(月) 02:57:57
>>566 なんか見落としてました。 そうですね、localtime呼び出しも一回だけで一番
単純な論理で書かれてますし、無駄な変数が0。 これで決定版ということにします。
my ($mday,$mon,$year) = (localtime(time))[3,4,5]; こうするとスマートかも
localtime(time)は単にlocaltimeでおk
並べるときは対応させた方がパッと見わかりやすいことがある
eucを一文字ずつ切り分けたいのですが どのようにすれば良いですか? split(//)じゃ駄目ですよね。
572 :
デフォルトの名無しさん :2006/02/20(月) 13:19:41
Perl5.8以上ならバイト列を文字列に変換して splitでいけるよ
>>572 ,573
ありがとうございます
参考にして少しやってみます。
String::Multibyteなんてのもあるね my $mbcs = new String::Multibyte 'EUC_JP'; my @splited = $mbcs->strsplit('', $euc_text);
$ echo $LANG ja_JP.eucJP $ perl -e 'use encoding "euc-jp"; $s="ほげほげ"; @s = split //, $s; print join("", map {"$_\n"} @s);' ほ げ ほ げ $
requireされているソースのパスをすべて列挙する方法は無いでしょうか? a.pl ---------- require "b.pl"; <ここで列挙させたい> b.pl ---------- require "c.pl"; require "d.pl"; 希望の実行結果例 c:\>perl a.pl c:\perl\my\b.pl c:\c.pl c:\d.pl よろしくお願いします。
print join("\n", values %INC);
580 :
577 :2006/02/20(月) 16:49:53
ズバリのご回答、ありがとうございました。
581 :
デフォルトの名無しさん :2006/02/20(月) 22:57:06
変数に全角文字が含まれないことを調べるにはどうすればいいですか?
全部半角かどうかチェックする
>>582 ありがとうございます。
私もそう思ったのですが、それはどうすればいいですか?
>>583 半角ったって英数字空白以外が20〜30くらいだろ。
力技で正規表現書けばいいんじゃね?
Jcode.pm つかっときな
>>585 Shift_JIS とかだったらちょっと面倒かも。
通常のキーボードから通常の手順で入力されるいわゆる半角文字と同じ文字コードだけから構成される Shift_JIS文字ってあるの?
ないよ
590 :
デフォルトの名無しさん :2006/02/21(火) 01:34:55
質問させてください。 qmail+LDAPでメールサーバを立てようと思っています。 アカウントごとにLDAPのパラメータとしてID・mailaddress・objectclassをPerlを用いて一括登録し、 その後にIDを引数にmailaddressを取得したいのですが、それまでに登録されたパラメータを取得するための 何かよい方法はないでしょうか? よろしくお願いします。
>>587 NEC拡張の2バイト半角文字の事かっ!
それを考慮しても、Shift_JISよりユニコードのほうが面倒な気がする。
半角文字が、ASCII+JIS X 0201 や ISO-8859-1 だけなら楽だけど。
Net::LDAP でも DBD::LDAP でも Tie::LDAP でも好きなモジュール使って検索すればいいんじゃない。
593 :
デフォルトの名無しさん :2006/02/21(火) 02:57:07
>>581 エンコードが何かによってやることが少し変わるかも。
但し Perl 5.8.x で use encoding での指定が適切にされているならば
正規表現の [] の中にあなたが半角だと強く信じる文字を入れて
パターンマッチさせればいい。
594 :
デフォルトの名無しさん :2006/02/21(火) 06:37:09
perl -MCPAN -e shellしてるんだが、 MIME::Toolsがインストールできないのはうちだけ? インストール時のテストでエラーが出る。 > install MIME:Tools って打つと、結構沢山テストに失敗してる。 t/Misc..............FAILED tests 4-5, 7-11 Failed 7/14 tests, 50.00% okay t/ParserEncoded.....ok 4/5 # Failed test 'Decoded MD5 match' # in t/ParserEncoded.t at line 53. t/ParserEncoded.....NOK 5# Looks like you failed 1 test of 5. t/ParserEncoded.....dubious Test returned status 1 (wstat 256, 0x100) DIED. FAILED test 5 Failed 1/5 tests, 80.00% okay OSはCentOS4.2のx86_64版。 同じような状況の人いますか?
>>594 Makefile.PLの中の %modulesにリストアップされているmoduleは全部入ってる?
596 :
594 :2006/02/21(火) 09:12:59
>>595 > install MIME::Base64
したらエラーが出なくなったよ。ありがとう。
yumみたいに依存性があるモジュールは全部インストール
してくれるのかと思ってたんだけど、ちがったのね。
>>596 perlのばやいmodule名とdistribution名が一致しないものがあるからさらにややこし。
MIME-tools自身もそうだし、要求されているMail::なんちゃらもMailtoolsで配布されてるし。
誰かCPANモジュールとPPM-Makeを改良してくれる香具師いないかな<他力本願モードw
5.8.8 ってどんなぐあいでしょうか?
599 :
デフォルトの名無しさん :2006/02/21(火) 14:57:24
my $AAA = $BBB->get_value('CCC'); CCCが存在しない時に、 Can't call method "get_value" on an undefined value at ./programname.pl line 行数 とエラーが表示されます。 データが存在しない時には 「データが存在しません」というメッセージを表示させて例外処理としたいのですが、 どのように書けばいいのでしょうか?
見たか!俺は600! 俺は至高!俺は吉良上野介! 俺は吟遊詩人!俺はホス○タル騎士団 俺はシャン○リ○通りの達人!俺はラザ○エフ商会 俺は
ーーーーーーーーーーーーーーー ここまでOK はい、次の質問。
>>599 エラーよく読め。それはCCCが存在しないのではない。
$BBBがundefになってる。よって$BBBがdefinedか調べればよい
603 :
599 :2006/02/21(火) 16:24:57
>>602 さん
レスありがとうございます。
おっしゃる通り、BBBに値が入っていませんでした。
きちんとデバッグできていなくてすいませんでした。
>my $AAA = $BBB->get_value('CCC');
この文を実行する前に、BBBの判定を行ってブレイクを挟もうと思うのですが、
今、BBBにはデータが何もはいっていません(printすると何も出力されず)
これを判定するためにはどのようにすればよろしいのでしょうか。
if($BBB=0) ? if($BBB=" ") ?
空白の判定のやり方がわかりません。
すいませんがご教授お願いします。
教授じゃないから無理
その状況で OO しようというのはものすごいチャレンジングな気がする。
パールでプロトタイプオーオー? OZが完成させていたのか。
>>603 掲示板で他の人を使うのではなく
きちんと本を読んで基本から勉強しましょう
>>603 とりあえず、ifの中では「==」って覚えとけ
609 :
598 :2006/02/21(火) 16:42:41
まだ使ってる人はいないか・・・
611 :
599 :2006/02/21(火) 17:08:35
すいません、レスありがとうございます。
if( $BBB == undef){ エラー処理 }
でひとまず動きました。
本日初めてPerlを使用したのと時間が押していたので焦って落ち着いて探せませんでした。
ご迷惑をおかけしました。
>>607 さん
おっしゃる通りです。以後気を付けます。
>>608 さん
ありがとうございます。
>>610 さん
助かりました。
ありがとうございました。
>>611 このケースはそれでも動くと思うけれど正しくは
if (!defined $BBB) { }
と書く。==は数値の判定に使うもので未定義値の判定には使えない。
ちなみに文字列の判定にはeq等を使う。
613 :
599 :2006/02/21(火) 17:34:58
>>612 さん
なるほど・・・
了解しました。勉強なります。
ありがとうございました。
質問なのですが、 一度useしたモジュールを取り消したいのですが可能でしょうか? no というのはあるようですが、あんまり意味ないみたいです。 具体的に書きますと、 常駐して再起動できないアプリケーションがあるのですが、 どうも特定の例外が起こった際に、overloadが壊れるみたいなのです。 これを復元するためにもう一度コンパイルしなおしてやればいいかな と思ったのですが、 一度useされているものは再びuseはしないようなので困っています。 (Class::DBIをmod_perl上で使っているときに発生するoverloadのバグのことです)
>>614 一応%INCから消してやれば再度読み込ませることはできるけれど、
useはスクリプトの解釈と同時に処理されるので注意。
具体的にはeval内でuseするとかrequire+importするとか
%INCから消せば再require;importは可能だけど、それまでの結果まで取り消す訳 じゃないから何が起きるやら。 再現条件不明のトラブルを抱えたくないなら、「再起動できない」をどうにかする方が 無難だと思う。
>>615 delete $INC{$_} foreach(grep($_ =~ /^Class\/DBI/, keys(%INC)));
といった感じでINCは消してみたのですが、
大量に sub routin **** is redefind. ってでます。
overloadのバグは直せていないので、読み込めていないようです。
具体的には↓な感じでやっています。
foreachのスコープでeval useが他に効かなくなっている。 とかないですよね・・・?
my @cdbipkgs = grep($_ =~ /^Class\/DBI/, keys(%INC));
delete $INC{$_} foreach(@dbipkgs);
foreach(@dbipkgs) {
$_ =~ s/\/::/g;
$_ =~ s/\.pm$//;
eval("use $_;");
}
>>617 すみません 3、4行目
Subroutine ***** redefined at ****** 26. ってでますが、overloadは直せていないようです。
の間違いです。
(´-`).。oO(なんてディストリなんだろう・・・> /Class/DBI/)
620 :
614 :2006/02/21(火) 20:05:27
>>619 Class::DBIなのですが、
%INC中では Class/DBI.pm といったように登録されているようです。
>>591 あったなぁ、2バイト半角(w。
PC-98のフォントでは、MS-DOS上で普通の半角より微妙に見栄えが良かったから、
あの頃はみんな良く使ってたな。
622 :
614 :2006/02/21(火) 23:50:16
その後 %Class::DBI:: にもハッシュ構造で関数等登録されているようなので、
undef %Class::DBI::;
してみましたがやはりClass::DBIのoverloadのバグは塗りつぶせないようです・・・
>>616 確かにその通りですね。
実際再起動が不可能なわけではなく、時間がかかるだけなのですが、
再起動が必要な状況かどうかを判断するのが人の目しかない状態でして・・・
もし塗りつぶせればサービスを止めずにすむな、と思った次第です。
>>622 そもそもoverloadが何やってるか調べたの?
625 :
614 :2006/02/23(木) 00:48:58
>>624 レスありがとうございます。
これですね。
use overload
'""' => sub { shift->stringify_self },
bool => sub { not shift->_undefined_primary },
fallback => 1;
オブジェクトがスカラー評価された際にPrimaryKeyの値を返す
と認識しておりましたが、違いますでしょうか?
>>625 624は、overload.pmが何やってるか調べたのかって聞いてる気がする。
力で押すつもりなら最初に確認する筈のところだから、念の為の確認だと思うけどね。
で、そのoverloadの認識も(この場合は)間違い。正しくは、
オブジェクトが文字列として評価されたら、メソッド stringify_self の戻り値を返す。
になる。
言いかえると、「文字列評価したときにstringify_selfが呼ばれなる状態が、overloadが
正常な状態」と認識しておくのが無難。
627 :
614 :2006/02/23(木) 14:55:38
>>626 なるほど。 ありがとうございます。
ちなみにですが、mod_perlでoverloadが壊れたときは以下のようなエラーが出ます
Operation `==': no method found,
left argument in overloaded package MyClassDBI::MyTable,
right argument has no overloaded magic at ~/MyApp/HogeHoge.pm line 105.
use utf8としてUTF-8でソースを書いた場合length関数の戻り値は文字数になるようですが、 バイト数を知りたい場合はどうすればよいのでしょうか? 例えば print &bar('Japanese'); print &bar('日本語'); sub bar($) { $s = shift; return $s . "=" x (80 - length($s)); } 等とすると 「日本語===========〜」 の方は83バイトになってしまいます。
629 :
デフォルトの名無しさん :2006/02/23(木) 17:54:12
もうutfとかencodingプラグマ廃止しろよ
ああ……Perlの面白くも楽しいバッドノウハウ迷宮から人々を解放すると、 プログラミング界にどれほど豊饒な実りがもたらされることか……
案外変わらない
Encode.pmのエンコード変換の仕組みを御存じの方いらっしゃいますか? iso-2022-jpへのコンバートはEncode::JP::JIS7に書いてあるのですけど、他 のエンコードへのコンバートについてはコードが書いてあるファイルを発見で きませんでした。
encodeとdecodeのメソッドを実装すれば新規にエンコードを追加できる ことから、shift-jis->euc-jpでは shift-jisをデコード==>euc-jpへエンコード という流れかと推測しているのですが。 jcode.plみたいにshift-jisから演算で直接euc-jpに変換はしていないの かと。どうなんでしょうか?
ズギューン
ズキュゥゥゥン
ドキュメントとかマニュアルって何? PHPマニュアルみたいなものがあるの?
>>640 > ドキュメントとかマニュアルって何?
> PHPマニュアルみたいなものがあるの?
あなたのディスクに全部入っているはずです。
>>640 1. まず前準備として、英語がよく分からない場合は電子辞書を買うなり
PCに辞書入れるなりしてすぐに英文を理解できる体制を整えろ。
2. perldoc perl と打て。
3. 終了。
645 :
デフォルトの名無しさん :2006/02/23(木) 21:43:22
perldoc perlでググれってこと?
647 :
デフォルトの名無しさん :2006/02/23(木) 21:48:31
>>646 1. まず前準備として、ロープを買え。
2. 回線切って首を吊れ。
3. 終了。
649 :
614 :2006/02/23(木) 21:54:44
>>646 きみWindowsユーザ?
コマンドプロンプトって知ってる?
my $temp = aho; $temp && baka, chinko $temp; こんな処理を一時変数無しでやることってできますかね? できたからってどうってことないと言えばどうってことないんですが…気分的に 返ってくる値が true のときだけ事前処理をしたいんです
_no<残ってたぁ
652 :
デフォルトの名無しさん :2006/02/23(木) 21:56:09
コマンドラインで perldoc perl と入力(もちろんリターンorエンターも) perl に関するドキュメントファイルの紹介文が ずらずら表示されるので、それを読んで 自分が知りたい情報が含まれていそうな ドキュメントの名前を確認 仮に、perlrun というドキュメントが臭うと思ったら perldoc perlrum と入力(もちろんリターンorエンターも) すると目的のドキュメントが表示される なんで、こんなこと書かなきゃならんのさ
$ perldoc Acme::MorningMusume No documentation found for "Acme::MorningMusume".
>>625 overload.pmを見てみそって言いたかったんだけど、その感じだと見てないよね……。
そーいやApacheとmod_perlのバージョンを聞いてなかった。
どれ?
#僕はその現象にあたったことがないんで、参考までに。
>>655 overload.pmはろくに見ていませんでした_no 読んできます・・・
perlは5.8.2と5.8.6 apacheは2.0.55 mod_perlは2.0.2です。
開発はCatalystでやっているのですが、Catalystのテストサーバーでも発生します。
Catalystのバージョンは5.57, 5.63 5.64, 5.65 で発生を確認しました。
Class::DBIは v3.0.12〜v3.0.14まで試しましたがすべてで発生するようです。
再現の方法としては、Class::DBIを使ってDBI中でdieするようなSQLを書くと
(たとえばintに対してtextでselectする等)それ以降、
my $data = MyCDBI::Table->retrieve(1);
if($data == 1) {
等とやった場合に、「if($data == 1) {」この部分で
>>627 のエラーが発生します。
発生した際に調べたところ、Class::DBIの作者自身「何でだろうね?」と言っているバグのようです。
(一緒に調べていた仲間がその記述を発見したため僕自身は確認しておりません)
overload.pm を見るには perldoc overload ソースも見るには perldoc -m overload
>>656 ちなみに、自分で似たようなクラスを作って
overloadした場合は問題なしなの?
「Class::DBIのバグ」と書くからにはとーぜんやってるんだとは思うけど、
念のため。
>>658 自分でoverloadを使ったクラスを作ってみたんですが、
再現することはできませんでした。
SQL間違わなければOKという問題じゃないの?
>>660 確かにOKなのですが、
SQLも動的につくったりしてるために万が一発生するとシステムがダウンしてしまうのです。
DBがOracleだったりする?
PostgreSQLです
知りたかったのはfrom_toの実装でした。実はperlは殆ど触ったことがなく なんとなく読めるかなというレベルです。Encode.pmの実装に興味があった のでお尋ねしております。 Encode.pmのソースを読むとfrom_toでは$Encoding{name}->encodeと $Encoding{name}->decodeの組合せで実装されていることが判かりました。 しかし、$Encode{name}がどこで作られているのかが今だ判らない状態です。 Encode/JP/Makefile.PLにその節があるように思えるのですがよく判りません。
666 :
デフォルトの名無しさん :2006/02/24(金) 02:58:04
RHEL4ってPOSIXモジュールは最初から入ってますか? 手元で実験しているうちにどのモジュールが最初から入っていたのか 分からなくなってしまいました。 自分でperl -MCPANしていれたんだっけなぁ・・・。
>>666 RHEL4は触ったこと無いがRHだからRPMでしょ
rpm -ql perlでパッケージに含まれていたファイル一覧が出てくるかと
あほくせー質問だな カスな質問はWeb板でやれよ foreach (@INC){ print "$_\n"; } でもすりゃわかる問題だろ
>>668 質問内容を良く読みましょう。
RHEL3は標準で入ってました。
>>666 /usr/lib/perl5/5.8.x/ に標準モジュール、
/usr/lib/perl5/vendor_perl/ に RPM パッケージ、
/usr/lib/perl5/site_perl/ にそれ以外が入っている。
標準モジュールのヴァージョン違いを入れると
/usr/lib/perl5/5.8.x/ のを上書きしたり
/usr/lib/perl5/site_perl/ に入ったりする。
671 :
666 :2006/02/24(金) 14:16:02
レスありがとう。標準で入ってたのね。 なんか、違う環境で cpan> install POSIX したらコンパイル始まって超焦ったのよ。
ってかコマンドプロンプトってなに
コマンドを知らずにボクらはうまれた〜
675 :
デフォルトの名無しさん :2006/02/24(金) 15:29:19
質問すー。 Perlソースコードの中のコメントを全て削除して すっきりさせるコード整形モジュールってありますか?
Perl::Tidy --delete-all-comments か?使ったことないんでよくわからん
>>672 こちらの釣り堀は閉業しました〜さよなら〜〜
YAPC::Asia 2006がSOLD OUTなんだと、へぇーーてな感じ
言うなよ!絶対言うなよ!
プログラミングに直接関わることではないんですけど、 オライリーの英語版ページをみていたら、 「Perl Best Practices」Damian Conway著 というのがあったのですが、 らくだ本読んでればこれはいらないですか? 出たのが2005/07ですから、 perl本にしては新しいのですが。 #さらに、近々同じ著者が「Perl Hacks」とか いうのも出すみたい。 つくづく日本語圏に生まれたことを後悔してます
>>680 Damian Conwayが誰か調べてみて決めてみるといいと思うよ
ありますよ
>>680 > 「Perl Best Practices」Damian Conway著
>
> というのがあったのですが、
> らくだ本読んでればこれはいらないですか?
「いる」本などひとつもない。
# 『実用Perlプログラミング第2版』の翻訳出るけどね。
>>680 以前Object Oriented Perl買って読んだけどまぁまぁだったな。
買って読んで講評をここでして呉れ給え。
Perl関連書籍日本語版は訳のヘボさとリリースの遅さには定評があるね。 TTの訳本欲しいよう。
訳のへぼさはどうでもいいw 索引だけはしっかりしてくれ。 原書にある索引を飛ばして、どうでもいい「BASIC」を入れた馬鹿どうしてるかなw
Conwayってよろしくやるって事ダロ
救命病棟よりは買い > Perl Best Practices
そのうちこんな本が出たり・・・ Business Hacks ・株価の上げ方 ・投資会社の作り方 ・逮捕されないために ・脱税の仕方
想定内です
693 :
680 :2006/02/25(土) 05:24:13
>>689 救命病棟は当時は久々のperl本でしかもnaoya氏が監修とかいうことで
ほくほくと買ってみたが・・・まぁ、なんというか、ね。
694 :
680 :2006/02/25(土) 05:31:58
連投ごめそ。とりあえず買ってみることにしました。
目次みた限りではこれまでの本との違いがよくわからない。
>>686 欲しいですよねぇ。他にもMasonだとかmod_perlの本も
海外オライリーはあるんだよね。mod_perlはWebで全部読めるのだけど、
一日3ページくらいが限界です・・・
#perlと関係ないんだけど、海外オライリーに
Subclassing and Hooking with Visual Basic
なんてのがあった。異色作?
Perl Best Practice 良いんじゃないかな。いくつか納得いかない点もあるが, 多人数でスタイルを統一するときはとりあえずこれを標準にしてます。PPI モ ジュールを使って,このスタイルに適合してるかチェックするPerl::Critic モ ジュールもイイ。
696 :
680 :2006/02/25(土) 14:36:40
>>695 ありがとう!じゃぁこの本はテクニックというよりコーディング規約みたいな本なのかな。
Navi2ch (Emacs) で fill してるとみた。
「ジュール」っていう便利なツールかライブラリがあるのかと思ったよ
Data::Dimensions でジュールが使えます どうでもいいですね 仕事に戻ります
ジュールについて
熱だよね。熱
Perlの団塊。
Perl6っていつ完成予定なの? なんか2chで作者が金を使い果たしたとか書いてあるけどデマだよね? ラリーウォールってオライリーの社員だから金はあるはずだよな? オライリーは資金提供してないのかな
706 :
デフォルトの名無しさん :2006/02/25(土) 18:16:43
PerlでOOPやっているのですが、 staticなメンバ変数ってできますかね?
>>706 Class::Data::Inheritable とかかな?
(メンバ変数と言われてもピンとこない駄目っぷり)
>>704 LarryはとっくにO'Reilly解雇されてますが
Perlって単体で実行可能な実行ファイルにコンパイルできないのでしょうか? 会社でちょっとしたツールつくっても人に配るときに、Perlインストール してもらうのは手間で。
ひとつのカキコでPerlとPerlを混ぜて書いちゃうようじゃ無理だね
初歩的な質問ですみませが、 for (my $i = 0; $i < 10; $i++) { sleep(1); print $i . " "; } とした場合、10秒待ってから一気にprintを実行してしまうのですが、 これを1秒毎に実行させるにはどうしたら良いですか? Perlは今週習い始めたばかりの超初心者です。
>>712 解決しました。どうも有難うございました。
Perlの特殊変数ってややこしいですね。
715 :
デフォルトの名無しさん :2006/02/25(土) 22:57:44
ファイルの内容を、1個のスカラ変数に読む方法って、どうやるのが普通ですか? 現在は、こんな風に書いてます。 open FILE, "<:encoding(utf-8)", "file.txt" or die; while (<FILE>) { $content .= $_; } close FILE; ループで、一行ずつ連結していく方法よりも、もっとすっきりと書く方法ってありますでしょうか。
716 :
デフォルトの名無しさん :2006/02/25(土) 23:14:23
>>715 ファイルは普通の言語はread関数でバッファ変数に読み込む
だからread関数をググルかマニュアルで調べたらすぐわかる
whileで読むのはPerlぐらいか?
717 :
デフォルトの名無しさん :2006/02/25(土) 23:16:25
Windows環境なんですがPerlのコードをインデントしたり整形してくれるエディタって どんなのがありますか? TerapadとかXyzzyだと適当に書いてると整形せずにゴチャゴチャになるし VS2003みたいに文章をカットアンドペーストしたら自動的に整形してくれるような エディタがほしいんだけど。
>>717 xyzzyでゴチャゴチャになるってどんな書き方してるんだ…
一応 M-x indent-region で整形されるけど、望みの手軽さではないんだろうな
>>716 while()はただのループ。
一行読み込み処理をやってるのは、<FILEHANDLE>の方。
C言語の一行毎の処理はPerlと似ている。
while( fgets(buf, n, fp) ){
// なんらかの処理
}
720 :
709 :2006/02/25(土) 23:39:11
>>714 ありがとうございます。
PARで検索したら、やり方などが出てきました。
721 :
715 :2006/02/25(土) 23:49:06
>>716 すみません具体的にはどういう風に書けばいいですか?
read を使う場合、あらかじめファイルサイズが分かっていないと、
「全部読む」は出来ないと思うのですが、その点は合ってますでしょうか。
こういうことでしょうか。
$size = -s $filename; #あらかじめファイルサイズを調べておく
open FILE, "<$filename";
read FILE, $content, $size;
close FILE;
>>715 readで読む方法が人気のようだけど漏れは$/をundefする方がPerl的だと思う。
open my $fh, $filename or die $!;
undef $/;
my $content = <$fh>;
close $fh;
724 :
デフォルトの名無しさん :2006/02/26(日) 01:22:30
$buf = `cat $file`;
open my $fh, $filename or die $!; my $content = join("\n", <$fh>); close $fh;
回答者も初心者。
>>725 その場合join '', <$fh>じゃないとまずくね?
728 :
デフォルトの名無しさん :2006/02/26(日) 01:39:39
この初心者臭いスレがなぜム板にあるの? WEB板が嫌ならネットワーク初心者に移れよwww
約10KBのファイル Benchmark: timing 5000 iterations of join_t, read_t, undef_t, while_t... join_t: 4 wallclock secs ( 2.86 usr + 0.87 sys = 3.73 CPU) @ 1339.05/s (n=5000) read_t: 8 wallclock secs ( 2.03 usr + 4.92 sys = 6.95 CPU) @ 719.01/s (n=5000) undef_t: 2 wallclock secs ( 0.23 usr + 0.86 sys = 1.09 CPU) @ 4574.57/s (n=5000) while_t: 2 wallclock secs ( 0.95 usr + 1.00 sys = 1.95 CPU) @ 2558.85/s (n=5000) 10MB Benchmark: timing 10 iterations of join_t, read_t, undef_t, while_t... join_t: 22 wallclock secs (20.28 usr + 0.48 sys = 20.77 CPU) @ 0.48/s (n=10) read_t: 10 wallclock secs ( 2.77 usr + 6.61 sys = 9.38 CPU) @ 1.07/s (n=10) undef_t: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) (warning: too few iterations for a reliable count) while_t: 1 wallclock secs ( 1.36 usr + 0.22 sys = 1.58 CPU) @ 6.34/s (n=10) ちなみに、'<' . $filenameよりも"<$filename"の方が見やすくて早いです><
730 :
デフォルトの名無しさん :2006/02/26(日) 02:51:19
ていうかファイル読むだけなら '<' は省略可。
>>729 乙
joinはありえないね。ファイル大きくなると。
配列できてから繋ぐんだから。
スクリプト言語の弱点はループなので while も遅い。
whleのソースが
>>715 みたいのだと、スカラの連結で更にコストがかかる。
undefするのが一番低レベルでガバッと読んでる事になると思う。
readは何でだろね。Cにそのまま渡ってる訳じゃないからかなぁ。
732 :
デフォルトの名無しさん :2006/02/26(日) 02:57:56
>>722 の方法は、OSがUNIXなどで、開いたファイルが普通のファイル
ではなかったときに何も読めずに終るかも知れない (-s の時の内部での
stat() が失敗するかも知れない)。
>>723 なら大丈夫だと思うが、なんと
なく可読性悪い感じしない? Perl 的といえば Perl 的だが。
>>689 まぁそんなもん。全員がこれに従えばかなり統一感がでるし,宗教戦争も未然
に回避できる。おーざっぱな構成は,まずベストプラクィスがきて,良い例,
悪い例,なぜ良いか?なぜ悪いか?の説明。
--------------------------
2.2 キーワード
制御キーワードは続く開き括弧と分離せよ
○イイ while ($min < $max) {
×マズー while($min < $max) {
理由:見やすいから
--------------------------
まぁ,ある程度の Perl ハカーでDamian を知らない奴もいないだろうから,多
少不満があっても皆従うしな。逆に「Damian ? ダレそれ?」とか「俺スタイル
のほうが絶対いい」ってやつは半可通か協調性ないやつなのでプロジェクトか
らは外すが吉。
>>697 698 の言うとおりす
>>729 235,146bytesのファイル
Benchmark: timing 5000 iterations of join_t, read_t, undef_t, while_t...
join_t: 28 wallclock secs (23.09 usr + 4.77 sys = 27.86 CPU) @ 179.47/s (n=5000)
read_t: 7 wallclock secs ( 3.02 usr + 3.31 sys = 6.33 CPU) @ 790.14/s (n=5000)
undef_t: 7 wallclock secs ( 3.52 usr + 3.56 sys = 7.08 CPU) @ 706.31/s (n=5000)
while_t: 15 wallclock secs (11.53 usr + 3.69 sys = 15.22 CPU) @ 328.56/s (n=5000)
timethese(5000,{
undef_t => sub {local $/;open my $fh, $filename or die $!;my $content = <$fh>;close $fh;},
read_t => sub {open my $fh, $filename or die $!;read $fh, my $content, -s $fh;close $fh;},
join_t => sub {open my $fh, $filename or die $!;my $content = join '', <$fh>;close $fh;},
while_t => sub {my $content = '';open my $fh, $filename or die $!;while (<$fh>) {$content .= $_;}close $fh;},
});
興味深いですなぁ
興味深くもなんとも無い
ひねくれてるなぁ
ひねくれてもなんとも無い
返信早w
これってwhileなんかは変数によっても変わらなかったっけ? my宣言されてるかとかlocal宣言されてるかとか スコープがループ内だけか外から続いてるかとか。
ベンチの結果貼ったときは、まとめというかコメント付けて欲しい。
>>741 特に要らんでしょ。
実行環境とコードってんなら、あれば参考にもなるけどさ。
ベンチは結果がすべて
なんでsysreadがない?
readとほとんど同じだろうな。freadとreadの差でしかないし、 この例だとバッファリングの恩恵はほとんど無いし。
>>731 たぶん、
>>729 のreadが遅いのは、WindowsやMac等を使って改行変換モード
でファイルを読みこんでいるから。
例えばWindowsだと、open $fh,'<',$file と open $fh,'<:raw',$file で
readの速度が20倍は違う。(ActivePerl 5.8.7)
perlでグラフ作成、しかも株価チャート図を作成できるモジュールってありませんか?
GD::Graphは知っていたんですけど、一発で表示させることは出来ないんですかね? Graphの機能を使って自分で作っていくしかないんでしょうか? もしそうだとすると、かなりの時間がかかってしまいますよね?
それが嫌なら金払って人雇えば
時間はかかるけどGraphで出来るということですね?
754 :
デフォルトの名無しさん :2006/02/26(日) 16:49:10
CPANで検索すると死ぬほどあるやん
CPAN利用したいんですけど英語がわからないので・・・ すいません。 辞書片手に検索してみます
(´・ω・)
>>748 win32 OLE でデータをExcelにはいて、グラフ作成させれば?
サブルーチンのデフォルト引数リスト@_は、サブルーチン内で いくら変更しても、実引数には影響を与えないということらしいのですが、 下記のようにやると、実引数が変更できてしまうのはなぜでしょうか。 @array = 1..5; func(@array); print "@array\n"; sub func{ for(@_){ $_ += 1; } }
>>759 >いくら変更しても、実引数には影響を与えないということらしいのですが、
あなたの聞いた、この噂が間違っています。
761 :
759 :2006/02/27(月) 00:27:12
そうですか。ではなぜ、
sub func{
shift @_;
}
のようなことをしても、実引数には影響ないのに、
>>759 みたいにすると影響があるのでしょうか。
何が違うのでしょう。
>>761 see "perlsub" manpgae.
The array @_ is a local array, but its elements are aliases
for the actual scalar parameters.
763 :
759 :2006/02/27(月) 00:36:57
う〜む、そういうことですか。 ありがとうございました。
まぁ、この辺は確かにPerlの微妙な所だよね。
ちょっと分かりにくい。
foreach とかでの要素変更もそうだけどさ。
>>759 では、引数をそのまま for ループに渡してる。
このループでの要素変更は、元要素の変更になる。
ということで
結局サブルーチンに渡した配列要素が変更されちゃう。
Perl6 になれば、in と out で明示的に指定できるから幸せになれるはず…
perl6かぁ。。
オルタも出たし、あとはPerl6だけなんだけどな。
Perl6ってそんなにリリースせまってるの? でないんじゃないかって話もあるくらいで。
Perl6ではPerl5で動いてたスクリプトが動かなくなるって本当ですか?
何か->が.になって.が~になるってどっかの本に書いてあったなあ 正規表現もかなり変わるらしい
771 :
デフォルトの名無しさん :2006/02/27(月) 05:15:33
>>769 なるらしいよ。文法の互換性を捨てるとか。
実行環境も Java みたいに仮想マシン上で動くようにするらしい。
するとやはりそのうち Perl 5 をその仮想マシン用バイトコードに
コンパイルして動かすやつが出て来るだろうな。
そしてあらゆるOSで仮想マシンが動くようになったら世界征服完了。
>>771 > Perl 5 をその仮想マシン用バイトコードに
Ponieってプロジェクト名で既にやってる。
perl5上でPerl6::*モジュール群を使うとPerl6風味が楽しめるよ
>>771 Perl5 も仮想マシン用バイトコードにコンパイルしてから動いている件について
6が出ようが出まいが、今はどうでもいいが 6は何が変わってくるんだ? コンパイル出来るとかだったら嬉しいけどな。
>>774 perl5でもできる(やってる)わけだが、
コンパイルできると何が嬉しいんだ?
man perlcompile
,-┐ ,ィ─、ri´^-─- 、 .┌f^f^f^f^f^f^f^f^f^┐ く / , ,' ヽ ヽ| ~ ~ ~ ~ ~ ~ ~ ~ ~│ `<' / ,'レイ+tVvヽ!ヽト 知ってるが │ !/ ,' i |' {] , [}|ヽリ お前の態度が | `!_{ iハト、__iフ,ノリ,n 気に入らない | // (^~ ̄ ̄∃_ア____n_____| _r''‐〈 `´ア/トr──!,.--' <_>─}、 `」レ 'ヽ、 ,.ヘーァtイ Y、.,___/ |.| | i `ー'i´
何これ。
澪
質問なのですが、次のプログラム、
print "\x0a";
は、1バイト出力すると思ったのですが、
実際にやってみると2バイト出力します。
環境によって違ってくるものなのでしょうか。
かんきょー:
win98
C:\My Documents>perl -v
This is perl, v5.8.7 built for MSWin32-x86-multi-thread
(with 14 registered patches, see perl -V for more detail)
Copyright 1987-2005, Larry Wall
Binary build 815 [211909] provided by ActiveState
http://www.ActiveState.com ActiveState is a division of Sophos.
Built Nov 2 2005 08:44:52
781 :
デフォルトの名無しさん :2006/02/27(月) 23:50:14
binmodeにすれば良いんじゃないの?
782 :
780 :2006/02/28(火) 00:09:51
binmode STDOUT; print "\x0a"; これでちゃんと1バイト出力するようになりました。
今、ラクダ本等を買い込んで必死に5.8勉強してるのに、6になったら 互換性ないとか、いろいろ変わっちゃうとかで、むなしくなるな・・・。
perl6が出ても当分Perl5は使われ続けると思うけどね CPANにあるライブラリの山はponieでParrotのコードに変換して perl6から呼ぶって感じになるんだろうか
>>783 > 今、ラクダ本等を買い込んで必死に5.8勉強してるのに、6になったら
> 互換性ないとか、いろいろ変わっちゃうとかで、むなしくなるな・・・。
5系と6を使えるようになるからいいじゃん。
そもそも5が終わりそうなこの時期にCGIはいまだに4だったりするだろ。 まだ心配する必要はないし無駄にもならない。
まるっきり別物になるわけじゃないし、勉強しといて損はないと思うよ。
習得するのに何週間もかかるわけじゃあるまいし、 あれもこれもやっとけ。
6が出ても5でコンパイルできるなら問題ない。
業務での置き換えは相当な時間がかかるから問題ない。 まずそのために予算取らなきゃいけないし。
Perl6 かぁ…とか思って、parrot をインスコして pasm や PIL を書いてたら 楽しくて仕方がない。
5.8はあと3年ぐらいは主流だと思うけどなぁ 楽観しすぎ? いまだに5.005_03な鯖も生存していることだし
以下のコードで##の部分がどういう処理なのか理解できません。 続、初めてのperlという本に載っていたサンプルコードです。 どなたかご教授願えませんか? my @input = qw(Gilligan Skipper Professor Ginger Mary_ann); my @sorted_positions = sort { $input[$a] cmp $input[$b] } 0..$#input; my @ranks; @ranks[@sorted_positions] = (0..$#sorted_positions); ##この部分 print "@ranks\n";
つか、まったく別物だしPerl6普及しないと思うんだが…
>>794 俺もそう思う。
oopなら先発のpythonやrubyのほうがこなれてるし、レガシーに関数で
ごりごりやるなら5.8xでOKだしなあ。
マイナーアップでencoding周りをもちっと洗練されてくれば6イラネ。
/bin入りを果たしてsedやawk、shスクリプトに置き換わるためにも
このまま枯れて欲しい。
デフォでuse strictなんだっけか。 今のPerlの位置から遠ざかりRubyとかpythonの位置になりそうだね。 ある程度のPerlerにはそんなこと関係ないけど。
797 :
デフォルトの名無しさん :2006/03/01(水) 12:29:16
>>795 > マイナーアップでencoding周りをもちっと洗練されてくれば6イラネ。
> /bin入りを果たしてsedやawk、shスクリプトに置き換わるためにも
> このまま枯れて欲しい。
現実には、Perlスクリプトがバイナリやshスクリプトに置き換えられているけどな。
Perl6ってコンパイル必須なの? Perlはプリプロセッサっていうのも売りのひとつだと思うんだけど、そんなんで普及するのかね。 いちいちコンパイルさせられるんだと、コマンドラインから使いづらい気がする。 5系と6系で別々に開発進んで欲しい。
>>793 @ の変数に $# 付けた場合は添字の最大値。
my @a = (1, 2, 3); の場合 $#a は 2。
>>793 >>799 じゃ説明足りないか。
で、0..$#sorted_positions の .. の部分はリストを作る演算子で、
たとえば 5..8 というのは (5, 6, 7, 8) と同じ。
なので問題の部分は 0 から $#sorted_positions までのリストを
作る。$# については
>>799 の通り。
>>800 $#とリスト演算子は2行上にも出てきていてそちらは理解している
というのだから、わからないのはスライスじゃないか?
>>801 あ、そうか。スライスか。
でももうめんどくさいから解説は君に任せた。
「スライス」というキーワードがわかったんだから、 「perl スライス」でぐぐりゃ解説ぐらい探せるだろう。
>>803 おおお、
>>793 じゃないですが、スライス知らなかったので勉強になりました。
ぐぐったらトップにスライスの解説が出てきました。
>>793 に変わってありがとうございます。
>>798 基本的には parrot で動くインタプリタ。
まったく同じソースから parrot のライブラリとか、必要なものをリンク
すれば実行ファイルも作れる。
ラクダ本買おうかな・・・
807 :
793 :2006/03/01(水) 20:41:59
すいません、ありがとうございます。 配列スライスは @array1[@array2] みたいな書き方もできるのですね。 もう一度、スライスについて説明した 項目を読み返してみます
perl使うくらいならsmalltalk使う。 ちょっとまともな奴ならperlで組もうとは思わない。
えー、smalltalk環境が…。 だったらsmalltalkっぽいRuby使うよ。
今ナウなのはhaskellじゃないの?
Rubyはもうちょっとレンタル鯖とかで普及してくれればなぁ。 稀にSolarisの仕事とかやるとPerlは入ってるけど、Rubyは入ってないんで萎える。 Perlは結構、どこの環境でも動かせるので気に入ってる。
812 :
デフォルトの名無しさん :2006/03/01(水) 22:42:26
webを参考に、perlを書いているのですが わからない所があるので質問させてください。 system('netstat');で実行したプロンプトの内容をperlにテキスト形式で取り込んで整形する事は可能でしょうか? 例えば、下記の方法では $name = system('netstat'); 0が返ってきます。
シェル端末とPerlの間に、テキストを挟まなきゃできないですかね?
>>812 perlopのqx/STRING/の所参照
$name = `netstat`;
>>814 マジで頼りになります。有難うございます
化合物の記述ファイルであるSDファイルを処理するモジュールとかって ありますか?CPANとかで見てみたけどよくわからなかったです。
htonl, htons, ntohl, ntohs に相当する処理ってどう書くの?
>>818 sub htonl { unpack("N",pack("L",shift)) }
sub htons { unpack("n",pack("S",shift)) }
sub ntohl { unpack("L",pack("N",shift)) }
sub ntohs { unpack("S",pack("n",shift)) }
>>807 できるっていうか
@a[4..8] とか @a[2, 4, 8] とかができるんだから
@a[@b] ができないわけがない。
@b = (2, 4, 8);
@c = @a[@b];
というのと
@c = @a[2, 4, 8];
で @c に入るものは同じだ。
>>821 言いたい事はわかるが、この場合に
「〜とかができるから〜もできないわけがない」は強引すぎる。
>>821 むしろ、それなんのAA?の領域まで達しているな
PerlのコードでAAって作れそうだね。
m(^_^); # regexp
>>826 DAT落ちしてるけど何て書いてあった?
921 デフォルトの名無しさん sage 04/05/21 21:40 ○○嫁っていうの、文系DQNみたいでなんかいや
空気嫁=ダッチワイフ m9(^Д^)プギャー
(´・ω・)
三角比のをラジアン単位じゃない方法で表示する方法ある?
>>831 > 三角比のをラジアン単位じゃない方法で表示する方法ある?
はい。
>>835 ラジアン単位を数学などで使ったときのsinやcosの値にする方法です。
1234のような任意の4桁を 12と34の2桁に分割するにはどのように書けば良いか教えてください。 いったん一桁ずつにバラして、2桁ずつに結合するしか思いつきません。。
839 :
デフォルトの名無しさん :2006/03/02(木) 20:45:54
>>837 もしかして、π≒3.14 → 180 って関数がほしいってことか?
840 :
デフォルトの名無しさん :2006/03/02(木) 21:08:04
841 :
デフォルトの名無しさん :2006/03/02(木) 21:13:07
842 :
838 :2006/03/02(木) 21:17:29
>>840 split(//, $_);でやってまして。。
>>841 ありがとうございます!
おかげさまで解決しました。
(´・ω・)
****-****-****-aaaa この-aaaaの部分だけ取り除きたいときはどうすれば良いですか? ****-は固定じゃなくて、****-****-aaaaだったり、 ****-****-****-****-aaaaだったりします。 ****には英数字記号が入ります。
すみません。aaaaにも英数字記号が入ります。
放置な、放置。
sleep()
$string = '****-****-****-aaaa'; $string =~ s/-....$//; print $string;
$expr = '****-****-****-aaaa'; # マッチングして別変数に保存 my($str) = ($expr =~ /(¥-¥w{4})$/); # 英数文字とか関係なく必ず末尾の5文字なら my $str = substr($expr, -5, 5);
>>848 >>849 ありがとうございます!みなさんから見たら基本中の基本でしょうけど..
まだ勉強中で正規表現をどう書けば良いか分からなくて途方に暮れてました。
感謝感謝です。
あ、末尾を取り除きたいのか。ごめんな。末尾だけにしちゃった…。
それなら
>>848 で良いや。
(;´д`)ハァハァ
853 :
816 :2006/03/03(金) 01:50:44
>>817 成る程、SDFの読み書きができそうです。ありがとうございました。
854 :
デフォルトの名無しさん :2006/03/03(金) 02:10:18
>>831 $deg = $rad * 45 / atan2(1, 1);
Math::Trig::rad2deg
およそ3
>>857 元の質問の意味がよくわからんけどな。
> 三角比のをラジアン単位じゃない方法で表示する方法ある?
> ラジアン単位を数学などで使ったときのsinやcosの値にする方法です
意味が良くわからない曖昧な質問に、推測で答えていると、 質問者がどんどん堕落して、意味が良くわからない曖昧な質問ばかりになる。
> 三角比のをラジアン単位じゃない方法で表示する方法ある? 俺が考えた単位に変換でいいならあるぞ。 sub sankakuhi2orenoougonhi($){ return ($_[0]) ? 7 : 3 ; } 一番うつくしいとされる7:3の比を返すのだ。ってこれ比なのか。
861 :
デフォルトの名無しさん :2006/03/03(金) 19:12:38
>>860 確信犯なのか、バカなのか。
print ( 860 ? 'ばか' : '確信犯' ), "\n";
sub pai { return 'およそ3'; }
webprog池
864 :
860 :2006/03/04(土) 03:42:27
>>861 それ残念ながらシンタックスエラー。プギャーm9(^Д^)
PerlにはDIコンテナってないのかな?
867 :
860 :2006/03/04(土) 04:47:53
>>865 >print (...) interpreted as function at test.pl line 1.
>Useless use of a constant in void context at test.pl line 1.
>ばか
おんや。警告がでてるだけか。最後を見逃してました。こりゃ失礼。
でもま、 print +( 860 ? 'ばか' : '確信犯' ), "\n"; のようにした方がいいのは確かだ。 んなコード誇られてもねぇ。
(´・ω・)
871 :
デフォルトの名無しさん :2006/03/04(土) 12:19:11
(´・ω・)
>>WWW::2ch これは危険なモジュールですね
[\w\d]+って\w+と同じじゃね?
いや大分遅いと思う
>>868 いやここは、CPANのモジュールを使った方がいいと思う
>>877 >>875 じゃないけど、perl -Dr -e '/REGEX/' でコンパイル結果を見て
速度を類推するといいよ。
% perl -Dr -e '/REGEX/' Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
林檎機でも同じだなぁ。。 $ perl -v This is perl, v5.8.6 built for darwin-thread-multi-2level (with 2 registered patches, see perl -V for more detail)
% perl -Dr -e '/REGEX/' Recompile perl with -DDEBUGGING to use -D switch
884 :
デフォルトの名無しさん :2006/03/05(日) 12:50:54
URLに日本語を表示させないようにしたいのですが URLの%8E%BF%96%E2という部分の文字列をデコードすると質問という文字列になるのはわかっているんですが 反対にPerlで質問と言う文字列をを%8E%BF%96%E2にするにはどうすればいいんでしょうか?
URI::Escape
sub tohex { join("",map(sprintf("%%%02X", $_), unpack("C*", $_[0]))); }
PerlでDIコンテナが無いみたいなので 自作することにしました。
それは自分じゃ見つけらんなかったから教えてくれってことでOK?
CPANPLUSって何なの? perldoc読んだけどさっぱり使い道がわからん。 普通に-MCPAN -eshellとやるのとどう違うの?
Perlみたいな言語でDIとか聞くとゲンナリするわ 本当にそれをする価値があると考えているのだろうか
まあ確かに必要ないわな。 んーと、Javaやってる人が移行する時に便利、とか? (移行するかどうかはともかく)
必要なくはないでしょ。
ダイコンとモジュールってどうちがうの?Tkみたいなもんじゃなくて?
DIコンテナなんて作らんでもevalでええやん
>>893-894 お前らがまともに DI コンテナを使った開発をしたことがないことは分かった。
>>895 知ったかだけで、教える能力がないことはわかった。
DIコンテナなんて聞いた事もねーよw
DoudemoIiコンテナ
>>878-883 perl -Mre=debug -e '/regex/'
でどないだ?
'
>>899 Freeing REx: `","'
となるけど・・・
by v5.8.7 built for MSWin32-x86-multi-thread
DIとか言ってる奴は流行の言葉を使いたいだけの池沼 1年後には違う略語を連呼しているに違いない
そういや、DIだのEIだの連呼してたのが、何時の間にかCLIだのSTIだの連呼していた事が・・・。
>>900 それだけしか表示されない場合用のヒント。
dir | perl -ne 'print'
と
dir | perl -ne "print"
の違いを確認。
>>902 おお、こんな夜中にありがとう。
見れたけど見方が分からんかったorz
% perl -Mre=debug -e '/regex/' Can't load '/usr/libdata/perl/5.00503/mach/auto/re/re.so' for module re: /usr/libdata/perl/5.00503/mach/auto/re/re.so: Undefined symbol "my_regcomp" at /usr/libdata/perl/5.00503/DynaLoader.pm line 169. at -e line 0 BEGIN failed--compilation aborted.
というわけで、
>>878 のは滅多に使えない無駄ワザということで FA ?
>>895 は妥当な読みだが、
>>896 は悔しがってるだけだな。
察しの悪い人でも、このレスに対する反応を見ればそれでわかると思うw
895=907 知らない=悔しいですか?へぇ〜へぇ〜へぇ〜 知らないことを認める人間になりましょうね。
-bash-3.00$ perl -Dr -e '/regex/' Compiling REx `regex' size 4 Got 36 bytes for offset annotations. (ry 繋いでたCentOSの鯖で何気なくやってみたら動いた。 でも出てくる結果はuse re 'debug'と変わらんね。 ちなみにActivePerlではreプラグマのみ動作
なんでこう無駄な煽り合いが生まれるのかね 誰か研究してくれないかね
中途半端に知能を持っているからでしょう
新たな煽りが出現です!!
>>905 俺と似たようなバージョン使ってる奴キターwww
>perl -v
This is perl, version 5.005_02 built for MSWin32-x86-object
煽りって青海苔に似てるよね。
火へんに扇っていう字がつくづく絶妙だと思う。
>>915-916 煽ってる暇があったらもっと生産的な事に時間を使ったほうがよいのではないだろうか。
アモーレ!
それもそうだな。 さてオナテク板でも覗いて来るか。
>>920 お前とお前の周りが生産性にあまりに無関心なだけ
意味不明な返しだな とりあえず急いで反応したんだろうね
遊び場 (2ちゃんねる) で生産性を追求する
>>921 に幸あれ!
生産性とか言いたいならPerlはよした方がいいと思う
コマンドライン中心だからPerlが最適
Perlの凄惨性について
927 :
917 :2006/03/06(月) 20:37:55
>>924 まぢですか。Perlを信じて4年間勉強してきた俺はどうすればいいんですか?
ギターでも弾いてれば?
>>927 安心しろ。15年勉強している俺がここにいる。
Perl って、Practical って言葉の通り、とくに勉強しなくても使えるところが いいとこだと思ってるんだが・・・。勉強する価値はあるけどね
>>927 心配するな。俺の職場では大活躍だ。
perlがなかったら、仕事中に2chを見る暇がなくなる。
>>930 > Perl って、Practical って言葉の通り、とくに勉強しなくても使えるところが
> いいとこだと思ってるんだが・・・。勉強する価値はあるけどね
Perlがもともとターゲットとしていた人々は、特に勉強しなくても使えてる。
ただ現在になって、当時は想像することすらできなかったほど知的レベルが
低い連中もプログラミング言語に手を出すようになってきているだけ。
933 :
デフォルトの名無しさん :2006/03/07(火) 10:19:18
mkdir関数でフォルダを作成する場合のフォルダ名の最大文字数を教えてください
OS によって違う。
937 :
デフォルトの名無しさん :2006/03/07(火) 17:37:02
>>932 PerlとCどっちも勉強したけどPerlの方が難しいと思った
難しさというか、使いやすさ・手軽さかなあ
C言語は難しすぎてわかんないです(><) エラーが起きても原因が全然見えてこない
Perlの方がむずかしいでしょ。言語仕様に正規表現がある時点で。 Cのほうがわかりやすいとおもう。開発すんのだりぃけど。
どっちから勉強したかとか、それ以前に何か学習したかにもよるだろうな。
最初、Cやったけどサッパリ分からなくてPerlに行った。 OOPの学習の為にJavaをかじり、Perlに戻った。 その後、もう一度Cをやり直してPerlもどきを作り、Perlの凄さが分かった。 けど同時にPerlの宜しくない所もたくさん知ってしまい、、Rubyへ。
Perl が嫌で Ruby を作った割に、なんであんなに出来が悪いんだろう
944 :
デフォルトの名無しさん :2006/03/07(火) 19:09:29
perl6 ってホントに出るの?
>>944 > perl6 ってホントに出るの?
それはあなたの力次第。
946 :
デフォルトの名無しさん :2006/03/07(火) 19:21:32
ラクダ本片手に、Perlで実装したCGI作って、 Live Doorに納品した 半金半手の手形もらって、その時は まじびっくりした、でもその代金はなんとか、市中の金融やに回らずに 回収できた。
ラクダ本片手に、Perlで実装したCGI作って〜♪ Live Doorに納品した〜♪ 半金半手の手形もらって、その時は〜♪ まじびっくりした、でもその代金はなんとか、市中の金融やに回らずに〜♪ 回収できた〜♪
948 :
デフォルトの名無しさん :2006/03/07(火) 20:06:37
Perlって仕事じゃあまり使われないよな
そんなことないよ、今でも使ってるとこかなりある。 大手でも部分的には使ってたりするし。 副業でサービスやるのにもお手軽でいい感じ。
perlを仕事で使ってる所は、マジで使ってる。無いとやってけないくらい。 リプレースできるような言語も無いし。 ネットワーク系が多いかも。
事務では知らんけど個人的に文書整形するときかなり便利よ。 Windows環境でコンパイラが欲しいぐらい。なぜかperlcc云々はエラーでできないからあきらめてるが・・・
mixiはPerl一色だ罠
マイミクが少ない罠
でも何でPerlにDIモジュールがないんだろうね。
知るかヴォケ 必要ならお前が作れ さもなければ、必要とされていない それだけのことだ
956 :
デフォルトの名無しさん :2006/03/07(火) 21:24:43
すいません流れ読まないで質問していいですか。 1) Perl で ls コマンドでも作ってみるか 2) ディレクトリ一覧を取得して stat() 3) なんか色々あるから Class::Struct で構造体に入れてみた 4) 各ファイルの構造体へのリファレンスを配列に入れてみた <---- いまここ 5) これどうやってソートすんだ? 配列の要素の構造体のメンバで配列をソート? ができないです。 なんか根本的に間違ってますカネ?
なんでまたperlで?
漢だから。
(´・ω・)
lsコマンドをそのまま使うというのは選択肢に無かったのか
961 :
956 :2006/03/07(火) 21:47:03
いや話せば長いんですが、 Windows をコマンドライン主体で使ってる派なんですよ。 でファイルを開くときは「 start ファイル名」とかやるんですけど、日本語の長い ファイル名とかだと面倒じゃないですか。 それで dir の結果に番号が付いてて、続けてその番号を入れるとファイルが 開ける、みたいにしたら便利じゃね? と。 で番号 -> ファイル実行は出来たんで超便利なんですが、ソートできないから超不便。
要するにPerlでファイラーを作りたいということだな。
964 :
956 :2006/03/07(火) 22:03:04
>>963 いや話せばもっと長いんですが、コマンドラインって cmd.exe 直じゃなくて
C で書いたラッパーを使ってるんですよ。これも超便利なんだけど、ただ
タブ完成機能はないんです。やりかたわかんないから。
それで ls -> 番号 -> 実行機能もそのラッパーで実装しようと思ってたんですが、
忙しくてほったらかしてる内に C 忘れて代わりに Perl への愛に目覚めたんで、
これは Perl で作るか、と思ったとですよ。
もう俺の発想が根本的に間違ってるとかそういう話はいいから誰か教えてください。
sort{}をなめるな
@sorted = sort { $a->{name} cmp $b->{name} @file_list; @sorted = sort { $a->{size} <=> $b->{size} @file_list; うちのDOSの中の人はこんな感じ
@sorted = sort { $a->{name} cmp $b->{name} } @file_list; @sorted = sort { $a->{size} <=> $b->{size} } @file_list; 隣のDOSの中の人はこんな感じ
>>954 > でも何でPerlにDIモジュールがないんだろうね。
あるよ。
(´-`).。oO(ぐだぐだと講釈を書き並べて最後には「教えろ」かぁ。。。 で、またぐたぐたになってCに戻って〜、、、ループなんだろうなぁ)
>>956 > 1) Perl で ls コマンドでも作ってみるか
> 2) ディレクトリ一覧を取得して stat()
> 3) なんか色々あるから Class::Struct で構造体に入れてみた
バカじゃね?
> 4) 各ファイルの構造体へのリファレンスを配列に入れてみた <---- いまここ
> 5) これどうやってソートすんだ?
つ[シュワルツ変換]
>>968 無いよ。ググっても出てこないんだから間違いない。
972 :
デフォルトの名無しさん :2006/03/07(火) 22:29:54
973 :
956 :2006/03/07(火) 22:36:58
>>965-967 うわ、ほんとに sort でできた。すげー。
ありがとうございます。ちょっと妹に自慢してきます。
妹が居るなら居ると最初に言えばみんなもっと丁寧に教えただろうに。
∩___∩ | ノ ヽ/⌒) /⌒) (゚) (゚) | .| / / ( _●_) ミ/ このスレレベル低下してるよあびゃばばば .( ヽ |∪| / \ ヽノ / / / | _つ / | /UJ\ \ | / ) ) ∪ ( \ \_)
>>966 > @sorted = sort { $a->{name} cmp $b->{name} @file_list;
> @sorted = sort { $a->{size} <=> $b->{size} @file_list;
これは、無駄無駄無駄無駄なのでやってはいけない方法の筆頭。
まあ普通こんな感じだろうなあ… @sorted = sort { $a->{name} cmp $b->{name} || $a->{size} <=> $b->{size} } @file_list;
>>972 馬鹿はお前。
試しにCPANで「DI」で検索してみろよ。
雑魚が。
980 :
デフォルトの名無しさん :2006/03/07(火) 23:04:49
つ「Java脳の恐怖」
>>979 DIがもともとIOCと呼ばれていたのは知ってたし、
IOCモジュールには行き着いていた。
だが、DIモジュールがあると言い張るのであえて言わず
カマかけてたんだがな。
とりあえず、お前は俺の役に立ってくれたよ。ご苦労様w
982 :
デフォルトの名無しさん :2006/03/07(火) 23:22:04
次スレは?
>>982 泣いてねーよ。むしろ喜んでるよ。
馬鹿は煽るとすぐ答えを出してくれる。
ちょろいもんよ。
>>984 26 番組の途中ですが名無しです 2006/03/02(木) 20:17:21.48 ID:rmCOuDKh0
高校の頃にクラスのDQN共が良く俺にやきそばパン買い行ってくださいと頼んでたよ
しかもこいつら頭わりーから月に5千円渡すと何も危害加えてこなくなるし敬語で話しかけてくるしw
マジで手なずけるのちょろかったなぁ高校時代はww
専門板の煽りは異常
>>983 よし、漏れに任せろ
# これで三連だが
>>989 しまった…スマソ
ふと気づいたが誘導に余計なmy付いてるな…
なんで三回使って気づかなかったんだろorz
# 初めmy $nextとやって$$self{next}に書き換えた記憶が
俺は英語が読めません!
私の名前はジョンです!
993 :
デフォルトの名無しさん :2006/03/08(水) 02:10:34
>>991 アメリカまでの貨物船に潜んでアメリカまで行けばいいと思うよ。
すいません。以下のプログラムで@{+shift}のように、 なぜ、shiftに+記号をつけられるの分かりません。 perlではリファレスンの値に+をつけると、参照先を 変えたり出来るんでしょうか? { package Barn; sub new { bless [], shift } sub add { push @{+shift}, shift } sub contents { @{+shift} } sub DESTROY { my $self = shift; print "$self is being destroyed...\n"; for ($self->contents) { print " ", $_->name, " goes homeless.\n"; } } }
996 :
デフォルトの名無しさん :2006/03/08(水) 03:35:15
>>995 ちょっとperldocからshiftの部分が関数呼び出しとみなされないと
書いてあるところを一緒に示せなくて申し訳ないけれど…
ttp://perldoc.jp/docs/perl/5.6.1/perlop.pod のSymbolic Unary Operators
> 単項演算子の "+" は、たとえ文字列に対して用いられた場合にも、何もしません。
> 関数名に続けて括弧付きの式を書く場合に、関数の引数リストと解釈されないようにするために用いることができます。
この場合は@{shift}と書くと@shiftだと解釈されるからそれを防ぐためにつけているわけ。
@{shift()}と書いても動くよ
998 :
デフォルトの名無しさん :2006/03/08(水) 04:14:59
>>997 せっかく教えてくれたのに、よく分からなくて、本当にすいません。
@{shift}だと書くと、何で@shiftと解釈されちゃうんでしょうか?
_ミ`ー‐、
`⌒丶、'ー-、_ + 十
 ̄\―ヽ._ 二_‐-
\ \  ̄ ‐-  ̄二二_ ―_,r'⌒ヽー、
 ̄\ ̄ \‐- ╋__..ニ -―― ´ ̄ __... -―一┘
+ ニニ ー--\ ⌒Y´ ̄ `丶 __,. -‐二´  ̄ ― +
 ̄\ ! =,. -‐ 二_
_ ヽ.._ ノ
 ̄ 〉 ー- ノ三二 +
十  ̄―/ ,' /二  ̄ _
ニー/⌒∨ / 二/ /⌒'l  ̄
_ / l /二 / ,イ |二_
/ /| / .ノ 〈. ′ / | _|__ ╋
 ̄_/ _/_ヽ_, .__,/ | |_
彡ニ ,ノ __( )_ 〈__ 三ミ +
+ `⌒  ̄∨ ̄∨― ⌒´
それがム板ヌクモリティ
http://pc8.2ch.net/tech/
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。