[表示 : 全て 最新50 1-99 2chのread.cgiへ]
Update time : 05/09 08:24 / Filesize : 23 KB / Number-of Response : 91
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 03:29:47 ]
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 pc11.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3

前スレ
Perlについての質問箱 30箱目
pc11.2ch.net/test/read.cgi/tech/1173880452/

リンク集は>>2-3
過去スレは>>4

9 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 15:06:27 ]
即レスサンクス
では「続」を買ってみます。

Amazonの関連本見てて「Perlベストプラクティス」とかいうのも面白そうだなと。
「続」読み終わったらそれ買おうかな。

10 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 03:24:12 ]
>>9
ベストプラクティスはいいよ。
ぜひ買えw


11 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 03:44:55 ]
>>9
もうみんなベストプラクティスを買いましたよ。

12 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 15:00:55 ]
日本語対応でsuffix array を構築するモジュールってありませんか?


13 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 15:01:44 ]
ありますよ

14 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 15:12:39 ]
なんていう名前ですか?

15 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 15:14:28 ]
っていうか、自分で書いても50行行かないくらいだし。

16 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 15:17:33 ]
うーん、書いていたんですがつまってしまいまして。
無駄な容量を使用しないように配列のインデックスだけでやろうとして、
ソートは基数ソートで構築しようとしていました。

17 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 15:24:49 ]
>>16
とりあえずsaryというのは知ってるの?

だんだん問題を思い出してきた。ソート地獄なんだっけ。
saryも「素朴なアプローチ」でしかないんだよな。

2001年に辞書ハッカーの方々のあいだでsuffix arrayが盛り上がった
ことがあって、わたしゃその時その人たちがいろいろ書き散らしたツール群を
使っています。



18 名前:12 mailto:sage [2007/06/12(火) 15:43:46 ]
>>17
saryとsufaryはsuffixを構築する部分はCで書かれているようでして、
出力されたファイルがバイナリだったので、ソースのどこを書き換えればいいんだ・・という状況です。

19 名前:12 mailto:sage [2007/06/12(火) 15:55:21 ]
うーん、もう少し考えてきてみます

20 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 15:55:23 ]
>>18
何が問題なのかわからない。インデクサの出力が、
バイナリ以外の何である可能性があるというのか?


21 名前:12 mailto:sage [2007/06/12(火) 17:41:22 ]
sufaryのmkaryを呼び出して、出力されたバイナリをunpackして使用しようかなと思います

22 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 20:34:56 ]
既存のPDFドキュメントにテキストボックス等の入力フィールドを追加できる
perlモジュールって存在しますか?
あるようでしたらモジュール名を教えてください。有償でも構いません。
PDFLibでは出来ませんでした。
PDFJは新規なら可能ですが、既存のものからは不可能でした。


23 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 14:54:25 ]
ソートなのですが、
@A = ( a, to, t, toa);
@A = sort @A;

とすると結果は
a,t,to,toaとなりますが、これをa,toa,to,tとsortするにはどうすればいいでしょうか。
アルファベット順にソートしてほしいのですが、文字列が長いほうが先にきて欲しいです。

24 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 15:51:21 ]
use strict;
my @A = qw(a to t toa);
@A = sort comp @A;
print "@A";

sub comp {
my($p, $x, $y);
do {
$x = substr $a, $p, 1;
$y = substr $b, $p, 1;
return $y cmp '' if $x eq '';
return '' cmp $x if $y eq '';
} while($p++, $x eq $y);
return $x cmp $y;
}

25 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 17:10:31 ]
>>24
ありがとうございます!参考にさせてもらって正規表現で作って見ました。
sub sort_length{
my ($a, $b) = @_;
#同じ文字列;
if($a =~ /^$b$/)
{
return $a cmp $b;
}
#途中まで同じ文字列で$aの方が長い;
elsif($a =~ /^$b/)
{
return '' cmp $a;
}
#途中まで同じ文字列で$bの方が長い
elsif($b =~ /^$a/)
{
return $b cmp '';
}
else
{
return $a cmp $b;
}
}

substrは(処理が重いから?)あまり使わないほうがいいみたいなイメージがあったので正規表現にして
みたのですが、どうでしょうか?

あとこの(ソートの仕方の)関数名に何か良い名前はないでしょうか。
なかなか良い名前が思い浮かばない・・・。

26 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 17:26:58 ]
どうみても余計重くなってる。
普通にsubstrつかえよ。

