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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

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

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

http://www.perl.org/get.html
● 2009/11/02 現在の最新版: 5.10.1

▼ 前スレ
Perlについての質問箱 41箱目
http://pc12.2ch.net/test/read.cgi/tech/1249581780/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり
2デフォルトの名無しさん:2009/11/02(月) 14:27:32
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/9784873114279/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/books/detail/4-7561-3057-7.shtml (修正)
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://search.cpan.org/dist/perl/
perl5.8.x のドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi (停止中)
perldoc.jp: ttp://www.perldoc.jp/
perldoc.com: ttp://www.perldoc.com/
3デフォルトの名無しさん:2009/11/02(月) 14:28:13
4デフォルトの名無しさん:2009/11/02(月) 14:28:53
# [Perl 日本語処理の基礎の基礎]
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
use Encode;
# 次に、あなたが実行したい処理の内容を入れて下さい。
$file = 'C:/なんたら/かんたら.txt';
open my $fh, '<', encode("cp932", $file) or die $! ; # ※2
print <$fh>;
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。
# 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、
# ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。
# ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
# この例のように cp932 でエンコードする必要があります。
5デフォルトの名無しさん:2009/11/02(月) 14:29:35
6デフォルトの名無しさん:2009/11/02(月) 14:30:16
7デフォルトの名無しさん:2009/11/02(月) 15:38:41
8デフォルトの名無しさん:2009/11/02(月) 19:15:49
>>1乙。
9デフォルトの名無しさん:2009/11/03(火) 13:43:09
>>1もつ
10デフォルトの名無しさん:2009/11/05(木) 13:32:33
今からPerlをするのって無駄ですかね?
やっぱり、Perl 6が出てからしたほうが無難ですか?
11デフォルトの名無しさん:2009/11/05(木) 13:49:58
>>10
> 今からPerlをするのって無駄ですかね?

いや、別に。

> やっぱり、Perl 6が出てからしたほうが無難ですか?

キニスンな
12デフォルトの名無しさん:2009/11/05(木) 18:58:10
Perl5とPerl6はもはや別言語。
同じ名前がついてるのが不思議なレベル
13デフォルトの名無しさん:2009/11/05(木) 23:37:34
こまる!

おまる!
14デフォルトの名無しさん:2009/11/06(金) 17:07:27
Perlのデストラクタって
強制終了時にも呼ばれますか?
15デフォルトの名無しさん:2009/11/06(金) 18:11:26
そんな器用なモンじゃない。
16デフォルトの名無しさん:2009/11/08(日) 10:53:00
substrのsubって何の略ですか?
17デフォルトの名無しさん:2009/11/08(日) 11:02:21
wikipedia より引用

「さぶ」は、日本で薔薇族に続き出版された男性同性愛者向け雑誌(ゲイ雑誌)である。
SMを中心とした雑誌アブハンター増刊号として、サン出版より1974年11月に創刊。
当初3号まで隔月発行であったが、1975年6月号(4号)より月刊化された。
創刊編集長は、有名なサブカル編集者である櫻木徹郎。
18デフォルトの名無しさん:2009/11/08(日) 11:05:24
19デフォルトの名無しさん:2009/11/08(日) 11:07:11
20デフォルトの名無しさん:2009/11/08(日) 11:28:26
>>16
だれに何かの略だというデタラメ吹き込まれたんだ?
21デフォルトの名無しさん:2009/11/08(日) 11:57:06
>>16
だれにsubとstrを分けるというデタラメ吹き込まれたんだ?
22デフォルトの名無しさん:2009/11/09(月) 01:25:53
Perl 6ってPerl 5互換モード搭載してるらしいんだけど
23デフォルトの名無しさん:2009/11/09(月) 09:35:17
4と5もだいぶ違ったしな。そのうちなれるだろ。
24デフォルトの名無しさん:2009/11/09(月) 13:59:48
4と5はそれなりに互換性があったけど
5と6は殆ど互換性が無いらしい。
だからPerl 6に5の互換モードの搭載を検討してるっぽい。

俺は試作品とか大量に作ってるから是非搭載して欲しいな・・・
また覚えるまで時間がかかりそうだし。
25デフォルトの名無しさん:2009/11/09(月) 14:51:14
>>22
>>24
Larry Wal 本人が解説してくれているけどな
ttp://www.nicovideo.jp/watch/sm4503164
26デフォルトの名無しさん:2009/11/09(月) 15:57:45
むしろ5に6互換モジュールが作られ始めてるから今のうちに慣れとくって手もあるんだぜ
27デフォルトの名無しさん:2009/11/09(月) 16:39:03
以下のようにファイルハンドルをハッシュで持って、それを<>演算子の中で使うとエラーになります。
<>演算子と同等で、ハッシュも使える関数はありますでしょうか?

my $in = $fh->{handle}; <$in>; と一旦、変数に格納してから使うしかないでしょうか?


my $fh = create_fh( 'data.txt' );
while ( my $line = < $fh->{handle} > ) {
  ・・・
  ・・・
}
close $fh->{handle};

sub create_fh {
my $file = shift;

open my $fh, '<', $file or die $!;
return { file => $file, handle => $fh };
}
28デフォルトの名無しさん:2009/11/09(月) 17:06:44
>>27
readline
29デフォルトの名無しさん:2009/11/09(月) 17:22:21
>>28
d
うまくいきました。
30デフォルトの名無しさん:2009/11/10(火) 02:48:49
置換の際、被置換文字列($string)に、ある文字列($buf)を格納した変数で置換するとき、その変数に^などの特殊文字が入っていると
うまく置換されないのですがどのようにすればよいのでしょうか

$string =~ s/$buf//;
31デフォルトの名無しさん:2009/11/10(火) 02:52:42
quotemeta($buf)
32デフォルトの名無しさん:2009/11/10(火) 13:15:26
>>30
quotemata $buf;
33デフォルトの名無しさん:2009/11/10(火) 13:43:20
また(カッコ)を付けてやがる。
何でもかんでもカッコ付けまくるカッコ病か、おまいは。
こういうヤツってさ、ファイルをコピーするだけでも
C:> copy (hoge.txt hoge.bak)
みたいにカッコつけるんかな。
34デフォルトの名無しさん:2009/11/10(火) 13:50:06
perlの前はlisp使いだったので勘弁してください
35デフォルトの名無しさん:2009/11/10(火) 14:05:33
perlじゃなくてPerlね
36デフォルトの名無しさん:2009/11/10(火) 14:59:50
これじゃダメ?

$string =~ s/\Q$buf//;
37デフォルトの名無しさん:2009/11/10(火) 17:45:06
やってみればいいじゃん
38デフォルトの名無しさん:2009/11/10(火) 19:57:02
>>31
>>32
>>36
ありがとうございます
39デフォルトの名無しさん:2009/11/11(水) 22:02:48
aaabdddbbbeeeecddddd
という文字列が有ったとして
文字列に現れる最後のbから一番近いcまでの文字を抜き出すにはどのような正規表現が良いのでしょうか
cに一番近いbという感じで考えたのですが、c以降にbがあるのならばともかく、c以前にbが有り、それがcにとっての最短マッチである場合の表現がわかりません
40デフォルトの名無しさん:2009/11/11(水) 22:34:37
/(b[^b]*?c)/
41デフォルトの名無しさん:2009/11/11(水) 22:48:04
>>40
こんな簡単な記述で出来るのか……
精進します
42デフォルトの名無しさん:2009/11/12(木) 03:09:48
/(b[^b]*?c)[^b]*?$/;
こっちの方が安全じゃないだろうか。
上の例だと、baaacbeeecみたいなのは$1がbaaacになっちゃうし。
43デフォルトの名無しさん:2009/11/12(木) 03:19:17
よく考えたら
baaacbeeecaabみたいなのに対応してないことに気がついた
で書き直したのがこれだが、
/(b[^b]*?c)(?:[^b]*|[^b]*b[^c]*)$/
さらに考えたら、これで良いことに気づいた。
/.*(b[^b]*?c)/
44デフォルトの名無しさん:2009/11/12(木) 15:27:31
my @string = qw{aa,33 bb,44 cc,55 aa,xx bb,44 cc,55 aa,yy bb,44 cc,55};
という配列の各要素をカンマ区切りでハッシュkeyとvalueに分け、かつ特定のkeyでぐぎった2次元配列にしたいです。
具体的には上記の配列を

$list[0]{aa} = 33;
$list[0]{bb} = 44;
$list[0]{cc} = 55;
$list[1]{aa} = xx;
$list[1]{bb} = bb;
$list[1]{cc} = 44;
$list[2]{aa} = yy;
$list[2]{bb} = 44;
$list[2]{cc} = 55;

というような2次元配列にしたいので以下のように書いたのですが、
最後のprintでは何も表示されませんでした。何がいけなかったのでしょうか?

my @list;
my %data;
my @string = qw{aa,33 bb,44 cc,55 aa,xx bb,44 cc,55 aa,yy bb,44 cc,55};
my $n = 0;

foreach my $item (@string) {
my ($key, $value) = split qq{,}, $item;
$data{$key} = $value;
if($key eq qq{cc}) {
$list[$n] = %data; %data=(); $n++;
}
}

print $list[0]{aa};
45デフォルトの名無しさん:2009/11/12(木) 16:28:46
$list[$n] = \%data;
ハッシュを代入すれば動くはず
46デフォルトの名無しさん:2009/11/12(木) 16:42:41
以下のように、コピーしてから代入じゃないかな?

$list[$n] = { %data };
47デフォルトの名無しさん:2009/11/12(木) 18:08:05
素直にやれば

$list[$n]{$key} = $value;
$n++ if($key eq qq{cc});
48デフォルトの名無しさん:2009/11/13(金) 07:59:02
>>44
$list[$n] = {%data}; %data=(); $n++;

どうちがうかは自分で考えてね
4944:2009/11/13(金) 10:15:26
>>47
素直にやることにしました。ありがとうございました。

>>48
deep copy と shallow copyの違いですかね?
映らない理由はわかりました。
50デフォルトの名無しさん:2009/11/13(金) 12:12:02
デバッグという概念を最初から持っていない
51デフォルトの名無しさん:2009/11/13(金) 13:31:24
Rubyだとそのオブジェクトがどのようなメソッドを持っているかを、

p obj.methods

でわかりますが、Perlだとどのようにするのでしょうか?

my $obj = new Foo;
print $obj->methods???
52デフォルトの名無しさん:2009/11/13(金) 14:04:34
>>51
つClass::Inspector
53デフォルトの名無しさん:2009/11/13(金) 15:28:01
>>52
d
CPANからインストールするんすね。
54デフォルトの名無しさん:2009/11/15(日) 10:28:23
Coroでサイト情報を取りに行けないのですが、何故でしょうか?

use LWP::Simple;
use Coro;

my $url = 'http://www.yahoo.co.jp/';
my $res;

async {
$res = get $url;
};

print $res; # 何も表示されない
55デフォルトの名無しさん:2009/11/15(日) 15:17:04
>>54
asyncの意味わかってるのか
56デフォルトの名無しさん:2009/11/15(日) 20:35:35
>>54
取りに行くように書いていないから
57デフォルトの名無しさん:2009/11/15(日) 20:41:44
取りに行ってと指示しただけで、取りに行ったか確認もしていないから。
58デフォルトの名無しさん:2009/11/15(日) 21:36:12
すみません、環境を書くのを忘れてました。
Windows XP SP2、ActivePerl 5.8.9です。

あと、>>54で、print $res;の前に、cede;も書いてましたが抜け落ちてました。
普通に、$res = "foo";とかだと表示されるんですけどね。。。
59デフォルトの名無しさん:2009/11/15(日) 23:24:10
Coro::LWPを使え
60デフォルトの名無しさん:2009/11/16(月) 14:27:03
初心者の質問なのですが、よろしくお願いします。
以下のコードを実行すると、"koko"と表示された後、しばらく時間が経ってから
終了します。GCが走っているんじゃないかと思うのですが、こんな箇所でも走るのでしょうか?

use strict;
use warnings;

my @rray;
my $i = 0;
while ($i < 100000000) {
push(@rray, $i);
$i++;
}
$i = 0;
while ($i < 1) {
unshift(@rray, 1);
pop(@rray);
print "koko\n";
$i++;
}
61デフォルトの名無しさん:2009/11/16(月) 14:37:52
GC(笑)

62デフォルトの名無しさん:2009/11/16(月) 14:40:30
>>61
すいません。全然違いますか、、、
63デフォルトの名無しさん:2009/11/16(月) 14:44:05
メモリを食うみたいだから、シェルがスワップアウトされてるんじゃないの?
64デフォルトの名無しさん:2009/11/16(月) 20:59:59
cure っていうコスプレサイトでエラー画面出てた
http://spicky.net/vipper/uploads/spicky/9/5/8/1859_zeL8gI2.png
http://spicky.net/vipper/image/1859/
65デフォルトの名無しさん:2009/11/17(火) 01:55:04
GC? Game Cube?
まあ何でも良いんだけど、このコードをみると、
下のwhileは一回で抜けるように見えるのは俺だけか
66デフォルトの名無しさん:2009/11/17(火) 09:57:25
>>65
おそらくデバッグ用にそうしてるんだろ。
それくらい善意に解釈してやれよ。
本質とは関係ないとこをいちいちツッコミ入れる
おまいのようなヤツが一番ウザイんだよ。
67デフォルトの名無しさん:2009/11/17(火) 10:05:33
お前が言うな
68デフォルトの名無しさん:2009/11/17(火) 10:11:46
>>66
お前もうざいよw
69デフォルトの名無しさん:2009/11/17(火) 10:18:23
どうせマルチなんだから文句を言ってもいいんじゃない?
70デフォルトの名無しさん:2009/11/17(火) 10:43:07
>>68
小学生かおまえはwww
71デフォルトの名無しさん:2009/11/17(火) 15:05:45
パターンマッチとindex関数
文字列に文字が含まれているか確認するならどっちがいい?
72デフォルトの名無しさん:2009/11/17(火) 15:31:59
>>71
index関数のほうが高速だからお薦め
73デフォルトの名無しさん:2009/11/17(火) 15:46:11
>>72
サンクス。
74デフォルトの名無しさん:2009/11/17(火) 20:43:42
>>72
それって最新の情報?
75デフォルトの名無しさん:2009/11/18(水) 09:40:09
論より証拠ってことでベンチとってみた。

use Benchmark;

my $s = '';
for (1.10000) {
$s .= chr(32 + rand(95));
}

timethese(
undef,
{
re => sub { $s =~ /abcdefgh/ },
index => sub { index($s, 'abcdefgh') },
}
);

結果は

Benchmark: running index, re for at least 3 CPU seconds...
index: 4 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 7719383.64/s (n=25010803)
re: 4 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 10203485.11/s (n=31528769)

正規表現すげー。

perlのバージョンは

This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi

です。測定方法に文句ある人はいろいろ試してくれ。
76デフォルトの名無しさん:2009/11/18(水) 18:12:18
無粋な突っ込みだが、
>for (1.10000) {
for (1..10000) {
だよね?
77デフォルトの名無しさん:2009/11/18(水) 18:24:48
>>76
うお、その通りだ。やりなおしたぜ。

Benchmark: running index, re for at least 3 CPU seconds...
index: 4 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 131580.13/s (n=410530)
re: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 131156.87/s (n=410521)

indexの方がやや速いが差は微妙という常識的な結果だった。
78デフォルトの名無しさん:2009/11/19(木) 01:13:24
                |   / ハ__________.ノ |
              ノ  /_.イ / ノト、_」/ |/l/_.斗  \ 〕
.               / l   ̄ 7|/| 」ィfて-カ`    ィf リハ  ! 「|
             / |    ∧| ノ   弋zノ      辷ノ' ノ∨|/|  おなかいっぱい食べさせられると(ry
.            / |   // | |、           ,    | |   ノ
.           /       // | | \            人 ハ  |
        /         厶-、| ト._个 、  ∠フ _. イ|    \|
        /       /   / ̄ ヽ、 >- ≦ノ| | /´⌒ く\

ということでもっと大きいデータや小さいデータを使うと若干差が出たような。
大きさに比例するものとコンスタントな速度を維持できるものと。
79デフォルトの名無しさん:2009/11/19(木) 18:36:44
共用のレンタルサーバを利用してCGIの制作を行っているのですが、モジュールの扱い
についてわからないことがあるので、質問させてください。

レンタルサーバに標準で入っていないモジュールをcpanより、~/CPAN以下にインストー
ルしているのですが、自分で制作したCGIはcpanのモジュールを使用しているため@INC
にパスを追加しないといけません。
現在は全てのモジュールを使用するcgiに@INCに追加するコードを追加しているのですが、
何か設定でパスを追加することはできないでしょうか?
共用サーバの為、ホームディレクトリ以下での作業以外はできないと思います。


どうか、宜しくお願いいたします。
80デフォルトの名無しさん:2009/11/19(木) 18:42:40
>>79
CGIは板違いな。1読め。
8179:2009/11/19(木) 18:58:17
>>80
ありがとうございます。

ファイルはCGIなのですが、Perlの設定になるのかと思いこちらで質問をさせていただきました。
Webプログラミング板の方が適切なようですので、もうしばらく書き込みをお待ちした後にWebプログラミング板に移動させていただきます。
82デフォルトの名無しさん:2009/11/19(木) 21:11:09
待たなくていいから今すぐ池
83デフォルトの名無しさん:2009/11/19(木) 22:21:48
>>79
みんな冷たいね
つ「use lib;」
84デフォルトの名無しさん:2009/11/20(金) 01:58:13
ほんとだよ。
コマンドラインでもCGIでも共通する部分の質問なんだから
CGIはWebProg板へのwarnを出した上で答えも付けてあげればいいのに。
85デフォルトの名無しさん:2009/11/20(金) 02:48:49
猫おばさんの襲来である
86デフォルトの名無しさん:2009/11/20(金) 06:59:49
知らないから答えられないだけだろ
87デフォルトの名無しさん:2009/11/20(金) 09:01:08
本を一冊通読した方が良いよ。

「猿でも三日でわかるCGI入門」みたいなものにも必ず書いてあるようなことが
わかってないんだから。聞くのも答えるのも時間の無駄。
88デフォルトの名無しさん:2009/11/20(金) 09:37:30
無駄だと思うなら答えなきゃいいじゃん。
>>80 とか >>82 とか他人に不快感を与えるレスの方がよっぽど無駄。
89デフォルトの名無しさん:2009/11/20(金) 09:51:56
>>83
use libにしろ@INCにしろいちいち全部に書くのが大変だから
まとめて設定したいって話なんじゃないの?

そうすると環境変数PERLLIBだけど、それを設定するにはCGIだと
鯖の設定ファイルとか.htaccessとかいう話になってきてこっち向き
ではないよ。WebProg板に行くべき。

>>88
いやそれ普通の誘導だから。そのくらいで不快感とか言われても
ポカーンだよ。
90デフォルトの名無しさん:2009/11/20(金) 11:56:07
普通の誘導wwww
91デフォルトの名無しさん:2009/11/20(金) 12:01:18
普通じゃない誘導……?
92デフォルトの名無しさん:2009/11/20(金) 13:16:05
まぁ、普通なんて関係ないよ。
世のなかでPerlを使っている人がどれだけいることか・・・
93デフォルトの名無しさん:2009/11/20(金) 13:38:38
本スレッドは、CGIに関する事項は取り扱っておりません。
>>1をよくお読みの上、WebProg板への移動をお願いいたします。
94デフォルトの名無しさん:2009/11/20(金) 13:44:23
>>88
> 無駄だと思うなら答えなきゃいいじゃん。
> >>80 とか >>82 とか他人に不快感を与えるレスの方がよっぽど無駄。

他人に不快感を与えるのが悪いと思っているのなら、まず自分が
>>88のような他人に不快感を与えるレスすんな。
95デフォルトの名無しさん:2009/11/20(金) 15:17:20
なんでこんなに荒れてんの?
まあ質問スレで荒れるのは大体が回答しないけど余計なこと言う奴が原因だけどねw
96デフォルトの名無しさん:2009/11/20(金) 16:08:23
回答しないけど余計なこと言う奴よ

新でくれ
97デフォルトの名無しさん:2009/11/20(金) 16:12:09
回答せずに余計なことをいう人が集結しているスレはここですか?
98デフォルトの名無しさん:2009/11/20(金) 16:52:58
自分の知らないことを聞かれると逆切れする回答者がいるよね
99デフォルトの名無しさん:2009/11/20(金) 18:17:16
いないよ
100デフォルトの名無しさん:2009/11/20(金) 18:21:28
いないだろ。
101デフォルトの名無しさん:2009/11/20(金) 18:23:57
さっき居たよ?
102デフォルトの名無しさん:2009/11/20(金) 18:54:56
windowsでperlを使えるようにするためactiveperlをインストールしました。
拡張子を関連付けたのですがhello_world.plをクリックしたらhello,worldと一瞬表示されて消えます。
どうすればいいのでしょうか?
103デフォルトの名無しさん:2009/11/20(金) 19:06:29
>>102
方法はいっぱいある。
例えばキーを押すまでループするプログラムを書く。
104デフォルトの名無しさん:2009/11/20(金) 19:25:26
最後に<STDIN>;
105デフォルトの名無しさん:2009/11/20(金) 19:27:15
>>103-104できました。有難うございました。
106デフォルトの名無しさん:2009/11/20(金) 19:30:17
>>102
これとかどうかな?

WindowsでPerlスクリプトをダブルクリックで実行したいけど
http://d.hatena.ne.jp/charsbar/20090604/1244104249

Perlの処理待ちコマンド - 教えて!goo
http://oshiete1.goo.ne.jp/qa5369764.html
107デフォルトの名無しさん:2009/11/20(金) 19:37:59
>>106の下の、色々やってるけど
>DOSバッチのpauseとかに相当するものです。
`pause`でええやんとか思た
108デフォルトの名無しさん:2009/11/20(金) 20:00:01
MVCフレームワークを勉強しているのですが、それで悩んでいます。
勉強用として制作したものが非常に動作の重いものになってしまいました。

どこが原因かの切り分けをおこなっていたところ、
各パッケージをuseしているところ(20箇所ぐらい)がかなり負担になっているみたいでした。


BEGIN{
push(@INC, "model");
push(@INC, "view");
push(@INC, "control");
use Model;
use View;
use Control;
.....
}

そこで↑のところを↓のように変更したらそこそこ改善された
(ログイン画面を表示するだけなのに4secかかっていたのが半分ぐらいに)
のですが、@INCにパスを追加するよりも絶対パス指定をした方がそんなにアドバンテージがあるものなんでしょうか?


use model::Model;
use view::Viewl;
use control::Control;
....
109デフォルトの名無しさん:2009/11/20(金) 22:00:25
>>108
> のですが、@INCにパスを追加するよりも絶対パス指定をした方がそんなにアドバンテージがあるものなんでしょうか?

無い
110デフォルトの名無しさん:2009/11/20(金) 22:03:53
なんだかみんなが少し優しくなった気がする
111デフォルトの名無しさん:2009/11/20(金) 23:30:09
ぼくのおかげでみんなが少し優しくなったのなら、質問に答えなくても少しは役に
たてたということですね。
112デフォルトの名無しさん:2009/11/21(土) 00:19:04
>>108
捜索範囲が広がればそれだけ時間もかかるんじゃないか?
証拠はないけど
というかそもそも名前空間が被ったりしないようにできるだけ@INCは少ない方がいいと思う
例えば lib/control/View.pm と lib/view/View.pm なんかがあった場合に、最初のだと競合して予想外の動作をするかもしれない
113108:2009/11/21(土) 02:31:47
>>109
やっぱりほかの部分に原因があって、たまたま速くなっただけでしょうか


>>112
絶対パスで書くのは長くなってしまって面倒だなぁと思って@INCで済ませていました。
MVCのサンプル通りのディレクトリ構造でやると lib::framework::abstract::model::Model.pm となってしまって
なんだかなぁと。。。でもその方が安全みたいなのでそちらで進めてみたいと思います。
114デフォルトの名無しさん:2009/11/21(土) 06:21:45
モジュールの名前は大文字で始めることになっている。
小文字で始まるのはプラグマ
115デフォルトの名無しさん:2009/11/21(土) 09:49:46
/PATH/TO/LIB/ 以下に FOO/Bar.pm があるなら
=== Bar.pm ===
package Foo::Bar ;

1;
======
って package 宣言して呼び出す方で
use lib qw( /PATH/TO/LIB/ ) ;
use Foo::Bar ;

114氏の言う通りなので、 FOO のディレクトリ名も
お約束として大文字スタート。
116デフォルトの名無しさん:2009/11/21(土) 09:50:50
s/FOO/Foo/g ;
orz...
117デフォルトの名無しさん:2009/11/21(土) 19:48:31
PenDCでactive perlをぶん回すと、
片方のコアだけ使ってCPU使用率が50%になるんだけど、
なんとか100%にできんもんかな
118デフォルトの名無しさん:2009/11/21(土) 20:11:04
実装し直さない限りもう一方のコアを使いまくるアプリを動かすしかないな。
119デフォルトの名無しさん:2009/11/21(土) 20:13:41
>>117
forkして2つ子プロセスを作って
120デフォルトの名無しさん:2009/11/21(土) 20:44:36
こんなにシングルコアなアプリも珍しい
forkしても多分1個しか使わない
121デフォルトの名無しさん:2009/11/21(土) 20:57:34
使ってないコアで他のいろんなことができるように設計しといたんじゃね?
122デフォルトの名無しさん:2009/11/22(日) 15:37:09
>>107
これいいんじゃない?
たまにこの手の初心者質問が出るからテンプレに入れるとか。
123デフォルトの名無しさん:2009/11/25(水) 11:29:01
いらね。Perl関係ないし
124デフォルトの名無しさん:2009/11/25(水) 11:40:16
これからプログラムをやってみたいと思っています。
目標はブログみたいなシステムを作りたいんですが、パールでできますか?
できない場合、他にそういうのを作れる言語を教えてほしいです。
125デフォルトの名無しさん:2009/11/25(水) 11:42:34
はい
126デフォルトの名無しさん:2009/11/25(水) 13:48:34
>>125
GJ
オレも参考になった
127デフォルトの名無しさん:2009/11/25(水) 15:12:01
>>125
サンクス。助かりました。
128デフォルトの名無しさん:2009/11/26(木) 15:25:22
今までPerlが好き使ってたけどPHPってよく見たら凄く良いね
最初見た時「汚ねぇwwwwこんなスクリプト書く奴って顔も心も汚いんだろうなww」
とか思ってすいませんでした。細かいことを気にしない人にとって至高の言語です。
129デフォルトの名無しさん:2009/11/26(木) 18:51:10
全くです。Perlのことは忘れてPHPに引っ越しましょう。
130デフォルトの名無しさん:2009/11/26(木) 23:12:16
>>128
ま、言語の問題じゃ無く、プログラムを作る人間次第ってことだね
お前が作るプログラムをみたら
「汚ねぇwwwwこんなスクリプト書く奴って顔も心も汚いんだろうなww」
と思ってしまうだろう、多分
131デフォルトの名無しさん:2009/11/27(金) 00:20:48
PHP最高!
Perlみたいに後から実装しないと実行出来ない機能がデフォでかなり装備されてる!
配列が使いづらいのは痛いけど
132デフォルトの名無しさん:2009/11/27(金) 06:03:32
そうかそうか
133デフォルトの名無しさん:2009/11/27(金) 10:22:22
>>131
良かったね、おめでとう
スレタイを読める日本語力があるともっと良かったのに
134デフォルトの名無しさん:2009/11/27(金) 10:23:25
無いのは>>133のスルー力のほうだな。
135デフォルトの名無しさん:2009/11/27(金) 17:39:57
perl = htmlを吐き出すためのプログラミング言語

これは確定事項です。
136デフォルトの名無しさん:2009/11/27(金) 17:42:55
世の中のコンピュータはすべて
WEBアプリで動作しています。

これは確定事項です。
137デフォルトの名無しさん:2009/11/27(金) 17:56:32
つまり、>136の意図する所は
>135は>136と同様にそんなことはありえない
ということでいいのかな
138デフォルトの名無しさん:2009/11/27(金) 20:37:30
俺がイケメンでちんちんズル剥けでかちんぽで男のフェロモンで女がメロメローンであるのも確定事項である
139デフォルトの名無しさん:2009/11/27(金) 21:08:01
あ、なんだ
周知の事実を述べてるだけか
140デフォルトの名無しさん:2009/11/27(金) 21:13:34
まあまあ、みんな落ち着いてもっとPerl関連の真面目な話に戻そうよ。
141デフォルトの名無しさん:2009/11/28(土) 04:06:45
けんかヨクナイ(・∀・)
142デフォルトの名無しさん:2009/11/28(土) 19:59:40
PostgreSQLに接続するためにDBD::Pgを使ってますが、DBD::ODBCを試して見たところ、自分の環境では
ODBCの方が少しだけ性能が上でした。単純なSELECTを発行しただけなのですが、これはこんなものなんでしょうか?
ODBCの方が性能がいいとすると、DBD::Pgの存在理由はなんなんでしょうか?
143デフォルトの名無しさん:2009/11/28(土) 21:56:07
それを知ってどうしようと?
コンビニならセブンイレブンがあるのにローソンの存在理由はなんなんなんでしょうか?
144デフォルトの名無しさん:2009/11/29(日) 17:15:35
問題解決法が選べることは喜ばしいことでは無いのか。
145デフォルトの名無しさん:2009/11/29(日) 23:03:27
perldoc を見ても、Text::Balanced の使い方がいまいち理解できません
できれば日本語で解説しているブログなどをご存知でしたら教えていただけないでしょうか
extract_tagged 関数のみ使えればよいのですが。。。
146デフォルトの名無しさん:2009/11/30(月) 09:45:02
>>145
extract_taggedでググれば一発でこんなの出てくるんだが....

ttp://questionbox.jp.msn.com/qa1767267.html
147デフォルトの名無しさん:2009/11/30(月) 10:28:42
>>146
後出しですみませんが、それは見つけました。
ただ、それ以外の文献が見つからないです。

やりたいことは
$open_tag = qr/<([a-zA-Z0-9]+)\s+([^>])+\s*>/;
で定義された独自タグのバランスをとることなんですが、そのURLからでは正規表現を使った場合のクローズタグの定義の仕方が分かりませんでした。

また、タグの定義をベタで書いた場合にも思ったとおりに動いてくれない場合があるため、何が分からないか分からない状態です。
具体的には

use Text::Balanced qw/extract_tagged/;
my $data = '<huga>test1<hoge>test2</hoge><hoge>test3<hoge>test4</hoge></hoge></huga>';

my($extracted, $remainder) = extract_tagged($data, '<hoge>', '</hoge>');
print "ext: $extracted\n";
print "rem: $remainder\n";

というスクリプトを作ってテストしてみたのですが、出力結果は期待に反して

ext:
rem: <huga>test1<hoge>test2</hoge><hoge>test3<hoge>test4</hoge></hoge></huga>

となってしまいました。

my($extracted, $remainder) = extract_tagged($data, '<huga>', '</huga>');

とすると期待通りの結果になるので、余計にわけが分からないです。
何か根本的に勘違いをしているような気がします。。。
148デフォルトの名無しさん:2009/12/01(火) 12:55:30
>147
クローズタグ指定省略か undef 渡せば良きに計らってくれそうだけどそれじゃあかんの?
デフォルトだと空白を無視して「文字列先頭」から取り出してくるので無視する部分(第4引数)を
指定すればいいと思われ。>146 でも指定してある。
149デフォルトの名無しさん:2009/12/01(火) 18:05:54
>>148
ああなるほど
このモジュールは先頭のタグのみを取り出してくれるだけなんですね
うまくいきました、ありがとうございます
150デフォルトの名無しさん:2009/12/02(水) 05:36:28
ある範囲の数値(1-9など)からランダムな4つの数字を被らないように取り出す(取り出した4つの数値で新しいリストを作る)

という処理をさせたい場合、
いくらでもやり方はあると思うんですが、
一番スマートな感じにするにはどういう風になるでしょうか?
151デフォルトの名無しさん:2009/12/02(水) 06:12:08
(List::Util::shuffle(1..9))[0..3]
152デフォルトの名無しさん:2009/12/02(水) 08:45:24
何かの問題なら自分の力でな
153デフォルトの名無しさん:2009/12/02(水) 12:31:26
>>150
こんなんどうですか?

my @nums = 1..9;
my @picked_nums = map splice( @nums, rand @nums, 1 ), 1..4;
154デフォルトの名無しさん:2009/12/02(水) 12:36:00
数の範囲が1から1億だったらどうする?
155デフォルトの名無しさん:2009/12/02(水) 13:32:08
一つ質問させてください。
Perlにおいて、文字列中の非表示文字を、簡単に確認できる方法はないでしょうか?

たとえばある文字列について、改行コードが\r\nか、それとも\nなのかを知りたいとき
これを確認する方法は、Devel::PeekのDump関数しかないのでしょうか?
(RubyでいうString#inspectやString#dumpのようなものがあれば、便利なのですが)
156デフォルトの名無しさん:2009/12/02(水) 13:54:06
>154
1要素取り出して
その度、被ってないかチェックすれば良いんじゃね?
157デフォルトの名無しさん:2009/12/02(水) 14:01:41
>>155

Unicode 16進表記でパターンマッチをかければいい。
例えば、[\x{ff10}-\x{ff19}]+ とすると、これは、全角の [0-9]+と同じ意味
158デフォルトの名無しさん:2009/12/02(水) 14:34:02
>>154
こんな感じでどうでしょうか?

my $min = 1;
my $max = 10**8;
my $num_to_pick = 4;
my @picked_nums;

for ( 1..$num_to_pick ) {
 my $picked_num;

 do {
  $picked_num = $min + int rand( $max - $min + 1 );
 } while ( grep { $_ == $picked_num } @picked_nums );

 push @picked_nums, $picked_num;
}

print "@picked_nums";
159デフォルトの名無しさん:2009/12/02(水) 16:17:46
ヒアドキュメントから再帰的に呼び出しを行う実験をしています

4 my $cnt;
5 sub hoge{
6 return "@{[ ' [[' . hoge() . ']] ']}" if $cnt++ < 10;
7 return "hoge";
8 }
9
10
11 $huga = "[[@{[hoge()]}]]";
12 print "count : $cnt\n";
13 print $huga;

このような再帰呼び出しを行う場合だと、当たり前ですが
count : 11
[[ [[ [[ [[ [[ [[ [[ [[ [[ [[ [[hoge]] ]] ]] ]] ]] ]] ]] ]] ]] ]] ]]
という結果が帰ってきます(この場合についての動きは理解しました)

呼び出すタイミングを遅らせようと
11 $huga = '[[@{[hoge()]}]]';
13 print eval{ $huga };
としたところ、
count :
[[@{[hoge()]}]]
という結果になりました

B::Deparse で確認すると、シングルクォーテーションで囲った文字列の中の @ がエスケープされていました
なので、文字列として展開しても @ がそのままだったようです

質問したいことは、eval の使用制限は1回で、なんとかこの仕様を回避する方法はないかということです
よろしくお願いします
160デフォルトの名無しさん:2009/12/02(水) 16:22:22
>>159
eval BLOCK と eval EXPR の違いについて調べてみればいいんじゃない
161デフォルトの名無しさん:2009/12/02(水) 19:11:13
>>160
有難うございます
助言より色々試してみた結果、
11 $huga = '"[[@{[hoge()]}]]"';
13 print eval($huga);
とするとうまく行くことが判明しました
162デフォルトの名無しさん:2009/12/02(水) 20:03:05
そんなこと聞いてません
163155:2009/12/02(水) 21:24:56
>>157
申し訳ないのですが、やりたいのは非表示文字の簡単な確認(表示)なのです。
164デフォルトの名無しさん:2009/12/03(木) 01:30:08
表示文字は\p{L}だから、非表示文字は[^\p{L}]
あとは任せた
165デフォルトの名無しさん:2009/12/03(木) 09:07:12
perlの組み込み関数としてそんなものはないので
モジュール拾ってきてインストールするか1,2行の
プログラム書くかになるだろ。Devel::Peekでできる
んならそれでええやん。
166150:2009/12/03(木) 15:51:53
規制巻き込まれてお礼遅れましたスイマセン

>>151-154
ありがとうございます。なるほどなるほど
シャッフルは目からウロコでした
範囲が大きい場合は一つずつチェックするやり方の方が良さげですねきっと
167デフォルトの名無しさん:2009/12/03(木) 19:38:02
初心者です。
$ARGV[1]が巨大なファイルなので内容を配列に押し込むとやたらに時間がか
かるのとメモリが一杯一杯になるので、以下のようなコードになってしまいました。
whileループ内でファイルのopen/closeを繰り返す以外に、メモリに負担をかけない
解決策が無いでしょうか?

open(IN0,"<$ARGV[0]");
while(<IN0>){
処理;
open(IN1,"<$ARGV[1]");
   while(<IN1>){
if(条件){処理;
last;
}
    }
close(IN1);

close(IN2);
168デフォルトの名無しさん:2009/12/03(木) 20:47:58
ねえよ、帰れ
169155:2009/12/03(木) 20:55:20
>>165
ありがとうございます。あきらめてDevel::Peekを使うことにします
170デフォルトの名無しさん:2009/12/03(木) 23:55:00
$^Nは、正規表現パターン内では
使えないの?

\数字のかわりに、/(.).+?$^N/とか
書けたら、括弧をいちいち数えなくても
よくなってウマー、と試したけど、なんか
うまくいかない。orz
171デフォルトの名無しさん:2009/12/04(金) 03:19:47
>>167
どんな処理してるか/ファイルサイズにもよるけど、いちいちopenするのではなく、
seek(IN1, 0, 0)でファイルポインタを戻してみるとか。
早く処理できるようなデータの持ち方に変えた方がよいのでは。
172デフォルトの名無しさん:2009/12/04(金) 09:14:52
open/closeをなくしてseekにかえても、メモリに抱えられないぐらい
でかいファイル$ARGV[1]を毎回頭から読んでたら負けだと思う。
インデックス的なものを用意して全部読まなくていいように工夫する
しかないんじゃないかなぁ。
173デフォルトの名無しさん:2009/12/04(金) 12:28:51
>>167
ファイルシステム版KVSとか使え
速度を問わないならdbopenとかでもいいからさ。
ただこの2つはシーケンシャルな読み出しにめっぽう弱い。
ので固定長ファイルに変換してseekで読み出すのも手。

それか>>172のようにファイルに直接インデックス張っちゃうか。

perldoc界隈がなんか騒がしいな。
174デフォルトの名無しさん:2009/12/05(土) 15:04:50
>>172>>173

一度だけハッシュを作ってそれを利用するという方法で高速化が出来ました。
>>173がインデックス的なと言ってくれたので思いつきました。
感謝です。
175デフォルトの名無しさん:2009/12/05(土) 15:06:28
perlはメモリ喰いと批判されるけど64ビット版なら好きなだけメモリ喰っても良いんじゃないの?
実際のところどうなんだろ?
176デフォルトの名無しさん:2009/12/05(土) 16:58:38
64bit版のperlあるの?
177デフォルトの名無しさん:2009/12/05(土) 17:11:24
64bit linuxにデフォで入っていない?
178デフォルトの名無しさん:2009/12/05(土) 17:13:13
そんなの5.8.0からとっくに対応になっとるやろボケ
179デフォルトの名無しさん:2009/12/05(土) 17:57:17
知るかクズが
180デフォルトの名無しさん:2009/12/05(土) 20:23:18
やかましわボケ
181デフォルトの名無しさん:2009/12/05(土) 23:37:42
死ねカス
182デフォルトの名無しさん:2009/12/05(土) 23:51:04
さっさとdual coreに対応しる
183デフォルトの名無しさん:2009/12/06(日) 16:10:36
>>174
むしろKVSやdbopenがハッシュ関数を積極的に利用する方なんだがな。
ハッシュって言葉の意味と、DB系の話で何でハッシュって言葉がでてくるのか
ちゃんと勉強しとかないと恥かくぞ。
184デフォルトの名無しさん:2009/12/06(日) 18:09:07
ハッシュテーブルを略してハッシュって言ってるんだろ。
ハードディスクを略してハードと言うのと同じ。
185デフォルトの名無しさん:2009/12/06(日) 18:59:21
>>183
プ
186デフォルトの名無しさん:2009/12/06(日) 21:17:00
>>ハードディスクを略してハードと言うのと同じ

それはねーよ
187デフォルトの名無しさん:2009/12/06(日) 21:51:31
ハードはハードウェアの略だろ、普通は
188デフォルトの名無しさん:2009/12/06(日) 21:59:39
ハードディスクをハードと略するのはあり得ないな。
他の板ならそれでも許されるかもしれんが、少なくともプログラム板では無理。
189デフォルトの名無しさん:2009/12/06(日) 22:06:17
つまらん
190デフォルトの名無しさん:2009/12/06(日) 23:05:57
Perlのハッシュは連想配列と呼ぶべきなんだが
「%」→パーシュ(?)ってことでハッシュにしてるんだろう
191デフォルトの名無しさん:2009/12/06(日) 23:12:29
4の頃は実際「連想配列」だったべ
5になったときにassociative arrayとかじゃなげーから呼び名を
hashにしたんじゃなかったか
単に内部実装がhash tableだからhashのはず
192デフォルトの名無しさん:2009/12/06(日) 23:56:28
「連想」という誤訳が好きだったのに
193デフォルトの名無しさん:2009/12/06(日) 23:58:59
お前らハッシュという言葉が何で、なんでハッシュテーブルって呼ぶのか
全然わかってないだろ・・・。
194デフォルトの名無しさん:2009/12/07(月) 00:22:25
日本語でおk
195デフォルトの名無しさん:2009/12/07(月) 02:30:05
>>193
キーをもとに生成されたハッシュ値を添え字とした配列だからでしょ。
196デフォルトの名無しさん:2009/12/07(月) 07:54:56
>>193
何で、なんで
197デフォルトの名無しさん:2009/12/07(月) 11:55:35
知ったかはどうでもいい
198デフォルトの名無しさん:2009/12/07(月) 14:06:05
ハッシュの実装って、コリジョンが起きたらどういう処理してるのん?
199デフォルトの名無しさん:2009/12/07(月) 16:17:15
顔を真っ赤にして倒れるよ
200デフォルトの名無しさん:2009/12/07(月) 16:33:30
>>198
ハッシュ値が同じになる奴はずるずるチェーンでつなげてたと思った。
201デフォルトの名無しさん:2009/12/07(月) 23:13:24
複数のファイルをそれぞれ1行ずつ読み込みたいです
$lineを2つ使うわけにもいかなくて、どうしたらいいですか?
202デフォルトの名無しさん:2009/12/07(月) 23:34:05
$lineを2つ使わないようにすればいいのではないでしょうか。
203デフォルトの名無しさん:2009/12/07(月) 23:35:32
@lineでも使ったら
204デフォルトの名無しさん:2009/12/07(月) 23:40:21
$lineをリファレンスで
205デフォルトの名無しさん:2009/12/08(火) 00:09:59
コリジョンは起きて当然というか
要は確率的に均等に読みだしたいというのがハッシュのそもそもの目的
206デフォルトの名無しさん:2009/12/08(火) 00:13:48
数字添え字にハッシュ作ったほうが普通に配列作るより早いんか?
207デフォルトの名無しさん:2009/12/08(火) 04:20:42
>>206
そもそも実装が違う
208デフォルトの名無しさん:2009/12/08(火) 04:54:14
Perlの内部構造について知りたいんですが、どのドキュメントから手をつけたら分かりやすいでしょうか
209デフォルトの名無しさん:2009/12/08(火) 05:00:53
ソースコード嫁
210デフォルトの名無しさん:2009/12/08(火) 05:17:20
>>206
んなこたーない
211デフォルトの名無しさん:2009/12/08(火) 05:53:02
PerlでOSを作ろうとしている変態のブログを読んでみたr・・・いや読まないほうがいいな
212デフォルトの名無しさん:2009/12/08(火) 07:57:19
>>201
そもそも、それぞれ1行ずつ読み込む必要があるのか?
一度に読み込めばいいんじゃないの?

>>206
用途による
213デフォルトの名無しさん:2009/12/08(火) 08:47:35
>>201
こんな感じでどうでしょうか
#! /usr/bin/perl

use strict;
open FH1, $ARGV[0];
open FH2, $ARGV[1];

while(1){
  my($line1, $line2);
  $line1 = <FH1>;
  $line2 = <FH2>;
  last if !defined $line1 and !defined $line2;
 
  print "file 1 : $line1";
  print "file 2 : $line2";
}
214デフォルトの名無しさん:2009/12/08(火) 09:29:44
>>208
付属ドキュメントに内部構造関係のもたくさんあるので片っ端から読め。
最初はXSでデータの内部表現に慣れるとこから始めるのがいいかな。
215デフォルトの名無しさん:2009/12/08(火) 09:34:42
>>206
実際perlのおじいさんみたいな言語であるawkには連想配列しかないな。
216デフォルトの名無しさん:2009/12/08(火) 10:27:03
JavaScriptも連想配列しかなったよね、確か
217デフォルトの名無しさん:2009/12/08(火) 11:34:56
>>215
おじいさんじゃありません。おかあさんです。
218デフォルトの名無しさん:2009/12/08(火) 13:05:24
>>206
その可能性は高い。

リストはランダムアクセスできないから、
添え字の速度はあんまりだったはず。
かわりに、リスト代入とかforeachとかの
処理方法が充実してるってことのはず。
219デフォルトの名無しさん:2009/12/08(火) 14:12:18
sed と sh がおじいさんとおばあさん
ed がひいじいさん
vi がおじさん
php がいとこ
220デフォルトの名無しさん:2009/12/08(火) 14:52:38
Rubyは長男?
221デフォルトの名無しさん:2009/12/08(火) 17:39:01
むしろRubyがいとこでPHPがゆとり教育で育った長男って感じじゃないかな
222デフォルトの名無しさん:2009/12/08(火) 19:03:08
同じサイズで、ランダムアクセス用途ならハッシュ配列の方が高速に動作することが多いよ
223デフォルトの名無しさん:2009/12/08(火) 20:46:48
Rubyって庶子だろ
いらない子
224デフォルトの名無しさん:2009/12/08(火) 22:07:41
>>214
なるほど
XSに挫折したので内部の知識が知りたかったのですが順序が逆だったようですね
もうちょっとねばります
225デフォルトの名無しさん:2009/12/08(火) 22:35:59
grepはペットですか?
226デフォルトの名無しさん:2009/12/09(水) 03:45:15
awkの連想配列はSNOBO4Lからパクったもんだが
テキスト処理に威力絶大で、LL言語が続出するきっかけになった。
SNOBOLの作者はIcon言語も作ったが、
これもパターンマッチングとかジェネレータとか最近のLL言語の流行を先取りしている
227デフォルトの名無しさん:2009/12/09(水) 06:16:29
>>208
マジレスするとperlgutsだろうな。
228デフォルトの名無しさん:2009/12/09(水) 06:18:15
>>224
さっきの者だが、
XSに挫折するようだと内部構造はきついだろうから、
まずXS書けるようになるのが先決だな。

あとCリテラシー必須な。構造体理解してないと全く訳わからんぞ。
229デフォルトの名無しさん:2009/12/11(金) 07:22:08
my %a;
$a{b} = {c=>1};
とした時に$a{b}のキーの一覧を取得するには、どうしたらいい?
my $d = $a{b};
keys(%$d);
でいけることを確認したが、一行では無理?
いろいろ()つけて試したが、全部syntax errorになった。
230デフォルトの名無しさん:2009/12/11(金) 08:11:30
>>229
中カッコでいけるんじゃないかな?

keys %{ $a{b} }
231デフォルトの名無しさん:2009/12/11(金) 18:02:15
とある変数の文字列、例えば $a="わたしは$1の$2が好き"; のように特殊変数とかが文字として入っているものに
マッチした結果を参照させる場合はどうすればよいでしょうか?

一応ここまでは考えたのですが

$a="わたしは$1の$2が好き";
my %machted_Reg_Hash = map +( $_, eval "$_"), $a=~ m|(\$[1-9とか])|g;
で、
printf qq|"%s" =>"%s"|, $_, $machted_Reg_Hash{"$_"} for keys %matched_Reg_Hash;
したら、
php=>RegExp
perl=>うんこー
長門=>--○◎●
232デフォルトの名無しさん:2009/12/11(金) 18:14:34
それは未承諾さんのコードだろ、串野郎
233デフォルトの名無しさん:2009/12/11(金) 18:15:44
うせえぞ和菓子野郎
234 ◆TWARamEjuA :2009/12/11(金) 23:29:44
呼ばれてない気がします。
235デフォルトの名無しさん:2009/12/13(日) 16:44:56
Perlプログラムのテストを書きたいのだけれど、
今はTest::ClassとTest::Baseが主流ですか?
書き方はTest::Classが好みなんだけど、皆さんはどちらを使われてます?
また、fixtureの仕組みというか、テストデータの読み込み消し込みが解りません。
Test::Fixture::DBIC::Schema を使うのが一般的?
236デフォルトの名無しさん:2009/12/13(日) 18:35:50
テストって?
そんなの使ったことない
237デフォルトの名無しさん:2009/12/13(日) 20:46:51
知らないならレスしないでください。
ここは匿名掲示板です。
あなたを名指しで質問しているのではありません。
自意識過剰もいいとこです。
238デフォルトの名無しさん:2009/12/13(日) 21:08:04
「一般的」とか言うからw
「特殊な質問ですが」とか言ってくれれば無視したのに
ところで>>236の発言のどこが「自意識過剰」なの?
バカなの?いつ死ぬの?W
239デフォルトの名無しさん:2009/12/13(日) 21:20:15
そんなの使ったことない <------ ここが自意識過剰100%
240デフォルトの名無しさん:2009/12/13(日) 21:22:27
━┓
┏┛    ⌒
・    .___ ⌒  ___   ━┓
   / ―\ / ―  \  ┏┛
 /ノ  (● X  (●)  \ヽ ・.
| (●)  /_  (⌒  (●) /.
|   (__/      ̄ヽ__) /
 \  /´    ___/
   \|        \
   /|´        |
241デフォルトの名無しさん:2009/12/13(日) 21:24:18
>>239
お前はもう死んでるw
242デフォルトの名無しさん:2009/12/13(日) 21:40:11
これだからp2は
243235:2009/12/13(日) 22:52:43
>>237>>239も私ではないのですが、
特殊な質問だったのですか・・・。
Perlではテストしないのが普通?
244デフォルトの名無しさん:2009/12/13(日) 22:56:08
>>243
そういう訳でもないですよ。
私はTest::Moreを使っております。
245デフォルトの名無しさん:2009/12/13(日) 23:13:30
このスレには脊椎反射馬鹿がいるからね
246235:2009/12/13(日) 23:15:06
>>244
回答ありがとうございます。
Test::Moreが基本で、+αの機能を使いたい人が
BaseやClassを使うようですね。
DBICを使って組むことを考えてまして、pl部分にはあまりコードを
書きたくないので、各schemaファイルにコードを書いていこうと思ってます。
その時にある程度纏まった塊でテストしたいため、
Test::Moreではちょっと見辛いなと思ったため、Test::Classを選択しました。

>>245
そ、そうなんですか・・・。
247デフォルトの名無しさん:2009/12/14(月) 12:51:15
a=100
b=200
c=300
という内容のファイルが合って、これを
a=100&b=200&c=300
に変換してくれるワンライナーはどうかけばいいですか。
1行ずつ読み込んで配列に格納し、さいごにjoin '&' すればいいんだと思うんですけど、さくっとかけるワンライナーがわかりません。
みなさんの黒魔術をおしえてください。
248デフォルトの名無しさん:2009/12/14(月) 12:58:44
アレイコンテキストで読めよ
249デフォルトの名無しさん:2009/12/14(月) 14:50:39
俺がやるならこれ。

% cat hoge
a=100
b=200
c=300
% perl -pe 's/\n/\&/ unless eof' hoge
a=100&b=200&c=300

アレイコンテキストで読んでjoinする方法だとだとchomp
しないと改行がのこるからさくっといかなかった。なんか
良い技ある?

% perl -e '@x=<>; chomp(@x); print join("&",@x)' hoge
a=100&b=200&c=300
250デフォルトの名無しさん:2009/12/14(月) 15:33:28
>>247
黒くないとだめなのか
perl -e '$"="&",$_="@{[<>]}",s/\s//g,print' file
251デフォルトの名無しさん:2009/12/14(月) 17:55:33
黒い所か真っ白なんだけど、(多分)一番短かいのがコレ
perl -0ple 's/\n(?=.)/&/g' file

Array で join に拘るなら、こう言う方法も。
perl -F"\n" -0ape '$_ = (join "&", @F)."\n"' file
perl -lne 'push @A, $_ }{ print join "&", @A' file
252デフォルトの名無しさん:2009/12/14(月) 18:12:01
短い勝負なら

perl -pe 'eof||s/\n/&/' file

249を||使って書き直しただけだけどな
253デフォルトの名無しさん:2009/12/14(月) 18:44:04
オレはmap大好き。

join('&',map{chomp($_);}(<>))
254デフォルトの名無しさん:2009/12/14(月) 21:57:42
レンタルサーバでCGIを使っているのですが、Out of memoryが出てしまいました。
そこで、CGIが使用許可されている最大メモリ量を調べたいのですが、
Perl自体を使って調べるいい方法はないでしょうか?
255デフォルトの名無しさん:2009/12/15(火) 00:59:27
>>254
1byteずつ、メモリを埋めていく。
一杯になったら、それが使用可能なメモリ容量。
256デフォルトの名無しさん:2009/12/15(火) 09:20:08
レンサバはいろいろ制限されていることがあるので使えるかどうかはわからないが、
/proc/self/limitsを覗いてみるとか、syscallでgetrlimit呼ぶとか。
257デフォルトの名無しさん:2009/12/15(火) 09:23:42
共用なんだろ?
あまり無茶をしてくれるなよ・・・
258254:2009/12/15(火) 10:22:11
>>255
print length("x" x int(1024*1024*3.52)), "\n";
こんなコードでいいんでしょうか?

>>256
残念ながら/procがないんですよ。
getrlimitはunlimitedのようでした。
259デフォルトの名無しさん:2009/12/15(火) 11:10:20
コードのつくりが悪いか、さもなくば追い出されるかのいずれかだな。
260デフォルトの名無しさん:2009/12/15(火) 12:45:44
>>258
quataは?

個人的な感覚としては、共用サーバーで
Out of memoryと言われて、その制限を
調べようとするのは、逆恨みに近い気が。

そんなに使ってないはずなの?


261デフォルトの名無しさん:2009/12/15(火) 21:21:06
あるスコープのレキシカル変数を自動的にハッシュにまとめる、というような操作はできないでしょうか。
perlでリフレクションというとシンボルテーブルへのアクセスですが、
レキシカル変数にはどうもアクセスできないように思いまして・・・
↓今現在の用途としてはこんな場面をイメージしています。

erb風のテンプレートクラスに値を渡す
(resultメソッド内でevalを実行するにあたり、現在は手作業でハッシュを作って渡しています)

my $name = 'my name';
my $output_text = $epl->result({'name'=>$name});

rubyではbindingオブジェクト、pythonではlocals()やvars()で
任意のスコープにあるすべての値を集めることができるので、近い形にできればと思ったのですが・・
erb.result(binding)  #ruby
epy.result(locals()) #python
262デフォルトの名無しさん:2009/12/16(水) 01:14:20
>>261
PadWalker とかそんな感じだった気がする
http://search.cpan.org/~robin/PadWalker-1.9/PadWalker.pm
263261:2009/12/16(水) 02:56:32
>>262
ありがとうございます。やっぱりCで書かれてるようですね。
こちらでも、perlの内部構造に直接アクセスすれば可能ということはわかったのですが
自分で書くにはハードルが高いようです・・・。

>>261のテンプレートクラスに関してはもう一案あるので、尚、検討してみようと思います。
264デフォルトの名無しさん:2009/12/16(水) 08:45:50
というかテンプレートで使う変数はもともとハッシュに集めとけばいいんじゃね?
265デフォルトの名無しさん:2009/12/16(水) 14:26:13
以下のコードを実行すると、

use strict;
use warnings;

use Encode qw(from_to);
use Encode::Guess qw( euc-jp cp932 7bit-jis );

my $data = '日本語';
from_to($data, 'Guess' => 'cp932');
print $data;


Use of uninitialized value in subroutine entry at D:/Lang/Perl/lib/Encode/Guess.pm line 56.

というwarningsが出るのですが、何が悪いのでしょうか?
ActivePerl 5.8.9、Windows XP SP2です。
266デフォルトの名無しさん:2009/12/16(水) 14:36:58
なんで引数にハッシュ使ってんの
267266:2009/12/16(水) 14:42:38
>>265
>Use of uninitialized value in subroutine entry at D:/Lang/Perl/lib/Encode/Guess.pm line 56.
これは値がundefの変数が使用されたことを示してる

>from_to($data, 'Guess' => 'cp932');
from_to($data, 'Guess', 'cp932');
こうじゃねーの?
268デフォルトの名無しさん:2009/12/16(水) 16:15:11
269デフォルトの名無しさん:2009/12/16(水) 16:27:24
>>268
なるほど
しかし、=>はハッシュの定義のみに使うべきだと思う

文字列短すぎて判別に失敗してるのかな
270デフォルトの名無しさん:2009/12/16(水) 16:50:57
そうかそうか

Guessが使えるのは、Encode::decode
271デフォルトの名無しさん:2009/12/16(水) 17:28:42
GuessはEncode::from_toでも使える
272デフォルトの名無しさん:2009/12/16(水) 17:34:51
'日本語'はguessできるから、
from_toでGuessするなって言ってんじゃないの?
273デフォルトの名無しさん:2009/12/16(水) 18:13:25
$enc->decode()の第2引数を省略せずにundefを
与えると警告が出るというところまではつきとめた。

use warnings;
use Encode qw(find_encoding encode);

$enc = find_encoding('cp932');
$s = encode('cp932', 'ほげほげ');

warn "check なし";
$enc->decode($s);

warn "check = undef";
$enc->decode($s, undef); # これだけ警告

warn "check = 0";
$enc->decode($s, 0);

Encodeでは省略可能な$checkパラメタをとる関数から
decode呼ぶときは、

$check ||= 0;

として確実に0にしてから渡しているのだが、Encode::Guess
のdecodeはその辺の配慮がされていない。どっちが正しい
のかはわからんけど。
274デフォルトの名無しさん:2009/12/16(水) 21:36:51
真意は子飼氏のみ知るか。。。
275デフォルトの名無しさん:2009/12/16(水) 21:54:27
Encode.pm使ってないけど、もうちゃんと動くの?
仕事で一回使ったけど、後でとんでも無く大変な目にあったw
utf8で使わなければ大丈夫なのかな?
276デフォルトの名無しさん:2009/12/16(水) 22:18:21
むしろutf8以外で使うと面倒だと思うんだが
277デフォルトの名無しさん:2009/12/16(水) 22:55:23
use utf8 で Encode.pm でcp932とutf8でもう
encode decode祭りで発狂寸前の俺がいる。
何がどうなってるのか訳解らんちん。
278デフォルトの名無しさん:2009/12/16(水) 23:04:02
1年前にRubyだけ使ってたときは
「すべての文字列がエンコーディング情報を持つ、なんて面倒なことせずに
全部UTF-8に統一すればいいんじゃね」と思ってたが
PerlとEncode.pmを使い始めて理解した。統一方式はものすごく面倒だ

>>275
どういう使い方でEncode.pmを使ってたんだ
279275:2009/12/16(水) 23:17:59
元々、画面SJIS、DB含めた内部がEUCのシステムを、画面・内部ともutf8に統一したシステムに変更した時にメール送信やメール送信や外部システムとの連携時の文字コード変換にEncode.pmを使った
単体テスト段階では気が付かなかったけど、DBのデータをコンバートのプログラムを作って実行した時点で文字化けがw
そのときにguessも使ったけど、文字数少ないとまともに文字コードを認識しないし、元々Jcode.pm使っててEncode.pmの使用実績も無いから、完全にEncode.pmに対する信頼性が全く無くなってなw
単体レベルの開発もほぼ終わって、結合・総合テストに入ろうとした段階だったのに、文字コード変換にかかわる部分をすべて手を入れててんやわんやw
多分、ウチの会社ではEncode.pmは二度と使わんな、きっと
280275:2009/12/16(水) 23:20:37
ま、使い方が悪かっただけかも知れないけど、後でEncode.pmについてぐぐったらワロタw
281デフォルトの名無しさん:2009/12/17(木) 00:02:00
まあ、Guessはシビアな場面でなくとも、まったく役に立たないね。
Guessだけのモジュール書いたら、需要ありそうな。
282デフォルトの名無しさん:2009/12/17(木) 00:14:12
というか、Perlに限らず、入力コードのencodingを指定してないのなら、
変換失敗することがあるなんて当たり前でしょ
何のヒントも無しに文字コードの自動認識が完璧に出来るわけないんだから
283デフォルトの名無しさん:2009/12/17(木) 00:19:05
guess はあくまで guess。
もしかして「げすのかんぐり」の語源?
まぁ、いっぺん辞書で guess の意味を調べてゴランよ。
こんなもん信頼する方がバカ
http://ocndictionary.goo.ne.jp/srch/all/guess/m0u/
284デフォルトの名無しさん:2009/12/17(木) 00:40:00
論理的に決定できない場合が出るのは多少なりなりとも文字コードに
ついて理解があれば至極当然のこと。

だからといって、出来不出来の差がないなんてことはまったくない。

>>283
中学生はオナニーでもしてさっさと寝ろ。
285デフォルトの名無しさん:2009/12/17(木) 00:46:03
乳か。
乳なんだろ。
286デフォルトの名無しさん:2009/12/17(木) 01:19:46
爆乳問題か
287デフォルトの名無しさん:2009/12/17(木) 02:13:47
>>284
プッ
guess と一緒に心中しろw
288デフォルトの名無しさん:2009/12/17(木) 09:15:52
SJIS半角カナとEUCの区別だけやりゃよかった昔なら
いざ知らず、utf8とeucはかぶりまくりだからなぁ。
文字化けして困る用途ならguessなんかせずに文字
コードをちゃんと決めて使わないとね。
289デフォルトの名無しさん:2009/12/17(木) 17:51:51
>>279
EUCからUTF8に変換したとき&とか変換できなくて困った覚えがある
あれ、Encode以外にEncode::EUCJPMSとか使わなきゃいけないんだよ
Encodeのバグかと思ったら、作者いわくEUC自体がまずいんだとか
290275:2009/12/17(木) 18:31:16
最終的に文字コードの変換にはUnicode::Japaneseを使った
use utf8とno utf8つけることに統一したな
慣れないから文字数の入力チェックもどうするか悩んだw
291デフォルトの名無しさん:2009/12/17(木) 19:33:21
>>289
EUC自体がまずいというかCP20932で定義されていないベンダ特有文字
が変換出来ないのは当然でそういった場合はCP51932使うのが普通でしょ。
guessに関しても対象文字列が全て定義されているか否かを調べるという単純な機能で
文字数が少なければ複数の候補が残る可能性が高まるし00-FF全て定義されてる
iso系なんかは全てパスしてしまう。
guessの候補が二つ以上残ったらdieするとか厳格すぎる気もするけどゆとり対応してないだけで
ユーザーの無知による誤った評価が多い気がする。
292デフォルトの名無しさん:2009/12/17(木) 22:45:35
規制がやっと解除された。
>>261
Filter::Simple で適当にフィルタ書けば?
ってレスしたかったのに
293デフォルトの名無しさん:2009/12/17(木) 23:53:54
perlが真面目にSJISに対応すればいいだけのこと
294デフォルトの名無しさん:2009/12/18(金) 01:47:41
>>293
何をすれば真面目に対応したという事になるの?
295デフォルトの名無しさん:2009/12/18(金) 08:22:08
>>293
今さらいらん。
utf8でおk。

それに、ShiftJISはもうあんまり文字を
追加できないだろ。
将来性がない。
296デフォルトの名無しさん:2009/12/18(金) 08:26:38
UTF-8厨の勢力がどんどん増してゆく.....
297デフォルトの名無しさん:2009/12/18(金) 08:45:13
常用漢字までsjis外の字が入るってのに、いまさら何を言ってるんだか。
298デフォルトの名無しさん:2009/12/18(金) 10:41:05
こういうのをよくやるんですが、もっと簡潔な書き方はないでしょうか?
$_ =~ /(\d+)-(\d+)-(\d)/;
$year=$1;$month=$2;$day=$3;
特にグループが多くなった場合、対応がすぐわかるとうれしいので、
Pythonの名前付きグループ化みたいなのができればいいんですが。
299デフォルトの名無しさん:2009/12/18(金) 10:49:20
300デフォルトの名無しさん:2009/12/18(金) 10:55:07
my ($year,$month,$day) = split(/-/,$_);
301デフォルトの名無しさん:2009/12/18(金) 11:00:22
>>296
> UTF-8厨の勢力がどんどん増してゆく.....

もう、ShiftJISなら3秒の処理をUTF-8にすると47秒かかるという時代じゃ
ないんだからさ……
302デフォルトの名無しさん:2009/12/18(金) 11:21:26
>>299 ありがとうございます。
303デフォルトの名無しさん:2009/12/18(金) 17:48:18
>>300
それじゃ等価じゃないしやりたいことを単純化して説明しているだけかもしれないから
my ($year, $Month, $day) = /(\d+)-(\d+)-(\d)/;
の方が適切じゃない?
304デフォルトの名無しさん:2009/12/18(金) 23:57:38
SJISならすっきり書けるコードがUTF-8だと汚くなるけどな
スピードは、どっちで書いても昔から一瞬だ
305デフォルトの名無しさん:2009/12/19(土) 00:24:21
結局の所さんざん悩んだ挙げ句、SJISじゃダメでCP932に落ち着いたあの日...
306デフォルトの名無しさん:2009/12/19(土) 11:35:43
>>301
EUCで14秒なのをUTF-8にしたら約3分ということがあったのを覚えている。
307デフォルトの名無しさん:2009/12/19(土) 12:15:50
どんだけタコなコードなのか逆に見てみたいものだな
308デフォルトの名無しさん:2009/12/19(土) 12:19:31
UTF-8で入力されたのをEUCに変換して処理してそれからUTF-8に戻すとか
309デフォルトの名無しさん:2009/12/20(日) 06:36:28
5.6.**から使い始めた俺にすれば、
sjisに固執する奴の方が厨房に見える
310デフォルトの名無しさん:2009/12/20(日) 08:52:54
バージョンは関係ないだろ
やろうと思う処理を素直に書くとUTF-8なんか入ってこない
perlのバグを回避する為に回り道させられてるだけ
311デフォルトの名無しさん:2009/12/20(日) 11:02:53
ちゃんと表\示されればそれで十\分だよ
312デフォルトの名無しさん:2009/12/20(日) 16:45:13
3,赤,#ff0000 1,青,#0000ff 2,緑,#00ff00がはいってる@allを
@all=@all[sort {$keys[$a]<=>$keys[$b]} 0..$#all];
ってやると
1,青,#0000ff 2,緑,#00ff00 3,赤,#ff0000
になるんですが
@all[sort {$keys[$a]<=>$keys[$b]} 0..$#all];ここの意味がよくわかりません
動き方がいまいち掴めません、詳しい方教えてください。
313デフォルトの名無しさん:2009/12/20(日) 17:40:51
>>312
keysの要素の順番に沿うようにallをソート?
ようわからんけど
314デフォルトの名無しさん:2009/12/20(日) 17:47:18
今色々試してみたんですが
@all=sort {$a<=>$b} @all;とやっても出来ました。
perl/CGIの極意600に書かれてた方法です上の難しい書き方は
@all=@all[sort {$keys[$a]<=>$keys[$b]} 0..$#all];
意味が同じってことですよね?
315デフォルトの名無しさん:2009/12/20(日) 18:17:33
@keysの中身まで書かれてないと説明めんどくさいな。
@allの要素数は3なので、0..$#allは(0, 1, 2)の配列になる。

my @keys = (2,1,0)としておくと、
sort {$keys[$a]<=>$keys[$b]} (0, 1, 2);
は@keysの要素でソートされた順番で配列の要素が返り、(1,2,0)になる。

@all = @all[(1,2,0)];
は2番目・3番目・1番目の順で@allの要素を返し、@allに格納するので
結果は>>312になる。
316デフォルトの名無しさん:2009/12/20(日) 18:22:35
ここで@keysを

my @keys = (1,2,0);

と書き換えると、(2,0,1)の順番で@allの要素が返されるので結果は

2,緑,#00ff00
3,赤,#ff0000
1,青,#0000ff

になる。
ぶっちゃけややこしいね。
317デフォルトの名無しさん:2009/12/20(日) 18:51:00
>>310
そう思っとけば良いよ、お前さんは
318デフォルトの名無しさん:2009/12/20(日) 20:06:45
質問です

最近perlを使ってどんなことをやりましたか?
319デフォルトの名無しさん:2009/12/20(日) 21:03:31
エロい画像の整理に使ってます
320デフォルトの名無しさん:2009/12/20(日) 21:10:31
あなたみたいな人がこんなスレ見てるなんて驚きでつね
はい次
321デフォルトの名無しさん:2009/12/20(日) 21:11:56
大抵はネット絡みだな
加工元のデータが自分の所で発生するケースはあんまりない
322デフォルトの名無しさん:2009/12/20(日) 21:20:14
加工って、まさかエロ画像のデータを加工するのでつか?
>>319氏は ファイル名に対してオペしてるのかとおもいました。。。。。

はい次
323デフォルトの名無しさん:2009/12/20(日) 21:37:56
エロ画像を大量にダウンロード
やっぱこれだね
324デフォルトの名無しさん:2009/12/20(日) 21:48:53
どこに行けばエロ画像が大量にあるのかを知らない私にはどうでもいいです
それともエロ画像検索用にperlが走ってるのでしょうか。そんなわけはないな

はい次
325デフォルトの名無しさん:2009/12/20(日) 21:53:45
2chでスレ立てとテンプレ貼りを数秒で終わらせるのにperlを使っています
326デフォルトの名無しさん:2009/12/20(日) 22:10:11
>>325
スレ立ての頻度を考えれば手間対効果、効率の面で疑問ですね。

はい次
327デフォルトの名無しさん:2009/12/20(日) 22:12:59
実際使い道が思いつかない・・・
perlやりとおしてるから意地はって適当に便利に使ってるふりしてる。
328デフォルトの名無しさん:2009/12/20(日) 22:28:07
虹画像の収集に使ってます
329デフォルトの名無しさん:2009/12/20(日) 22:30:46
全角数字を半角数字に変換したい
※ただしローマ数字は除く

ということをやりたいんですが、ローマ数字が文字化けしてしまいます。
どうしたらいいでしょうか。
SJISのテキストで保存されたファイル内の全角数字を半角数字に変換してSJISで保存したいです。

たとえば、「12VWX6789」→「12VWX6789」と変換したいのですが、
下記の方法では「12?V?W?X6789」となってしまいます。

試したこと1:
 $test = decode('sjis', $test);
 $test =~ tr/\x{ff10}-\x{ff19}/0-9/;
 $test = encode('sjis', $test);

試したこと2:
 use Lingua::JA::Regular::Unicode;
 $test = decode('sjis', $test);
 $test = alnum_z2h($test);
 $test = encode('sjis', $test);

試したこと3(スクリプトもSJIS)
 use Jcode;
 $from = jcode('[0-9]')->euc;
 $to = jcode('[0-9]')->euc;
 $test = jcode($test)->tr($from, $to)->sjis;
330デフォルトの名無しさん:2009/12/20(日) 22:51:35
# このスクリプトはutf8で保存
use utf8;
use Encode;

# ファイル開いてSJISのバイナリ列持ってくる
my $test = ...;

# flagged-utf8にして
$test = decode 'cp932', $test;
# tr///で全角数字を半角にして
$test =~ tr/0-9/0-9/;
# SJISバイナリ列に戻す
$test = encode 'cp932', $test;

print $test;
331デフォルトの名無しさん:2009/12/20(日) 22:53:21
画像の収集とか、ネットラジオの収集とか、
自動ツールがあるけどいたちごっこで対策されたりしてる分野に、
自分専用スクリプトを書くとかなり効果的だな
332デフォルトの名無しさん:2009/12/20(日) 23:00:13
>>328
虹が好きなんですね。
どうやったらperlが「おっ、虹画像見っけた」って判断できるのか?おせーてください

>>331
ネットで公開してるくせに自動ツールは拒否したりするのですね。ネットって不思議ですね

はい次
333デフォルトの名無しさん:2009/12/20(日) 23:11:23
#!/usr/bin/perl
@ls=`ls -al`;
foreach (@ls)
{
s/rwx/7/g;
s/r-x/5/g;
s/rw-/6/g;
s/-wx/3/g;
s/--x/1/g;
s/-w-/2/g;
s/r--/4/g;
s/---/0/g;
}
print "@ls";
パーミッションを分かりやすく表示してる
334デフォルトの名無しさん:2009/12/20(日) 23:17:16
スレ保持数の厳しい板でスレの自動保守をさせる
保守合戦になっても絶対生き残る
335デフォルトの名無しさん:2009/12/20(日) 23:33:30
>>334
保守age
保守age
保守age
保守age

ってのがそれですね。需要がないのを理解してください
はい次
336デフォルトの名無しさん:2009/12/20(日) 23:37:58
>>333
こ、こ、、、これは?
数字のほうがわかりやすい?????
へんな人ですね
あと、ファイル名に  rwx  なんてのがあったら可笑しくなりそうなので
タンゴ協会みたいなのいらないですか? g なんていらなくない?


はい次
337デフォルトの名無しさん:2009/12/20(日) 23:42:29
なんでいちいち10桁も見ないといけないんだよ
ファイル名にrwxなんて使うのか
ugoの3つあるからgは必要

はい次
338デフォルトの名無しさん:2009/12/20(日) 23:59:37
おっとーーーー
俺間違えてるワラワラワラ

-rwxr-xr-x

自分、グループ、他人だっか?でならんでるのか
じゃ、変換してよろし

ただg はいるじゃんw


はい次
339デフォルトの名無しさん:2009/12/21(月) 00:00:44
あ、そうそう、
致命的なバグがあるね

>>ファイル名にrwxなんて使うのか


はい次
340329:2009/12/21(月) 00:03:05
>>330
うまくいきました!
sjisではなくcp932を使うんですね。
なるほど・・・これは知りませんでした。
ありがとうございます。
341デフォルトの名無しさん:2009/12/21(月) 00:25:05
use List::Util 'sum';
my @ls = `ls -al`;
s{(?<=^\S)([r-])([w-])([x-])([r-])([w-])([x-])([r-])([w-])([x-])}
{ @_ = map { $$_ eq '-' ? 0 : (4,2,1)[($_-1)%3] } 1..9; join '', sum(@_[0..2]), sum(@_[3..5]), sum(@_[6..8]) }efor@ls;
print @ls;

これでいいんだろ
342デフォルトの名無しさん:2009/12/21(月) 00:36:51
>>341
練習問題としては勉強になります

ただ >>318への回答としては、失格です

はい次
343デフォルトの名無しさん:2009/12/21(月) 00:41:36
別にお前に話してない

はい次
344デフォルトの名無しさん:2009/12/21(月) 00:44:55
失礼しました

はい次
345デフォルトの名無しさん:2009/12/21(月) 00:49:02
荒らすなゴミ
346デフォルトの名無しさん:2009/12/21(月) 01:13:52
euc厨が自分の恥を流そうと必死なんだろ
347デフォルトの名無しさん:2009/12/21(月) 01:15:28
341の正規表現書いたあとに見直したら無駄多すぎだったから訂正しとくわ
s{(?<=^\S)([rwx-]{3})([rwx-]{3})([rwx-]{3})}{ join " . ", map { (local $. = $$_) =~ y/rwx-/4210/; join "+", split //, $. } 1..3 }ee

関係ないので
はい次
348デフォルトの名無しさん:2009/12/21(月) 01:39:54
-rwxr-xr-x

のほうが見やすい

はい次
349デフォルトの名無しさん:2009/12/21(月) 06:31:30
スレ判定してここでレス書く時だけ、末尾に「はい次」を自動で入れるようにしてます

はい汁
350デフォルトの名無しさん:2009/12/21(月) 06:49:54
>>349
かなりつまんないです

はい次
351デフォルトの名無しさん:2009/12/21(月) 09:14:54
つstat
352デフォルトの名無しさん:2009/12/21(月) 10:15:37
はい次とかほざいて
サバサバ気取ってるのわかる
心の広い人間に憧れる乙
353デフォルトの名無しさん:2009/12/21(月) 10:17:44
あまりの低レベルさに
ここに質問していいのか判りませんが
一つご教授お願いします

モジュールの追加についてです
当方、winXPにてprel5.8を使用しています

IPのDNS問い合わせに「Net::DNS」を使用しようと思うのですが
Net::DNSのモジュールの追加がうまく行きません
ttp://footmark.wordpress.com/2008/02/13/dns%E9%80%86%E5%BC%95%E3%81%8D%E9%AB%98%E9%80%9F%E5%8C%96/
ここの説明どおりライブラリパスに置いているつもりなのですが
どうもうまく行きません
perl自体はCドライブの直下に置いてるんで
ライブラリパスとは
C:\Perl\「lib」←ここの事ではないのでしょうか?

プログラミング以前の問題ですが
どうかご教授よろしくお願いします
354353:2009/12/21(月) 10:52:35
すみません
Net::DNSの「::」の意味を考えたら
自己解決しました

スレ汚し申し訳ありませんでした
355デフォルトの名無しさん:2009/12/21(月) 15:13:15
はい次
356デフォルトの名無しさん:2009/12/21(月) 15:32:13
perlのgethostbyaddrが遅いって本当なん?
単純にOSが用意したgethostbyaddr(3)を
呼んでそうなもんだけど。

自分でソース読んで確かめろって話だけど、
この手のシステム依存部分って抽象化と
場合分けがぐじゃっとしていて読みにくいん
だよな。
357デフォルトの名無しさん:2009/12/21(月) 16:26:12
>>353
Strawberry Perlを使ってるのか?
Active Perl 5.8/5.10ならppmにあるし、そちらを使う方が楽だと思うが
358デフォルトの名無しさん:2009/12/21(月) 17:16:19
>>354
あまりのレベルの低さにワロタw
359デフォルトの名無しさん:2009/12/21(月) 17:25:17
>>358
自分の人としてのレベルの低さ、みみっちさに早く気づいてください

はい次
360デフォルトの名無しさん:2009/12/21(月) 17:43:59
>>359
自己紹介乙

はい次
361デフォルトの名無しさん:2009/12/21(月) 18:30:51
最近へんな人が張り付いてるなぁ
クリスマス前に振られたのか?
362デフォルトの名無しさん:2009/12/21(月) 19:12:02
363デフォルトの名無しさん:2009/12/21(月) 19:18:09
perl使いの皆様の本職を教えてください
364デフォルトの名無しさん:2009/12/21(月) 20:06:54
研究者
365275:2009/12/21(月) 20:10:47
>>363
システム開発者
今もperlでWEBオープン系の仕事してる
PHPもするし、汎用系もなんでもするよ
趣味で遊ぶのはperlだな
でも実用性重視で、細かいことは気にしない
366デフォルトの名無しさん:2009/12/21(月) 20:10:50
ニート
367デフォルトの名無しさん:2009/12/21(月) 20:20:53
ぼくも研究者
368デフォルトの名無しさん:2009/12/21(月) 20:28:53
俺も研究者 アニメの
369275:2009/12/21(月) 20:29:25
金持ち
370デフォルトの名無しさん:2009/12/21(月) 22:05:45
研究者、結構いるんだな。
おれも研究者……4月以降どうなるかわからんが(泣
371デフォルトの名無しさん:2009/12/21(月) 22:39:19
DBI.pmについての質問はここでOKでしょうか。

以下のようなプログラムがあるとします。
Shift_JISの文字列に対し、DBIのquote()メソッドを使ってサニタイジング&シングルクォート囲むプログラムです。

 use DBI;
 my $dbh = DBI->connect(略);

 my $inStr = '出席表\'; #いわゆるダメ文字が最後に来る文字列
 my $outStr= $dbh->quote($inStr);
 print "$outStr\n";

さて、このプログラムを構成の異なる2つのサーバで実行したところ、出力に差異が生じました。

 サーバA(perl 5.0+DBI 1.37) → '出席表'
 サーバB(perl 5.6+DBI 1.67) → '出席表\'

サーバBの出力のままでは、シングルクォート自体がエスケープされることになり、DB(MySQL)に投げることができません。
このような違いは何が原因で起きるのでしょうか?
何かヒントなどあればよろしくお願いします。

・DBに投げる際、プレースホルダを使っても変化なし
・スクリプトの文字コードをEUCやUTF-8にしても変化なし
・「表示」のように、ダメ文字が最後に来なければ問題なく動く
372デフォルトの名無しさん:2009/12/21(月) 22:41:56
use utf8しろ
373デフォルトの名無しさん:2009/12/21(月) 22:46:34
>>372
与えられる文字列そのものがShift_JISなので変わりません
374デフォルトの名無しさん:2009/12/21(月) 23:03:27
意味不明。
375デフォルトの名無しさん:2009/12/21(月) 23:51:54
はいどんどん
376デフォルトの名無しさん:2009/12/22(火) 00:08:14
>>371
'出席表\'は実際のスクリプト中でも、そのまま書かれているんだよね?
それとも実際のスクリプトでは、$inStrは外部から読み込んできた文字列になる?

それと、372の言う通りuse utf8は試してみた?
377デフォルトの名無しさん:2009/12/22(火) 00:24:32
>>374
すみません、色々テンパってました

>>376
あ、はい。実際には外部からの入力です。
use utf8は既に試しています。

調べているうちにuse encoding 'shiftjis' というプラグマを見つけたのでそっちも試してみます。
378デフォルトの名無しさん:2009/12/22(火) 00:54:18
>>377
use encodingは色々と問題が多いので使わない方がいい
それを使うなら、代わりにEncodeを使うべき

詳しくはこの辺
ttp://blog.livedoor.jp/dankogai/archives/51031595.html
ttp://blog.livedoor.jp/dankogai/archives/51221731.html
ttp://www.rwds.net/kuroita/program/Perl_unicode.html
379デフォルトの名無しさん:2009/12/23(水) 02:00:04
GTK2で常駐型のアプリケーションを作りたいと思っています
どうすればパネルにアイコンを置くことができるでしょうか
よろしくお願いします
380デフォルトの名無しさん:2009/12/23(水) 14:23:33
GUIならコンパイラ言語で作れ
はい次
381デフォルトの名無しさん:2009/12/23(水) 14:26:31
老害
382デフォルトの名無しさん:2009/12/23(水) 14:34:27
>>380
これはひどい
383デフォルトの名無しさん:2009/12/23(水) 16:25:15
年末に職を失ったのかな
相手にしないことだ
384デフォルトの名無しさん:2009/12/23(水) 16:25:34
いまどきEUCとsjisで的はずれな書き込みがあるからって教えられてみたけど
確かにeuc厨すごいなww
385デフォルトの名無しさん:2009/12/23(水) 16:54:25
どうした?シフトJISのソースファイルの「ソ」の後ろに\を付ける仕事に飽きたのか?
386デフォルトの名無しさん:2009/12/23(水) 16:58:38
もうShift_JISさんは許してやれよ
387デフォルトの名無しさん:2009/12/23(水) 17:01:02
Shift_JISさんを許しても
息子のcp932さんが仇討ちに来るがな・・・
388デフォルトの名無しさん:2009/12/23(水) 17:07:32
馬鹿がひとり粘着してるのか?
389デフォルトの名無しさん:2009/12/23(水) 17:42:13
そこでjperlですよ
390デフォルトの名無しさん:2009/12/23(水) 18:27:17
郵便配達のバイトしてます
391デフォルトの名無しさん:2009/12/23(水) 21:50:45
コマンドライン上で、一度表示したものを消して再表示するにはどのようにしたらよいのでしょうか?

具体的には処理の進捗状況を出したくて、一度表示した後に何秒後かにそれを消してまた表示するという感じなのですが。
392デフォルトの名無しさん:2009/12/23(水) 22:17:04
エスケープシーケンスで行頭に戻す
393デフォルトの名無しさん:2009/12/23(水) 22:58:27
>>391
\b(バックスペース)か\r(復帰)を使って消せるよ
394デフォルトの名無しさん:2009/12/23(水) 23:13:56
>>393
有難う御座います!!
395デフォルトの名無しさん:2009/12/23(水) 23:16:14
質問が理解できない・・・・・・


はい次
396デフォルトの名無しさん:2009/12/23(水) 23:31:44
バカは黙ってろ

はい次
397デフォルトの名無しさん:2009/12/23(水) 23:59:28
キャリッジリターンってまさにその為の制御文字だしな
398デフォルトの名無しさん:2009/12/24(木) 00:04:52
バカは黙ってろ

はい次
399デフォルトの名無しさん:2009/12/24(木) 00:12:02
イブなのに
悲しくならないか?
400デフォルトの名無しさん:2009/12/24(木) 01:19:16
EUCになに期待してんだよ
401デフォルトの名無しさん:2009/12/24(木) 01:31:31
自演でしか勝者になれないヘタレ乙

はい次
402デフォルトの名無しさん:2009/12/24(木) 01:35:40
Perl6のリリース日程が公式に公開されてるから今年のクリスマスwktkは無いの?
403デフォルトの名無しさん:2009/12/24(木) 15:55:05
むかし、JIS対EUC闘争というのがあってのう。
404デフォルトの名無しさん:2009/12/24(木) 19:37:01
UTF-8の台頭で、規模縮小したアレのことだな。
405デフォルトの名無しさん:2009/12/24(木) 19:37:50
perl/tk やってる人いない?
ファイルサイズが大きくなってくるとセグメンテーション・フォールトで止まちゃうんだけど。。
ファイルを二つに分けると普通に動く。
これは仕様なの?
406デフォルトの名無しさん:2009/12/24(木) 21:32:30
仕様と言うより、限界?
407デフォルトの名無しさん:2009/12/24(木) 21:47:29
PSGI/Plack の勢いが凄まじいな。こういうのが間歇的に発生するからこの糞言語が終わらないんだよな。
408デフォルトの名無しさん:2009/12/24(木) 22:13:44
perlはLEGOなんだよ
409デフォルトの名無しさん:2009/12/24(木) 22:18:41
Perlは可読性を除き神言語
410デフォルトの名無しさん:2009/12/24(木) 22:21:46
素材としては最強
411デフォルトの名無しさん:2009/12/24(木) 23:12:37
CPANがあるからPerl使う
412デフォルトの名無しさん:2009/12/25(金) 10:31:00
>シフトJISのソースファイルの「ソ」の後ろに\を付ける仕事

「刺身の上にタンポポのせる仕事」より酷いな
413デフォルトの名無しさん:2009/12/26(土) 03:48:44
>>405
それに絶望してwxPerlに逃げた
414デフォルトの名無しさん:2009/12/26(土) 10:34:44
cpanがよくわからん。
unixでしかも英語力があれば何とかなるのかいな。
windowsでしかも英語力がないと、モジュールを組み込むのは不可能だ。
415デフォルトの名無しさん:2009/12/26(土) 10:40:49
何でインタプリターなぼろい言語なのにこのプログラム使うんだ
416デフォルトの名無しさん:2009/12/26(土) 10:42:23
>>414
ActivePerlにppmあるし。
417デフォルトの名無しさん:2009/12/26(土) 10:46:04
>>415
お前は何もわかってない
418デフォルトの名無しさん:2009/12/26(土) 10:52:53
BASICがインタプリターでぼろいというなら、
Perlも同じくインタプリターだからぼろい。
419デフォルトの名無しさん:2009/12/26(土) 10:54:25
BASICの話なんか誰がしてるんだよ
420デフォルトの名無しさん:2009/12/26(土) 10:59:50
異常性格言語その名はPerl
421デフォルトの名無しさん:2009/12/26(土) 11:12:26
perlはレコード型の変数ってないんだろ。
422デフォルトの名無しさん:2009/12/26(土) 11:21:12
連想配列
423デフォルトの名無しさん:2009/12/26(土) 11:43:29
VisualBASIC舐めんな
424デフォルトの名無しさん:2009/12/26(土) 11:46:32
>>415
適度にぼろいものがウケるのだ

425デフォルトの名無しさん:2009/12/26(土) 11:54:11
連想配列を使うとレコードもどきはできるが、
レコードの配列は無理だろう。
426デフォルトの名無しさん:2009/12/26(土) 12:10:50
Class::Structあるだろ
427デフォルトの名無しさん:2009/12/26(土) 12:17:38
ラリーはなぜ、Cからswitch- case文やstructを除外したのか。
428デフォルトの名無しさん:2009/12/26(土) 13:05:14
structはともかく、Switch文が組み込みでないのは本当に謎だ
429デフォルトの名無しさん:2009/12/26(土) 13:07:46
ライブラリで実現できるものは言語コアに入れなかっただけじゃないの
430デフォルトの名無しさん:2009/12/26(土) 13:19:22
>>429
その理屈なら、printfも言語コアには入らないことになるぞ
431デフォルトの名無しさん:2009/12/26(土) 13:19:27
とりあえず使う予定がなかったからだろ。
432デフォルトの名無しさん:2009/12/26(土) 13:23:02
>>430
ただの関数だろ
433デフォルトの名無しさん:2009/12/26(土) 13:30:11
>>432
関数だから何なんだ
434デフォルトの名無しさん:2009/12/26(土) 13:31:34
>>433
言語に組み込むことと、組み込みライブラリに含めることではレベルが違う
435デフォルトの名無しさん:2009/12/26(土) 14:27:19
>>434
言ってることがよくわからん
関数だろうと制御文だろうと、コア機能であるべきものは言語に組み込むべきだろう
436デフォルトの名無しさん:2009/12/26(土) 14:31:27
言語コアとライブラリの区別ができんようなやつがプログラミング言語を設計したときにできるのがPerl4みたいなゲテモノ
437デフォルトの名無しさん:2009/12/26(土) 14:42:31
「言語コアはすべて暗記しなければならない」
「ライブラリは暗記しなくていい」
という幻想
438デフォルトの名無しさん:2009/12/26(土) 16:24:47
そこらの言語に比べて組み込み文法があれだけ多いのに、switchが無いのは確かに謎だな
439デフォルトの名無しさん:2009/12/26(土) 16:46:00
俺はCとは違うんじゃー っていう変な新年で外されたとしか思えん
440デフォルトの名無しさん:2009/12/26(土) 17:09:42
単純にswitchの実装が面倒で、避けただけだと思う。
441デフォルトの名無しさん:2009/12/26(土) 17:49:37
>>439
Cじゃなく、sh+awk+sedと比べるべき。
442デフォルトの名無しさん:2009/12/26(土) 20:04:37
規制中なので携帯から失礼します。
低レベルな質問なんですが
テキストのIPアドレスを読み込み、逆引きして
ドメイン名検出をしようとしてるのですが
どうもうまく行きません
以下のプログラムでやっているのですが
結果は
ドメイン不明
ドメイン不明
  ・
  ・
  ・
となります。
テキストファイルの中身は
一行に一つのIPが書かれている状態で
それが約5万件ほどです。
443デフォルトの名無しさん:2009/12/26(土) 20:06:49
use strict;
use Net::DNS;
use vars qw/ $myRes $query $rr $host $str @word $st /;



$myRes = Net::DNS::Resolver->new;

sub myLookup($){
$query = $myRes->search($_[0], 'PTR');
if (!$query) {
return "ドメイン不明";
}
foreach $rr ($query->answer) {
if ($rr->type eq "PTR") {
return $rr->ptrdname;
}
}
}
open(FILE,"<IP.txt"); #ファイル読み込み

while ($str = <FILE>){ #ファイル関連

$host = &myLookup($str);
print $host."\n";

}
close(FILE);
プログラムはこのようになっています
本当に低レベルな質問なんですが
どうかご教授お願いします
444デフォルトの名無しさん:2009/12/26(土) 20:18:52
ちなみにIPを一つだけ入れるとうまく行きます。
$host = &myLookup("202.131.30.146");
このようにテキストから読み込むプログラムは
書かずにそのままIPを入れると正常にドメインが出力されます

結果は
crawl-202-131-30-146.naver.jp.ne.jp
(これはテキストの一行目のIPのドメインです。)

以前に似たような形でカントリーコードを
出力させるプログラムは普通に動きました。
445デフォルトの名無しさん:2009/12/26(土) 20:28:57
ソースがレガシーすぎてちゃんと読む気おきないけど、
$host = &myLookup($str);
の前に
chomp $str;
を入れてみるとか
446デフォルトの名無しさん:2009/12/26(土) 20:43:25
chompだろうな
447デフォルトの名無しさん:2009/12/26(土) 20:44:46
やはりchompか
448デフォルトの名無しさん:2009/12/26(土) 20:53:45
そうか、レコードの配列はハッシュのリファレンスを配列に詰め込めば、
もどきなことができるのか。
何で、こんな裏技的な方法で、もどきなことをさせるのか。
解決策を見つけるまで、回り道をしながら余計な学習時間が掛かったじ
ゃないか。
異常性格なPerlのぼろさだ。
449デフォルトの名無しさん:2009/12/26(土) 21:04:06
特殊変数とかマッチ演算子とかあらかじめ学習しておかないと解読できない
異常性格言語Perl。
Perlが完全に未学習で初めてなのに、いきなりソース持ってきて、このCGI
を作れと言われて、俺の知能が低いからソース読めないと思ってたが、実は
ソースが汚いとか可読性が悪いとか随分評判が悪いらしい、異常性格なPerl。
450デフォルトの名無しさん:2009/12/26(土) 21:07:35
オブジェクト指向プログラミングももどきなパッケージで実現する
異常性格なPerl。
451デフォルトの名無しさん:2009/12/26(土) 21:10:37
確かに知能は高くなさそうだな。
452デフォルトの名無しさん:2009/12/26(土) 21:18:26
CやC++スタイルのコメントも使わせない、異常な#を使わせる、異常性格なPerl。
453デフォルトの名無しさん:2009/12/26(土) 21:32:24
ラクダ本の能書きを読まずに、普通の入門書とかだけでは、
何かよくわからないまま、この場合はこのように対応する
らしいから、それに従うみたいになるだけで、応用力を身
に付けるのには適してないように思える。
なぜだ、それだけ異常性格なPerlだからか。
454デフォルトの名無しさん:2009/12/26(土) 21:33:05
普通の知能の人が普通に勉強すれば絶対詰まらないところで詰まった経験なんて、
いくら話しても馬鹿にされて終わるだけですよ。
455デフォルトの名無しさん:2009/12/26(土) 21:34:09
Perlができなくて、危うく首になりそうになった異常性格な言語Perl。
456デフォルトの名無しさん:2009/12/26(土) 21:38:37
>>454
普通に勉強する準備時間も無い状態でいきなり仕事やらされたんだぞ。
457デフォルトの名無しさん:2009/12/26(土) 21:49:46
>>456
普通じゃない状況のせいだとわかっているなら、言語批判に置き換えるのはおかしい。

あと、普通の知能の持ち主だったら、その状況でももっとマシな仕事できてたろうね。
458デフォルトの名無しさん:2009/12/26(土) 21:55:22
PHPなら全く初めてでも対応できた
だがPerlは異常だからそうはいかないから言語批判
459デフォルトの名無しさん:2009/12/26(土) 21:57:21
俺はどっちも普通に対応できたから
片方でヘマこいた人のレベルが低いようにしか思えない。
460デフォルトの名無しさん:2009/12/26(土) 21:57:34
while (<FILE>)ではなく、while(<>)て何のファイル読んでるんだ。
この異常性格Perl。
461デフォルトの名無しさん:2009/12/26(土) 22:03:44
この子のなにが凄いって、ここに書き込んだ例のすべてが
普通の人ならPerlを初めて触った日の最初の3時間で解決するレベルの
基本事項だってことだな。
462デフォルトの名無しさん:2009/12/26(土) 22:13:46
>>460
ARGVだろボケ
463デフォルトの名無しさん:2009/12/26(土) 22:22:43
慣れれば慣れるほど、コードが読めなくなっていく
ぱっと見Cみたいに見える頃はとても読みやすい
464デフォルトの名無しさん:2009/12/26(土) 22:30:37
3時間で解決する調べ方教えてくれ。
本読んでも何の前触れもなく突然意味不明なコードが出現したり、
目次や索引とかgoogleで常に疑問の解決に直結する情報が即座に
得られるというわけでもないし、地道に順を追って学習せざるを
得ないことが多い。
465デフォルトの名無しさん:2009/12/26(土) 22:39:14
>>440
if+elseは、内部でswitchのように
実行される(こともある?)らしいので、
実装難度が理由ではない。

つか、switchくらい面倒なわけないだろ。
理由は、後方互換と意地だと思う。
466デフォルトの名無しさん:2009/12/26(土) 22:48:33
Perlにはラベルがないからな
467デフォルトの名無しさん:2009/12/26(土) 22:49:12
記号を検索しにくいなら、検索しやすい名前で一通りラップすればいいんじゃないか
そういうライブラリって既にある?
468466:2009/12/26(土) 22:49:18
いや、あるし。何を言ってるんだ
469デフォルトの名無しさん:2009/12/26(土) 22:49:37
>>467
use English;
470442:2009/12/26(土) 22:53:00
>>445,446,447さん
見難いコードにも拘らず
ありがとうございます
上手く起動しました。
chompを調べたところ
行末の文字を消去すると出ていたのですが
どうやらCR+LFの改行コードで詰まっていたんですね
471デフォルトの名無しさん:2009/12/26(土) 23:23:47
どうやら、Perlを使うほど人間も異常性格になって、人を馬鹿にしたいらしい。
472デフォルトの名無しさん:2009/12/26(土) 23:28:33
直感で理解するにも限度がある、学習の裏付けがないとソース読めない異常性格Perl。
473デフォルトの名無しさん:2009/12/26(土) 23:32:47
異常性格製造機Perl
474デフォルトの名無しさん:2009/12/26(土) 23:55:37
>>456
そんなの普通にあるな。 甘えんな
475デフォルトの名無しさん:2009/12/26(土) 23:57:43
>>471
まだ俯瞰で物を見る力が残っているなら、客観的に周り見てみ。 誰が一番異常か。
476デフォルトの名無しさん:2009/12/26(土) 23:59:10
 \                    /
   \  丶       i.   |      /     ./       /
    \  ヽ     i.   .|     /    /      /
      \  ヽ    i  |     /   /     /
   \
                                  -‐
  ー
 __          わ た し で す            --
     二          / ̄\           = 二
   ̄            | ^o^ |                 ̄
    -‐           \_/                ‐-

    /
            /               ヽ      \
    /                    丶     \
   /   /    /      |   i,      丶     \
 /    /    /       |    i,      丶     \  
477デフォルトの名無しさん:2009/12/27(日) 00:02:08
みんな仲良く汁!!

あと難しい言葉使うな!!
478デフォルトの名無しさん:2009/12/27(日) 00:05:01
switchってどうインデントするのが正解なんだろ
479デフォルトの名無しさん:2009/12/27(日) 00:13:07
>>475
お前だ
480475:2009/12/27(日) 00:29:20
>>479
そんな筈があるわけ・・・ ほんまや
481デフォルトの名無しさん:2009/12/27(日) 00:45:27
>>476
お前、今、輝いてるよ
482デフォルトの名無しさん:2009/12/27(日) 02:28:54
Perlは確かに異常だよ。
483デフォルトの名無しさん:2009/12/27(日) 02:41:57
try- catchではなくeval- if(@)を使わせる異常性格
484デフォルトの名無しさん:2009/12/27(日) 02:57:06
Try::Tiny使えばいいじょう性格
485デフォルトの名無しさん:2009/12/27(日) 03:31:03
switch caseの話題でgiven whenが出てこないスレwww
486デフォルトの名無しさん:2009/12/27(日) 09:43:01
try catchって、ずっと use Error qw(:try) でやってたよ。

given when って知らなかったな。って、5.10からか。
仕事で使ってる人は、圧倒的に5.8系が多いんじゃないか?
俺がそうだから、みんながそうだとは限らんけど、RHEL使ってるなら、そうだよね。
5.10や、6の機能なんか調べても意味ないから調べないな。
5.10はもうちょっとして、新規の案件があれば調べるかも、程度だなぁ。
6はちょっと論外だなぁ。5年後くらいには、5.10がメインになってるかもね。
でも、Perl6::Sayは使っちゃう。

487デフォルトの名無しさん:2009/12/27(日) 10:11:40
一応 Solaris8で使うことも考えるから、基本は Perl 5.00503 かな
Solaris9 前提なら Perl 5.6.1 でもいいんだろうけど
488デフォルトの名無しさん:2009/12/27(日) 10:23:53
スマートマッチもあるしね。

今からPerlやるとか変態だろう。
RubyとかPythonがある今で。
489デフォルトの名無しさん:2009/12/27(日) 10:30:27
ギドがもうちょっとイケメンだったらPythonに乗り換えてた。
490デフォルトの名無しさん:2009/12/27(日) 10:47:34
>>487
うへぇ、そういう環境って、やっぱCPANもろくに使えないとか?
Perlって、CPANなけりゃとてもとても使えたもんじゃねーって思ってる。
491デフォルトの名無しさん:2009/12/27(日) 12:06:59
perlのリストというのは、配列と同義だろうか。
配列のperl用語だろうか。
492デフォルトの名無しさん:2009/12/27(日) 12:12:32
そうか、コンマで区切ってカッコでくくったものがリストらしいな。
493デフォルトの名無しさん:2009/12/27(日) 12:14:47
それに対して配列は、リストの受け皿である変数のことを言うんだろうな。
494デフォルトの名無しさん:2009/12/27(日) 12:43:53
perlのlはリストのlだ
495デフォルトの名無しさん:2009/12/27(日) 12:55:19
>>490
CPANのパッケージは、比較的最新のPerl版数を要求するものが多かったり、
他のパッケージを要求するものが多く、芋づる式にたくさんのパッケージを
入れると、どこかで Perl 版数に引っかかったりして、こういう環境では使いづらいね

でも、素 Perl であっても、シェルスクリプトでは出来ないことが出来るし、
全然役に立つ。Solaris8以降なら最小インストールでも入るのも大きい
496デフォルトの名無しさん:2009/12/27(日) 13:08:22
perlを多用するようになったのはエクセルでは開けない巨大なデータを扱い始めてからだったなあ
エクセルで並び替えたり変換したり抽出したり計算したりを全部perlでやるようになった
負荷の高い数値計算とかだと今でもCだけど
497デフォルトの名無しさん:2009/12/27(日) 13:10:13
#!/local/usr/bin
から
#!/usr/bin
に変わった時はうれしかったよ
498デフォルトの名無しさん:2009/12/27(日) 13:11:15
間違えた
#!/usr/local/bin
だたw
499デフォルトの名無しさん:2009/12/27(日) 13:48:02
#!/usr/bin/env perl
とかできひんの?
500デフォルトの名無しさん:2009/12/27(日) 13:48:43
でけへん
501デフォルトの名無しさん:2009/12/27(日) 18:01:26
>499
use Perlのjournalとか読んでるとサンプルソースで#!/usr/bin/env perl
って書いてるのをよく見かけるな。
502デフォルトの名無しさん:2009/12/28(月) 01:30:36
>>499
その書き方は、稀によく見掛けるね

自分は好きじゃないけど
503デフォルトの名無しさん:2009/12/28(月) 01:47:45
「稀によく見掛ける」
504デフォルトの名無しさん:2009/12/28(月) 02:09:23
>>503
どうした?
505デフォルトの名無しさん:2009/12/28(月) 12:48:36
>>230
規制中による遅レス失礼。
うまくいきました。
カーリーブレースがデリファレンスの正式な方法って知らなかった。
続•初めてのperlを買ったら、載っていて理解した。
506デフォルトの名無しさん:2009/12/28(月) 13:04:10
デリファレンスは%部分だろ
507デフォルトの名無しさん:2009/12/28(月) 13:53:50
無センス
508デフォルトの名無しさん:2009/12/28(月) 14:03:01
%$a{b}
509デフォルトの名無しさん:2009/12/28(月) 16:50:33
正確に言うとphpなんですがpreg系の正規表現置換で、
バックスラッシュ以外の一文字っていう正規表現がわかりません。
/[^\\]/
かなと思ったのですが[]が閉じてないと言われてしまいます。
/[^\]/でも同様でした。
文字列を指定した文字で、分割したくて、エスケープ処理も使いたいってことなんですが、
1:2\::3
↑この文字列を1,2:,3に分割したいってことで\が前にない:で分割ってのをしたいんです。
よろしくお願いします
510デフォルトの名無しさん:2009/12/28(月) 17:03:55
PHPの正規表現は知らんが(すれ違いだし)
511510:2009/12/28(月) 17:05:25
否定先読みでも使えばいいんじゃないの
512デフォルトの名無しさん:2009/12/28(月) 17:05:41
pregって一応perl準拠なんですが・・・。まあ完全に一緒ではないのかもしれません。
513デフォルトの名無しさん:2009/12/28(月) 17:08:20
あーこの場合だと、否定後読みか?
514デフォルトの名無しさん:2009/12/28(月) 17:10:09
>>509
phpは正規表現リテラルがなくて文字列で表すので、

/[^\\]/

を得ようと思ったら、

"/[^\\\\]/"

と書かなきゃいけないんじゃなかったっけ。(めんどくさー)

まあスレチだからちゃんとききたきゃPHPスレで。
515デフォルトの名無しさん:2009/12/28(月) 17:12:44
>>511
/(?<!\\)\:/
こういうことですか?これでも()が閉じてないと言われてしまいました。
516デフォルトの名無しさん:2009/12/28(月) 17:16:26
/(?<!\\\\):/"
でいけました。スレ汚し失礼いたしました。
517デフォルトの名無しさん:2009/12/28(月) 17:18:21
ああ、なるほどね
phpだと関数だからstringで渡さなきゃいけないのか
518デフォルトの名無しさん:2009/12/28(月) 18:47:57
Mechanize使ってWebページのフォームにあーだこーだすることはできたんですが
flashplayerにあーだこーだすることはできませんか?
具体的にはニコニコ動画のコメントを読み込んだり書き込んだりしたいんですが
519デフォルトの名無しさん:2009/12/28(月) 19:07:05
520デフォルトの名無しさん:2009/12/28(月) 19:08:58
APIが用意されてたんですか
ありがとうございます
521デフォルトの名無しさん:2009/12/28(月) 23:22:50
>>514

/[^\\]/

笑ってるゾウみたい。
522デフォルトの名無しさん:2009/12/28(月) 23:50:35
/ ̄ ̄ ̄ ̄ ̄\
| ^ U      |
| |ι        |つ
U||  ̄ ̄ ||
   ̄      ̄
523デフォルトの名無しさん:2009/12/29(火) 08:06:14
既存のモジュールに多少手を加えたものを作ろうとしているのですが、
たとえば/usr/local/lib/perl/5.10.0/xxx.pmを多少変更したxxx1.pmというのを作って使おうとしたら、
どうやって読み込めばいいでしょうか?
よろしくお願いします。
524デフォルトの名無しさん:2009/12/29(火) 08:10:14
というか、モジュールが@INC以外に存在するとき、どうやって場所を指定すればいいでしょうか?
525デフォルトの名無しさん:2009/12/29(火) 08:11:14
自己解決しました。
use lib /home/perl/Modules;
use NewModule;
でした。
526デフォルトの名無しさん:2009/12/29(火) 08:11:47
>>523
/home/hoge/lib/xxx1.pm
に設置したとしたら、スクリプトの冒頭(じゃなくてもいいんだけど)で、

use lib qw(/home/hoge/lib);

とすると吉。
527デフォルトの名無しさん:2009/12/29(火) 08:12:46
>>525
俺の立場をどうしてくれるw

まあ、use libの後は何らかの引用符で囲んでリストで渡すように。
528デフォルトの名無しさん:2009/12/29(火) 08:21:46
527さん

ありがとうございました。qwでやります。
529デフォルトの名無しさん:2009/12/29(火) 08:58:01
>>525
それで出来るんだね。

push(@INC, '/home/perl/Modules');

ってやってたけど、そっちのがよさげだね。
530デフォルトの名無しさん:2009/12/29(火) 13:36:49
>>529
あれっ、それ無理でしょ。
@INCはコンパイル時に評価されるから。
BEGINでくくるなら別だけど。
531デフォルトの名無しさん:2009/12/29(火) 15:59:38
perlでuniqって簡単にはいかないんですか?

@list=uniq @list
みたいな?
532デフォルトの名無しさん:2009/12/29(火) 16:06:26
無理
533デフォルトの名無しさん:2009/12/29(火) 16:08:33
そうですか。。。。
自力で重複分を捨てないといけないのですね?
需要高そうですけど、、、、、、どなたかコピペお願いします
534デフォルトの名無しさん:2009/12/29(火) 16:12:41
でもcpanモジュールにあったと思うぞ
535デフォルトの名無しさん:2009/12/29(火) 16:23:22
List::MoreUtilsにあったはず
536デフォルトの名無しさん:2009/12/29(火) 16:37:32
>>533
Perlクックブックより

my %seen;
@list = grep !$seen{$_}++, @list;
537デフォルトの名無しさん:2009/12/29(火) 16:38:17
欲わかんなかったので書いてみた
@id=sort @id;

for(@id){
unless($temp eq $_){
push(@temp,$_);
}
$temp=$_;
}

for(@temp){
print;
print "\n";
}

プロフェッショナルな皆さん、評価お願いします
538デフォルトの名無しさん:2009/12/29(火) 17:06:24
>>533
最初からハッシュ配列に入れれば?
539デフォルトの名無しさん:2009/12/29(火) 17:14:42
配列作るときに

$hash{$_}++

ってして

@list=keys %hash

で良いんじゃないの?
540デフォルトの名無しさん:2009/12/29(火) 17:25:26
うむ・・・・
上のほうの方も、
>>最初から
>>配列作るときに
の方も、、、根本的にプロフェッショナルの方はやり方が違うのですね・・・・
尾恥ずかしながら、最初 @id を作ってるところがこんな感じです。
ここでハッシュというものが登場するわけでしょうかww

while(<>){

if(/(\d\d:\d\d:\d\d).*ID:(........)/){
#print "$2"."\t";
#print "$1";
#print "\n";
push(@id,"$2");
}

}

541デフォルトの名無しさん:2009/12/29(火) 17:55:40
>>539
これで動いたみたいです!!
ありがとうございます。勉強します

while(<>){

if(/(\d\d:\d\d:\d\d).*ID:(........)/){
#push(@id,"$2");
$hash{$2}++;
}

}


@list=keys %hash;
#@id=sort @id;

#for(@id){
#unless($temp eq $_){
#push(@temp,$_);
#}
#$temp=$_;
#}

for(@list){
print;
print "\n";
}

542デフォルトの名無しさん:2009/12/29(火) 18:07:32
ちなみに

%hashのkeyあたりどれぐらい重複していたかは

$hash{key}

で分かるよ
543デフォルトの名無しさん:2009/12/29(火) 23:58:54
これって今の場合はともかく、@listが何かへのリファレンスだったらまずくない?
544デフォルトの名無しさん:2009/12/30(水) 10:27:51
そりゃ、uniqを取ると言う目的とは別の処理の問題だろ。

リファレンスが対象だったとしたら、「リファレンスのアドレスが同じ」か、
「リファレンスの中身(例えば中身のスカラーが同じとか)が全て同じ」かで
処理は全く変るわけだし。

前者だったら、Scalar::Util の refaddr 関数とかで各固有のアドレス(数値)を
得てハッシュに突っ込む。
Scalar::Util qw( refaddr ) ;
my %seen ;
my @arr = .... ;
my @uniq = grep { ! $seen{ refaddr $_ } ++} @arr ;
# + 0 でいいじゃん、なんて某氏が言いそうな突っ込みは禁止。
545デフォルトの名無しさん:2009/12/31(木) 21:56:34
大晦日に失礼致します。
数日前から色々と苦戦しています。。
当方、超初心者です。

現在、CGIのページで携帯のチャットサイトを作っています。
携帯の機種名を取得して表示したいのですがうまくいきません。

-----------------------------------------------------------
sub html_view {
&html_header;
if ($FORM{'mode'} eq 'reg') { &html_form2; }
else { &html_form1; }

@DATA = &read_file($datefile);
$kizi = @DATA;
if($kizi >= $max_page) { $dataview = $max_page; }
elsif($kizi < $max_page) { $dataview = $kizi; }
foreach (0 .. ($dataview - 1)) {
local($date,$name,$com,$cl) = split(/,/,$DATA[$_]);
chop($cl);
print "<HR SIZE=1>\n";
$name =~ s/\0/,/g;
$com =~ s/\0/,/g;
print "<FONT COLOR=\"$cl[$cl]\">$name</FONT>\>$com<br>★($date)\n";
}
&html_footer;
exit;
}
-----------------------------------------------------------
上記のソースの★の部分に携帯の機種名を表示したいのです。
546デフォルトの名無しさん:2009/12/31(木) 21:58:01
色々と調べて、CGI、perlで表示できそうなサイトをみつけました。
(http://www.kawa.net/works/perl/phone/pnews.html)
テストとして、こちらのサイトさんのプログラムをダウンロードして、
phone.plをアップロード、そしてtest.cgiを作り、
------------------------------------------
#!C:/perl/bin/perl
print "機種名: $phone->{name}<BR>\n";
------------------------------------------
として保存してtest.cgiにアクセスしましたが、
internal server errorと表示されてしまいます。

どのようにしたら、★の位置に携帯の機種名を表示できるのでしょうか・・・
どうかよろしくお願い致しますm(_ _)m
547デフォルトの名無しさん:2009/12/31(木) 22:32:48
大晦日に失礼致します。
数日前から色々と苦戦しています。。
当方、超初心者です。

現在、CGIのページで携帯のチャットサイトを作っています。
携帯の機種名を取得して表示したいのですがうまくいきません。

-----------------------------------------------------------
sub html_view {
&html_header;
if ($FORM{'mode'} eq 'reg') { &html_form2; }
else { &html_form1; }

@DATA = &read_file($datefile);
$kizi = @DATA;
if($kizi >= $max_page) { $dataview = $max_page; }
elsif($kizi < $max_page) { $dataview = $kizi; }
foreach (0 .. ($dataview - 1)) {
local($date,$name,$com,$cl) = split(/,/,$DATA[$_]);
chop($cl);
print "<HR SIZE=1>\n";
$name =~ s/\0/,/g;
$com =~ s/\0/,/g;
print "<FONT COLOR=\"$cl[$cl]\">$name</FONT>\>$com<br>★($date)\n";
}
&html_footer;
exit;
}
-----------------------------------------------------------
上記のソースの★の部分に携帯の機種名を表示したいのです。
548デフォルトの名無しさん:2009/12/31(木) 22:33:51
ごめんなさい・・
二回書き込んでしまいました。
549デフォルトの名無しさん:2009/12/31(木) 22:57:52
>>546
httpヘッダ出力してねえのに、エラー出ない訳ないわなw
550デフォルトの名無しさん:2009/12/31(木) 22:58:22
追記
cgiに関することはスレ違い
551デフォルトの名無しさん:2009/12/31(木) 23:36:24
>>549さん
ありがとうございました!
やってみます!

>>550
すみません。
適切なスレを探したいと思います。
552デフォルトの名無しさん:2010/01/01(金) 12:38:21
スレ違いというか板違いね

http://pc11.2ch.net/php/
こっちからPerlでスレ検索
553デフォルトの名無しさん:2010/01/02(土) 22:02:35
packで"p"、"P"ってどういう使い方をするのでしょうか?
簡単な例で説明してくれると嬉しいです。

p 文字列へのポインタ
P 構造体 (固定長文字列) へのポインタ
554デフォルトの名無しさん:2010/01/02(土) 22:30:03
ポインタが取得できる
555デフォルトの名無しさん:2010/01/02(土) 23:01:28
4桁の16進数の文字列をunsignedの数値にしたい時、
どうunpackすれば?
556デフォルトの名無しさん:2010/01/02(土) 23:07:31
hex $hoge;
557デフォルトの名無しさん:2010/01/03(日) 00:27:13
つまり、unpackでは無理だと
558デフォルトの名無しさん:2010/01/03(日) 09:24:59
Win上の activeperl について質問です。

wperl を使ってウィンドウを出さない状態で
実行したいのですが、スクリプトの中で
バッククォートとか system を使うと、
DOS窓が出てきてしまいます。

DOS窓を出さずに、相当のことができる方法は
何かありますでしょうか?
559デフォルトの名無しさん:2010/01/03(日) 09:46:41
>>558
ていうか今時バッククオートとか有り得ないから。
同等の機能を持ってるモジュールがあるはずだから、
ググって探せ。
560デフォルトの名無しさん:2010/01/03(日) 10:16:18
>>557
一発じゃ無理じゃないんかなあ。
unpack使いたいなら、一旦普通にunpackしてMSB立ってたら1の補数を取れ。
それか一旦4バイト列にするかだが、補数取る方がコスト低い希ガス。
561デフォルトの名無しさん:2010/01/03(日) 10:17:08
×4バイト
○2バイト
562デフォルトの名無しさん:2010/01/03(日) 17:12:03
先生質問です。

日本語処理の正規化について
これを読めば一通り理解できるってサイトや書籍ってありますか?
もしくは何らかのヒントが欲しい。
563デフォルトの名無しさん:2010/01/03(日) 22:54:51
>>562
「日本語処理の正規化」ってどういうこと?

内部エンコーディングのUTF-8で扱う、って話なら
「perl encode」でググれ
564デフォルトの名無しさん:2010/01/04(月) 00:01:41
やっぱり他の人も判らないのか
情報科学の最近の課題なのかと思った
565デフォルトの名無しさん:2010/01/04(月) 00:05:31
形態素解析みたいなことかな?
566デフォルトの名無しさん:2010/01/04(月) 01:02:14
形態素解析とか表記揺れ吸収とかの話だとしたらまあスレ違いだわな。
具体的にこれこれこういう処理をPerlで実装したいとか言うんならともかく。
567デフォルトの名無しさん:2010/01/04(月) 01:07:21
単に日本語が不自由な人だったに一票
568デフォルトの名無しさん:2010/01/04(月) 02:38:02
質問者を叩くの楽しいなあ
569デフォルトの名無しさん:2010/01/04(月) 08:57:20
どこにでもクズは居るね
570デフォルトの名無しさん:2010/01/04(月) 09:29:00
>>562
お前が言ってるのはこの手合いか?
http://www.amazon.co.jp/dp/4320122380/
Perl全然関係ないんですけど。
571デフォルトの名無しさん:2010/01/04(月) 13:55:59
Unicode正規化のことなんじゃねえかなぁ
572デフォルトの名無しさん:2010/01/04(月) 14:06:20
はじめまして!初心者です。
いい感じのフリースクリプトのページを見つけたのですが、全然意味がわかりません!

http://homepage1.nifty.com/kkuri/computer/ExAuction.html

ここに載ってるスクリプトをどなたか解説していただけませんか??(涙)
573デフォルトの名無しさん:2010/01/04(月) 14:07:47
572です。

…私はWEBプログラミング板で質問するべきだったのでしょうか??
失礼しました!
574デフォルトの名無しさん:2010/01/04(月) 19:28:02
if (($pc_auction) and ($auctype) and ($session_endtime > time())) {&pcuser;}
if (($userid eq 'root') and ($action eq 'scoredsply')) {&scoredsply;}
if ($action eq 'calldsply') {&calldsply;}
elsif ($action eq 'formdsply') {&formdsply;}
elsif ($action eq 'accept_sell') {&accept('accept_sell');}
elsif ($action eq 'accept_buy') {&accept('accept_buy');}
elsif ($action eq 'cancel_sell') {&accept('cancel');}
elsif ($action eq 'cancel_buy') {&accept('cancel');}
elsif ($action eq 'call_sell') {&callsave('sell');}
elsif ($action eq 'call_buy') {&callsave('buy');}
elsif ($action eq 'call_mess') {&callsave('message');}
elsif ($action eq 'ses_start') {&session_start;}
elsif ($action eq 'ses_end') {&session_end;}
elsif ($action eq 'logoff') {&logoff;}
elsif ($action eq 'final') {&final;}
elsif ($action eq 'newauction') {&newauction;}
elsif ($action eq 'backup') {&backup;}
elsif ($action eq 'payofftable') {&payofftable;}
elsif ($action eq 'pricetable') {&pricetable;}
elsif ($action eq '') {&framedsply;}
exit;

どういう処理がなされているのでしょうか?
575デフォルトの名無しさん:2010/01/04(月) 19:37:25
色んな処理
576デフォルトの名無しさん:2010/01/04(月) 20:01:35
switchにして欲しいね
577デフォルトの名無しさん:2010/01/04(月) 20:58:32
$switch{$action}->();
で済みそうな。
578デフォルトの名無しさん:2010/01/04(月) 22:22:14
いまどきこんな書き方する奴が居るのか
579デフォルトの名無しさん:2010/01/04(月) 22:22:25
動作コストも少なく済みそう。
580デフォルトの名無しさん:2010/01/04(月) 23:35:22
素直な書き方ではあるけど、elsifと$actionを何度も書くのが格好悪いので、
スマートに書こうと無駄な努力をしがち
581デフォルトの名無しさん:2010/01/05(火) 00:31:11
ディスパッチャか

ていうかwebprog板で報酬を要求されたからって
こっちに戻ってきてもいいことないぞ
582デフォルトの名無しさん:2010/01/06(水) 02:23:35
Perl学習中です。
ある文字列について一定確率で文字を置換するプログラムを作りたいのですが
いくつか条件があるために頭が混乱してしまいます。
そもそも一定確率でランダムに置換する方法が分からないのですが・・。
条件1.一文字一文字に対して一定確率で文字置換が起こるようにする。
条件2.置換を起こさない文字もある。
----------------
AADBCCBCDACA
| | || |
BADCAACCDABA
----------------
上の例で言えば
条件2:Dは置換することはない
条件1:A,B,Cはそれぞれ一定の確率で、A,B,Cのいずれかの文字に置き換わる。
例では1/2。*結果的には1/2になっていなくても良い。
置換後の配列と元の配列それぞれのABCの含有量は一緒でなくても良い。

文字を一文字ずつ認識することはできているのですが、この先どうすればいいのでしょうか。
ご指導よろしくお願いします。
583デフォルトの名無しさん:2010/01/06(水) 02:25:45
図の線がずれてしまいました><
584デフォルトの名無しさん:2010/01/06(水) 02:55:40
%r = (
'A' => 0.5,
'B' => 0.5,
'C' => 0.5,
'D' => 1,
);

foreach (split//,'AADBCCBCDACA') {
$s .= rand(1) < $r{$_} ? $_ : ('A','B','C')[rand(3)];
}
print $s;
585デフォルトの名無しさん:2010/01/06(水) 02:58:17
↑すまん。これはダメ
586デフォルトの名無しさん:2010/01/06(水) 03:06:20
int付けろよw
587デフォルトの名無しさん:2010/01/06(水) 03:38:28
%r = (
'A' => 0.5,
'B' => 0.5,
'C' => 0.5,
'D' => 1,
);

print join ('',map {rand(1) < $r{$_} ? $_ : ($_ eq 'A' ? ('B','C')[int rand(2)] : ($_ eq 'B' ? ('A','C')[int rand(2)] : ('A','B')[int rand(2)] ) );} split//,'AADBCCBCDACA');
588デフォルトの名無しさん:2010/01/06(水) 03:44:08
あ、join不要だった
寝よう…
589デフォルトの名無しさん:2010/01/06(水) 04:13:42
D以外は、該当文字の確率を倍にして全部乱数にかければいいべ
590デフォルトの名無しさん:2010/01/06(水) 04:18:35
$_="AADBCCBCDACA";
$l="ABC";
s/[$l]/int rand 2?(grep$&ne$_,split"",$l)[rand -1+length$l]:$&/eg;
print;

ABCが置換される確率1/2固定だけど
591デフォルトの名無しさん:2010/01/06(水) 09:12:00
Perlには予約言語の種類がたくさんありますが全部覚える必要はありますか?
592デフォルトの名無しさん:2010/01/06(水) 09:15:19
>>591
$foo{log} = "$time: written\n";

みたいなクオート略記を多用するなら全部覚える必要あり。
ついでにインポートした関数もな。
ちなみに上記はlogが予約語なので期待した動作をしない。ありがちなミスの例として有名。
593デフォルトの名無しさん:2010/01/06(水) 09:16:13
>>590
三項演算子の条件部で各文字の確率と比較してあげればいいよね。

my $str = "AADBCCBCDACA";

my %r = (
A => 0.5,
B => 0.5,
C => 0.5,
D => 1,
);

my @chrs = grep $r{$_} != 1, keys %r;

$str =~ s/(@{[join '|', @chrs]})/
rand() < $r{$1} ? (grep $1 ne $_, @chrs)[rand $#chrs] : $1/eg;
594デフォルトの名無しさん:2010/01/06(水) 09:31:35
>>592
へーと思って試してみたけど特に不思議なことはないみたいなんだが??

% perl -MData::Dumper -e '$foo{log} = 1; print Dumper(\%foo)'
$VAR1 = {
'log' => 1
};

バージョンは

This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi
595デフォルトの名無しさん:2010/01/06(水) 10:21:21
Perl v5.8.0 でも同じ結果
http://codepad.org/lYxkZxCO
596デフォルトの名無しさん:2010/01/06(水) 13:12:43
$foo{log(1)}にしたときは関数として評価されて関数の返り値がハッシュのキーになるね
597デフォルトの名無しさん:2010/01/06(水) 13:38:46
perlrefのNot-so-symbolic referencesのあたりにはっきり書いてあるね。

ですから、

$array{ "aaa" }{ "bbb" }{ "ccc" }

の代わりに以下のように書けて:

$array{ aaa }{ bbb }{ ccc }

そして添え字が予約語であるかどうかを心配することはありません。以下のようなことがしたいという珍しい場合には:

$array{ shift }

裸の単語でないようにさせる何かを追加することで予約語であるように強制的に解釈させることができます。

$array{ shift() }
$array{ +shift }
$array{ shift @_ }
598デフォルトの名無しさん:2010/01/06(水) 19:43:48
>>592
ありがとうございます
親切にお答えいただいて
599デフォルトの名無しさん:2010/01/06(水) 20:01:18
解釈の方法多すぎワロタ
仕様全部覚えようとすると圧倒的にダメな言語だなw
600デフォルトの名無しさん:2010/01/06(水) 22:15:36
そこが可愛いとこでもある
601デフォルトの名無しさん:2010/01/06(水) 23:35:53
当方Perlの初めて数ヶ月のPerlの玉子ですが
同じソース上で動かすと問題なく可動し
ライブラリをrequireしようとすると
入力フォームから得たUTF8が表示されなくなります。
#!/usr/local/bin/perl

require 'getformdata.pl';
use utf8;
use encoding "utf8";
use open IO => ":utf8";
use open ":std";
use Encode;
open(OUT,">text.txt");


#本来は別途のライブラリを介して値を得たい
#%formdata=plab::getformdata();
%formdata=getformdata();
#同じソース上でしか、utf8を得られない。
print "content-type: text/html;charset=UTF-8\n";
print "\n";

while (($key, $val) = each(%formdata)) {
print "$key = $val<br>";
}
close(out);
602デフォルトの名無しさん:2010/01/06(水) 23:38:48
#'getformdata.pl';
sub getformdata
{
local $rawdata;
local %formdata;
local @inputs;
local ($input,$name,$val);

if($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN,$rawdata,$ENV{'CONTENT_LENGTH'});
}
elsif($ENV{'REQUEST_METHOD'}eq "GET"){
$rawdata=$ENV{'QUERY_STRING'};
}
@inputs=split('&',$rawdata);

foreach$input (@inputs){
($name,$val)=split('=',$input);
$val=~tr/+/ /;
$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C",hex($1))/eg;
$formdata{$name}=$val;
}
return %formdata;
}
どうやったら別々のソース上でUTF8が表示できるようになるか教えてください。
603デフォルトの名無しさん:2010/01/06(水) 23:40:31
>>602
少し訂正。
package宣言はすでにしている物とします。
604デフォルトの名無しさん:2010/01/07(木) 00:06:05
は?CGIでいいじゃねーか
605デフォルトの名無しさん:2010/01/07(木) 00:15:34
getformdata.plをrenameしてgetformdata.cgiにしましたが
実行結果は同じでした。同じソース上でサブルーチンした場合は
UTF8は表示されますが、ライブラリとして呼び出したらまるでUTF8
自体存在しなかったような挙動をとります。
606デフォルトの名無しさん:2010/01/07(木) 00:17:03
use CGI
607デフォルトの名無しさん:2010/01/07(木) 00:20:32
なんでuse utf8とかuse Encodeとかしてるのに全体的には10年以上前に書かれたようなコードなんだ…
608デフォルトの名無しさん:2010/01/07(木) 00:59:37
KENTなんかから入って、飛び飛びにつまみぐいで勉強すると
そうなることもあるだろうね
私も少し前までそうだったよ
609デフォルトの名無しさん:2010/01/07(木) 04:02:27
初めまして。文字化けについて、質問させてください。
Fedora11を使用しています。
Perl v5.10.0で, utf8でコードを書いています。

例えば、
#!/usr/bin/perl
$str = "こんにちは。";
$buffer = $str;
while ($buffer) {
$letter = substr($buffer, 0, 1, "");
$out .= $letter ."";
}
print $out . "\n";
ならば、「こんにちは。」と表示させることができるのですが、
6行目を
$out .= $letter ." ";
とすると(ダブルクォーテーションの中に半角スペースを入れると)、
ハテナ文字が18個ぐらい続いて、文字化けします。
「こ ん に ち は 。 」と表示させたかったのですが、
この場合、どうすればよいでしょうか。
610デフォルトの名無しさん:2010/01/07(木) 04:35:08
use utf8プラグマを使えばスクリプトがutf8で書かれていると解釈され、
substrなどの文字列操作関数が、バイト列のどこからどこまでが1文字なのか適切に判断出来るようになる。
611デフォルトの名無しさん:2010/01/07(木) 07:19:47
>>594
perl4の時の話じゃなかったっけそれ?Perl5.003でやったけど大丈夫だな。
詳しく調べてないけど、use strict subsで警告でないから問題ないんだろ。
思いつく例だと、

open(log, ">", "log.txt");
print log "hello\n";

これは問題になるわな。だかららくだ本では大文字推奨なわけだね。
まあ最近はそもそも裸のリテラルをファイルハンドルにするなって
話になってるけど。
612デフォルトの名無しさん:2010/01/07(木) 07:24:20
>>599
Perl vs PHPとかだとお互い様な気がするが、Javaとかとそこを比べられると辛い。
でもPerl好きな人はそういう言語仕様のお茶目なところが堪らんかったりするんだよ。

PHPの言語仕様の揺れは、お茶目というよりは単なる嫌がらせ。
PHP好きな人はたいていそういう言語仕様のお茶目なところに泣かされている。
613デフォルトの名無しさん:2010/01/07(木) 08:37:00
Perlのらくだ好きです
614デフォルトの名無しさん:2010/01/07(木) 15:25:04
Perlがそこそこできるようになったので、Yahoo!の知恵袋で回答しようと思ったら全然
質問が来ないね。

やっぱ廃れた言語なんだね。
C言語はいっぱい質問が来るのに。
615デフォルトの名無しさん:2010/01/07(木) 15:44:39
おまえは、注文が減ったと嘆いてる中小企業の社長かw
616デフォルトの名無しさん:2010/01/07(木) 17:04:17
ネットに質問出すやつなんて、もともとはぐれメタルばっかり。
617デフォルトの名無しさん:2010/01/07(木) 17:10:39
.plファイルをダブルクリックして実行するとウィンドウが出ますが
これを表示させずにバックグラウンドで実行させる方法はありますか?
618デフォルトの名無しさん:2010/01/07(木) 17:49:19
0との論理和をとると何故、整数部だけが抽出できるのですか?

my $n = 123.45;
print $n | 0; #=> 123
619デフォルトの名無しさん:2010/01/07(木) 17:57:54
| は logical or じゃないよ
620デフォルトの名無しさん:2010/01/07(木) 18:07:09
>>614
お前がそう思うんならそうなんだろう。お前ん中ではな。


>>617
恐らくダブルクリックなら引数がつかないから、それを利用して自身を1度だけ呼び出すとか。

system("start /b cmd /c perl \"$0\" 1"),exit(0) if !@ARGV;
# バックグラウンド処理

621デフォルトの名無しさん:2010/01/07(木) 18:10:59
>>620のバックグラウンド処理の奴忘れておくれ。
systemの実行が終わるのを待ってからexitするので意味がなかった。
622デフォルトの名無しさん:2010/01/07(木) 18:17:54
>>617みたいな質問するやつはたぶんWindowsだろうからwperl使えと言っとく
623デフォルトの名無しさん:2010/01/07(木) 22:51:29
>>622
そのとーりです。
どうもありがとう
624デフォルトの名無しさん:2010/01/07(木) 23:20:18
>>558

#!/usr/bin/perl -w

use strict;
use Win32;

my $old = Win32::SetChildShowWindow(0); # 小プロセス起動時のコンソール表示無効化
my $retval_invisible = system 'dir';
# my $retval_invisible = `dir`;
Win32::MsgBox qq(system 'dir' executed: $retval_invisible);
Win32::SetChildShowWindow($old); # 復元
my $retval_visible = sytem 'dir';
# my $retval_visible = `dir`;
Win32::MsgBox qq(system 'dir' executed: $retval_visible);

__END__
625デフォルトの名無しさん:2010/01/08(金) 04:29:36
夜中にすんません、perl初心者なんですが
朝から悪戦苦闘してます
どうしてもわからないので、先輩方、教えてください

下記のような二桁の数字を羅列したtxtファイル(sample.txt)があったとします

64
72
88
55
77
33
29
94
86

で、二行目の72と七行目の29をれぞれ$aと$bに代入し
そんで、仮に$aは$bより10以上多い場合はtrueを返すというスクリプトを作りたいんですが・・・

open (IN, "sample.txt");

このあとがもうわかりません!><

説明不足かも知れませんが、よろしくおながいします
ちなみに、上戸彩に似てるって言われます、Dカップの処女です
626デフォルトの名無しさん:2010/01/08(金) 04:32:59
つ 除草剤
627デフォルトの名無しさん:2010/01/08(金) 05:30:16
>>614
Perl使う人はリテラシー高い人が多いのでYahoo!知恵袋みたいな
情報精度の極端に低いものは使いません。
Cの質問が多いのはどう見ても学校の宿題。
628デフォルトの名無しさん:2010/01/08(金) 07:42:14
>>625
依頼されたツールを誰かが作るスレ
http://pc11.2ch.net/test/read.cgi/php/1078997682/
629デフォルトの名無しさん:2010/01/08(金) 14:36:58
いろんな日付フォーマットに合わせて整形しようとして以下のようなスクリプトを書きました。
しかし結果がうまくいきません。どこが間違っているのでしょうか?

予定:2009-September-14 08:52:12
結果:2009-September-September September
-----
$DATE_FORMAT{'hoge'} = '^([a-zA-Z]+) (\d{1,2}), (\d{4}) (\d{2}:\d{2}:\d{2}).*';
@DATE_ARRAY{'hoge'} = (2,0,1,3); # 年月日 時分秒の順番を指定

$pattern_id = 'hoge';
$date_str = 'September 14, 2009 08:52:12 PDT EST';

&date_cnv($pattern_id,$date_str);

sub date_cnv {

my($id,$date)=@_;
my(@date_array) = @DATE_ARRAY{$id};

$date =~ /$DATE_FORMAT{$id}/;
my(@factor) = ($1,$2,$3,$4);
print qq|$factor[$date_array[0]]-$factor[$date_array[1]]-$factor[$date_array[2]]|.
qq| $factor[$date_array[3]]|;
}
----
print (@factor); で確認すると、@factorには期待していた値がちゃんと入っているようなのですが・・・
630デフォルトの名無しさん:2010/01/08(金) 14:45:58
>>629
@date_arrayも確認しろよ
631デフォルトの名無しさん:2010/01/08(金) 14:50:47
@DATE_ARRAY{'hoge'} じゃハッシュのスライスだよ。

たぶん君がやりたいことは @{$DATE_ARRAY{'hoge'}}
632デフォルトの名無しさん:2010/01/08(金) 15:06:31
>>630
あ、すみません。値が変ですね... [0] に 2 が入ってて、あとは空だ・・・
2行目のmy(@date_array)が期待通りいってないですね..

>>631
@{$DATE_ARRAY{'hoge'}} = (2,0,1,3);

おおおおお、こうすればうまくいきました!!
うまくいかなかった理由をもう少し勉強してみます。。。さんくす!!
633デフォルトの名無しさん:2010/01/08(金) 15:33:21
use DateTime::Format::Strptime qw(strptime strftime);

my $date_str = 'September 14, 2009 08:52:12 PDT EST';
print strftime( '%Y-%B-%d %T', strptime( '%B %d, %Y %T', $date_str ) );
634デフォルトの名無しさん:2010/01/08(金) 16:44:02
>>625
それは宿題だな。宿題スレへ逝け、....と言っても無いみたいだな。
Perlの宿題スレでも作ったら?
635デフォルトの名無しさん:2010/01/09(土) 01:55:22
>>634
立てずともこの辺のゴミスレをリサイクルすればよろし。

俺の課題を誰か作ってくれ!!
http://pc12.2ch.net/test/read.cgi/tech/1169822971/
プログラムをしたいけどなにしたらいかおしえて
http://pc12.2ch.net/test/read.cgi/tech/1214703631/
大卒ニーツです。プログラムマスターしたいです。
http://pc12.2ch.net/test/read.cgi/tech/1175864871/
何を作ればいいですか?
http://pc12.2ch.net/test/read.cgi/tech/1172057161/
636デフォルトの名無しさん:2010/01/09(土) 04:01:32
open (IN, "sample.txt");
close IN;

my($a,$b)=(72,29);
print 'true' if $a>$b+10;
637デフォルトの名無しさん:2010/01/09(土) 14:55:48
sub syukudai{
  my ($a,$b) = $_[2,7];
  return $a>$b+10 ? 'true' : 'false';
}
638デフォルトの名無しさん:2010/01/09(土) 17:38:13
sub syukudai {
  open (IN, "sample.txt");
  return 'ture';
}
639デフォルトの名無しさん:2010/01/09(土) 17:47:03
sub syukudai {
  open (IN, "sample.txt");
  print 'ずっと前から先生の事が好きでした';
}
640デフォルトの名無しさん:2010/01/09(土) 18:34:10
true love ですね
641デフォルトの名無しさん:2010/01/09(土) 22:30:59
#!/usr/bin/perl
$x=1;
$y=43;
$g=0;
$sum=0;
while($y){
$g=length($y);
if($g==1)
{
unshift(@a,$y);
last;
}
if($g!=1)
{
$xx=10*($g-1);
unshift(@a,$y%$xx);
$y=$y/$xx;
redo;
}
}
print "@a\n";

43を一つずつ10^桁数で割ってそのあまりを入れてるんですが
43って出力されるはずなんですが、出力結果が。
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3
となってしまうのは何故ですか?
教えてください。
642デフォルトの名無しさん:2010/01/09(土) 22:55:11
>>641
最初の $y /= $xx は $xx == 10 だから $y eq "4.3" になって次の length($y) が 3 。
以降 $y を割り続け、アンダーフローして 0 になった時に $g == 1 == length($y) になって
while から抜ける。

詳しくは「浮動小数点数」でウィキペドれ。
643デフォルトの名無しさん:2010/01/09(土) 23:54:07
デバッグしない人々
644デフォルトの名無しさん:2010/01/10(日) 00:15:55
おっし
$y=($y-($y%$xx))/$xx;
でいけた。
645デフォルトの名無しさん:2010/01/10(日) 01:52:15
bmi計算なんだが・・・何故か出力されない・・・どこがおかしい??



#BMI値の計算
$tall=165;
$weight=65;
$tall=$tall/100;
$bmi=$weight/$tall/$tall;
print "あんたのBMIは$bmi\n"

#判定
if ($bmi >= 30) {print "救えないデブだな!!\n";}

elsif ($bmi >= 25) {print "このデブが!!\n";}

elsif ($bmi >= 18) {print "普通だ!つまらないね!!\n";}

else {print "カマキリみたな体してるね!!\n";}
646デフォルトの名無しさん:2010/01/10(日) 02:04:11
print "あんたのBMIは$bmi\n";
647デフォルトの名無しさん:2010/01/10(日) 02:28:40
>>646
ありがとう。くだらなすぎてびっくりした
648デフォルトの名無しさん:2010/01/10(日) 06:57:14
これで「なぜか出力されない」なんてことあるんかい
環境によっちゃエラーにならないってことか
649デフォルトの名無しさん:2010/01/10(日) 07:22:41
後置ifと誤爆してるとかなのかな?
650デフォルトの名無しさん:2010/01/10(日) 08:36:30
なるほどな
ifの前は;抜けてもエラーにならないのか
651デフォルトの名無しさん:2010/01/10(日) 08:42:34
> syntax error at - line 1, near ") {"

ブロックが続くと後置でないことがバレるみたいだけど。
652デフォルトの名無しさん:2010/01/10(日) 09:00:32
ふむ…何でだろ
まあ、セミコロンは見た方が良いやね
セミコロン忘れがちな俺は、エディタの強調文字列としてセミコロンを登録して
それを一番目立つ色+太字にしてるぜ
653デフォルトの名無しさん:2010/01/10(日) 09:15:22
ブロックが続かないなんてことはないしな
出力されないんじゃなくて、やっぱりコンパイルが通ってない筈
654デフォルトの名無しさん:2010/01/10(日) 18:13:41
ファイルから16bit Big-Endianのバイナリデータを読み出し、
16進数と符号付き10進数で表示したいのですが、
なぜか符号なし10進数として表示されてしまいます。

read(INPUTFILE,$buf,2);
$value = unpack("n", $buf );
printf("HEX : %04X¥n", $value);
printf("DEC: %d¥n", $value);

出力
HEX: FFFC
DEC: 65532

FFFCは-4なのに、符号なしと解釈されて65532になっています。
unpackで"n"としたときに、符号なしと決めうちになってしまうのでしょうか。
655デフォルトの名無しさん:2010/01/10(日) 18:19:10
n An unsigned short (16-bit) in "network" (big-endian) order.
656デフォルトの名無しさん:2010/01/10(日) 18:19:24
決め打ちも何もnは符号無し16ビットビッグエンディアンの指定だが
657デフォルトの名無しさん:2010/01/10(日) 22:01:42
なんでnetworkって言うんだろう
658デフォルトの名無しさん:2010/01/10(日) 22:58:16
>>632
よくコロンと打ち間違える俺もそうしてる:
659デフォルトの名無しさん:2010/01/11(月) 05:00:18
>>657
> なんでnetworkって言うんだろう

networkを流す時のバイトオーダーをそう決めたから。
660デフォルトの名無しさん:2010/01/11(月) 09:07:50
もう少しましなネーミングは無かったのか
661デフォルトの名無しさん:2010/01/11(月) 09:23:27
>>660
マシだと思うが。
662デフォルトの名無しさん:2010/01/11(月) 12:47:32
ある既存モジュールに含まれるメソッドを書き換えたいと思い、
org_methodを次のような別名定義により書き換えをおこないました。

*old_method = \&org_method; #オリジナルに別名を割り当て
*org_method = \&my_method; #書き換えたメソッドをオリジナルの名前に割り当て

sub my_method {...}

プログラム動作は正常ですが「メソッドを再定義した」というエラーがログに残ってしまいます。
=>Subroutine Hoge::org_method redefined
呼び出し頻度の高いメソッドなので、あっという間にログが埋まってしまうありさま・・・

コードが微妙に誤っているのか・・・
このメッセージが出ないように対処することは可能でしょうか?
663デフォルトの名無しさん:2010/01/11(月) 12:52:55
メソッド?サブルーチンだろ
何いってんだお前
664デフォルトの名無しさん:2010/01/11(月) 13:01:41
まぁそんなことは置いといて
特に問題ないなら警告消せばいいだろ
no warnings 'redefine';
665デフォルトの名無しさん:2010/01/11(月) 13:10:34
>>664
warningsも個別に制御できるんですね。ありがとうございます。

個別のテストでは警告もなかったので、どうも1回の実行のうちの複数箇所で
このモジュールが読み込まれているからだと思います。
モジュール内に直接書かない方がいいのかな・・・。
666デフォルトの名無しさん:2010/01/11(月) 14:46:52
モジュールって何度も読み込まないようにできてるんじゃないの?
何度も呼ばれるサブルーチンの中で再定義してるんじゃないの?
667デフォルトの名無しさん:2010/01/11(月) 15:00:51
>>665
そのモジュールはなんなんだ?
OOPで書いたのか?関数のセットとして書いたのか?
668デフォルトの名無しさん:2010/01/11(月) 17:34:15
>>665
そのモジュール読むときには、useやrequire使ってるよね?
(他の方法だと1つのファイルが複数回読み込まれることがある)
669デフォルトの名無しさん:2010/01/12(火) 10:49:28
>>668
requireは複数回読むことがあると思うんだが。
670デフォルトの名無しさん:2010/01/12(火) 11:41:04
>>669
%INCをいじるとか、同じファイルを指すけど字面的には別なファイル名で
指定する、といったような特殊なことをしない限り2回読むことはないはず
じゃなかったっけ。
671デフォルトの名無しさん:2010/01/12(火) 11:47:46
>>669
どういう場合で?
http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod#item_require

do なら特別な事をせずとも呼ばれた回数だけ読むけれど。
http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod#item_do_EXPR_do

>>662
OO的に行儀のいい書き方だと、親の名前空間を直接いじったりしない。
http://perldoc.jp/docs/perl/5.10.0/perlboot.pod
http://perldoc.jp/docs/perl/5.10.0/perlbot.pod
672デフォルトの名無しさん:2010/01/12(火) 12:22:54
>>670
> 同じファイルを指すけど字面的には別なファイル名で

それ。1回目フルパス、2回目相対パスとか。やってみてないから分からんけど、
確かRequireはその欠点があったはず。
673デフォルトの名無しさん:2010/01/12(火) 12:43:27
useもrequireみたいなもんだから同じ欠点を持ってるの?
674デフォルトの名無しさん:2010/01/12(火) 12:45:54
こんなのね。

% cat hoge.pl
print "hoge!!!\n";
% perl -e 'require "hoge.pl"; require "./hoge.pl";'
hoge!!!
hoge!!!
% perl -e 'require "hoge.pl"; undef %INC; require "hoge.pl";'
hoge!!!
hoge!!!
675デフォルトの名無しさん:2010/01/12(火) 13:00:20
>>672
字面が違うと複数回読む挙動が欠点と言うより、
違う字面で複数回指定してしまう設計・実装の方がマズく思えるな。

>>673
use はモジュール名での指定に限られるから、@INC 内で最初に
見つかるファイルに限定される。更にコンパイル時に読まれるから
>>674 みたくわざと %INC を改変して eval "use Foo" のように
しない限り複数回読む事は無いよ。
676デフォルトの名無しさん:2010/01/12(火) 14:28:26
>>673
ないよ。文脈中じゃなくて初回に読まれるから%INC変えても意味ないし。
677デフォルトの名無しさん:2010/01/12(火) 14:29:44
@INCな。
678デフォルトの名無しさん:2010/01/12(火) 20:39:44
質問させてください。
簡易的なバックアップシステムを作ろうとしているのですが、そのコアの部分で悩んでいます。

以前のバックアップから変更があったファイルのみを抽出したいと思っているのですが、どのような方法がありますでしょうか?
抽出と言うのはファイル名(PATH)さえわかれば、そのファイルをコピーする作業は行えています。

現在考えているのは、バックアップを行った時点でファイル名とファイルサイズの対応表を作っておき、次回にバックアップを行うときに、その時点でのリストを作り以前のリストと比較。
その比較の結果、ファイルサイズや新たに追加されたファイルがあればコピー。
以前のリストにあり、最新のリストにないファイルは削除。
というようなことを考えています。
ですが、これだと編集後に同じ要領になったファイルが検出できないと思います。
ファイルのチェックサムを作れば、ファイル名ではなくそのチェックサムで確認が行えると思うのですが、バックアップファイルが数千や数万になることを考えると、チェックサムは現実的でない気がしています。

何か効率のいい方法や、やりかたがあればお教えいただければと思います。

どうかよろしくお願い致します。
679デフォルトの名無しさん:2010/01/12(火) 20:50:42
「効率」が重要ならperlで行うような処理じゃない気がする
680デフォルトの名無しさん:2010/01/12(火) 20:59:44
乱入

カレントディレクトリ配下にあるファイル名の一覧ってどうやって入手すんの?
globでやるとカレントディレクトリにあるファイル一覧しかとれん
681デフォルトの名無しさん:2010/01/12(火) 21:00:26
statでctimeかmtimeでも見れてばいいんじゃない
682デフォルトの名無しさん:2010/01/12(火) 22:04:28
>678
わざわざ作らず rsync を使う。

>680
一発じゃないけど File::Find 使えば?
683デフォルトの名無しさん:2010/01/12(火) 22:42:44
rsyncをPerlで書いたのがあった気が。

と気になって「rsync perl」でググったら検索トップだったw
684デフォルトの名無しさん:2010/01/12(火) 23:53:04
>>678
ぼくは、filenameとsizeとi-nodeとmtimeが一致したら同じと見なすという妥協をやっている。
685デフォルトの名無しさん:2010/01/13(水) 01:04:56
mtimeが前回バックアップ日時より後になっているのだけで十分だと思うけど
686デフォルトの名無しさん:2010/01/13(水) 03:59:04
どっちがプラスでどっちがマイナスだったか すぐ忘れる
687デフォルトの名無しさん:2010/01/13(水) 07:19:13
>>678
俺もrsync推しとく。君が言ってる面倒なことは全部やってくれて、
なるべく少ない転送量で済ませてくれるから。
rsyncはどんだけ転送量を節約したか表示されるが、それを抜くのは困難だと思われ。

あとチェックサムは桁が概して小さすぎるし、文字の入れ替えで同じ結果が出たりするから、
現在はメッセージダイジェストなどを使うのが一般的。
688デフォルトの名無しさん:2010/01/13(水) 22:14:26
新旧2つのログファイルがあります。
この新ログファイルでは新しく増えた行、旧ログファイルより削除された行があります。
この増えた行、削除された行を抽出したいのですが、どうすればいいでしょうか?
私が考え付いたのは、 旧ファイルを配列に読み込む。
配列より1行づつ新ファイルと比較する。
新ファイルに無ければ、削除された行。
上述の逆を行い、旧ファイルに無ければ追加された行。
というのをかんがえています。
689デフォルトの名無しさん:2010/01/13(水) 22:15:14
activeperl 5.10 x64にDevel-Profilerをインストールできた人いるかな・・
CPANからDevel-Profiler-0.04.tar.gzをダウンロードしてきてreadmeのとおりにインストールしたのだけど
nmake testで

C:\bin\Perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib', 'blib\arch')" t/*.tt/01basic.t .......
Not a GLOB reference at C:\bin\Perl\cpan\build\Devel-Profiler-0.04-K04u79\blib\lib/Devel/Profiler.pm line 155.
INIT failed--call queue aborted.

とでて完走せず。。
690デフォルトの名無しさん:2010/01/13(水) 22:31:51
ppmにはないのか?
691デフォルトの名無しさん:2010/01/14(木) 00:35:49
配列があって、先頭が日付から始まる要素(A) と、そうでない要素(B)があるのですが、
A-A-A-B-B-B-A-B-B-A-B-A (要素数12)
Bがあったら、それより前のAに吸収させたいのですが、
A-A-ABBB-ABB-AB-A (要素数6)
どうやればいいでしょうか?
692デフォルトの名無しさん:2010/01/14(木) 00:42:16
>>690
ppmではDevel-ProfilerでもDevel::Profilerでもそんなパッケージ見つからねえぞと言われた;;
Devel-Profiler以外のものでもactiveperlで使えるプロファイラがあれば教えてください・・
693デフォルトの名無しさん:2010/01/14(木) 00:44:51
activeperlでcpanを使うのか
makeとかコンパイラは入れたの?
694デフォルトの名無しさん:2010/01/14(木) 00:52:43
>>693
VisualStudio2008を入れてる。
CPANのConfig.pmでmakeはnmake使えとかいう設定を済ませてあるので
そのへんは大丈夫だと思うんだけども・・
695デフォルトの名無しさん:2010/01/14(木) 01:09:16
Devel::DProfとか?
696デフォルトの名無しさん:2010/01/14(木) 01:37:30
>>691
my @data = (元データ);
my ($append_to, $i);
for (@data) {
  if (/^ひづけ/) {
    $append_to = $i;
  }
  else {
    $data[$append_to] .= $_;
    undef $_;
  }
  $i++;
}
@data = grep defined, @data;
# てきとう

>>694
とりあえずStrawberryPerlでも試してみたら
697デフォルトの名無しさん:2010/01/14(木) 01:43:23
>>696
それは一度環境を構築したActivePerlから乗り換えろってことを言ってんのか
結構無茶いうね
698デフォルトの名無しさん:2010/01/14(木) 01:48:39
>>692
ActiveState以外のレポジトリも当たってみたのか?
699デフォルトの名無しさん:2010/01/14(木) 02:42:00
>>697
原因特定のために別の環境でも試してみたらってことを言いたかったんだが…

今Linuxで試したら>>689のエラーが出たからActivePerlのせいではないな。
forceでインストールしても実際使おうとすると同じエラーが出る。
700デフォルトの名無しさん:2010/01/14(木) 04:07:05
cpanの利用が前提ならStrawberryPerlの方が都合良いし
乗り換えもぜんぜん無茶じゃないと思うがなぁ
ppm listで導入したモジュールを調べて、cpanで入れるバッチを組むだけでしょ
701デフォルトの名無しさん:2010/01/14(木) 09:13:47
新しいActivePerlはcpanが使えるって話はどうなったんだ
ttp://d.hatena.ne.jp/perlcodesample/20091106/1246274997

702デフォルトの名無しさん:2010/01/14(木) 10:52:25
5.8 のときでも nmake や dmake 突っ込めば cpan shell 使えるぞと書かれてたと思う。
それはあらかじめ用意しなくてもよくなったという話じゃないのかな。
703デフォルトの名無しさん:2010/01/14(木) 11:20:58
まあ、入れただけじゃコンパイル通らんけどね。

5.10はデフォで動くのか。
他人にperlを勧めるときは良いかも。
704デフォルトの名無しさん:2010/01/14(木) 12:41:38
もうストロベリーパールの優位性ないでしょ
今までもMinGW入れれば良かったんだけど、より手軽になった
ppmも使えるしね
705デフォルトの名無しさん:2010/01/14(木) 14:12:49
>>688
そうゆうときはdiffを使う
706デフォルトの名無しさん:2010/01/14(木) 15:51:45
>>689
CPAN Testerを見ると5.10はみんなFAILしてるからダメなんじゃ
707デフォルトの名無しさん:2010/01/14(木) 16:10:15
ActivePerl 5.8.9 + MinGW では問題なし
Perlのバージョンじゃね?
708689:2010/01/14(木) 20:11:22
皆さんどうもありがとです。5.10には無理なのね・・

今日いろいろ聞いてまわったら今は後継のDevel-Profileを使うのが定石らしいです。
(昨日ぐぐりまくってたけど1字違いで検索にかからなかった・・)
こちらはppmであっさりインストール完了。
Devel-Profilerとほぼ同じ情報を提示してくれます。
ということで参考になれば。
709デフォルトの名無しさん:2010/01/14(木) 23:45:41
>688
>配列より1行づつ新ファイルと比較する。
1行毎に新ファイルの全行と比較するって言ってるんだよね?
longest common subsequence と呼ばれる問題(の派生)で賢い人々がもっと効率的なアルゴリズムを考えてるから
>705 の言うとおり diff 呼び出すか diff がなければ Algorithm::Diff あたりを使えばいい。
710デフォルトの名無しさん:2010/01/14(木) 23:50:33
100万行くらいあるtsvファイルが30個ぐらいあって、そのすべての行を1行ずつ取りだして、
splitし、所定のフィールドの値を関数の戻り値に置き換え、必要なフィールドだけをjoin
して別のファイルに書き出していく、という処理を書いたのですが、Core2Duo 3.16GHz/
2GB-RAMなWinXP環境でActivePerl5.8.8で実行させたところ、70分くらいかかって
しまいました。CPUパワーは平均して2/3程度占有していました。
3000万件あるのである程度は仕方ないにしても、このような処理を高速で行うために有効な
方法がなにかありますでしょうか。
711デフォルトの名無しさん:2010/01/15(金) 00:22:34
perlでまとまった行を無効化するような方法はありますでしょうか?
Cでこんな感じでやるような、、
#if 0
#endif
今は
if (0) {}でやってます。
712デフォルトの名無しさん:2010/01/15(金) 00:43:02
=hoge
まと
まった

=cut
713デフォルトの名無しさん:2010/01/15(金) 01:19:26
ヒアドキュメントを思いついた俺は邪道。
714デフォルトの名無しさん:2010/01/15(金) 01:31:47
>>712-713
色々やりかたがあるんですね。ありがとうございました。
715デフォルトの名無しさん:2010/01/15(金) 01:52:10
多数のログファイルがあって、中からXXXXという文字の入った行を抜き出し、その先頭の日付だけを取り出したいのですが、
以下のようにやると出来たのですが、Perlのワンライナーの書き方として正しいでしょうか?

grep "XXXX" *.log | perl -ne 'if ($_ =~ /(\d\d\d\d\-\d\d\-\d\d \d\d:\d\d:\d\d)/) { print $1,"\n";}'
716デフォルトの名無しさん:2010/01/15(金) 02:39:55
>>715
ワンライナーの書き方に正しいも何もないと思うけど、期待通りに動いてるならそれでいいだろ。
ただそれだと日時が行の先頭以外にあっても抜き出しちゃうけど。
grep無しで書くとこんな感じか。

perl -lne 'print $& if /XXXX/ && /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d/' *.log
717デフォルトの名無しさん:2010/01/15(金) 11:20:54
ある入力が数値か確認する処理を書いたんだが、use warningsしてるせいでワーニングが出てしまうんだけど、no warnings するしかないかな。というかこれでええのか?

sub isNumeric {
$a * 1 == $a;
}
718デフォルトの名無しさん:2010/01/15(金) 11:28:59
>>717
$aやめれとか引数の受け取り方がなってないというのは置いといて、
数値に見えない文字列は0扱いだから0 * 1 == 0になって、判定式
が成り立っちゃうぞ。もう少しよく考えよう。
719デフォルトの名無しさん:2010/01/15(金) 12:52:46
looks_like_number関数を参考にするとか
720デフォルトの名無しさん:2010/01/15(金) 23:28:33
--
aaa
$str
bbb
--
というファイルtestを作って

$str = 'xxx';
open(READR,"<test");
while(<READR>) { $buf .= $_; } close(READ);
print $buf;

を実行するとそのまま出力されるのですが、
aaa
xxx <--- ここ
bbb
と表示するようにする方法はないでしょうか?
今はテキスト置換で無理矢理やってるんですけど、いい方法があれば教えてください。
721デフォルトの名無しさん:2010/01/15(金) 23:58:10
print eval '"' . $buf '"';
722デフォルトの名無しさん:2010/01/16(土) 00:00:11
eval
楽だけどお勧めはしない
723デフォルトの名無しさん:2010/01/16(土) 00:06:41
d
evalっぽいなと思ってたんですけど、使い方がよくわからなくてうまくいきませんでした。

>>721
えっと、最後の print $buf; 行をそれに変えてみましたがエラーになってしまうんですけど、
フォローいただけると助かります。

>>722
そうですか。普通の置換でやるのがベストでしょうか?
724デフォルトの名無しさん:2010/01/16(土) 00:12:21
.が抜けてた
print eval '"' . $buf . '"';
725デフォルトの名無しさん:2010/01/16(土) 00:16:03
できますた!
自己解決できなくてすみまそんw

eval で '"' なんてするとは全然思いつきませんでした。
もう少し勉強してみます
726デフォルトの名無しさん:2010/01/16(土) 00:17:02
s/\$([A-Za-z_]\w*)/$str{$1}/g
727デフォルトの名無しさん:2010/01/16(土) 00:22:11
>>726
d!
ちょっといじって
s/\$([A-Za-z_]\w*)/$$1/g
でいきましたー

いろんな方法があるもんですね・・・参考になりますた!
728デフォルトの名無しさん:2010/01/16(土) 00:23:35
>>724だと$bufに " が入ってると死ぬ
729デフォルトの名無しさん:2010/01/16(土) 00:25:57
そんな罠が・・w むずかしいですね・・
730717:2010/01/16(土) 03:36:10
>>718
すんません、もしもしから書いててshift入れるの忘れてました。

結局そのブロック内だけno warningsしてとりあえずは動きました。
移行スクリプトなので、現行のデータで動けばいいやと妥協しましたorz
731デフォルトの名無しさん:2010/01/16(土) 06:31:13
質問
IO::Pipeで立ち上がったプロセスにシグナルを送りたいんですけど
立ち上がったプロセスのIDってどうやれば取得できますか?

----
my $pipe = IO::Pipe->new;
$pipe->reader(qw{./hoge arg1 arg2 arg3});
# 処理
my $pipe_pid = q{hogeのプロセスIDが欲しい};
kill 10, $pipe_pid;
----

pkillやpgrepだと他のhogeプロセスまで拾っちゃうし。。。
どうすればいいのか分かりません ><
732731:2010/01/16(土) 06:55:28
すんません、>>731について自己レスです。

perldoc -m IO::Pipe
でソース見たら
${*$pipe}{'io_pipe_pid'}
でとれました。
733デフォルトの名無しさん:2010/01/16(土) 10:04:15
>720
その用途には大仰かもしれないが Text::Template 辺りを使うって方法もあるよ。
734デフォルトの名無しさん:2010/01/16(土) 17:00:34
http://niwatori.cage.to/xoops/modules/cgi1/

2010年にこんなコンテンツを公開するなんて驚き。
即刻公開停止を求めるべきじゃね?
735デフォルトの名無しさん:2010/01/16(土) 17:03:10
>>734

&jcode'convert(*company, 'euc');

すでにこれ読めない人とかいるんじゃないだろうかw
736デフォルトの名無しさん:2010/01/16(土) 17:16:42
Perl6が出そうな今こそ初心に戻ってPerl4をって事ですね
737デフォルトの名無しさん:2010/01/16(土) 17:24:12
>>734
for $c(split(//,$mail)){
  if($c =~ /[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\-\_\@\.]/){
  } else {
  $mail_error = "-";
  &error;
  }
}

oh...
738デフォルトの名無しさん:2010/01/16(土) 17:34:02
旧石器時代のコードかよ
739デフォルトの名無しさん:2010/01/16(土) 18:21:22
プログレ好きらしいので、21st Century Schizoid Codeの称号を与えたい
740デフォルトの名無しさん:2010/01/16(土) 20:23:28
open FH,"id.txt";
while(<FH>)
{
chomp($user=<FH>);
last;
}
open PH,"pass.txt";
{
chomp($pass=<PH>);
last;
}

$passには値が読み込まれるんですが
なぜか$userには値が読み込まれません
誰か教えてください。
741デフォルトの名無しさん:2010/01/16(土) 20:35:31
まさかとは思いますが、id.txtとは、1行しかないのではないでしょうか。
もしそうだとすれば、<FH>を2回読んでるので$userが空であることにほぼ間違いないと思います。

1行しかないならchomp($user=<FH>)
複数行ならwhile(<FH>){chomp($user=$_);}
742デフォルトの名無しさん:2010/01/16(土) 21:07:03
アポストロフィはラクダ本で初めて知った
昔の書き方だって書いてあったと思う
743デフォルトの名無しさん:2010/01/16(土) 21:31:06
use Acme::Don't
744デフォルトの名無しさん:2010/01/16(土) 23:02:46
林先生はperlも出来るのか・・・
745デフォルトの名無しさん:2010/01/16(土) 23:49:58
アポストロフィ何
746デフォルトの名無しさん:2010/01/16(土) 23:59:59
ftpでレスポンスコードの530や230を取得したいんですが
while(chomp($buf=<SOCKET>))
とやるんですが、最初のログイン時のレスポンスコードが入り込んでしまい
うまく取得できません。

そこで、<SOCKET>の中身は
230----
331--password
530
となっています。

最初のwhileの繰り返しで230が入ってしまうんですが、これを230と331を読み込まず
530だけを取得するにはどうすればいいんでしょう。詳しい方教えてください。

seek(SOCKET,x,x)やsysseek(SOCKET,x,x)などで飛ばせるかと思ったんですがうまくいかず。
747デフォルトの名無しさん:2010/01/17(日) 00:06:10
読んだあとに、行頭に 530 があるかパタンマッチすれば
いいんじゃないの?
748デフォルトの名無しさん:2010/01/17(日) 08:31:50
>>747
読み込むとパターンマッチ処理で実行速度が遅くなるので
なるべく飛ばして処理をしたいのですが、何か方法はないですか?
749デフォルトの名無しさん:2010/01/17(日) 08:45:47
streamはseek出来ないから捨てることは出来ても飛ばすことは出来ないんじゃない?
750デフォルトの名無しさん:2010/01/17(日) 08:56:46
>>748
たとえば2行捨てたいなら

$null = <SOCKET>;
$null = <SOCKET>;

でできるけど?
751デフォルトの名無しさん:2010/01/17(日) 09:46:18
どんだけ処理速度気にするんだよ
そもそもstatus code以下の文字列は任意長だからseekしてもね
752デフォルトの名無しさん:2010/01/17(日) 10:01:33
next if / /
で目的以外を読み飛ばす処理しか思いつかん
753デフォルトの名無しさん:2010/01/17(日) 10:14:24
今、next ifで飛ばしてました
while(<SOCKET>)
{
next if 1..2;
print "\n$_";
if($_=~/^230/)
{
$flg=1;
$okusr=$user;
$okpass=$pass;
last;
}
last;
}
気づかなかった。
どうもありがとうございました。
754デフォルトの名無しさん:2010/01/17(日) 12:36:22
こんなんでパターンマッチ処理で実行速度が遅くなるとか
Perlさんなめすぎ
755デフォルトの名無しさん:2010/01/17(日) 13:00:53
@buf = <SOCKET>;
$buf = $buf[2];
756デフォルトの名無しさん:2010/01/17(日) 18:05:44
それだとメモリ使用量が増えすぎるので・・・
757デフォルトの名無しさん:2010/01/17(日) 18:13:04
(undef,undef,$buf) = <SOCKET>;
758デフォルトの名無しさん:2010/01/17(日) 18:19:21
Net::FTP ではだめなのかしら?
759デフォルトの名無しさん:2010/01/17(日) 21:22:59
Net::FTPって1セッションしか張れないのかな?
Parallel::ForkManagerと併用するとエラーでたから、
ソースちら見したらそんな気がした。
760デフォルトの名無しさん:2010/01/17(日) 22:11:06
メモリを節約する時代じゃないだろもう
761デフォルトの名無しさん:2010/01/19(火) 20:44:42
オブジェクト指向ってよくわからない
base使ってたりMoose使ってたりグロブでメソッド生やしてたり、
モジュールによって実装方法がてんでばらばら

おまいらどうやって拡張したり継承したりしてますか
読むと幸せになれる本とかありますか
762デフォルトの名無しさん:2010/01/19(火) 21:40:28
763デフォルトの名無しさん:2010/01/19(火) 22:06:40
HTTPで複数のURL(200個くらいある)を取得するスクリプトで
LWPを使うとひとつのURLを完全に取得し終えるまで次の処理にいけないので
threadsを使ってみたんだがthreads自体が重すぎて萎えた。

複数のURLを素早く軽快に取得するにはsocket使ってガリガリ書いてくしかないのかね・・
764デフォルトの名無しさん:2010/01/19(火) 22:12:27
>>763
LWP::Parallel::UserAgent
765デフォルトの名無しさん:2010/01/19(火) 22:29:02
>>764
おっとこんなに早くレスもらえるとは!
そんなのあったのねありがとー
766デフォルトの名無しさん:2010/01/19(火) 23:34:48
>>764
そんなんあったんだ
いつから?
767デフォルトの名無しさん:2010/01/19(火) 23:57:24
俺もいつからあったのかは知らないので ChangeLog 見たら12年前だった。

> Fri Mar 27 1998 Marc Langheinrich
> o First official CPAN release, version 2.31

いちおう貼っとくね。
http://search.cpan.org/~marclang/ParallelUserAgent-2.57/
768デフォルトの名無しさん:2010/01/20(水) 13:44:00
>>763
おそらく200くらいだと最速は、
AnyEvent::HTTP + Coro::AnyEvent + Coro + Coro::sephorma。

threadsは糞。
769デフォルトの名無しさん:2010/01/20(水) 13:44:51
なんだsephormaって。Semaphoreの間違いな。
770デフォルトの名無しさん:2010/01/20(水) 13:46:32
全モジュール名でググったらこんなんでた。
http://d.hatena.ne.jp/unau/20100114/1263432308
771デフォルトの名無しさん:2010/01/21(木) 10:34:37
my $str = "123aaa456aaa789ccc012ggg";
my @ary = ($str =~ /\d+/);
print @ary[0], "\n";
とやると、1と表示されるんですが、どうして123じゃないのでしょうか?
Greedyじゃなかったんでしょうか?
772デフォルトの名無しさん:2010/01/21(木) 10:42:03
パターン内に()が無いから
773デフォルトの名無しさん:2010/01/21(木) 10:50:14
こうしたいんじゃないかなと予想

my @ary = $str =~ /\d+/g;
774デフォルトの名無しさん:2010/01/21(木) 10:57:17
>>772
括弧があるのとないのとで動きが違ってくる理由がわかりません。。。
が、本当に違いますね。
775デフォルトの名無しさん:2010/01/21(木) 11:07:15
$str =~ m/\d+/が返すのはtrue/falseだから、1はパターンマッチの結果のtrue
776デフォルトの名無しさん:2010/01/21(木) 11:13:24
$strの先頭が"1"だったばかりに……

777デフォルトの名無しさん:2010/01/21(木) 11:24:28
>>775
それはスカラーコンテキストの場合で、リストコンテキストのときは違うよ。

成功したときは、括弧を含むパターンなら、キャプチャーした文字列の
リスト、括弧がなければ(1)
失敗したときは空リスト

なので、今回の場合は括弧がないから(1)になった。
778デフォルトの名無しさん:2010/01/21(木) 11:39:28
こうしてPerler予備軍がまたひとり去っていくのであった・・
779デフォルトの名無しさん:2010/01/21(木) 11:56:11
perl mongerじゃなくてperlerなのか
780デフォルトの名無しさん:2010/01/21(木) 12:07:30
Perl者
781デフォルトの名無しさん:2010/01/21(木) 12:16:17
#リストコンテキストの場合
/\d+/ : (1) #真。失敗時は ()
/(\d+)/ : ('123') #最初にマッチした部分の$1〜$9
/\d+/g : ('123', '456', '789', '012') #全ての$&
/(\d+)/g : ('123', '456', '789', '012') #全ての$1〜$9

#スカラーコンテキストの場合、マッチ成功時は 1 、失敗時は ''
scalar /\d+/  scalar /(\d+)/  scalar /\d+/g  scalar /(\d+)/g

あと、誰か@ary[0]にも突っ込んでやれよ
782デフォルトの名無しさん:2010/01/21(木) 12:39:50
むしろ@ary[0]でもきちんと動くことに驚いた
Perlのバージョンによるのかな
783デフォルトの名無しさん:2010/01/21(木) 13:05:01
@ary[0]は配列スライスになるから問題ない。
784デフォルトの名無しさん:2010/01/21(木) 13:23:53
なるほど右辺値にある場合はどっちも同じように動くのか
785デフォルトの名無しさん:2010/01/21(木) 15:01:09
@ary[0]じゃなくて、$ary[0]と書かないといけないのはわかりました。
コンテキストとかよくわからないし、、、
Perlってなにか奥が深いですね
786デフォルトの名無しさん:2010/01/21(木) 16:59:25
こうしてPerler予備軍がまたひとりPythonスレへと巣立っていくのであった・・
787デフォルトの名無しさん:2010/01/21(木) 18:41:54
>>785
初心者はあまり気にしなくてもいいところ。
788デフォルトの名無しさん:2010/01/21(木) 19:52:15
>>785
> Perlってなにか奥が深いですね

「奥が深い症候群」でググっておいたほうがいい。
789デフォルトの名無しさん:2010/01/21(木) 19:56:25
厨臭い造語をググってもたいして実りは無い。
790デフォルトの名無しさん:2010/01/21(木) 22:57:43
>>764
5.10にこれインストールしようとすると
http://www.perlmonks.org/?node_id=758739
これと同じエラーが出たので断念。
libwww-perlのバージョンが新しすぎるとダメらしい・・
UserAgent.pmの一部をコメントアウトしたらOKとかいう情報も
あったけどうちの環境ではだめだった。
>>768
この方法も試してみるありがとー
791デフォルトの名無しさん:2010/01/22(金) 02:17:48
そのスレッドに色々な代替が載ってるな
WWW::Curl::Multi
Parallel::Forkmanager
Mojo::Client + Mojo::Trunsaction
IO::Lambda

多すぎ
792デフォルトの名無しさん:2010/01/22(金) 13:03:11
>>788
俺も見るからに厨臭いと感じたがググってみたら
発信してるのがその著書にお世話になったこともある有名人で驚いたw
793デフォルトの名無しさん:2010/01/22(金) 14:14:37
open(FH, "file.txt");
と書いたときFHというのは何になるのですか?
変数でも配列でもハッシュでもないし。
794デフォルトの名無しさん:2010/01/22(金) 14:29:49
ファイルハンドルになる
795デフォルトの名無しさん:2010/01/22(金) 17:18:50
ファイルハンドルというのは、$がついててもいいし、ついてなくてもいいんですね。
796デフォルトの名無しさん:2010/01/22(金) 17:43:29
は?何を言っているのか分からない
797デフォルトの名無しさん:2010/01/22(金) 17:50:36
>>795
俺も詳しく理解してはいないんだけれど
どっかでファイルハンドルopenと変数openは違うという説明を見たような

今から新しいコードを書くなら、変数を使った方がいいそうだ
詳しくは、下記記事の「ファイルハンドルにはレキシカル変数を使うこと」の項にある
ttp://d.hatena.ne.jp/perlcodesample/20091120/1246679588
798デフォルトの名無しさん:2010/01/22(金) 18:59:55
799デフォルトの名無しさん:2010/01/22(金) 19:22:45
インターナルサーバーエラーで、苦しんでいる。
apach2+activeperlの最新。
環境はwinxp home
コマンドプロンプトではperl helloworld.plで正しく出力できるが、cgiとして動かすとインターナルサーバーエラー。
パスにはスペースを含めていないし、
うーん。
ヒントをお願いします。
800デフォルトの名無しさん:2010/01/22(金) 19:25:34
どうせhttpheaderを出力してないんだろ
801デフォルトの名無しさん:2010/01/22(金) 19:39:56
>>799
エラーログ
802デフォルトの名無しさん:2010/01/22(金) 19:45:05
>>799-801
>インターナルサーバーエラーで、苦しんでいる。
Webプログラミングの話はWebプログラミング板へ
803デフォルトの名無しさん:2010/01/22(金) 19:53:39
>>797
生ファイルハンドルつか型グロブなんか
もう使う気にはならんよ。
804デフォルトの名無しさん:2010/01/22(金) 21:07:49
人のソース見てたらなんか sub hoge : fuga (){} みたいな記述を見つけました。
なんぞこの fuga
805デフォルトの名無しさん:2010/01/22(金) 21:11:56
806デフォルトの名無しさん:2010/01/23(土) 00:01:57
Class::Stdというモジュールをつかっているんですが、DESTROYにあたる、DEMOLISHが発動しません。いろいろなサイトを参考にしながらコード生成したんですが、理由が不明です・・・何が原因なんでしょうか・・・

http://search.cpan.org/~dconway/Class-Std-0.011/lib/Class/Std.pm
http://d.hatena.ne.jp/nyaago69/20090929/1254192165
http://d.hatena.ne.jp/cooldaemon/20060317/1142562536

=======CODE==========
package test;
use strict;
use warnings;
use Class::Std;
{
my %test :ATTR( :get<test>);
my %hoge :ATTR( :get<hoge>);

sub BUILD {
my ($self, $ident, $arg_ref) = @_;
$test{$ident} = 'test string';
$hoge{$ident} = 'fuga fuga';
}

sub DEMOLISH {
my ($self, $ident) = @_;
print $self->get_test."\n";
print $self->get_hoge."\n";
}
}
1;
=======CODE==========

何か原因になりそうな箇所等でもいいので、助言を頂ければなと思います・・・><
807デフォルトの名無しさん:2010/01/23(土) 12:43:22
関数から配列を返したいときは、グローバルで返さないと駄目ですか?
例えば、
sub function() {
my @array;
return \@array;
}
とかやったら駄目ですか?
808デフォルトの名無しさん:2010/01/23(土) 12:54:13
そゆときは呼び出し元で配列作って参照渡しする
809デフォルトの名無しさん:2010/01/23(土) 13:35:04
なるほど。ありがとうございました。
810デフォルトの名無しさん:2010/01/23(土) 14:14:54
>>807
やってもいいよ。というか、複数の配列を返すなら基本的にそうするしかない
一つの配列を返すだけなら return @array; でもいい

808の言うように参照渡しするという手もあるけど、俺にはメリットがよくわからない
811デフォルトの名無しさん:2010/01/23(土) 15:11:58
>>806
コード部分をtest.pmというファイルに書き込んで試してみたけど
DEMOLISHは普通に呼ばれてるようだが?

% perl -e 'use test; $x=test->new'
test string
fuga fuga

これで不満ならもう少し説明してもらわないとなんとも。

あとついでだが全て小文字のモジュール名はプラグマ用なので
避けた方がいいよ。
812デフォルトの名無しさん:2010/01/23(土) 22:58:17
>>810
コピーが起きないから早くなる
813デフォルトの名無しさん:2010/01/24(日) 00:41:18
本当にコピーが起きるのか
814デフォルトの名無しさん:2010/01/24(日) 01:35:41
>>807
大丈夫だよ。リファレンスカウントってのがあってスコープ抜けても値は保持される。
リファレンス返すのも良いし呼び出し時にfunction([1,2])みたいにリファレンスを渡す
方法も結構使われてると思う。
815デフォルトの名無しさん:2010/01/24(日) 02:56:35
デバッガ(perl -d)の使いかたがよくわかりません。
/usr/lib/perl5/vendor_perl/5.10/Net/HTTP/Methods.pm 内の
sub http_configure にブレークポイントを設定する場合はどうやったらいいの?
816デフォルトの名無しさん:2010/01/24(日) 03:33:25
>>812
しかし副作用って嫌いなんだよな
他人の書いたソースに

sub hoge{
my($str, $opt) = @_;
$opt->{fuga} ||= 'hogefuga';
~~~
}

のような処理があって$opt->{fuga}が自動生成されたためにバグが起きたことがあったんだが、
それ以来副作用の起こる関数はトラウマだ
それ考えたらちょっと遅くなるほうが断然マシだ
817デフォルトの名無しさん:2010/01/24(日) 03:44:15
use strict 'refs';
818デフォルトの名無しさん:2010/01/24(日) 11:13:56
819デフォルトの名無しさん:2010/01/24(日) 12:17:35
perl, v5.10.0 built for i386-linux-thread-multi
を使っています。
ターミナルの文字コードもプログラムも utf-8 を使用しています。

以下のプログラムでは、文字のエンコードとデコードがうまくいくときといかないときがあるのですが、どうしてしょうか。
また、その解決のためにはどうすればいいでしょうか。

#!/usr/bin/perl
use utf8;
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;

my $original_string = $ARGV[0];
my $internal_string = decode('Guess', $original_string);
my $utf8_string = encode('utf8', $internal_string);
print $utf8_string . "\n";
exit;
~

で、
$ ./encodeco_test.pl あ
だと、

を返して成功するのですが、
$ ./encodeco_test.pl に
だと、
shiftjis or utf8 at /usr/lib/perl5/5.10.0/i386-linux-thread-multi/Encode.pm line 162
と返って、うまくいきません。
どうすればうまくいく「に」と返ってくるでしょうか。
820デフォルトの名無しさん:2010/01/24(日) 12:33:13
Guessを使わない
821デフォルトの名無しさん:2010/01/24(日) 14:11:23
>>819
エンコーディングの自動判別ってのはそういうもんだよ
必ず正確に判別できるわけじゃないから、できれば使わないほうがいいし
使うのなら失敗した時にどうするか考える必要がある
822デフォルトの名無しさん:2010/01/24(日) 15:07:35
Guessを使うやつは何考えてんだろ
823デフォルトの名無しさん:2010/01/24(日) 17:27:34
>>822
ちゃんと判別てきると考えてる
824デフォルトの名無しさん:2010/01/24(日) 17:36:23
候補が複数あるときは、両方でデコードしてみて
結果のバイト数が少ないほうを採用すると大抵はうまくいく。大抵は。

>>822
ウェブ拍手のような、送信元の文字コードが不定になる
レンタルサービスを作るなら欲しくなるときもあるんじゃない。
FORMのaccept-charset(は通じないブラウザがある)か、インラインフレームで対処可能だけど。
・・・板違いか。
825デフォルトの名無しさん:2010/01/24(日) 18:12:18
guessをdetectorのような使い方するのが問題なんだよね。
その文字コードの定義範囲に収まっているものだけに絞るといった点
では完璧な動作するのに(jis系は除く)。
826デフォルトの名無しさん:2010/01/25(月) 00:57:50
JIS,EUC,半角カナなしのSJISぐらいを考えれば良かった昔はだいたい
判別できたんだけど、utf8が入ってきた時点で区別のつかないパターンが
増えてどうにもならなくなったよな。
827デフォルトの名無しさん:2010/01/25(月) 03:25:57
820-826のみなさん、回答ありがとうございます。
エンコーディングの自動判別とはそういうものなのですね。
できれば使わない方がよく、使う場合は、失敗時の対応を用意すると。
また、utf8が入った段階で区別がつきにくくなった、という歴史的な経緯もあるとのこと。
勉強になりました。

>>824
いろいろなヒントをありがとうございます。
試してみます。
828デフォルトの名無しさん:2010/01/25(月) 05:29:39
jcode.plだと、一番マッチしたバイト数の多い文字コードを返すようにしてたな。
829デフォルトの名無しさん:2010/01/26(火) 00:58:49
utf8がないからjcode.plは精度が良かった
830デフォルトの名無しさん:2010/01/26(火) 08:25:47
今はすべてutf8に統一すればいいだけなんで楽になったな
831デフォルトの名無しさん:2010/01/26(火) 09:28:25
統一できるならな・・・
そうもいかない場合も時としてあって、そのときどうしようねって感じ
832デフォルトの名無しさん:2010/01/26(火) 11:21:19
utf8はロジックで比較的簡単に判別出来るでしょ。
sjis、euc、jisの他に8859-1を加えた中から判別とかになるとguessじゃ絶望的だけど。
833デフォルトの名無しさん:2010/01/26(火) 22:17:15
Win32::OLE で質問です。
Excel1 の特定セルの値を配列に保持し、Excel2 の特定セルに書き、
Excel3で別名保存と処理がしたいのですが、別名保存ができません。

my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
  || Win32::OLE->new('Excel.Application', 'Quit');

  # 読込むエクセルオープン
  my $ReadBook = $Excel->Workbooks->Open("C:\\Excel1.xls");
  my $ReadSheet = $ReadBook ->Worksheets('Sheer1');
  # セルの内容を配列にする処理。読込んだらClose
  $ReadBook->Close();

  # 書込むエクセルオープン
  my $WriteBook = $Excel->Workbooks->Open("C:\\Excel2.xls");
  my $WriteSheet = $WriteBook->Worksheets('Sheer1');
  # 配列の内容をセルに書込む処理。書込んだら保存

  $WriteBook->SaveAs("C:\\Excel3.xls") or die "保存失敗";
  $WriteBook->Close();

  $Excel->quit() ;

申し訳無いのですが、どなたかお心当たりありましたらご教授お願いします。
834デフォルトの名無しさん:2010/01/27(水) 11:02:54
>>833
そのコードで試してみたけどエラーが出なかった。
dieのところで Win32::OLE->LastError() を調べてみてはいかが。
835デフォルトの名無しさん:2010/01/27(水) 23:08:55
>>834
ありがとうございます。LastError()やってみました。

エラーコード:0x8002000E
無効なパラメーター数です。と出ました。

引数の数が合ってないのかな。
ネットのサンプルやActivePerlのサンプル見ても引数1つだし、分からんです・・・。
リファレンス何処かにありませんか?
836デフォルトの名無しさん:2010/01/27(水) 23:17:12
VBAを使うのだあ
837デフォルトの名無しさん:2010/01/28(木) 01:02:16
かなり大きな行列計算をしたいのですがperl.exe.stackdumpと出て強制終了してしまいます
これはメモリが足りないということでしょうか
838デフォルトの名無しさん:2010/01/28(木) 11:59:37
バグじゃない?
839835:2010/01/28(木) 23:18:21
>>836
使いたいですよ・・・。でもなんでか知らないんですがPerlの案件なんです。
自己解決というか、なんでか分からないけど回避できました。
  $WriteBook->SaveAs("C:\\Excel3.xls") or die "保存失敗";
ではなく、
  $WriteSheet->SaveAs("C:\\Excel3.xls") or die "保存失敗";
にしたら保存できました。何でだよ・・・。意味が分からん・・・。
840デフォルトの名無しさん:2010/01/29(金) 08:08:17
>>837
超長い文字列に正規表現適用したら起こるって記事見たことあるな
841デフォルトの名無しさん:2010/01/30(土) 03:53:35
JSON.pm でスクリプトタグなんかをサニタイズしたいんですが、メソッドが見つかりません
普通はどういう方法でやるものなのでしょうか
シリアライズした後に置換すれば問題ないでしょうか
842デフォルトの名無しさん:2010/01/30(土) 04:09:45
HTML::Entities使えば?
843デフォルトの名無しさん:2010/01/30(土) 05:51:55
>>842
申し訳ないですがその解決策は HTML::Parser に依存しているようなので却下で。。。
できればあまりCで書かれたライブラリに依存せずに実装したいです
844デフォルトの名無しさん:2010/01/30(土) 13:27:34
「普通はどういう方法でやるものなのでしょうか」って聞いておきながら
HTML::Parser使ってるのは駄目って後出し条件言うなよw
そもそもJSON.pmとタグのサニタイズの関係性がわからないんだけど
なんでJSON.pmにそんなメソッドがついてると思ったの?
845デフォルトの名無しさん:2010/01/30(土) 13:43:57
>>843
なら置き換え演算子で置き換えろよカス
846デフォルトの名無しさん:2010/02/01(月) 09:10:29
>>844
その通りですね、すみませんでした
そういったことをしたい場合はHTML::Entityを使うというのが普通なのですね
ありがとうございます

サニタイズについては、JSONで通信をする場合に不適切なコンテントタイプによって
スクリプトタグを通されてしまう可能性があるという記事を見つけまして、
サーバー側でサニタイズしてしまえばブラウザ間の差異も考えずに済むし楽なのではないかと思いました
そしてそういう欲求は多くの人が持っているのではないかと考えました
JSON.pm を見ても / やら ascii 文字以外やらをエスケープするメソッドはあったので、
簡単な手法で < や > などもエスケープすることができるのではないかと思いました


>>845
ラッパーモジュールを作ってセッターで置換することにしました
お手数お掛けしました
847デフォルトの名無しさん:2010/02/01(月) 14:41:43
そんなの上のレイヤーの話でJSON関係ないだろ。
なんでも一カ所にぶち込むなや
848デフォルトの名無しさん:2010/02/01(月) 20:06:31
print "\u\Labc\n";
print "\L\uabc\n";
どっちも「Abc」となるのだけど、なぜだろう?
849デフォルトの名無しさん:2010/02/01(月) 20:11:58
\Lは単独では意味ないぞ
どっちも\Lが無視されるから同じ文字列になる
850デフォルトの名無しさん:2010/02/01(月) 21:33:23
print "\u\LABC\n";
print "\L\uABC\n";
えっと、これでも両方「Abc」になるんだけど、なぜだろう?
bとcが小文字に変換されているので\Lは動いていると思うのだけど
どうも理解が出来ず。
851デフォルトの名無しさん:2010/02/01(月) 22:10:52
\E を覚えずに \L 使ってると理解しにくいと思う。
852デフォルトの名無しさん:2010/02/01(月) 22:32:16
ていうか \u\Labc\n なら大文字にされるべきは \L だろう、という理屈か。
853デフォルトの名無しさん:2010/02/02(火) 00:39:27
全く理解できず(´・ω・`)
print "\u\LABC\E\n";
print "\L\uABC\E\n";
\Eを入れても動作変わらない。
前者は\Lでabcになってその後\uでAbcになると思っていて
後者は\uでABC(何も変わらない)になってその後\Lでabcになると思ってるんだが
そうならない。
854デフォルトの名無しさん:2010/02/02(火) 01:42:58
順番じゃなくて強度の問題だから。
範囲指定と1文字指定がかぶってるところは1文字指定の効果が優先される。
855デフォルトの名無しさん:2010/02/02(火) 02:34:11
perlの本スレは(あるのかどうか分らんけど)どこでしょう?
856デフォルトの名無しさん:2010/02/02(火) 03:34:05
無い、あるいはここ
perl6のスレはWEBプログラミング板にある
857デフォルトの名無しさん:2010/02/02(火) 09:34:23
>>854
実験するとそんな感じなんだけどマニュアルのどこかで説明されてる?
perlopのQuote and Quote-like Operatorsのあたりかなと思ったけど
その辺は明記されてないし。
858デフォルトの名無しさん:2010/02/02(火) 12:31:06
ありがd。
優先順位みたいなのがあるのね、なんとなく理屈は分かった。
ラクダ読んだ感じだとそういう記載は見当たらなかったけど
perlのソースでも読めば書いてあるんかな。
859デフォルトの名無しさん:2010/02/02(火) 12:36:34
そりゃソースに書いた通りに動いてるんだから当たり前だろ
860デフォルトの名無しさん:2010/02/02(火) 12:37:01
スレチだったらごめん。

MT4 のプラグイン周りの本で、「プラグイン開発入門(関根元和著)」より詳しい本ってありますか。

この本はほとんど理解できたんだけど(実践した)、もうちょっと細かいところを知りたいんですが。

MT 自体がもう落ち目なのかもしれないけど。。
861デフォルトの名無しさん:2010/02/02(火) 13:50:23
>>855
ないこともない。

Perlについて
http://pc12.2ch.net/test/read.cgi/tech/1217851121/
862854:2010/02/03(水) 14:33:33
>>857
ラクダかリャマで読んだ記憶が・・と今見返してみたらリャマに載ってた。
初めてのPerl第3版P148〜149とその脚注参照。
マニュアルは全部目通してないからわからない。。
863デフォルトの名無しさん:2010/02/04(木) 00:52:06
優勝賞金500万円

http://www.jaist.ac.jp/ICGA-events-2010/olympiad/

1989年にロンドンで第1回目のコンピュータオリンピアードが開催されました。
毎年開催される本イベントでは,コンピュータゲームプレイヤー同士が競技し,世界最高位を決定します。
これまでの優勝者には,Neurogammon(バックギャモン, 1989年), Chinook (チェッカー, 1989年および1990年) そして Tacos(将棋, 2005年, 2006年, 2008年, 2009年)などがあります。
コンピュータオリンピアードは国際コンピュータゲーム協会(ICGA)が主催して実施されています。

競技部門には,アマゾン,バックギャモン,ブリッジ,コンピュータプール,六目並べ,象棋,ドッツアンドボックス,国際ドローツ,囲碁,9路盤囲碁,ヘックス,ハバナ,ラインズオブアクション,
将棋,スラカルタなどがあります。

この他のゲームもコンピュータによる競技会を開催する可能性があります。主催者までコンタクトしてください。
2010年に第15回目となるコンピュータオリンピアードは金沢市内で開催されます。
ICGAとJAISTとの共同イベントとして9月25日から10月2日にかけて金沢市内で開催されます。
各競技の日程は後日決定します。
参加申し込みなどの詳細も後日お知らせ致します。
864デフォルトの名無しさん:2010/02/07(日) 17:18:28
perlもutf8、SQLもutf8
これで2バイト文字使うと取り出した際に必ず文字化けする
どーすればいいんだ
かれこれ7時間悩んでる
865デフォルトの名無しさん:2010/02/07(日) 17:33:46
UTF-8の2バイト文字…?
とりあえず、mysql_enable_utf8オプションをつければPerl側からフラグ付きUTF-8を受け渡しできるはずだが
866デフォルトの名無しさん:2010/02/07(日) 17:48:33
>>865
ありがとう!!!!!!!!!!!!!
sqliteだったからフラグで検索して
$dbh -> {unicode} =1
で解決したぁぁ

ほんとありがと!


あとこれ使わない時は
$text = Encode::decode('utf8', $text);
とすればよかったのか
867デフォルトの名無しさん:2010/02/07(日) 18:18:37
pythonがいいよ
文字で何も悩まなくて済む
868デフォルトの名無しさん:2010/02/07(日) 18:30:41
>>867
ダウト
869デフォルトの名無しさん:2010/02/07(日) 20:00:56
rubyでいいじゃん。

多分。
870デフォルトの名無しさん:2010/02/07(日) 22:45:48
perlの次にマスターするのは、rubyかpythonのどっちかだな
それぞれに特徴があるけど、どっちでもだいたいおんなじ
871デフォルトの名無しさん:2010/02/07(日) 22:55:56
スクリプト言語はperlだけで充分。
perlの次はC/C++かjavaだろjk
872デフォルトの名無しさん:2010/02/07(日) 22:56:12
結局Perlに戻ってくるんだよね
873デフォルトの名無しさん:2010/02/08(月) 00:29:52
環境によって学ぶものは人それぞれだろ
一概にこれがいいって議論は不毛だし、ここでは必要ない
874デフォルトの名無しさん:2010/02/08(月) 01:53:04
またモジュールをいちいち探して使い方を調べる作業は不毛だし
いや自分で作るからって人にはどのスクリプト言語使おうが同じだし
最初に覚えたスクリプト言語を使い続けるのが普通だと思うけど
外的要因で他も使わざるを得ない人はほんとに気の毒だね。
875デフォルトの名無しさん:2010/02/08(月) 12:12:28
日本マンセーならRuby一択
876デフォルトの名無しさん:2010/02/08(月) 12:33:22
blessしたオブジェクトが途中までは使えるんですが、いつの間にかHASHに
戻ってメソッドが呼べなくなるバグに悩まされています。

ためしに
sub DESTROY {
my ($obj) = @_;
print $obj->{"Name"}, " was destroyed.\n";
}

て感じで書いてみたら見事にオブジェクトが壊されていました。
このDESTORYがいつ、どこで、どうして呼ばれるのか
知る方法は無いでしょうか?
877デフォルトの名無しさん:2010/02/08(月) 13:08:05
DESTROYのなかでcluck使ってバックトレース出してみれば?
878デフォルトの名無しさん:2010/02/08(月) 13:14:48
Devel::Trace
・・・と書こうと思ったけど877の方がいいな
879デフォルトの名無しさん:2010/02/08(月) 13:28:15
参考書に

「ローカル変数を宣言する場合はmy関数を使用するのが望ましいが、
配列や連想配列をmy関数によってローカル化できない為にそういった場合にはlocal関数を使用する」

と書いてあるのですが、参考サイトを見てみるとそういったことは書いてありません。
本当にlocal関数でしか配列はローカル化できないのでしょうか?

my関数の方が完全にローカル化出来るので、できればmy関数を使用したいのです。
880デフォルトの名無しさん:2010/02/08(月) 14:00:06
myをローカル化なんて説明している本は捨てた方がいいんじゃね?
ちなみになんていう本よ?
881デフォルトの名無しさん:2010/02/08(月) 14:31:08
秀和システムのPoket詳解Perl/CGI辞典です。
882876:2010/02/08(月) 14:41:35
>>877をやってみました。

at c:/xampp/htdocs/test//Foo.pm line 224 ←&cluck()を書いた行
Foo::DESTROY('Foo=HASH(0x........)') called at ./baa.pl line 0
eval {...} called at ./baa.pl line 0
at c:/xampp/htdocs/test//Foo.pm line 224
Foo::DESTROY('Foo=HASH(0x........)') called at ./baa.pl line 0
eval {...} called at ./baa.pl line 0
at c:/xampp/htdocs/test//Foo.pm line 224
Foo::DESTROY('Foo=HASH(0x........)') called at ./baa.pl line 0
eval {...} called at ./baa.pl line 0


て感じで続きます(オブジェクトの配列です)。正直line 0 とか意味が分かりません。
分かる方お教え下さい。

でもその前の配列のsortに使う関数の中で、Use of uninitialized value in 〜 が
頻発しているので、この時にすでにオブジェクトが壊れているのかなとも思います。

これ以上なにかヒントありますでしょうか?
883デフォルトの名無しさん:2010/02/08(月) 15:15:45
>>882
運が良いときはeval {...} called at 〜 が解放の起きた付近を示していることも
あるんだけど、line 0じゃ手がかりないねぇ。

878が紹介してたDevel::Trace使ってみれば?
884デフォルトの名無しさん:2010/02/08(月) 16:01:46
>>879
確かなことは言えないが、もしかすると書籍の引用の前後の文脈では
配列の「要素」について説明してるんじゃないか?
myは変数に対して宣言するわけだから、つまり↓のようなことを言ってるのでは。

×my $foo{'bar'}
○local $foo{'bar'}
885デフォルトの名無しさん:2010/02/08(月) 16:13:05
もしそうだとしても、配列の要素1個だけlocalにするような
プログラムってどうよ?
886デフォルトの名無しさん:2010/02/08(月) 18:47:47
とんち染みてきたなw
887デフォルトの名無しさん:2010/02/08(月) 20:55:29
>>884
すいません「要素ローカルにできない」とちゃんと書いてありました。
自分の目が節穴だったためにお手数をお掛けして申し訳ありませんでした。
888デフォルトの名無しさん:2010/02/08(月) 21:53:53
local $SIG{ALRM} = sub {};
こういう使い方以外に思い浮かばない
889876:2010/02/10(水) 13:18:17
WEBプログラミング板に移動したのでこちらは締め切ります。
お前ら使えねえな。
890デフォルトの名無しさん:2010/02/10(水) 14:17:50
>>889
分かったら教えてよw
891デフォルトの名無しさん:2010/02/10(水) 17:51:35
>>889
お力になれず申し訳ありませんでしたm(_ _)m
892デフォルトの名無しさん:2010/02/10(水) 20:43:40
>>889
自分の程度の低さを棚に上げて最低な奴だな
死ね
893デフォルトの名無しさん:2010/02/11(木) 00:36:31
Windows の ActivePerl を使っています。
Win32::OLE->new で、iTunes を起動するスクリプトを書いて、
それはうまくいっています。
iTunesが動いていないときも、new を実行すると iTunes を起動してくれるのですが、
少しありがた迷惑なので、iTunes が起動していないときには、
何もせず終了するようにしたいのです。
どういうオプションを渡せばよいでしょうか?
894デフォルトの名無しさん:2010/02/11(木) 10:33:34
iTunesが起動していないときだけ起動する、というのではないの?
それとも勝手に起動されると迷惑だから、起動している時だけ、スクリプトを実行させたいのかな。

newの前に、
return 0 if !Win32::OLE->GetActiveObject('iTunes.Application');
とかやるのはどう?
895デフォルトの名無しさん:2010/02/11(木) 14:21:29
サーバー上で
perl からphpファイルを実行するのはどうすればいいでしょうか


$ans = `php -f post.php`;
print $ans;

print system("/usr/local/bin/php -f /virtual/user/public_html/post.php");

my $PHP = '/usr/local/bin/php';
my $PHP_FILE='/virtual/user/public_html/post.php';
open FH, "$PHP -f $PHP_FILE|";
while (my $x = <FH>) {
print "$x\n";
}
close FH;

この3つ試したんですがphpのソースが表示されてしまいます
サーバーはcoreserverです
896893:2010/02/11(木) 14:42:05
>>894
ありがとうございます。後者の方です。
サンプル試してみます。
897デフォルトの名無しさん:2010/02/11(木) 15:09:07
>>894
> Win32::OLE->GetActiveObject('iTunes.Application');
は、iTunes が起動していても、起動していなくても、
取得に失敗してしまい、判別に使えませんでした。
898デフォルトの名無しさん:2010/02/11(木) 15:31:06
http://www.opensubscriber.com/message/[email protected]/501266.html
のあたりにも同じ質問があって、解決策は見つからないみたいです。
なにか、抜け道をご存じの方いらっしゃいませんか?

new をすると、iTunes を起動して、OLEハンドラを取得できます。
GetActiveObject が、iTunes を起動していても失敗するのが問題です。
899デフォルトの名無しさん:2010/02/11(木) 16:03:19
>>895
>>1をよく読んでくれ
900デフォルトの名無しさん:2010/02/11(木) 16:58:51
>>899
すみません
Webプログラム板にいってきます
901デフォルトの名無しさん:2010/02/11(木) 17:23:26
>>898
psのwin移植版かwin標準で入っている(かもしれない)tasklist.exeを呼び出せばよいのでは?
`ps` =~ m/iTunes/i とか `tasklist` =~ m/iTunes\.exe/i あたり。
902デフォルトの名無しさん:2010/02/11(木) 17:31:54
>>901
perl だけでなんとかしたかったのですが、tasklist をつかってごまかすことにします。
ありがとうございました。
903デフォルトの名無しさん:2010/02/11(木) 18:42:17
何でもアリなのがいいな、Perl
904デフォルトの名無しさん:2010/02/12(金) 09:18:24
Matts::Message::Parserの使い方について
わかる人教えてください。
eメール形式のファイルから本文や添付ファイル等を取り出したいのですが、
利用しているレンタルサーバー(webarena)の契約では
MIME::ParserやMIME-toolsがなく、できるだけ
依存関係が少ないパッケージモジュールを検索していましたら
Matts::Message::Parser
http://search.cpan.org/~msergeant/Matts-Message-Parser-1.0/lib/Matts/Message/Parser.pm
にたどり着きました。
Message.pmと
Parser.pm(use Matts::Message;をrequire './Message.pm'に変更)
で何とか動きました。
require './Parser.pm';
open(my $fh, "foo.eml");
my $msg = Matts::Message::Parser->parse($fh);
my $msg_size=$msg->size; #メッセージサイズ
my $msg_enc=$msg->body_enc; #エンコードタイプ
my $msg_id=$msg->header('message-id'); #メッセージID
my $msg_time=$msg->header('date'); #受信時間
my $msg_subject=$msg->header('subject'); #件名
と取得できたのですが肝心の本文(body?)と
添付ファイル(attachment?)の取得ができません。
$msg_body=$msg->body()?
$msg_body=$msg->bodies?
とかしたんですけど型グロブ?がなんたらでよく
わかりませんでした。
どなたか助け舟をお願いします。
905デフォルトの名無しさん:2010/02/12(金) 17:08:20
よくわからないけど、ソースを見た感じだと
$msg_body=$msg->parse_body;
とかじゃないの?
906デフォルトの名無しさん:2010/02/12(金) 17:17:26
Matts::Message::add_body_part() を見るとパースが終わった後のファイルハンドルをそのまま突っ込んでるな。
$msg->bodies は Content-Type とファイルハンドルが組になったリストを返すし、
$msg->body はファイルハンドルを返す。
どおりでサンプルはcloseしてないわけだ。
だから、body を読みたければ例えばこうする。
my $bodyfh = $msg->body;
my $body = join '', <$bodyfh>;

こんなもんでいい?
907デフォルトの名無しさん:2010/02/12(金) 17:24:42
あと、pure-perlなモジュールをインストールせずに手元で動かしたければ
libフォルダを丸々コピーして
use strict;
use warnings;
use lib(qw{ ./lib });
use Matts::Message::Parser; # require がいいならそれでも桶
すればいいよ。
908デフォルトの名無しさん:2010/02/12(金) 20:43:08
>>906
>>907
ありがとうございます。
use Encode;
use MIME::QuotedPrint;

my $msg_size=$msg->size; #メッセージサイズ
my $msg_enc=$msg->body_enc; #エンコードタイプ
my $msg_id=$msg->header('message-id'); #メッセージID
my $msg_time=$msg->header('date'); #受信時間
my $msg_subject=$msg->header('subject'); #件名
my $msg_cenc=$msg->header('Content-Transfer-Encoding'); #Content-Transfer-Encoding

my $bodyfh = $msg->body;
my $msg_body = join '', <$bodyfh>;

$msg_body=encode(lc($msg_enc),$msg_body); #エンコード
if (lc($msg_cenc)=~ /quoted-printable/){
$msg_body=decode_qp($msg_body); #quoted-printableの場合
}

としてみたらうまく取得できました。
添付ファイルもわかったら解読していただけませんでしょうか?
私には暗号にしか見えませんので。。
909デフォルトの名無しさん:2010/02/12(金) 23:14:19
悪いが俺はそこまで付き合う気は無い。
>Don't use in your own projects, unless you are willing to figure out the API
yourself.
(てめえが API を自分で見つけ出す気がないなら、てめえのプロジェクトで使ってくれるなよ)
とあるしな。
他のお暇な方どうぞ。
910デフォルトの名無しさん:2010/02/13(土) 00:03:07
横からなんだけど figure out って「分かる/理解する」だよ
911デフォルトの名無しさん:2010/02/13(土) 00:09:14
うん、どっちかって言うと、「嫌なら使うな」ってニュアンスだね。
912デフォルトの名無しさん:2010/02/13(土) 02:36:58
centos5.4 X64環境にてcpan2rpmでDBIx::Classをインストールしようとすると
途中で固まっちゃうのだが、なんか手立てはないかな?

Tarball extraction: [/usr/src/redhat/SOURCES/DBIx-Class-0.08118.tar.gz]
が出て固まる。

ソースからコンパイルしてインストールすればいいのだろうけど。
913デフォルトの名無しさん:2010/02/13(土) 07:12:26
use strict使うとファイル単位で宣言を検査するから
グローバル変数として用意した設定値が困る
外部ファイルでrequireしてもエラーだし
useでもそうだけど$package:hoge
みたいに書かないといけないから見た目がださいよね
数が多いからファイル毎に空の宣言並べるのも馬鹿みたいだし
なんかこうC言語のincludeみたいにコンパイル前にソースに結合するとか
綺麗なやり方はないのかな?

使い方としては別ファイルに固定定数を並べといて
実行時には$hogeみたいに変数名だけでアクセス出来るようにしたくて
かつuseやrequireみたいな一文を冒頭に追加するだけでいいみたいな
914デフォルトの名無しさん:2010/02/13(土) 07:58:31
>>913
つExporter
915デフォルトの名無しさん:2010/02/13(土) 10:19:13
>>914
Exportってそういう使い方も出来るのか
でもまだ効率悪いな
qwで変数名書いて、定義して、値を代入する
の3個書かないといけないんだな
CGIだから無駄にソース膨らめばその分遅くなるんだがな
916デフォルトの名無しさん:2010/02/13(土) 16:25:42
CGIで遅いとかw そんなに遅くて困るんならmod_perlなりfastcgiに
行くべきで、そんなところで頑張るのは無駄。
917デフォルトの名無しさん:2010/02/13(土) 21:52:44
\begin{align}から\end{align}までの間の行を抜き出したいのですが,どうすればよいですか?
↓の例だと3行を抜き出したいです.
hogehoge
\begin{align}
a=b\\
c=d\\
e=f
\end{align}
hogehoge
教えてください.
918917:2010/02/13(土) 22:00:31
917です.
print ifを使わずに,中身を変数に格納したいです.
よろしくお願いします.
919デフォルトの名無しさん:2010/02/13(土) 22:02:31
printでできるんなら、printを$s .= $_に置き換えればいいだけだと思うが。
920デフォルトの名無しさん:2010/02/13(土) 22:03:08
>>918
言っている意味がわかんない。
921デフォルトの名無しさん:2010/02/13(土) 22:06:44
>919
ありがとうございます.
>920
分かりにくくてすんません.
print if /\\begin{align}/../\\end{align}/;
でprintならできるけど...という意味でした.
922デフォルトの名無しさん:2010/02/13(土) 22:14:10
919氏が答えを言ってんじゃん。
$s .= $_ if /\\begin{align}/../\\end{align}/;
とか、
if( /\\begin{align}/../\\end{align}/){
$s .= $_ ;
}
で好きな様に料理すれば良かろ?
923デフォルトの名無しさん:2010/02/13(土) 22:18:35
って良く読まずに書きこんじゃった。
924デフォルトの名無しさん:2010/02/13(土) 23:25:28
ドンマイ
925デフォルトの名無しさん:2010/02/14(日) 01:39:54
ここでいいのか分からんのだけど
perlエンジン自体をローカルアプリで利用したい場合は
別途perlをインストールしてshellで呼ぶのが一般的なんだろうけど
アプリ自体に組み込んで利用出来るライブラリとかはあるんでしょうか?
mod_perlみたいな
mod_perlはライセンスの関係で他のアプリに組み込んで配布していいのか良く分からんし
アプリを配布するのにperlを別途インストールしてねなんてやりたくないし
なんかいい方法ありますかね?
926デフォルトの名無しさん:2010/02/14(日) 01:47:18
perlembed
http://www.perl.com/doc/manual/html/pod/perlembed.html

俺はやったことないけど
927デフォルトの名無しさん:2010/02/14(日) 02:57:01
> アプリを配布するのにperlを別途インストールしてねなんてやりたくないし
こういう用途ならpp (Perl Packager) 、perlcc、perl2exeとかがあるよ。
928デフォルトの名無しさん:2010/02/14(日) 03:37:30
>>927
そうだ、盲点だった
ありがとう
929デフォルトの名無しさん:2010/02/14(日) 08:43:00
どれも不完全だったり入手困難だったり
930デフォルトの名無しさん:2010/02/15(月) 20:03:52
$hoge=print'value="$x"';
$x=100;print $hoge; #value="100"
という結果が欲しいのですが
$hoge = print("value=\"".$x.\""); や
$hoge = print qq{value="$x"};
とやってもダメでした・・・何か方法が有れば教えて頂けないでしょうか。
931デフォルトの名無しさん:2010/02/15(月) 20:31:21
my $hoge = sub { qq{value="$_[0]"} };
my $x = 100;
print $hoge->($x);

↓だとpiyoを出力した上でその成否(成功なら1)を$hogeに代入する、という意味にしかならない。
$hoge = print "piyo";
932デフォルトの名無しさん:2010/02/15(月) 21:28:50
$hoge = 'print "value=\"$x\"";';
$x = 10;
eval $hoge;
933デフォルトの名無しさん:2010/02/15(月) 21:59:41
>>931-932
おかげさまでうまく廻すことが出来ました!
成否判断やeval関数のご指摘、とても勉強になりました。
有り難うございます。また精進してきます




934デフォルトの名無しさん:2010/02/16(火) 12:58:21
use HTML::AA;
my $aart = new HTML::AA;
$aart -> code('sjis');

を宣言して、
$dot = $aart -> shorter(@a);
とするとパニック起こして動きません。
@aはpushによって動的に作成された配列です。
リストで @a = (1,2,3); のように作成した配列なら正常に通ります。
原因わかる方いらっしゃいますか?

最初のコード宣言をeucにすると通りますが、出来上がりの表示が崩れてダメでした。
配列に放り込む時に文字コードを変換してみましたがそれでもダメでした。
935デフォルトの名無しさん:2010/02/16(火) 13:07:57
俺たちはエスパーじゃないので
936デフォルトの名無しさん:2010/02/16(火) 13:19:28
俺現役エスパーなんだけどわかりません
937デフォルトの名無しさん:2010/02/16(火) 13:27:46
>>934
少なくともうちの環境ではpushだろうが正常に通るので、
パニックだし環境依存の問題じゃね-の?
938デフォルトの名無しさん:2010/02/16(火) 13:29:19
ttp://cpanratings.perl.org/dist/HTML-AA
1 out of 13 found this review helpful:
HTML-AA (0.10)

WTF?
Dan Dascalescu - 2009-01-21 01:17:46
939デフォルトの名無しさん:2010/02/16(火) 15:32:16
>>936
だって君の能力は透明化じゃないか
肝心なときだけ見られてるけど
940934:2010/02/16(火) 17:03:32
一応ソースはってみます。おかしいところはないはずですが・・・・

#!/usr/bin/perl

use HTML::AA;
my $aart = new HTML::AA;
$aart -> code('sjis');

@TeamRanking = ('順位'); @TeamScore = ('スコア ');
for(0..150){
push @TeamRanking, $_;
push @TeamScore, int(rand(1000000));
}

$dot_R = $aart -> shorter(@TeamRanking);
$dot_S = $aart -> shorter(@TeamScore);
@TeamRanking_c = ();
@TeamScore_c = ();
foreach (@TeamRanking){ push @TeamRanking_c,$aart -> adjust('', $_, 'R', $dot_R); }
foreach (@TeamScore){ push @TeamScore_c,$aart -> adjust('', $_, 'L', $dot_S); }

$txt_team = "成績\n";

for(0..$#TeamRanking){
$txt_team .= "|$TeamRanking_c[$_] $TeamScore_c[$_]\n";
}
open DATA,"> ranking.txt";
print DATA $txt_team;
close DATA;
941デフォルトの名無しさん:2010/02/16(火) 17:55:03
sub shorter_sjis {
my $self = shift;
my @array = @_;
my $fit = 0;

foreach my $buf (@array) {
my $set = $self -> calcu_sjis($buf);
next if $fit >= $set;
$fit = $set;
}

while (1) {
my $flag = 0;
foreach my $set (@array) {
my $temp = $self -> adjust_right_sjis($set,q{},$fit);
my $temp2 = $self -> calcu_sjis($temp);
next if $fit == $temp2;
$flag = 1;
$fit ++;
last;
}
last unless $flag;
}

return $fit;
}

なにこのwhileふざけてるの?
942デフォルトの名無しさん:2010/02/16(火) 18:32:32
>>940
無限ループなのかどうかはわからないけど、
CPU100%に張り付いたままいつまで待っても
終わらんね。

最初のshorterの呼び出しの

$dot_R = $aart -> shorter(@TeamRanking);

が帰ってこない。

use strict;
use HTML::AA;
my $aart = new HTML::AA;
$aart->code('sjis');
my @x = qw(foo 1 10);
$aart->shorter(@x);

ぐらいで再現するから作者にバグレポしてみれば?
943デフォルトの名無しさん:2010/02/16(火) 18:50:50
utf8が入る以前の遺物なのかなぁ。今ならsjisとeucで同じような
関数を並べて書くなんて無駄なことしないでutf8決めうちで最後
の出力の時に変換してねでいいと思う。
944デフォルトの名無しさん:2010/02/16(火) 19:03:14
2006年にプロトタイプをファーストリリース。

対して Encode.pm が標準モジュールになったのは、
2002年の perl5.8 から
945デフォルトの名無しさん:2010/02/16(火) 19:12:56
作った奴の脳が旧時代だったんだろうな
946デフォルトの名無しさん:2010/02/16(火) 23:16:26
eucなら動くんなら、配列にsjisだとメタ文字を含む日本語が使われてるんじゃ?
947デフォルトの名無しさん:2010/02/17(水) 02:49:14
>>934
文字列の"0"を数値とみなしちゃって起きるバグだと思う
HTML/AA.pm の271行目の

    270         my @array;
    271         while($str) {
    272                 $str =~ s/(.)//;



    270         my @array;
    271         while($str ne '') {
    272                 $str =~ s/(.)//;

って直したら自分のところではうまくいった


948934:2010/02/17(水) 11:40:11
>>947
こちらでもうまくいきました。エスパー様ありがとう。
その他協力いただいた方もありがとうございました。
949デフォルトの名無しさん:2010/02/17(水) 13:53:24
ちゃんと作者にフィードバックしとけよ
950デフォルトの名無しさん:2010/02/17(水) 14:32:17
934のように最低限の訊き方、礼儀をわきまえた奴がゆとり新人にいないのは
仕様ですか?
951デフォルトの名無しさん:2010/02/17(水) 14:34:50
>>950
仕様。それをできるように仕込むのがおまえの仕事。
952デフォルトの名無しさん:2010/02/17(水) 16:46:41
★自分のサイトのperlスクリプト場所
 www.samohan.jp/cgi-bin/form.cgi
★買い物カゴシステムのPOST送信先(買物カゴ中身画面のアドレスと同じ)
 https://www.jacky.jp/cgi/kago.cgi?user=samohan
とします。
htmlやphpのFORMで買い物カゴシステムへPOSTせずにform.cgiでPOSTデータをkago.cgiへ送信し、送信したらkago.cgiが表示する買物カゴ中身画面へと移動させたいです。
買物カゴシステムを乗り換えるときカンタン移行できるよう、ワンクッションかませたいとおもっているのです。
今はform.cgiでフォームを表示して「送信」ボタンを押してもらい、kago.cgiへPOSTしているのですが、押さずに済ませたいのです。
★form.cgi内のpost送信ソース
 my $url = 'https://www.jacky.jp/cgi/kago.cgi?user=samohan';
 use LWP::UserAgent;
 use HTTP::Request::Common qw(POST);
 my %formdata = ('user' => 'samohan', 'item' => $item, 'price' => $price, 'kazu' => $kazu);
 my $request = POST($url, [%formdata]);
 my $ua = LWP::UserAgent->new;
 my $res = $ua->request( $request);
 print $res->as_string;
としてみました。
しかし
★結果(www.samohan.jp/cgi-bin/form.cgiの結果表示画面)
 Found
 The document has moved here.
となります。
'here'はリンクとなっており、リンク内容は'http://www.samohan.jp/cgi-bin/kago.cgi?user=samohan'となっています、どうしていいのかわかりません、がんばりが足りないのでしょうか。
953デフォルトの名無しさん:2010/02/17(水) 16:49:56
すみません、post送信ソースの最後はprint $res->as_string;ではなくprint $res->content;にしています・・・。
954デフォルトの名無しさん:2010/02/17(水) 16:58:53
>>1を読むがんばりは欲しいな
955デフォルトの名無しさん:2010/02/17(水) 17:25:09
インターネットの質問コーナーは、どれもこれもいずれ礼儀に関する説教に
埋め尽くされる状態に至る。
956デフォルトの名無しさん:2010/02/17(水) 17:50:11
こんばんは。ハッシュの渡し方について質問です。

&follow_form ( key1 => 'hoge', key2 => 'foo', key3 => 'bar'......);
(keyとvalueの名前と要素数は可変)といった関数を作成したいのですが、
submit_form内のfieldsへのデータの渡し方が分かりません。

何卒お願い致します。
-----------------
my $mech = WWW::Mechanize->new();
sub follow_form {
  my %item_list = @_;
  #ここでなんらかの処理?
  $response = $mech->submit_form(
    fields => {
      "key1" => "hoge",
      "key2" => "foo",
      "key3" => "bar",
      ........
    },
  );
  #エラー処理

-----------------
957デフォルトの名無しさん:2010/02/17(水) 17:57:32
ハッシュリファレンスにすりゃいいだけじゃないの?
958デフォルトの名無しさん:2010/02/17(水) 20:39:57
>>957
レス有り難うございます。
fieldsは%item_listを参照してね、という表記が必要なのですね。

ハッシュリファレンスについて調べて見たのですが、
Mechanizeのドキュメントでも「fields => \%fields」と記載が合ったので
fields => \%item_list としてみましたがエラー吐いちゃいます。

うーん。。
959958:2010/02/17(水) 20:48:55
すみません
$fields => $item_list で自己解決しました!
お騒がせして申し訳ありません。有り難うございました。
960デフォルトの名無しさん:2010/02/17(水) 21:53:43
いや、>956 に書いてある事をそのまま読んだらそれはおかしくね?
961デフォルトの名無しさん:2010/02/17(水) 22:30:33
fields => \%item_list
これで、通らないほうがわからん。色々変更したのかな。
962デフォルトの名無しさん:2010/02/18(木) 00:02:24
follow_form( { key1=>'hoge', key2=>'foo', ...} );

引数をこうしたんじゃないかな。
963sage:2010/02/18(木) 11:35:00
がんばりが足りませんでした!CGI質問板にいきます・・・ズミマゼン
964デフォルトの名無しさん:2010/02/18(木) 17:31:36

...sky-blue...という文字が含まれている文字列を、

...<A>sky-blue</A>...
に置換する場合です。

$txt =~ s/$term/<A>$term</A>/g

だと-をエスケープしないとマッチしないのですが、
エスケープすると置換後...<A>sky\-blue</A>...
になってしまいます。

回避の仕方教えてください。
965デフォルトの名無しさん:2010/02/18(木) 17:35:19
言っている意味がわからない
966デフォルトの名無しさん:2010/02/18(木) 17:37:07
$termの中に、sky-blueが含まれてるんです。
967デフォルトの名無しさん:2010/02/18(木) 17:41:32
$txt =~ s{sky-blue}{<a>$1</a>}g;
968デフォルトの名無しさん:2010/02/18(木) 17:41:58
miss
$txt =~ s{(sky-blue)}{<a>$1</a>}g;
969デフォルトの名無しさん:2010/02/18(木) 17:57:54
>968

おお、超thx。
そんな方法全然知らなかったです。
970デフォルトの名無しさん:2010/02/18(木) 18:20:29
後方参照でググればいいと思う
971デフォルトの名無しさん:2010/02/18(木) 20:37:01
どしてその場合、

/ / /
が要らないの?
972デフォルトの名無しさん:2010/02/18(木) 20:42:32
>>968じゃないけど、///が要らないというか、///を{}{}に変えてる。
元のやり方だと、</a>に使われているスラッシュもエスケープしなきゃいけないし、
どこが区切りなのかがちょっとわかりづらい。だから変えたんだろう。

{}{}じゃなくても、たとえば|||なんかでもいい。
$txt =~ s|(sky-blue)|<a>$1</a>|g;
973デフォルトの名無しさん:2010/02/18(木) 22:23:59
こんなのもいけたよね?
$txt =~ s@(sky-blue)@<a>$1</a>@g;

いける文字、いけない文字ってなんだっけ。
↑は確かいけたはずだけど、@は配列で使うのになーと思いつつ・・・
できるのシェルの方だっけ?
974デフォルトの名無しさん:2010/02/18(木) 22:38:44
演算子が明示されているときはどんな文字で区切っても良かったはず
975デフォルトの名無しさん:2010/02/18(木) 22:56:37
うぉ、マジだ。\でも#でも;でもいける。
Perlしか知らんのだけど、RubyとかPythonでも普通に出来ること?
976デフォルトの名無しさん:2010/02/18(木) 23:10:54
昔は文字化けするから、パターンマッチはeucとか
決まりだったが、
最近は、unicodeのテキストファイルを扱わなくてはいけない場面が多々あって、
open(FH, "<:utf8", $filename);
とかを使い出したのですが、
パターンマッチとか、出力とかで、特に文字化けとか不具合とかないですよね?

今のところ大丈夫そうなんだけど・・・。
977デフォルトの名無しさん:2010/02/18(木) 23:38:06
区切り文字って、万能に使えるのって無いよな
大抵何かとぶち当たって、その時にいいのを選ぶ
978デフォルトの名無しさん:2010/02/19(金) 01:40:59
>>976
use utf8;のことかな>
979デフォルトの名無しさん:2010/02/19(金) 02:00:05
980デフォルトの名無しさん:2010/02/19(金) 02:58:05
一度DBを経験すると戻れなくなるよね
981デフォルトの名無しさん:2010/02/19(金) 08:01:42
そろそろ次スレを誰か頼む
982デフォルトの名無しさん:2010/02/19(金) 16:46:05
次スレ立てて来ます。
983デフォルトの名無しさん:2010/02/19(金) 16:48:34
次スレです。
Perlについての質問箱 43箱目
http://pc12.2ch.net/test/read.cgi/tech/1266565626/
984デフォルトの名無しさん:2010/02/19(金) 19:53:23
  A   B   C
  D   E   F
      ・
      ・

という複数スペース区切りのものを
while(<IN>){
chomp;
($a,$b,$c) = split(/\s+/,$_);
というふうに取り出そうとすると、先頭の$aに何も入らず
一つづつズレてしまいます。
回避方法はありますでしょうか?
985デフォルトの名無しさん:2010/02/19(金) 19:56:00
(undef, $a, $b, $c) split /\s+/;
986デフォルトの名無しさん:2010/02/19(金) 19:56:10
=が抜けた
987デフォルトの名無しさん:2010/02/19(金) 20:11:04
($a, $b, $c) = split;
($a, $b, $c) = split ' ', $_;
988984:2010/02/19(金) 20:14:37
>>985
ありがとうございます。undefというモノが使えたのですね。
できないときは、($nasi,$a,$b,$c)とかしていたのですが。

基本的に複数スペース区切りを分けるときに、行先頭に複数スペースが有った場合に
先頭に空文字が入るのは避けれないんでしょうか?

どうもスマートでは無いような気がして。

989デフォルトの名無しさん:2010/02/19(金) 20:16:33
($a, $b, $c) = /(\S+)/g;
990984:2010/02/19(金) 20:18:39
>>987
リロしてなくてすみません。

そんな方法があるのですか。
どいういう仕組みか分かりませんが、ありがとうございます。
991デフォルトの名無しさん
ttp://perldoc.jp/docs/perl/5.10.1/perlfunc.pod#item_split
こんな動作もするんだな。
勉強になった。