27 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 17:44:59 ]
>>25
横レスだが、単なるベタ比較に名前なんかないよw
名前が付くのは「シュワルツ変換」とか「シャチ泳ぎ」とか定番の手法
ちなみに "" cmp $a とか処理のムダだから、素直に-1とか与えたら?
シュワルツ変換で例を書こうかと思ったけど、まあ御参考までに。
@A = sort { $a eq $b ? -1
      :$a =~ /^$b/ ? -1
      :$b =~ /^$a/ ? 1
      : $a cmp $b } @A;




28 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 17:44:59 ]
俺ならこうするかな。多分上の二つよりはずっと速い

sub compare {
if($a eq $b) {
return 0;
} elsif(length $a < length $b) {
return $a cmp substr($b, 0, length $a) || 1;
} elsif(length $a > length $b) {
return substr($a, 0, length $b) cmp $b || -1;
}
return $a cmp $b;
}

29 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 17:47:51 ]
ああ、27まちがえた orz...
$a eq $b ? 0 だよ。


30 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 17:48:31 ]
>>27
っ \Q

31 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 17:53:01 ]
つか常識的に考えて24は激重だろ…
他はベンチとってみなきゃ分らんが

32 名前:ベンチ厨 mailto:sage [2007/06/14(木) 17:58:51 ]
use Benchmark;
timethese undef, {
24=>sub{ my@a=sort comp24 qw/a to t toa/ },
27=>sub{ my@a=sort comp27 qw/a to t toa/ },
28=>sub{ my@a=sort comp28 qw/a to t toa/ }
};

>Benchmark: running 24, 27, 28 for at least 3 CPU seconds...
>24: 2 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 55973.25/s (n=175756)
>27: 3 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 21100.32/s (n=66255)
>28: 2 wallclock secs ( 3.17 usr + 0.00 sys = 3.17 CPU) @ 104963.11/s (n=332943)

うむ。激重ってほどでもないが、重いな。

33 名前:デフォルトの名無しさん [2007/06/14(木) 18:20:39 ]
utf-8なEncodeを使いたいときに、use uft8とかEncodeとかいろいろ使わないとまともに動かないようなんですが、
そういうのを全然しらなくて、普通にEUCと同じような感覚で、ファイルのencodeはutf-8にしたり、
GDBMのキーにいれたりと、utf8な文字列をそのままバリバリ使ってしまっていますが、
とりあえず、期待通りの動作はしているようです。
use utf8やEncodeとかいれると修正箇所が多すぎて逆に問題がおきそうなんですが、
それでも、治した方がいいんでしょうか?
Perlの5.8.8を使ってます。

34 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 18:25:26 ]
場合によるとしか言いようがないが、
EUCと知らずにEUCを扱える環境なら、UTF-8も同程度に安全。

35 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 19:02:15 ]
@A = ( 'a' x 1000, 'a' x 2000 , 'a' x 3000 ) ;
24: 3 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 345.45/s (n=1102)
27: 3 wallclock secs ( 3.21 usr + 0.00 sys = 3.21 CPU) @ 7608.10/s (n=24422)
28: 3 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 60339.81/s (n=189467)



36 名前:23 mailto:sage [2007/06/14(木) 22:10:14 ]
うおおぉぉ・・・・勉強になります・・!
ありがとうございます!

37 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 22:37:45 ]
>>33
ちゃんとした「文字」として扱いたいかどうかによる。
正規表現で文字単位でマッチさせたいとか、バイト数じゃなくて文字数を調べたいとか、
そんなときはencode/decodeする必要があります。




38 名前:33 [2007/06/15(金) 10:05:22 ]
ということは、特に何もしてなければ、たんなるバイト列として扱われるってことなんかな
これで特に問題はないんで、とりあえずこれはこのまま放置しておこう

39 名前:デフォルトの名無しさん [2007/06/15(金) 19:17:52 ]
perl未経験者なんですが・・・。
いきなりのご質問でも大丈夫でしょうか?

40 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:21:10 ]
あきらめて下さい。
あなたの質問は解決できません。

41 名前:39 mailto:sage [2007/06/15(金) 19:22:09 ]
分かりました。
お手数をおかけしました。

42 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 19:38:06 ]
perlよりも先に日本語を勉強して欲しい

43 名前:39 mailto:sage [2007/06/15(金) 19:41:12 ]
>42
そうかもしれません。
本当にごめんなさい。

44 名前:39 mailto:sage [2007/06/15(金) 21:16:05 ]
れろれろえれ男レオレオ炉得れろ絵

45 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:45:55 ]
質問に応じて忍者ポイントで答えるよ!

46 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 21:48:29 ]
>>43
いけない子だ。お仕置きだね。

47 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 23:17:53 ]
>>39
こちらへどうぞ

くだすれPerl(超初心者用)
pc11.2ch.net/test/read.cgi/php/1157862828/l50




48 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 02:15:49 ]
>>38
「たんなるバイト列」がU+00〜U+FFと一致する事は、覚えておいて損はないかも。

例.
$a = substr(pack('CCCC',0xFC,0xFD,0xFE,0xFF).chr 256,0,4); # utf8フラグ付き
$b = pack('A*',$a)); # utf8フラグ無し
$c = pack('CCCC',0xFC,0xFD,0xFE,0xFF);
print "a:",unpack('H*',$a),"\n";
print "b:",unpack('H*',$b),"\n";
print "c:",unpack('H*',$c),"\n";
print "a eq b:",$a eq $b ? 1:0,"\n";
print "a eq c:",$a eq $c ? 1:0,"\n";
print "b eq c:",$b eq $c ? 1:0,"\n";

a:c3bcc3bdc3bec3bf
b:c3bcc3bdc3bec3bf
c:fcfdfeff
a eq b:0
a eq c:1
b eq c:0


49 名前:48 mailto:sage [2007/06/16(土) 02:22:20 ]
ごめん、見て分るとおり2行目の $b=pack('A*',$a)); は、 $b=pack('A*',$a); の間違い。

50 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 06:50:36 ]
ゆ る さ ん

51 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 10:28:05 ]
無意味にユニコード系薦める奴は売国奴

52 名前: ◆TWARamEjuA mailto:sage [2007/06/16(土) 11:16:28 BE:2940293-2BP(6824)]
↑くすくす♪

53 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:05:17 ]
「くすくす」は絵師だろ…常識的に考えて

54 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:01:52 ]
アプリケーションがダイアログを表示した場合に、
それを検知し閉じる処理を行うアプリケーションを作りたいのですが
どういうモジュールを使えば良いですか。

OSはWindowsXP、
Perlのバージョンはv5.8.8 built for MSWin32-x86-multi-thread
です。

55 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:29:38 ]
Win32::API

56 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 01:56:41 ]
さきほどactiveperlのver5.88をインストールしました。
今、モジュールを使おうとしてエラーが出て苦戦しています。

CPANのモジュールを利用使用と思い
perl -MCPAN -e shellとコマンドプロンプトで打ち込んだのですが、

PerlCRT.dllが見つからないというエラーが出て、

仕方ないのでactiveperlをアンインストール→インストール→試す→失敗→またアンインストール→( ´_ゝ`)

の繰り返しです。

PPM install ほにゃらら

でもDBIのコネクトが失敗と出ます。
コレは一体どういうことなのでしょうか?
分かる人いたら教えて下さい!こんな初歩の質問でごめんなさい(>w<)

OSはXPです。

57 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 03:38:01 ]
Perlの前に InstMsi.exe を入れるといいかもしれん



58 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 10:51:03 ]
この問題がわからないのでおしえてください。

標準入力(STDIN)から取り込んだテキストファイルの文中に出現する「単語」の出現頻度を調べあげ、出現頻度の多い順に並び替えたあと、標準出力に 単語 頻度数 の順で一行ずつ表示する。英単語の大文字/小文字の区別はしない。表示時にはすべて小文字で表示する。

59 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:39:00 ]
宿題開き直りワロスw

60 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:39:04 ]
>57

返信ありがとうございます。
どうやらPATHの設定等で問題があったようです。
PATHを設定して順調に行くかと思いきや今度は、MSPDB80.dllが見つからないと言われました。
原因は分からないですが、また調べてみます。

PPMでもモジュールをインストールしよう頑張っているのですが
ppm gui failed:DBI connect failed:unable to open database faile(1)と
出ます。

activeperlの場合、特に何も設定せずにppmは使えるのでは・・・と思ったのですが。

61 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:52:53 ]
>>58

perlじゃ無理
Javaならできるw

62 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:57:56 ]
>>61

Javaじゃ無理
PHPならできるw


63 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 13:04:04 ]
> 標準入力(STDIN)から取り込んだテキストファイルの文中に出現する「単語」の出現頻度を調べあげ、出現頻度の多い順に並び替えたあと、標準出力に 単語 頻度数 の順で一行ずつ表示する。英単語の大文字/小文字の区別はしない。表示時にはすべて小文字で表示する。

my $unko;
while (<STDIN>) {
  map { $unko->{$_}++; } split(/\s+/, uc($_));
}
for ( sort { $_->{$b} <=> $_->{$a} } @$unko ) {
  print $unko->{$_} . " " . $_ . "\n";
}


64 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 13:06:34 ]
うそかいてた。

my $unko;
while (<STDIN>) {
  map { $unko->{$_}++; } split(/\s+/, uc($_));
}
for ( sort { $unko->{$b} <=> $unko->{$a} } keys %$unko ) {
  print $unko->{$_} . " " . $_ . "\n";
}


65 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 13:07:35 ]
宿題丸投げに答えるのはどうかと思うが

66 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 13:12:39 ]
こっちのほうがかっこいいお。

use strict;
use Template;

my $unko;
while (<STDIN>) {
  map { $unko->{$_}++; } split(/\s+/, lc($_));
}
my $rel;
for ( sort { $unko->{$b} <=> $unko->{$a} } keys %$unko ) {
  push(@$rel, { count => $unko->{$_}, name => $_ });
}

Template->new->process(\<<'EOF', { rel => $rel });
[% FOR x IN rel -%]
  [% x.name %] [% x.count %]
[% END -%]
EOF


67 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 13:19:46 ]
こんな糞宿題に TT ってあほだろおまえw



68 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:11:47 ]
もっとCPANバリバリで

69 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:14:35 ]
DBIx::Class で SQLite 使う感じで。

70 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:12:01 ]
ホントにperlのためにつくられた問題というか宿題という感じがするね

71 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:14:04 ]
perl 脳。

72 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:49:56 ]
しかし perl のソースは汚いな

73 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:40:45 ]

毎回Perlは汚いと煽ってる馬鹿に言いたいんだが…
言語仕様によって汚くなるというのは無いんだよ、これは。
それを言う偉い先生方の見解によれば、要は書き手によって変わると。
Perlは柔軟性が高い余り、完全に理解出来てない所謂無知が多い。
そしてそういう奴等が世の中に糞コードを放つから、総合的に汚く見えると。
つまり、君は騙されているんだよ。

74 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:14:35 ]
そんな汚いかな?
$unkoは汚いけど

75 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:39:32 ]
$anal

76 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:53:29 ]
>>58 がCPANにこのモジュールを公開すれば、
ソースは use、new、print の3行だけの美しいコードになるべ。そして3行を提出。

77 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:16:02 ]
それはまるで、C か何かで書けと言われた課題に対し、use POSIX; とかして提出したひとみたいですね。



78 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:45:22 ]
>>72
俺のコードはきれいだぞ

79 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:49:37 ]
俺のケツも綺麗だよ

80 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:05:43 ]
僕の肛門もリファクタリングされそうです><

81 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:13:57 ]
俺にきれいなコードを書くのは無理とわかった。

#!/usr/bin/perl
use strict;
BEGIN { require warnings && import warnings }
local $/ or grep ++$un'ko{$_},map m/\b\w+\b/g,uc<STDIN>;
print lc and printf join $un'ko{$_},unpack 'a'x2," \n" for reverse sort { $un'ko{$a} <=> $un'ko{$b} } keys %un'ko;
__END__

82 名前:デフォルトの名無しさん [2007/06/17(日) 23:31:49 ]
こうしてPerlを知らない優秀なPerlプログラマがまたひとり巣立って行く

83 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:44:17 ]
>>81
わざと汚く書いてるよねw

84 名前:54 mailto:sage [2007/06/18(月) 01:41:29 ]
Perlでは難しいんでしょうか

85 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:14:06 ]
>>55

86 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 12:21:14 ]
もうちょっとシンプルにならんかなぁ
#!/usr/bin/perl
use strict;use warnings;
my(%chinko,%manko);$/=undef;
print "$_:$chinko{$_}\n" for sort {$chinko{$b}<=>$chinko{$a} || $a cmp $b} grep !$manko{$_}++ , map {$chinko{$_}++;$_} split /\s+/,lc <STDIN>;


87 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 13:32:46 ]
そういう変なのをもっともらしく貼り付けるから perl はダメとかいわれるんじゃないの?



88 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 13:47:23 ]

これはこれで綺麗に見えるのだが、
その感性を会得出来ないのは、
まだ君が未熟である証拠であろう。

89 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 13:55:00 ]
>>86
%chinkoと%mankoわけるのは無駄だろ?

90 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:51:34 ]
> これはこれで綺麗に見えるのだが、

廃人になる前にドラッグやめたほうがいいよ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<23KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef