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

このエントリーをはてなブックマークに追加
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
● 2010/02/19 現在の最新版: 5.10.1

▼ 前スレ
Perlについての質問箱 42箱目
http://pc12.2ch.net/test/read.cgi/tech/1257139591/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-7 あたり
2デフォルトの名無しさん:2010/02/19(金) 16:47:21
[プログラミング自体の経験が無い奴はまずココを読め]
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デフォルトの名無しさん:2010/02/19(金) 16:47:26
4デフォルトの名無しさん:2010/02/19(金) 16:47:31
# [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デフォルトの名無しさん:2010/02/19(金) 16:47:34
6デフォルトの名無しさん:2010/02/19(金) 16:47:36
7デフォルトの名無しさん:2010/02/19(金) 16:47:39
8デフォルトの名無しさん:2010/02/21(日) 10:33:23
1,1,4
1,2,7
1,3,2

という(X,Y,値)というメッシュ(グリッド)データがあって
例えば座標が1ごとに値があるのを、5毎にして今までの値を平均して入れるというのを組みたいのですが
どうすればよいでしょうか?

どう処理して良いかわからず困っています。
9デフォルトの名無しさん:2010/02/21(日) 10:56:54
>>8
5ごとのメッシュを作っておいてそこにコピーする、というのは何となく思いついたんだけど、
「今までの値の平均」っていうのがよくわからんな。
10デフォルトの名無しさん:2010/02/21(日) 11:19:03
eval {
...
};
if (@_){
...
}
って感じで例外処理できるっていろんなとこに書いてるけど、これがサブルーチンの中で既に@_の中埋まってたりする場合evalの最後でundef(@_)とかしなきゃいけないの?
なんか他にいい方法ない?
118:2010/02/21(日) 11:41:27
>>9
今までの値の平均というのは5ごとのメッシュにした場合そのメッシュには
(1,2),(1,3),(1,4),(1,5)(2,1)・・・・・(5,5)のそれぞれのメッシュの値の平均を入れたいんです。
この場合このメッシュは変換後(2,5、2,5)の座標となって上記の平均が値となるようにです。
12デフォルトの名無しさん:2010/02/21(日) 11:42:26
>10
@_ じゃなくて $@ じゃないのか?
13デフォルトの名無しさん:2010/02/21(日) 13:19:22
>>12
ありがと...orz
14デフォルトの名無しさん:2010/02/21(日) 15:22:58
evalの前でlocal $@すればいいんじゃない
15デフォルトの名無しさん:2010/02/21(日) 16:14:53
>>11
2.5×{1+INT(座標)}で変換すりゃいーんじゃないか
16デフォルトの名無しさん:2010/02/21(日) 16:15:38
ごめん
座標÷5
17デフォルトの名無しさん:2010/02/21(日) 16:21:26
二次元配列に入れてforでsum取って25で割るだけだろ?
188:2010/02/21(日) 17:06:36
>>15,16
おお、座標の変換は出来そうですね。
あとはそれで値を平均していくというのができればいいのですね。

>>17
forでsumとって25で割るっていうのは値の平均ですよね?
二次元配列に入れるのは座標ですか?

19デフォルトの名無しさん:2010/02/21(日) 21:45:13
Perlに二次元配列なんてねえよ
リファンレスな
20デフォルトの名無しさん:2010/02/21(日) 22:19:11
perldoc perllol より
>If you want to get at a slice (part of a row) in a multidimensional
>array, you’re going to have to do some fancy subscripting. That’s
"multidimensional array"
確かに二次元って言葉は出て込ない(通常 Array of Array って書くから)

>リファンレス
??
21デフォルトの名無しさん:2010/02/21(日) 22:20:20
×Array of Array
◯Array of arrays
22デフォルトの名無しさん:2010/02/21(日) 22:23:08
呼び方はかってだろうけれど、どっちにしろリファンレスを使ってた次元配列を実現しているのだから、同じこと
23デフォルトの名無しさん:2010/02/21(日) 22:24:40
そうじゃなくて
24デフォルトの名無しさん:2010/02/21(日) 22:25:38
そうじゃなくて何?
25デフォルトの名無しさん:2010/02/21(日) 22:25:56
refanless
26デフォルトの名無しさん:2010/02/21(日) 22:26:10
リ「ファレ」ンスだよ。
27デフォルトの名無しさん:2010/02/21(日) 22:30:05
恥ずかしい
28デフォルトの名無しさん:2010/02/22(月) 05:55:04
低レベル化、ここに極まれり。
29デフォルトの名無しさん:2010/02/23(火) 16:40:49
前スレから、用語がどうとか本捨てろとか話の腰を折っては
自己満足してる初心者がいるな
30デフォルトの名無しさん:2010/02/24(水) 16:02:17
if ($res->is_success && (!($recstr =~ /.+/) ||
$res->content =~ /$recstr/)) {
service_set($v, $r, "up");
&ld_debug(2, "check_http: $$r{url} is up\n");
return $SERVICE_UP;
}

service_set($v, $r, "down");
&ld_debug(3, "Headers " . $res->headers->as_string);
&ld_debug(2, "check_http: $$r{url} is down\n");
return $SERVICE_DOWN;

こんなコードあるんだけど
if ($res->is_success の箇所で
Can't call method "is_success"って出てて処理が停止しちゃうんだけど
とりあえず続行させるにはどうすればいいの?
31デフォルトの名無しさん:2010/02/24(水) 16:05:22
削ればいいと思うよ。その後の動作は保証しないが。
3230:2010/02/24(水) 20:26:30
なんか{is_success}にしたらとりあえず大丈夫な気がしないでもないけど、
Perlってそもそも変数に原始性はもってないものなの?

ECCメモリ使ってないせいなのかな?
33デフォルトの名無しさん:2010/02/24(水) 20:34:59
その話を続けるつもりなら、CPAN モジュールならモジュール名を晒せよ。
じゃなきゃ、こっちが分かるわけないだろ。
34デフォルトの名無しさん:2010/02/24(水) 21:58:33
HTTP::Response でしょ。コードで use してるのは LWP::UserAgent 辺りかもしれないけど。
35デフォルトの名無しさん:2010/02/24(水) 22:09:35
36デフォルトの名無しさん:2010/02/24(水) 22:55:42
とりあえずData::Dumperで$resの値を晒してもらうのがいいんじゃないか?
37デフォルトの名無しさん:2010/02/24(水) 22:59:36
「Can't call method」って出てるのにデータ構造見せられてもね
38デフォルトの名無しさん:2010/02/25(木) 00:12:20
どのパッケージにblessされてるかわかるだろ。もっともそれだけなら
ref $resをprintするだけでいいけどな。
39デフォルトの名無しさん:2010/02/25(木) 16:40:46
AUTOLOADが実行されてない時点で何かおかしいだろ
40デフォルトの名無しさん:2010/02/26(金) 11:49:00
>>33 お父さんかよ!
>>34 お母さんかよ!
>>35 お兄ちゃんかよ!
>>36 家庭訪問の先生かよ!
>>37 たまたま居合わせた水道屋かよ!
>>38 とりあえず呼ばれてきた親戚かよ!
>>39 とりあえず呼ばれてきたお巡りさんかよ!
41デフォルトの名無しさん:2010/02/26(金) 12:11:25
mooseでis => 'bare'して、自分でアクセサ書く時に、そのアクセサの中で型制約したい時はどうするの?
42デフォルトの名無しさん:2010/02/26(金) 20:45:28
has 'hoge' => ( is => 'bare', isa => 'Foo', reader => '_get_hoge', writer => '_set_hoge' );
最終的にhogeに値をセットするんなら最初にhogeに対して指定した制約(Foo)が適用されるんじゃないの?
俺が素人だからかもしれんが何がしたいのかよくわからん
43デフォルトの名無しさん:2010/02/28(日) 09:44:33
web上の画像ファイルを自動でダウンロードするにはどうるすれば良いですか?
たとえばhttp://hogehoge/hoge.jpgを自動でダウンロードする場合です
44デフォルトの名無しさん:2010/02/28(日) 09:51:13
use LWP;
45デフォルトの名無しさん:2010/03/01(月) 00:00:24
新Perldocって死んだの?
Googleグループもスパムが飛んでるし
46デフォルトの名無しさん:2010/03/01(月) 01:51:13
http://perldoc.perl.org/ ならこっちからは繋がるけど?
47デフォルトの名無しさん:2010/03/01(月) 02:48:27

requireで実行した処理に引数を送りつけるにはどうしたら良いでしょうか?
requireで実行でなくても構わないんですが、

1: 実行中に外部から文字列 (フィル名と引数) を受け取る。
2: その文字列をrequireして返って来た内容を処理する。

と言うのがしたいのです。
コマンドとかではなくて、同じプロセス内で実行できたらいいなと思ってます。
4847:2010/03/01(月) 03:27:24

eval( qq[ local \@_ = @外部から受け取った引数\; \n] . $openで読んだファイル内容 );

とやるのはあまりに強引でしょうか?
49デフォルトの名無しさん:2010/03/01(月) 05:19:14
>>46
あ、新PerldocJPだった
年末に空中分解したような感触を受けたんだけど
50デフォルトの名無しさん:2010/03/01(月) 06:02:22
>49
分解以前に、始まってるようにも見えなかったが
51デフォルトの名無しさん:2010/03/01(月) 21:58:27
貴重な生きてる板だから何かしようぜ
52デフォルトの名無しさん:2010/03/02(火) 23:17:42
これからやろうぜ!って集まったけど年開けてみんな忙しくてはや3月って感じだろ
53デフォルトの名無しさん:2010/03/03(水) 09:05:51
5.11使ってる人いる?
54デフォルトの名無しさん:2010/03/03(水) 13:30:51
CPANTSってメンテ中?
>>53
12月に5.12が出ると思ったら難航しているみたいだから使っているよ、5.11.5を。
55デフォルトの名無しさん:2010/03/03(水) 19:38:03
($var) = unpack(...)

こんなかんじのコードがあるんですけど$varに括弧を付ける意味ってなんですか?
56デフォルトの名無しさん:2010/03/03(水) 19:45:27
リストコンテキストになる
57デフォルトの名無しさん:2010/03/03(水) 19:57:36
>>56
ありがとうございます。
ググってもうまく探せなかったので助かりました。
58デフォルトの名無しさん:2010/03/04(木) 02:00:32
1〜1000の整数の先頭に0を付け加えて、4桁にしたい

1   →0001
100 →0100
1000→1000

s/〜/〜/;

で一発で置換するには〜の部分はどう書けばいいですか?
59デフォルトの名無しさん:2010/03/04(木) 02:03:10
スレ違い
60デフォルトの名無しさん:2010/03/04(木) 02:39:02
sprintf 禁止なのかな。
61デフォルトの名無しさん:2010/03/04(木) 03:09:27
全角だから工夫が必要かもね
62デフォルトの名無しさん:2010/03/04(木) 03:14:54
Pythonでやればいいのに
63デフォルトの名無しさん:2010/03/04(木) 03:15:30
Python厨
64デフォルトの名無しさん:2010/03/04(木) 03:20:21
いやだからその部分だけPythonにやらせてPerlから呼び出せばいいじゃん
そういう使い方ができるのがPythonなんんだから
65デフォルトの名無しさん:2010/03/04(木) 03:23:50
print( substr("0000" . "1", -8, 8 ) . "\n");
print( substr("0000" . "100", -8, 8 ) . "\n");
print( substr("0000" . "1000", -8, 8 ) . "\n");
66デフォルトの名無しさん:2010/03/04(木) 04:05:45
$str =~ tr/0-9/0-9/;
my $formated_str = sprintf( %04d, $str );
$formated_str =~ tr/0-9/0-9/;
文字コードは書かれてないから知らん
67デフォルトの名無しさん:2010/03/04(木) 04:21:09
use utf8;
utf8::is_utf8($_) or die "死ね";
s{ (?<!\d) (\d{1,3}) (?!\d) }{
  my $is_zenkaku = $1 =~ tr/0-9//;
  ( $is_zenkaku ? '0' : '0' ) x ( 4 - length $1 ) . $1;
}egx;
68デフォルトの名無しさん:2010/03/04(木) 05:05:06
なんかたまたま全角で書いてるだけだったりしてな・・・整数って書いてるし。
ということで俺は つsprintf
69デフォルトの名無しさん:2010/03/04(木) 16:44:31
use utf8;
$_ = "1〜1000の整数の先頭に0を付け加えて、4桁にしたい ";
1 while(s/(?<![0-9])([0-9]{1,3})(?![0-9])/0$1/g);

規制一時解除記念カキコ。
70デフォルトの名無しさん:2010/03/08(月) 06:52:00
*{__PACKAGE__ . "p"} = \&CORE::print;
p(); #=> Undefined subroutine &main::p called at - line 2.

これは print 関数の厳密なエイリアスは作れないということでしょうか
71デフォルトの名無しさん:2010/03/08(月) 10:49:27
>>70
作れないかどうかはわからないが、コードだけ見ると名前空間の::がないからでは?
*{__PACKAGE__."::p"}
72デフォルトの名無しさん:2010/03/10(水) 12:16:30
#!/usr/bin/perl -w
# perl のパスを指定

$send="00000000000\@docomo.ne.jp"; # デフォルト送信先

while (<>){
$content .= $_;

m/^Content-Length: (\d+)$/;

if ( m/^$/ ){ # 本文は調べない
while (<STDIN>){
$content .= $_;
}
}
}

open(SENDMAIL,"|/usr/bin/sendmail $send");
print SENDMAIL $content;
close(SENDMAIL);

exit;

Perlを勉強中で、上記を使って自分の携帯からメールを送りそのまま返信
(転送)するプログラムを作ろうとしています。
実際にメールを送るとサーバーには届いているのですが、返信をしてくれ
ません。記述で間違っている箇所があれば教えてください。
73デフォルトの名無しさん:2010/03/10(水) 12:33:34
とりあえず受信と送信一度に書くとどこに問題があるかわかりにくいので、

・受信したメールを適当なファイルに格納するプログラム
・適当な内容のメールを送信するプログラム

を別々に書くところからはじめるのをお勧めする。
74デフォルトの名無しさん:2010/03/10(水) 23:23:28
perlの前にmailを勉強すべきかもしれない
ちゃんとヘッダを作ってないのに /usr/bin/sendmail を
使うのはよくない。
75デフォルトの名無しさん:2010/03/11(木) 01:57:19
sendmailは本当に/usr/binにあるのか?
7672:2010/03/11(木) 09:21:14
レスありがとうございました。いろいろ試してみて、.forwardを作り直したら
上手くいきました。記述は全然変えていないのですが、.plで作成してサーバー
で変更をしていたのがよくなかったようです。
原因がわからず解決まで半日もかかってしまいましたorz

上のコードは社内でperlができる人のを真似たものでした。
77デフォルトの名無しさん:2010/03/11(木) 17:54:42
続けてですみません。
私が作りたいと思っているプログラムが

「携帯Aから(絵文字などを含む)メールを受け取り、携帯Bに転送する」

というものなのですが、>>72で書いたコードではデコメは良いのですが
絵文字が全て〓に化けてしまいました。

サーバーで受け取った時点で〓に置換されてしまうので、送る各キャリ
アに合わせて文字コードを変換しなくてはならないとわかりました。
ttp://cgipon.specters.net/labo/it_emoji.htmlで紹介されているサン
プルを試してみたりしているのですが、上手く変換してやることができ
ずにいます。 どのような方法を試してみればよいでしょうか?
78デフォルトの名無しさん:2010/03/11(木) 19:35:50
〓に変換されたらもとが何の絵文字だったか知りようがないのでは?
79デフォルトの名無しさん:2010/03/11(木) 21:27:10
SoftBankの絵文字に変換されてるって意味じゃないよな
80デフォルトの名無しさん:2010/03/12(金) 01:59:19
>>77
> どのような方法を試してみればよいでしょうか?

どこが悪いのか突き止めて、そこを修正するといいよ。
81デフォルトの名無しさん:2010/03/12(金) 07:40:31
バッチファイルに以下のように記述し、放り込んだファイルの名前に応じて
テキストファイルの一部を置換したいんですが、よく文字化けしてしまいます
>>4を使ったplファイルを別途用意せず、バッチファイルへの記述だけで
文字化けに対応する方法はないでしょうか?

perl -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
82デフォルトの名無しさん:2010/03/12(金) 09:30:44
>>77です。
>>78
全てを試したのではないのですが〓に変換されたのは、ほぼ全ての絵文字
でした。
>>79
SoftBankではないです、言われてみれば〓はSoftBankのロゴなんですね。
>>80
上記のサイトのサンプルの関数を通して変化しなかったので、他のサイト
を一生懸命探していました。

絵文字はこんなに難しかったのですね
83デフォルトの名無しさん:2010/03/12(金) 11:35:37
>>81
perl -Mencoding=xxx かな。
PERLIOとかPERL_ENCODINGは効かないのか...
84デフォルトの名無しさん:2010/03/13(土) 03:58:23
>>83
ありがとうございます
が、恥ずかしながらうまく使えません・・・
以下みたいなのとは根本的に使い方が違うんでしょうか?
perl -Mencoding=sjis -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
85デフォルトの名無しさん:2010/03/13(土) 06:34:22
実はsjisじゃなくてcp932ってオチだったりして
86デフォルトの名無しさん:2010/03/15(月) 18:34:27
Encode::JP::Mobile; を使った経験のある方がいたら、教えてく下さい。

my $subject_encoded =
is_imode($email_to)
? '=?SHIFT-JIS?B?' . MIME::Base64::encode_base64( encode( 'x-sjis-docomo', $subject ), '' ) . '?='
: is_softbank($email_to)
? '=?UTF-8?B?' . MIME::Base64::encode_base64( encode( 'x-utf8-softbank', $subject ), '' ) . '?='
: is_ezweb($email_to) ? encode( 'x-sjis-kddi-auto', $subject )
: '=?ISO-2022-JP?B?' . MIME::Base64::encode_base64( encode( 'iso-2022-jp', $subject ), '' ) . '?=';

UTF-8文字列の$subjectを上記を使ってエンコードしたいのですが、文字
化けしてしまいます。Encode::Guessで確認するとasciiに変換されていま
した。使い方に間違いがあるでしょうか?よろしくお願いします。
87デフォルトの名無しさん:2010/03/16(火) 09:11:14
>>86
どの携帯キャリアの分岐だったのか、encode_base64を通す前が問題なのか
通した後が問題なのか、ぐらいは切り分けてから質問しろよ。
88デフォルトの名無しさん:2010/03/16(火) 14:21:01
プログラムを組む際は use strict を最初に書いておく事といわれたので、
これをつけて.plファイルを実行すると、
下記のようなエラーが多く出ます。どう対応すればいいでしょうか_?
use strict をつけないと特にエラーは出ません。

Global symbol "$xxxx" requires explicit package name at xxxx.cgi line 16.
89デフォルトの名無しさん:2010/03/16(火) 14:55:14
>>88
「use strict を付けた状態でエラーにならないように書け」ってこと。
変数にmy付けてスコープを明確にせよ
90デフォルトの名無しさん:2010/03/16(火) 15:10:35
>>89

thanks
91デフォルトの名無しさん:2010/03/16(火) 18:26:58
>>87
不十分でした、すみません。
キャリアはdocomoなのでis_imodeの分岐を通っています。
encode_base64の前と後、どちらに問題があるのかつかめていない状
態です。
utf-8にデコードした文字列をそこに通すだけで良いのかと考えてしま
っていたのですが、使い方を間違っているようです。

絵文字について調べてEncode::JP::Mobileを見つける事ができたので
すが、携帯から受け取ったメールをそのまま返信するというコードに、
どう当てはめていけばよいのかわからずに苦戦中です。
92デフォルトの名無しさん:2010/03/16(火) 20:46:44
使い方はそんなもんのような気がするので、入力段階で化けてそうだが。
単に化けたというんじゃなくて、具体的に$subjectがこれこれのときに
結果がこうなって化けてますというのを示して欲しい。
93デフォルトの名無しさん:2010/03/16(火) 21:20:56
DBIx::Classについて質問です。

PostgresqlのXML型へ代入しようとするとエラーが出ます。

DBIx::Class::ResultSet::update_or_create(): DBI Exception:
DBD::Pg::st execute failed: ERROR: operator does not exist: xml = unknown
LINE 1: ...fo_id = $1 AND me.program_type_id = $2 AND me.res = $3 AND m...
^
HINT: No operator matches the given name and argument type(s).
You might need to add explicit type casts.

XML型への代入にキャストが必要だということはわかったのですが、
具体的にどうすればよいのか、ググってもマニュアル読んでも見つかりません。
賢い方、どうかご教示ください。
94デフォルトの名無しさん:2010/03/17(水) 09:17:32
>>92
レスありがとうございます。
ttp://yanor.net/wiki/?%E6%90%BA%E5%B8%AF
こちらのメール送信を参考にさせてもらっています。

my $email_to = '[email protected]';

MIME::WordDecoder->default(
MIME::WordDecoder->new([
'*' => sub{jcode(shift)->sjis},
]
)
);

#メール読み込み準備
my $parser = new MIME::Parser;
$parser->output_to_core(1);
$parser->tmp_recycling(1);
$parser->use_inner_files(1);

my $entity = $parser->parse(\*STDIN);

my $subject = decode('MIME-Header', $entity->head->get('Subject'));

上記のようにして$subjectを抜き出して、>>86を通しています。
このままですと、日本語は大丈夫で絵文字が全て〓となってしまいます。
95デフォルトの名無しさん:2010/03/17(水) 10:24:53
だからどうやって処理してるかじゃなくて具体的にどういう
$subjectの値がどう文字化けしたかを示せと。

俺の予想では「このプログラムに入る前から絵文字が
〓に置き換わっている」だけどなw
96デフォルトの名無しさん:2010/03/17(水) 11:31:02
どんな絵文字かわからないけど、もし携帯で使うような絵文字のことなら文字コードで定義されてないんじゃない?
入出力結果はほしいね。
97デフォルトの名無しさん:2010/03/17(水) 11:54:10
>>95
debugで確認して
「今日の天気は[雲の絵文字]です」が「莉頑律縺ョ螟ゥ豌励・縲薙〒縺・」
となっていました。

>俺の予想では「このプログラムに入る前から絵文字が
>〓に置き換わっている」だけどなw
受け取った段階で〓ということでしょうか?
98デフォルトの名無しさん:2010/03/17(水) 11:57:56
こういうときは普通16進ダンプにするものだ。
99デフォルトの名無しさん:2010/03/17(水) 12:58:07
cookie にメモを保存してやりたいんだけど、cookie のどの項目に保存してやればいい?
このメモはクライアント側のメーカー名でこれは、CGIで取得できます。
この値をcookie に保存したいと考えています。

CGI::Cookie は理解しています。

1. expiration date
2. domain
3. path
4. secure flag
とクッキーには項目がありますが、どのあたりにいれてやればいいでしょうか?
また、具体的にどのように、セットすればいいでしょうか?
また、 %cookies = fetch CGI::Cookie;とすることで、
ハッシュに格納できることは理解しております。
100デフォルトの名無しさん:2010/03/17(水) 13:04:28
>>99
どれもハズレ
101デフォルトの名無しさん:2010/03/17(水) 13:11:57
id=ID情報
memo=メモ内容
って普通に情報を記録すればいいんでないの?
102デフォルトの名無しさん:2010/03/17(水) 13:51:05
>>101

thank you,
>id=ID情報
>memo=メモ内容
このあたり、もう少しソースコードも交えて教えてください
よろしくお願いします。
103デフォルトの名無しさん:2010/03/17(水) 14:11:17
どうぞおググりください
104デフォルトの名無しさん:2010/03/17(水) 14:16:35
ここの"SYNOPSIS"の項目を見てピンとこなければ、>>101の内容も理解できないし、CGI::Cookieも理解してないことになる。
http://search.cpan.org/dist/CGI.pm/lib/CGI/Cookie.pm

質問見る限り、Cookieについて理解がないようだからもう少しCookieというものについて調べたほうがいいよ。

105デフォルトの名無しさん:2010/03/17(水) 14:39:40
>>104
Ty
>>
>> # Create new cookies and send them
>> $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456);
>> $cookie2 = new CGI::Cookie(-name=>'preferences',
>> -value=>{ font => Helvetica,
>> size => 12 }


このSYNOPSISでは、
# Create new cookies and send them

# fetch existing cookies
の2通りの例が示してあるのですね。

で新たにくっきを作るときが上のコードですね。


>>$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456);
これを
$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>めもしたいこと);

って感じにしてもいいのでしょうか?
106デフォルトの名無しさん:2010/03/17(水) 15:05:59
pythonを主に使ってたのですが
他の言語がわかってる人向けのperlの教科書みたいのないですか?
107デフォルトの名無しさん:2010/03/17(水) 15:06:20
全然違うから
CGI::Cookie is object oriented. Each cookie object has a name and a value. The name is any scalar value. The value is any scalar or array value (associative arrays are also allowed).
108デフォルトの名無しさん:2010/03/17(水) 15:11:56
>>105
実際に試してみたらいいんですよ

[14:58]% perl -MCGI::Cookie
new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>めもしたいこと);
Unrecognized character \xE3 in column 51 at - line 1.

ほら、エラーになる。日本語のところでエラーになってる。
日本語をシングルクォートでくくっても、

[15:03]% perl -MCGI::Cookie -MData::Dumper
$cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456,-memo=>'めもしたいこと');
warn Dumper $cookie1;

$VAR1 = bless( {
         'value' => [
               123456
              ],
         'name' => 'ID',
         'path' => '/'
        }, 'CGI::Cookie' );

欲しい結果にはなってないと。って感じで自分で試さないとレス貰えないよ。
109デフォルトの名無しさん:2010/03/17(水) 15:38:26
>>108

thanks
Data::Dumper;
こんな便利なモジュールがあるんですね、ありがとうございます。

>>[15:03]% perl -MCGI::Cookie -MData::Dumper

このあたり、perl -M で二つのモジュールを指定してどのような処理を行いるかすこしわからないのですが調べてみます。



110デフォルトの名無しさん:2010/03/17(水) 16:05:19
>>98
すみません、ダンプするにはどうしたらよいのでしょうか?
111デフォルトの名無しさん:2010/03/17(水) 16:13:46
ttp://www.ietf.org/rfc/rfc2965.txt
によりますと、クッキーの情報に関して、
>> set-cookie = "Set-Cookie2:" cookies
>> cookies = 1#cookie
>> cookie = NAME "=" VALUE *(";" set-cookie-av)
>> NAME = attr
>> VALUE = value
>> set-cookie-av = "Comment" "=" value
>> | "CommentURL" "=" <"> http_URL <">
>> | "Discard"
>> | "Domain" "=" value
>> | "Max-Age" "=" value
>> | "Path" "=" value
>> | "Port" [ "=" <"> portlist <"> ]
>> | "Secure"
>> | "Version" "=" 1*DIGIT
>> portlist = 1#portnum
>> portnum = 1*DIGIT
となっております。クッキーに関しては、
>>ttp://www.thinkit.co.jp/free/article/0604/7/8/
を読みました。
>>101のアドバイスによる、
>>id=ID情報
>>memo=メモ内容
>>って普通に情報を記録すればいいんでないの?
ですが、これは、どうも、new CGI::Cookie 内に書くところがないような気がします。
どこに書いてやればいいでしょうか?
アドバイスお願いします。
112デフォルトの名無しさん:2010/03/17(水) 16:14:08
unpack("H*", $str);
113デフォルトの名無しさん:2010/03/17(水) 16:30:46
>>111
>>108の文章を読めばわかるはずだが、そのやり方ではできない。

WEBでサービスを利用してると、IDと一緒にパスワードも記録するってのはたまに見かけるでしょ?
>>101はIDと一緒にメモを記録しておこうってだけだよ。


#!/usr/bin/perl
use strict;
use CGI qw/:standard/;
use CGI::Cookie;

# 記録
my $cookie1 = new CGI::Cookie(-name=>'id', -value=>"ID");
my $cookie2 = new CGI::Cookie(-name=>'memo', -value=>"MEMO");
print header(-cookie=>[$cookie1,$cookie2]);

# 読取
my %cookies = fetch CGI::Cookie;
my $id = exists $cookies{'id'} ? $cookies{'id'}->value : "none";
my $memo = exists $cookies{'memo'} ? $cookies{'memo'}->value : "none";

print "id: $id\n";
print "memo: $memo\n";

CGIとして実行すると、初回はnone、2回目以降はIDとMEMOが表示される。
114デフォルトの名無しさん:2010/03/17(水) 16:54:30
>>112
レスありがとうございます。
早速unpackの使い方を調べて
@chr = unpack("H*", $subject);
print "@chr\n";
を試してみました。結果は空白です。やっぱり変な変換のされ方を
してしまっているのかもしれません。
115デフォルトの名無しさん:2010/03/17(水) 17:05:22
>>113

thank you
理解できました。
116デフォルトの名無しさん:2010/03/17(水) 17:10:35
>>112
ワイド文字列をunpack 'H*'に食わせると各文字の下位8bitしか
出てこないので、俺はこんな感じの自作サブルーチン
使ってる。

sub hexdump {
my($s) = @_;

$s =~ s/(.)/sprintf "[%x]", ord($1)/ge;
return $s
}
117デフォルトの名無しさん:2010/03/17(水) 17:17:38
>>116
それは>>86のプログラムに食わす前の$subjectの値が空白だったということか?
そんなら〓はどっから出てくんだよ。なんかおかしくね?
118デフォルトの名無しさん:2010/03/17(水) 17:18:22
ごめんアンカミスった。>>116じゃなくて>>114
119デフォルトの名無しさん:2010/03/17(水) 17:29:42
>>117
>>86を通る前の表示が記述ミスしていました。
「今日の天気は[雲の絵文字]です」が「cae56e29176f1367590a」となって
いて、同じ方法で>>86後の$subject_encodedをダンプすると空白になって
しまいました。
120デフォルトの名無しさん:2010/03/17(水) 17:45:06
>>119
雲の絵文字があるはずの7文字目の文字コードの下2桁が
13ってことだな。

雲はU+E63F
〓はU+3013

なのですでにその時点で〓になってる疑いが濃厚。

ttp://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/index.html
121デフォルトの名無しさん:2010/03/17(水) 18:41:41
>>120
文字コードを調べたらUTF-8で3013は〓でした。perlを置くサーバーにメール
が届いた段階で〓に変えられているのでは、>>86を通しても…
〓にしないでメールを受け取る方法があるのでしょうか?
122デフォルトの名無しさん:2010/03/17(水) 20:17:55
絵文字を〓に変換してるのは携帯キャリアのメル鯖。
123デフォルトの名無しさん:2010/03/17(水) 23:34:13
>>121
gmailぐらいの交渉力があれば個別対応してもらえるけど、普通は
無理なんじゃないかなぁ。
124デフォルトの名無しさん:2010/03/18(木) 09:14:35
>>122>>123
まずは自社サーバーで〓に変換されていない状態で受け取れないと無理ですね。
同じようなプログラムに挑戦した方が結構いるのかと思っていました。
125デフォルトの名無しさん:2010/03/18(木) 13:38:39
サーバー、クライアントがあります。
クライアントがサーバーに対して
GET リクエストを出します。

この際、クライアントは、
GET xxxx HTTP/1.1
User-Agent:test1


とUser-Agent のヘッダを追加します。
つまり、クライアントからのリクエスには、上のUser-Agnet
のヘッダが含まれています。

サーバー上のパールプログラムの中でで、このUser-Agent の
test1 を変数として保持したいのですが、具体的な実装方法に
ついてアドバイスをお願いします。
126デフォルトの名無しさん:2010/03/18(木) 13:50:15
>>125
$ENV{HTTP_USER_AGENT}
127デフォルトの名無しさん:2010/03/18(木) 14:10:35
>>126

ありがとうございます。
128デフォルトの名無しさん:2010/03/18(木) 14:35:34
GET /a.xml HTTP/1.1
Host: 192.16
Connection: close
User-Agent:
x-ModelName: pp-pppp
x-SDKVersion: 1.1.1

リクエストヘッダが上のようにあり、この中で特殊な、x-ModelName
の pp-pppp を取得したいと考えています。

しかし、
ttp://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0#HTTP.E7.92.B0.E5.A2.83.E5.A4.89.E6.95.B0

をみますと、これに該当する環境変数がありません。
この場合、どうやって、pp-pppp を取得できますでしょうか?
129デフォルトの名無しさん:2010/03/18(木) 15:07:57
>>125,128
板違い

>>126みたいに板違いなのに回答するとこうやって図にのるのでみんなやめようね
130デフォルトの名無しさん:2010/03/18(木) 16:00:44
>>129

どこの板に質問すればいいでしょうか?
131デフォルトの名無しさん:2010/03/18(木) 16:03:03
>>130
>>1読め
132デフォルトの名無しさん:2010/03/18(木) 16:03:13
>>130
>>1読め
133デフォルトの名無しさん:2010/03/18(木) 16:07:58
>>131
>>132

thank you.
134デフォルトの名無しさん:2010/03/19(金) 10:18:39
初歩的な質問ですみません。
改行コードを変換したいんですが

・次行の先頭が 'A' で始まる場合のみ、行末の改行を削除

これを

perl -pe 's/\nA//g'

とやっても期待した結果になりません(全く完全に何も置換されない)
環境はCygwin1.7です。
135デフォルトの名無しさん:2010/03/19(金) 10:42:54
Treat string as multiple lines
136デフォルトの名無しさん:2010/03/19(金) 10:54:20
>>134 s/\n(?=:A)//sg
137デフォルトの名無しさん:2010/03/19(金) 10:59:03
間違えた
>>134 s/\n(?=A)//sg
138デフォルトの名無しさん:2010/03/19(金) 15:57:58
改行区切りで読み込んでるからだろ
perl -p0e 's/\n(?=A)//g'
139デフォルトの名無しさん:2010/03/20(土) 06:01:46
otsuneさんがウザくてamachangが爽やかなのはperlのせいですか?
140デフォルトの名無しさん:2010/03/20(土) 06:21:57
はてなに帰れ
141デフォルトの名無しさん:2010/03/20(土) 08:43:37
「処理済み」を表すフラグの変数名は何がいいですか?
142デフォルトの名無しさん:2010/03/20(土) 08:56:41
done
143デフォルトの名無しさん:2010/03/20(土) 09:02:41
ああ、それはいいな
finishとかprocessedとか、どうもしっくり来なかった
144デフォルトの名無しさん:2010/03/26(金) 13:04:37
http::request の使用に関しての問題ですが、perl のプログラム(リフェレンス)の問題に
なりますのでここで質問させてもらいます。
ttp://search.cpan.org/~gaas/libwww-perl-5.834/lib/HTTP/Request.pm
によりますと、
$r = HTTP::Request->new( $method, $uri, $header_ref, $content )
で三番目の引数が、reference to an HTTP::Headers object or a plain array
reference of key/value pairs.
とリフェレンスになっております。
Can't call method "clone" on unblessed reference at C:/Perl/lib/HTTP/Message.pm
line 32.
*たしかに、message.pm 内では、$header = $header->clone; 
となっております。
my %header = ('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded');
my $header_ref = \%header;
と三番目の引数をセットしています。
ttp://ftp.ics.uci.edu/pub/websoft/libwww-perl/archive/1999h1/0500.html
解決方法は、このあたりに書いてあるとおもうのですが、どのように三番目の引数をセットしてやればいいでしょうかアドバイス願います。
145デフォルトの名無しさん:2010/03/26(金) 13:20:33
>>144
HTTP::Headersのオブジェクトにしたら良いよ

my $h = HTTP::Headers->new('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded');
この$hを第三引数に。
146デフォルトの名無しさん:2010/03/26(金) 13:22:28
plain array referenceって書いてあるんだから、ハッシュじゃだめだろ。

my @header = ('User-Agent' => 'test_Agent','Content-Type' => 'application/x-www-form-urlencoded');
my $header_ref = \@header;
147デフォルトの名無しさん:2010/03/26(金) 13:25:15
エラーメッセージの行のまわりを見ればこうなっているわけだが。

if (ref($header) eq "ARRAY") {
$header = HTTP::Headers->new(@$header);
}
else {
$header = $header->clone;
}
148デフォルトの名無しさん:2010/03/26(金) 13:50:13
レスありがとうございました。
解決いたしました。

>>145
オブジェクトを指定してうまく動作しました。
>>146
plain array reference を読み間違えておりました。配列であってハッシュではありませんでした。
>>147
アドバイス ありがとうございました。
149デフォルトの名無しさん:2010/03/27(土) 00:11:17
perlから外部コマンドを実行して出力を格納するのに
バッククオートを使用しているのですが、
コマンドの文字列に$を含むような場合(環境変数とか)に
変数として展開されないようにする方法ってありませんでしょうか。
150デフォルトの名無しさん:2010/03/27(土) 09:38:32
$を適切にエスケープすりゃいいんじゃねーの?

またはperlipc(1)の例にあるsafe backtick

# add error processing as above
$pid = open(KID_TO_READ, "−|");

if ($pid) { # parent
while (<KID_TO_READ>) {
# do something interesting
}
close(KID_TO_READ) || warn "kid exited $?";

} else { # child
($EUID, $EGID) = ($UID, $GID); # suid only
exec($program, @options, @args)
|| die "can't exec program: $!";
# NOTREACHED
}
151デフォルトの名無しさん:2010/03/27(土) 16:02:53
お前らモダンPerlで書いてる?
俺はまだ勉強してないんだけど
モダンPerlの利点って何があるのか簡潔に書け。
152デフォルトの名無しさん:2010/03/27(土) 17:14:04
Perl4互換で書いてる。念のため
153デフォルトの名無しさん:2010/03/27(土) 17:42:38
Mooseとかは使わないけどPerl4互換とか絶対あり得ないわw
154デフォルトの名無しさん:2010/03/27(土) 18:45:16
自分で使うためのものしか考えてないから、5.10で追加されたものも普通に使って書いてる
いまさらPerl4互換とかないわー
155デフォルトの名無しさん:2010/03/27(土) 18:49:09
perl4ってどんなの?
localとか使うん?
156デフォルトの名無しさん:2010/03/27(土) 19:38:50
157デフォルトの名無しさん:2010/03/27(土) 19:48:28
関数の引数は、localで受ける方が自然に見えるのは俺だけ?

sub func
{
    local($x, $y)=@_;

まあ慣れなんだけど
158デフォルトの名無しさん:2010/03/27(土) 20:10:32
おまえとKENTだけ
159デフォルトの名無しさん:2010/03/27(土) 20:21:09
myだろ普通
JavaとかPHPとか他の言語は自動的に局所変数だ
160デフォルトの名無しさん:2010/03/28(日) 09:35:47
最近は受ける変数名を考えるのが面倒だから
$_[0]とかを直接使ってるw
161デフォルトの名無しさん:2010/03/28(日) 13:56:50
pythonのctypesに相当するものはありますか?
162デフォルトの名無しさん:2010/03/28(日) 14:03:11
ん?PythonってCのやり方に頼りだしたんだw
163デフォルトの名無しさん:2010/03/28(日) 14:04:47
書き忘れた
CPANでCtypeで検索しろ
164デフォルトの名無しさん:2010/03/29(月) 11:12:09
swigしかないようです
165デフォルトの名無しさん:2010/03/29(月) 12:40:00
Archive::Zipの解説しているWebPageないでしょうか。
できれば日本語で・・・

ぐぐっても、圧縮/解凍のやりかたしか出てない;;
166デフォルトの名無しさん:2010/03/29(月) 16:31:31
>>165
「圧縮/解凍のやりかた」以外の何を知りたいのか
具体的に書くべきだろうな、そういう時は。
「マニュアルに書かれている内容が理解できないので
噛み砕いて教えて下さい」って言ってるのと同義なんだから。
http://search.cpan.org/dist/Archive-Zip/lib/Archive/Zip/FAQ.pod
http://search.cpan.org/dist/Archive-Zip/lib/Archive/Zip.pm
167デフォルトの名無しさん:2010/03/29(月) 16:48:45
>>166
すみませんでした。

具体的にやりたいのは、画像ファイルを無圧縮ZIPに固めておき、それを解凍せずにブラウザに表示したいのです。
ローカルファイルを開いたハンドルから表示するのは出来たので、
ZIP内のファイルのハンドルが取れれば、出来そうなのですが・・・

my $zip = Archive::Zip->new('test.zip');
my $fh = $zip->open('hoge.jpg');

みたいに出来たらな・・・と。
168デフォルトの名無しさん:2010/03/29(月) 19:22:43
>>167
お望みの物はArchive::Zip::MemberReadかい
169デフォルトの名無しさん:2010/03/30(火) 15:14:12
>>168
ありがとうございます。
早速調べて試してみたのですが、Not a GLOB reference のエラーが出ます。perl は初めてなので、なにか勘違いしていると思いますが、それがどこかわかりません。

#!/usr/bin/perl
use Archive::Zip;
use Archive::Zip::MemberRead;

$imgtype = 'jpeg';
#// file @
# open(IMG, "./1.jpg") or die;

#// zip A
$zip = Archive::Zip->new('./1.zip');
$IMG = Archive::Zip::MemberRead->new($zip, "1.jpg");

#// イメージ表示
binmode $IMG;
binmode STDOUT;
print "Content-type: image/$imgtype\n\n";
print while (<$IMG>);
#// 画像クローズ
close($IMG);
#// 終了
exit(0);

@を生かし、Aを殺すとうまくいきますが、逆だと binmode $IMG の箇所でNot a GLOB referenceとなります
170デフォルトの名無しさん:2010/03/30(火) 16:28:22
Archive::Zip::MemberReadは中をのぞいてみたけど
ハッシュをblessしただけの普通のオブジェクトだから
ファイルハンドルとしては使えない。あくまで同じような
メソッドが用意してあるだけの普通のオブジェクト。
binmodeとかはムリ。

IO::Stringみたいにグロブにtieしていろいろがんばれば
なんとかなるけどそこまではやってないようです。
171デフォルトの名無しさん:2010/03/30(火) 16:55:00
テンポラリに展開して、それを読み込んだほうが良さそうですね。
そういう方向で修正していって見ます。

わざわざ中をのぞいていただき、ありがとうございました。
172デフォルトの名無しさん:2010/03/31(水) 21:16:21
ドキュメントぐらい読めよ関数名見りゃだいたい分かるだろ
$zip->contents(FILENAME);
173デフォルトの名無しさん:2010/04/01(木) 11:14:51
>>172
テンポラリファイルを使用する形で出来上がっていましたが、$zip->contents(FILENAME)を使用することで
「ファイルの書き込み→読み込み→出力」が、「ファイルの読み込み→出力」にすることが出来ました。
画像の縮小をさせるとレスポンスが遅いのですが、玄箱には重過ぎるのでしょう。

まだフロント(iアプリ)はテスト用でしか試してませんが、なんとか目処がつきました。
ありがとうございます。
174デフォルトの名無しさん:2010/04/01(木) 17:09:07
Perlのバイブル本って何?
175デフォルトの名無しさん:2010/04/01(木) 17:12:59
プログラミング言語Perl
176デフォルトの名無しさん:2010/04/01(木) 17:31:06
正直最初にその1冊買ってそれが最後の本になるなw
あとはCPANとかでいろいろ探しまくる作業が残りの半分。
177デフォルトの名無しさん:2010/04/01(木) 17:40:50
>>175
どの本ですか?
アマゾンなどのリンクください。
プログラミング言語Perlマスターコース
プログラミングPerl
という本なら見つかるのですが
178176:2010/04/01(木) 17:43:19
ああ、俺が言ってるヤツは プログラミングPerl。
オライリーのらくだ絵の本。Perl開発者が書いたやつ。
179デフォルトの名無しさん:2010/04/01(木) 19:04:29
モダンPerl読んだ方がいいと思う
180デフォルトの名無しさん:2010/04/01(木) 19:14:03
それバイブルどころか入門書じゃないの?
181デフォルトの名無しさん:2010/04/01(木) 19:30:19
プログラミングPerlって説明が古いじゃん
182デフォルトの名無しさん:2010/04/01(木) 23:06:19
Effective Perlがいいぞ
183デフォルトの名無しさん:2010/04/01(木) 23:17:35
モダンPerlはサスペンダーが大絶賛してたから意地でも読まない
184デフォルトの名無しさん:2010/04/01(木) 23:57:33
江川達也さんは何の本でもたいしてちゃんと読まずに大絶賛するだろうが
185デフォルトの名無しさん:2010/04/02(金) 00:19:10
モダンPerl読んだけど、情報がとびとびでさっぱり理解できない
初心者にすすめるもんじゃないよありゃ
186デフォルトの名無しさん:2010/04/02(金) 02:40:11
プログラミングPerlは思想的に面白い。
Perl6なんて本当は完成させたくないんだよ。
綺麗すぎる言語は退屈だ。
187デフォルトの名無しさん:2010/04/06(火) 00:05:27
Linux上で動かすPerlについて質問があります。
ファイルリストに記載されているファイルのみを
別のディレクトリにコピーしたいのですが、
どのようなコードを書けばよいのでしょうか?
ファイルリストを読み込み、$file_listで1文字ずつ表示させる状態にして、
system("cp $file_list $dir_name");とやっているのですが、うまくいきません。
188デフォルトの名無しさん:2010/04/06(火) 00:16:52
>>187
print `cp $file_list $dir_name`;
エラーがあるならこれで分かるんじゃないか
189デフォルトの名無しさん:2010/04/06(火) 00:31:12
俺の予想では、chompするとうまくいく
190デフォルトの名無しさん:2010/04/06(火) 04:09:32
俺が touch ';rm -fr /;' しといてやるぜw >>187
191デフォルトの名無しさん:2010/04/06(火) 20:19:04
blessしたオブジェクトをscalar($self)した時に
任意の文字列を返すにはどうすればよいでしょうか?

例えばDateTimeモジュールはDateTime->now()でオブジェクトを取得しますが、
scalar($now)すると現在時間が文字列で返ってくるのですが、
こういうのはどう実装すればよいでしょうか?
192デフォルトの名無しさん:2010/04/06(火) 20:38:04
少なくともDateTimeではscalar使った時点で文字列に変わったりはしない
print $now; とか my $datestr = "$now"; で文字列になることを言ってるんなら、overload
193デフォルトの名無しさん:2010/04/08(木) 01:08:37
>191
use overload ( 略
'""' => '_stringify',
194デフォルトの名無しさん:2010/04/10(土) 00:38:14
どうしても文字化けしてしまいます。
どなたかヒントでも頂けるとありがたいです。

WWW::Mechanize でCSVをダウンロードします。
その後print や Encode::decode などすると「Wide character ....」 と表示されました。
UTF8フラグが立っているのかと思い、Encode::encode("utf8",$data_str) などして、
ファイルを保存して開いてみると文字化けしてしまいます。
エディタはEmacsでエンコード指定して開き直したりもしてみました。

本当に試行錯誤して、encodeやdecodeのいろんな指定をしてみましたがダメでした。
しかしブラウザからCSVをダウンロードするとエクセルできちんと開きますし、
Emacs で UTF-8 で開くことが出来ます。

正直、分かりません・・・。
195デフォルトの名無しさん:2010/04/10(土) 00:43:24
Encode::from_to($data_str, "utf8", "cp932");
196デフォルトの名無しさん:2010/04/10(土) 01:25:59
>>194
わかってないなら弾の言う通りに書けよ。
197194:2010/04/10(土) 02:00:29
単純にdos窓で表示できない、と言う訳ではありません。Emacsで開いているので。

ブラウザで落とすとUTF8になっているので、ファイルはUTF8なんだと思うんですが。。

Mechanizeのcontent には独特なエンコードルールが有るんでしょうか?
contentのデータをencodeするのがマズイのかな。
198デフォルトの名無しさん:2010/04/10(土) 02:23:11
Mech使わないから知らんけど、LWP::UserAgentとかみたいにHTTP::Responseでデータ返してくれるんなら
my $content = $res->decoded_content(charset => 'none'); # $res isa HTTP::Response
で生データ取れるからそれをそのまま保存するなりすればいいかと。
199デフォルトの名無しさん:2010/04/10(土) 02:42:18
文字化けとかUTF8と思うとか曖昧なこと言わないで
バイナリエディタで中身見ればいいのに
200デフォルトの名無しさん:2010/04/10(土) 02:54:08
>ファイルはUTF8なんだと思うんですが。
思うってなんだそりゃw
自分で見てから判断しれよ
201デフォルトの名無しさん:2010/04/10(土) 04:20:49
>>194
とりあえずDevel::Peekなりでdumpしてutf8flagが立ってるかどうかをちゃんと確認した方がいい。
曖昧なまんまの推測だと答えも推測になるからなかなか答えにたどり着かんよ
202デフォルトの名無しさん:2010/04/10(土) 05:28:58
>>194
iso-8859-1なんじゃねえの?
203デフォルトの名無しさん:2010/04/11(日) 00:35:30
Spidering Hacksに載ってたな
204デフォルトの名無しさん:2010/04/11(日) 00:42:17
Spidering Hacksの内容は今となってはさすがに古過ぎる
スクレイピングのマナーとか心構えとかは参考になるけどな
205デフォルトの名無しさん:2010/04/14(水) 19:52:51
もう5年以上前になると思いますが、
Perlで書かれたプログラムを実行するとラクダの形で文字列が出力され、
そのプログラム自体もラクダの形に揃えられていたものをみたのですが、
探してみてもなかなかみつかりません。

少ない情報ですが、お分かりの方はいませんでしょうか?
206デフォルトの名無しさん:2010/04/14(水) 20:21:48
Acme::EyeDropsじゃねーの
207デフォルトの名無しさん:2010/04/15(木) 23:32:19
URLを画面に表示する時に、指定した文字数より長すぎる場合、
ディレクトリ階層を優先してまびくようにするにはどうしたらいいでしょうか?
例:
$url = "http://www.abc123.net/abcdefg/hijklmn/opqrstu/vwxyz/foo1234.html" ←65文字
$url = omiturl($url, 50);
print $url;
この結果としてこんな感じにしたいです
http://www.abc123.net/ ... /vwxyz/foo1234.html ←47文字
208デフォルトの名無しさん:2010/04/16(金) 00:36:20
>>207

use URI;
sub omiturl {
 my $uri = URI->new(shift);
 my $maxlen = shift;

 my $repl_q = quotemeta(my $repl = "...");
 my $path = $uri->path;
 until (length "$uri" <= $maxlen) {
  $path =~ s,\A/(?:$repl_q/)?[^/]+,/$repl, or last;
  $uri->path($path);
 }
 return "$uri";
}

手っ取り早くURI使ってるから$replに半角スペースとか使うと%20にされちゃうんで、
そのへん気に入らなかったら適当に直してくれ
209デフォルトの名無しさん:2010/04/16(金) 04:53:00
>>208
便利につかわさせて頂きます。
ありがとうございました。
210デフォルトの名無しさん:2010/04/16(金) 05:59:51
localhost/p2/read.php?host=pc12.2ch.net&bbs=tech&key=1266565626&ls=208-#r208
のようなクエリ文字列 or フラグメントの長いURLを>>208に通すと無限ループするな
見た感じだとマッチしなくなった時点でループを抜けるように書かれてると思うけど、なぜだろう
211デフォルトの名無しさん:2010/04/16(金) 06:53:08
マッチもしないし文字数もこれ以上短く出来なくなったら無限ループだな。
例えば文字の長さを10とかやったら絶対無限ループ
212208:2010/04/16(金) 10:08:30
oh…やっちまった……テストはちゃんと書きましょうってことだな…
untilを↓に差し替えで無限ループは回避できるはず。>>207がまだ見てることを祈る…
 for (my $i = 0; length "$uri" > $maxlen and $i < 20; $i++) { # ループ20回で強制的に抜ける
  $path =~ s,\A(/(?:$repl_q/)?[^/]+),/$repl, or last;
  last if $path eq $1; # マッチするが置換しても内容が変わらない場合抜ける
  $uri->path($path);
 }
213デフォルトの名無しさん:2010/04/16(金) 22:26:22
Cだと
static char hoge[128];
write(fd, hoge, 128);
とすれば128バイト分の0x00が書き込まれると思うのですが
perlだとどのように記述すればいいでしょうか?
214デフォルトの名無しさん:2010/04/16(金) 22:45:34
print 0x00 x 128;
215デフォルトの名無しさん:2010/04/16(金) 22:46:25
あ、ごめん "\x00" x 128 だ
216デフォルトの名無しさん:2010/04/17(土) 00:38:56
>>214
>>215
ありがとうございます、繰り返し演算子という奴を使うんですね。
217デフォルトの名無しさん:2010/04/17(土) 16:23:26
配列の任意の位置に要素を入れるにはどうすればいいのでしょうか?

my @arr = qw(a b c d e);
my $i = 3;

??? add_elem @arr, $i, "z";

print "@arr"; #=> a b c z d e
218208:2010/04/17(土) 17:34:11
splice @arr, $i, 0, "z";
219デフォルトの名無しさん:2010/04/17(土) 18:05:40
>>218
d
できました
220デフォルトの名無しさん:2010/04/21(水) 18:25:44
require HOGE::FUGA; を require $foo; みたいにして、
HOGE::FUGAの代わりにHOGE::PIYOを読むように動的に変更したいのですが、
この場合'HOGE/FUGA.pm'ってパス指定しないとうまくいきません。
出来ればHOGE::PIYOのような形式で指定したいのですが、
上手い方法はないでしょうか?
221デフォルトの名無しさん:2010/04/21(水) 18:26:35
なるほど、evalの中でrequireするか、でなければUNIVERSAL::require使えばよいのか。
222デフォルトの名無しさん:2010/04/22(木) 00:53:15
こんばんは
Perlでグラフを書く必要がありGD::Graphというモジュールを発見したので
使おうと思っていろいろ調べました。
その結果、このモジュールは軸を対数表示にすることができない?ようなんですが
この認識であってますかね?

http://search.cpan.org/~mverb/GDGraph-1.43/Graph.pm
223デフォルトの名無しさん:2010/04/22(木) 00:58:38
対数計算した座標渡せばいいだけでは
224デフォルトの名無しさん:2010/04/22(木) 02:12:27
それだとグラフ自体は意図通りに描画されるかも試練が
軸の目盛り(?)が意図したようにならんのでは?
225デフォルトの名無しさん:2010/04/22(木) 05:03:24
じゃあ使うのやめれば
226224:2010/04/22(木) 11:20:42
おれは使ってないぞw
227デフォルトの名無しさん:2010/04/22(木) 19:34:23
>>223
レスありがとうございます。
描画はそれでいけますが素直にgnuplotのほうが無難かな。

228デフォルトの名無しさん:2010/04/22(木) 22:51:17
データだけ吐いてR言語がいいぞ
229194:2010/04/22(木) 23:50:50
文字化け

use strict;
use warnings;
use utf8;
use Encode;
use Net::Delicious;

my $delicious = Net::Delicious->new({user=>'hoge',pswd=>'fuga'});
my $agent = LWP::UserAgent->new;

foreach my $bookmark ( $delicious->recent_posts ) {

my $url = $bookmark->url();
print utf8::is_utf8($bookmark->description) . "\n";
my $title = Encode::encode('utf8',$bookmark->description);
my $tags = Encode::encode('utf8',$bookmark->tags);
$tags =~ s/([^ ] )/#$1/g;

print $title . "\n";
print $tags . "\n";
print "---------------------------------------------\n";
}

上のようなスクリプトをかきましたが、descriptionが文字化けしてしまいます。

Net::Delicious からとったデータはutfフラグがたっていたので、そのままencodeしました。

UTFフラグがたったものをencodeして文字化けする場合はどのように対処すれば良いでしょうか?
230デフォルトの名無しさん:2010/04/23(金) 02:37:56
>>229
試してみたけど文字化けしないな
使い方も問題なさそうだけど
231デフォルトの名無しさん:2010/04/23(金) 15:55:39
>>229
cpan moduleがencodeに対応してたりしてなかったりするものを混ぜると
わけわかんなくなる場合がある。
関係してそうなmoduleかたっぱしからupdateしてみ
232デフォルトの名無しさん:2010/04/23(金) 16:31:43
package TestC;
sub new{
  my $class = shift;
  my $self = {
    a => [],
  };
  return bless $self, $class;
}

----
my $c1 = new TestC;
my $c2 = new TestC;

としたときに $c1 と $c2 の a が同じものになってしまいます。
($c1 で編集すると $c2 も同じになる)
インスタンスごとに配列も別の実態を参照してほしいのですがどうすればよいでしょうか?
233デフォルトの名無しさん:2010/04/23(金) 16:50:56
普通ならないけどな。編集して同じになったというのが
わかるソースも出せよ。

package TestC;
sub new{
my $class = shift;
my $self = {
a => [],
};
return bless $self, $class;
}

package main;
$c1->{a}->[0] = 100;
printf "c1: %d, c2: %d\n", $c1->{a}->[0], $c2->{a}->[0];

すくなくとも上記で試した限りでは結果は

c1: 100, c2: 0

だった。
234デフォルトの名無しさん:2010/04/23(金) 16:55:03
>>232
別物みたいだけど?

package main;
my $c1 = new TestC;
my $c2 = new TestC;

warn '$c1->{a} and $c1->{a}: ' . is_equal($c1->{a}, $c1->{a});
warn '$c1->{a} and $c2->{a}: ' . is_equal($c1->{a}, $c2->{a});

sub is_equal {
my($x, $y) = @_;

($x eq $y) ? 1 : 0;
}

package TestC;
sub new{
my $class = shift;
my $self = {
a => [],
};
return bless $self, $class;
}

1;

====================
$c1->{a} and $c1->{a}: 1
$c1->{a} and $c2->{a}: 0
235232:2010/04/23(金) 17:05:46
>>233
すいません、長くなりそうなのではしょってしまいました。
以下を実行すると
c1 2
c2 2
と表示されます。@5.10.0

package TestC;
####new省略
sub push_array{
  my $self = shift;
  my $a = $self->{a};
  push @a, $_[0];
}
sub get_count{
  my $self = shift;
  my $a = $self->{a};
  return @a;
}
package main;
my $c1 = new TestC;
my $c2 = new TestC;
$c1->push_array(1);
$c2->push_array(2);
print "c1 ".$c1->get_count."\n";
print "c2 ".$c2->get_count."\n";
236デフォルトの名無しさん:2010/04/23(金) 17:18:56
use strictしなかった結果がこれだよ!
237デフォルトの名無しさん:2010/04/23(金) 17:40:45
$a!
238デフォルトの名無しさん:2010/04/23(金) 17:43:02
$a ≠ @a
239デフォルトの名無しさん:2010/04/23(金) 17:44:47
$aと@aは全くの別物。このプログラムに登場する@aはmyで宣言されてない
から常に同じパッケージ変数が使われてる

あと$a, $bはsortが使う特別な変数なのでそれ以外の用途で使うとろくな目に
会わないからやめとけ。
240デフォルトの名無しさん:2010/04/23(金) 20:07:59
$a使った結果がこれだよ!
241デフォルトの名無しさん:2010/04/23(金) 20:08:54
sortが$a, $bを使うという仕様を見た時は目ん玉飛び出たな
どんな糞仕様だよと
242デフォルトの名無しさん:2010/04/23(金) 20:56:57
どこが?
Perlなら妥当な仕様だろ。
243デフォルトの名無しさん:2010/04/23(金) 21:14:28
$_ とか $@ とか $! とかも糞仕様
244デフォルトの名無しさん:2010/04/23(金) 21:26:09
つまりPerlは糞言語だから糞仕様なのがむしろ妥当だと
245デフォルトの名無しさん:2010/04/23(金) 22:34:24
$aと$bをどう使うと降順になるのか何度やっても覚えない
そもそも、降順と昇順の意味がピンと来ない
246232:2010/04/23(金) 22:44:39
返答が遅くなり申し訳ありません。
色々と得心がいきました。
解決したところで引き続き頭をこねこねしたいと思います。
ありがとうございました。
247デフォルトの名無しさん:2010/04/23(金) 23:26:38
$_やら$@やら$!はだれがプログラムしても同じ変数だから分かりやすい
っていう話があってだな
248デフォルトの名無しさん:2010/04/24(土) 00:01:40
>>247
なるほど
そう考えると確かにと思わざるを得ない

ただあまり使わない特殊変数は検索かけても引っかかってこないのがウザい
249デフォルトの名無しさん:2010/04/24(土) 00:03:24
perldoc perlvar
250デフォルトの名無しさん:2010/04/24(土) 00:26:59
とりあえず>>245が頭が悪いと言う事はわかった
251デフォルトの名無しさん:2010/04/24(土) 01:56:06
UTF-8 で書かれたテキストファイル hoge.txt の内容を
Windowsのバッチファイルからワンライナーで
msg="おはよう"
から
msg=こんにちは
に置換したいんですが・・・

perl -i.BAK -pe "s/(?<=msg=).*/こんにちは/" hoge.txt

これだとシフトJISで書き込まれてしまうんです。
UTF-8 で書き込む方法があれば教えてください。
252デフォルトの名無しさん:2010/04/24(土) 10:37:27
見つけたよ特殊変数のスレ
同じプログラム板じゃないか


Perlの特殊変数は氏ね。絶対に使うな。可読性下がる
http://pc12.2ch.net/test/read.cgi/tech/1141988910/34

34 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/11(土) 22:02:24
特殊変数は、他人や「昔の自分」が書いたソースに出てきても
まったく可読性に影響の無い、数少ない構成要素の一つだろう。
同じ名前の変数には、常に同じ意味を持つものが入ってるんだから。

「これ何のためにあるの?何が入ってるの?」って状態になるのは普通の変数のほう。

253デフォルトの名無しさん:2010/04/24(土) 14:02:59
>>251
文字コードがsjisであれば、
perl -i.BAK -pe -MEncode "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt

>>252
可読性とか書きようによってはいくらでも良くなるし悪くもなるもんなのに、言語仕様のせいにするのはおかしいよね。
他の言語から見れば、Perlは変数の前に$@%*とか使ったり、特殊変数の意味が理解できないだろうから気持ち悪く映るんだろうけど。
254デフォルトの名無しさん:2010/04/24(土) 18:26:39
$@%があるからスカラなのか配列なのか、分かりやすくて良いと思う俺って少数派?
255デフォルトの名無しさん:2010/04/24(土) 18:27:43
多数派
256デフォルトの名無しさん:2010/04/24(土) 20:20:59
じゃあリファレンスも別のプリフィクスを採用するべきだったよね
あと配列もハッシュも中身にアクセスするとき$プリフィクスを要求するのは分かりにくいよね(これはperl6で変更になるけど)
257デフォルトの名無しさん:2010/04/24(土) 20:23:23
あれはあれでいいんだよ
258194:2010/04/24(土) 20:59:32
>>231,230
Macだといけました。
Windowsだと化けるんだな。。
ppmのモジュールは確かに古かったから、cpanで入れ直してみようかと思います。

ちなみにeshellで出力してるので、winでもcp932にencodeしなくても大丈夫です。
てかこれで途中までは日本語がきちんと表示されます。
259デフォルトの名無しさん:2010/04/25(日) 01:08:38
>>256
おれはperl5の方が好きだ
スカラだから$で統一されててわかりやすい
260デフォルトの名無しさん:2010/04/25(日) 03:03:46
最終的に得るものがスカラ、という考え方か
例えばデリファレンスで配列を得たけりゃ@$array_refだし
確かにそりゃそうだなぁ
261デフォルトの名無しさん:2010/04/25(日) 05:23:43
あれだよな。@は配列変数 って書くサイトや本が悪いよな。
配列へのアクセスなのに。
262デフォルトの名無しさん:2010/04/25(日) 10:58:03
>>260
そういう思想で作ってあるって習ったから覚えやすかった
263デフォルトの名無しさん:2010/04/25(日) 14:29:25
@names = ('OZA-', 'POPPO', 'MASZOE');
@mes = ('012345678901234567890123456789', 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ', いいいいい);
例えばこのようなものを、次のように2つのカラムがあるかのように出力したいのですが、どうしたらできるでしょうか?

OZA-   .| 012345678901234567890123
      ...| 456789
POPPO  | あいうえおかきくけこさしすせそたちつてとなにぬ
      ...| ねのはひふへほ
MASZOE .| いいいいい

こんなのでできるかなと思ったのですが無理でした…
format AAA =
@<<<<<<<<<< | @<<<<<<<<<<<<<<<<<<<<
~~        | @<<<<<<<<<<<<<<<<<<<<
.
よろしくお願いします。
264デフォルトの名無しさん:2010/04/25(日) 14:47:40
と思ったらformatでできました。お騒がせしました。
265デフォルトの名無しさん:2010/04/25(日) 19:20:18
>>253
ありがとうございます。すごい勉強になります。

> perl -MEncode -i.BAK -pe "s/(?<=msg=).*/Encode::from_to('こんにちは','sjis','utf8')/e" hoge.txt
だと Modification of a read-only value attempted at C:/Perl/lib/Encode.pm line 195, <> line 280. って叱られるので

perl -MEncode -i.BAK -pe "s/(?<=msg=).*/$s='こんにちは';Encode::from_to($s,'sjis','utf8');$s/e" hoge.txt
でできました!

Jcode使えば少し短くなりました
perl -MJcode -i.BAK -pe "s/(?<=msg=).*/Jcode->new('こんにちは','sjis')->utf8/e" hoge.txt
266デフォルトの名無しさん:2010/04/26(月) 12:59:43
Perlの特殊変数って言っても、使うのは $_ $@ @_ とかほとんどこんなもんだろ。全部覚えてる奴なんてまずいない。
267デフォルトの名無しさん:2010/04/26(月) 14:39:27
最低限:$_ @_ $1〜$9 $a $b
覚えてると便利:$@ $! $. $/ $? $$
ゴルフやるなら:$\ $, $" $& $` $' @F
268デフォルトの名無しさん:2010/04/26(月) 21:46:22
open IN,"file";

while(<IN>){
$str .= $_;
}

file内のテキスト全てを、$strというスカラー変数に代入してみました。
ファイルサイズが小さければ問題ないが何万行とかだと代入処理に失敗しますよね?
269(!>>268):2010/04/26(月) 22:29:11
そういえば数値はスカラに2^1023以上、2^1024未満が入ったけど、
このヘンの上限というか仕様ってどこか載ってます?
270デフォルトの名無しさん:2010/04/26(月) 23:29:24
>>266
それは文法の一部で、特殊変数じゃない
271デフォルトの名無しさん:2010/04/27(火) 02:49:33
>>268
open IN,"file";
read IN,$str,-s IN;
272デフォルトの名無しさん:2010/04/27(火) 03:17:45
use File::Slurp;
$str = read_file('filename');

>>268
メモリあれば大丈夫だよ。ただ毎行 .= すると遅い
273デフォルトの名無しさん:2010/04/27(火) 17:40:54
教えてエロい人

perlはいつからスカラの要素を参照するときに@で参照できるようになったんだ?
my @sca = (1,2,3);
print $sca[1]; // OK...
print @sca[1]; // OK?!
@sca[1] = 'x';
print @sca[1]; // OK?!?!
274デフォルトの名無しさん:2010/04/27(火) 17:49:04
>>273
それスカラじゃなくてたまたま1要素の配列スライス。
配列スライス自体はperl4の昔からすでにあった。
それより前はシラネ
275デフォルトの名無しさん:2010/04/27(火) 17:53:30
my @sca = (1,2,3);
@sca[0..2] = "a".."c";
print @sca[0..2], "\n", @sca[0, 2], "\n", @sca[0];
276273:2010/04/27(火) 18:08:51
>>274,275
なるほど!とんくす!
277デフォルトの名無しさん:2010/04/29(木) 21:10:07
xpでactiveperl v5.8.9を使ってたら、
使えてたスクリプトが急に「問題が発生したため」云々のウィンドウを出して止まるようになった
ファイルが12728あるディレクトリでreaddirをしたのが原因みたい
ファイルの少ないところで使うと問題ない
なんか制限あったっけ
278デフォルトの名無しさん:2010/04/29(木) 21:25:34
違った
260文字あるファイル名のせいだった
279デフォルトの名無しさん:2010/04/30(金) 17:50:08
Perl/Tkで作ったテキストウィジェットに1秒置きに1-10の数字を表示させるにはどうすれば良いですか?
280デフォルトの名無しさん:2010/04/30(金) 22:56:37
281デフォルトの名無しさん:2010/05/05(水) 15:50:31
バッチファイル(hoge.bat)の1行目に
PATH C:\hage;%PATH%
と「挿入」したいんですけど、
ワンライナーでできますか?
できるならやり方を教えてください。
282デフォルトの名無しさん:2010/05/05(水) 16:00:35
open BAT '>hoge.bat'; print BAT 'PATH C:\hage;%PATH%';print BAT <BAT>;
こんな感じ?
283デフォルトの名無しさん:2010/05/05(水) 16:07:04
愚直に
perl -e "open my $FH,'<','hoge.bat';my @l=<$FH>;close $FH;open $FH,'>','hoge.bat';print $FH \"PATH C:\\hage;\%PATH\%\n\",@l;"
284デフォルトの名無しさん:2010/05/05(水) 16:15:23
perl -p0i -e 's/^/PATH C:\\hage;%PATH%\n/' hoge.bat

Windowsだとシングルクオートじゃなくてダブルクオートじゃないとだめなんだっけか
でもこのままやると%PATH%が展開されちゃったりするのか?よくわからんから適当に直してくれ
285デフォルトの名無しさん:2010/05/05(水) 17:13:28
>>284
できました!ありがとう。

perl -i.BAK -p0 -e "s/^/PATH C:\\hage;%%PATH%%\n/" hoge.bat
286デフォルトの名無しさん:2010/05/07(金) 01:58:11
perlのスクリプトを含むWindowsのパッケージを
setup.exe
みたいな塊にまとめたいのですが
何がおすすめでしょうか?
昔単なる実行ファイルだけのときは
innoSetup使ってたけど
287デフォルトの名無しさん:2010/05/07(金) 07:21:30
PAL
Perl2EXE
288デフォルトの名無しさん:2010/05/07(金) 12:04:34
関数の命名でヒントください

「array化」を英語で書くとしたら
「arraylize」「arrailise」「arrailize」、
どれにしたらよいでしょうか?

テキストを読みこんで、それを配列に格納する
というありふれた機能を持つ関数の名前です
下のように使っています

my @list = arraylize ( "list.dat" ) ;

sub arraylize {
my $name = $_[0] ;

open ( FH ,"< $name" ) ;
my @listArray = <FH> ;
close (FH) ;

return @listArray ;
}

他にも、もっと語呂のいい名前があったら教えてください
それ以前に、同じような動作をするものがあったら知りたいです

289デフォルトの名無しさん:2010/05/07(金) 12:16:00
いきなりファイル名でというのは知らないけど、強いて言えば
IO::Handleのgetlinesが近いかなぁ。

本題とは関係ないが、せめてopenのエラー処理( or die $!
をつける程度でいいよ)はやっとけ。後で苦労するぞ。
290デフォルトの名無しさん:2010/05/07(金) 12:27:01
「ファイルを読み込んで配列を返す」処理につける名前にしちゃ arraylize は筋が悪いな
readfile なり readlines なりでいいだろ

どうしても array が重要だっつーんなら make_array
291デフォルトの名無しさん:2010/05/07(金) 12:30:10
まんまでいいなら、file2array
292デフォルトの名無しさん:2010/05/07(金) 12:35:40
sub arraylize {
my $name = shift ;

open ( my $fh ,"<", $name ) ;
my @listArray = <$fh> ;
close ($fh) ;

return @listArray ;
}


関係ないけど
293デフォルトの名無しさん:2010/05/07(金) 12:39:50
>「arraylize」「arrailise」「arrailize」
l はどっから出てきたんだよ
294デフォルトの名無しさん:2010/05/07(金) 13:18:58
セパレータが指定されたら split した配列を返したり、
配列だったらそのまま返したり、
ハッシュだったら key/value をセパレータで繋げた配列を返したり・・・
そこまでやって、初めて arraylize を名乗っていい。
そう思うんだ。

どうでもいいけど
295デフォルトの名無しさん:2010/05/07(金) 13:37:18
to_arrayじゃダメなん?
296デフォルトの名無しさん:2010/05/07(金) 14:12:49
ありがとうございます
単純にfile2arrayにします

エラー処理や
ファイルハンドルに$fh、
そこのところ貰います
297デフォルトの名無しさん:2010/05/07(金) 14:42:16
my %tmp;
@tmp{qw(foo bar baz)} = split(/,/, $_, 3);
push(@result, \%tmp);

みたいなコードがあるんですが、これを %tmp を使わずに一行で済ます書き方ってあるでしょうか。
mapあたりでできそうなんだけど思いつかない…
(foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
298デフォルトの名無しさん:2010/05/07(金) 14:51:29
>>288
わざわざ作らんで

use File::Slurp;
my @list = read_file("list.dat");

しなよ。
299デフォルトの名無しさん:2010/05/07(金) 14:58:34
>>297
> (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。

List::MoreUtilsになにかあるんじゃ
300デフォルトの名無しさん:2010/05/07(金) 15:01:31
perl -e "print ((qw(foo bar baz),split(/,/, 'xxx,yyy,zzz'))[map{$_,$_+3}(0..2)]);
fooxxxbaryyybazzzz
あんまやるもんじゃないな
301デフォルトの名無しさん:2010/05/07(金) 16:11:01
頭がおかしくなりそうだ
TMTOWTDIと言うけど、杉樽歯泳場猿画五都市と言う名言もあるし
302デフォルトの名無しさん:2010/05/07(金) 16:17:03
>>297

use List::MoreUtils qw(zip);

$_ = '1,2,3';
push @result, {zip @{[qw(foo bar baz)]}, @{[split /,/, $_, 3]}};
303デフォルトの名無しさん:2010/05/07(金) 16:23:58
>>299
おお! と思って List::MoreUtils の pairwise や mesh が使えるかと思って試してみました。
が、一旦変数に入れないとARRAYとして解釈してくれずダメでした…

#NG
print mesh qw(foo bar baz), (split(/,/, "1,2,3")); # compilation errors

#OK
my @array1 = qw(foo bar baz);
my @array2 = split(/,/, "1,2,3");
print mesh @array1, @array2;
304デフォルトの名無しさん:2010/05/07(金) 16:25:12
>>302
入れ違いになりました。
素晴らしい。使わせていただきます。ありがとうございます。
305デフォルトの名無しさん:2010/05/07(金) 16:35:48
>>297
>(foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
変数一つ作っていいならこんな関数かな

my @arr = ('foo', 'bar', 'baz', 1, 2, 3);
my $half = $#arr / 2;
my @result = map { +($arr[$_], $arr[$_ + $half + 1]) } (0 .. $half);
306デフォルトの名無しさん:2010/05/07(金) 17:07:39
>>302
いったん無名配列への参照[]にして
それを@{}で、参照先の配列に戻して渡している
という理解でいいのかな?
307デフォルトの名無しさん:2010/05/07(金) 17:10:34
308デフォルトの名無しさん:2010/05/07(金) 17:12:08
>>305
なんで3行で済ます方法を書いたの?
309デフォルトの名無しさん:2010/05/07(金) 17:14:06
>>308
二行だろ
310デフォルトの名無しさん:2010/05/07(金) 17:18:09
>>308
何揚げ足とろうとしてんのw
311デフォルトの名無しさん:2010/05/07(金) 17:32:43
perl -e "print join',', map{(qw(foo bar baz))[$_],(split /,/, 'xxx,yyy,zzz')[$_]}(0..999);#十分に大きい値
foo,xxx,bar,yyy,baz,zzz
>>300よりはマシかなあ…
312デフォルトの名無しさん:2010/05/07(金) 17:51:55
>>305
sub zip{ map { $_, shift @{$_[1]} } @{$_[0]} }
print zip [1,2,3],[4,5,6] ;

313デフォルトの名無しさん:2010/05/07(金) 18:02:25
perl -e '@array = qw/xxx yyy zzz 1 2 3/; print map { $array[$_] => $array[$_ + @array / 2] } (0..($#array / 2));'
314デフォルトの名無しさん:2010/05/07(金) 21:28:38
>>293
ヒント:シノラー
315デフォルトの名無しさん:2010/05/07(金) 22:52:02
TwitterのAPI叩くにはどうすればいいですか
Net::Twitterとかじゃなくて、純粋にHTTP使ってその辺から学習したいのです
316デフォルトの名無しさん:2010/05/07(金) 23:18:20
317デフォルトの名無しさん:2010/05/07(金) 23:51:12
use Net::Twitter;
役にたたなかった
318デフォルトの名無しさん:2010/05/08(土) 19:37:45
win32でパスを含めて 256 バイト以上のファイル
http://www.namazu.org/ml/namazu-win32-users-ja/msg01951.html

この問題ってもう解決されています?
319デフォルトの名無しさん:2010/05/11(火) 00:00:10
Perlのファイル読み込みと配列格納について質問があります。
エクセルから出力した行列状態になっているcvsファイルをPerlに読み込ませて、
@a、@b、@cにそれぞれの行のデータを格納したいです。
なので、二次元配列のようなことをしないといけないと思うのですが、
Perlで二次元配列のような処理をするにはどうすればよいのでしょうか?
また行列状態になっているファイルを配列に格納する他の良い方法はありますでしょうか?
よろしくお願いします。

320319:2010/05/11(火) 00:14:07
追記です。このような内容のファイルを扱っています。

1 Takehara Shinji 500 600 1300
2 Hatakeyama Takanori 569 795 1560
3 Kouki Kameda 785 889 2695
4 Daiki Kameda 758 784 9000
5 Tomoki Kameda 580 120 984

そして、左から4行目〜6行目にある数値を縦に、
@a、@b、@cに格納し、
$a[0] を参照すると、500
$a[1] を参照すると、569
$b[0] を参照すると、600
$b[1] を参照すると、795
$c[0] を参照すると、1300
$c[1] を参照すると、1560
といった具合にしたいです。
321デフォルトの名無しさん:2010/05/11(火) 00:16:24
>>319
・「perl 配列の配列」でググる
・「perl CSV」でググる
322デフォルトの名無しさん:2010/05/11(火) 00:40:12
>>320

1 #! /usr/bin/perl
2
3 use strict;
4
5 my(@data, @array);
6 @data = (
7    '1 Takehara Shinji 500 600 1300',
8    '2 Hatakeyama Takanori 569 795 1560',
9    '3 Kouki Kameda 785 889 2695',
10    '4 Daiki Kameda 758 784 9000',
11    '5 Tomoki Kameda 580 120 984',
12 );
13
14 foreach(@data){
15    push(@array, [@{[split(/\s+/, $_)]}[3..5]]);
16 }
17
18 local $\ = "\n";
19
20 print $array[0][0]; #=> 500
21 print $array[1][0]; #=> 569
22 print $array[0][1]; #=> 600
23 print $array[1][1]; #=> 795
24 print $array[0][2]; #=> 1300
25 print $array[1][2]; #=> 1560
323デフォルトの名無しさん:2010/05/11(火) 01:17:33
>>322
ありがとうございます。
外部からファイルを読み込む場合はどうすればよいのでしょうか?
324321:2010/05/11(火) 01:45:17
>>323
だから「perl CSV」でググれと教えたのに。ググれば
”csvファイルを読み込んで配列の配列に変換に変換する”
ttp://d.hatena.ne.jp/perlcodesample/20080728/1217336230
こんくらいすぐに出てくるだろ
325デフォルトの名無しさん:2010/05/11(火) 01:51:03
>>322を改良できんレベルの人なら>>324のリンク先飛んでもイミフだろ
326デフォルトの名無しさん:2010/05/11(火) 01:53:57
>>323
use IO::File;
my @data = IO::File->new('data.txt', 'r')->getlines;
chomp @data;
327デフォルトの名無しさん:2010/05/11(火) 02:04:22
use File::Slurp;
my @csv = read_file('hoge.csv');
chomp @csv;
328デフォルトの名無しさん:2010/05/11(火) 02:19:44
>>322
[@{[split(/\s+/, $_)]}[3..5]]

[(split /\s+/, $_)[3..5]]
のほうがいいよね。この場合に限れば /\s+/, $_ が無くてもよし。

つーかCSVなら最初からText::CSV(_XS)?使えばいいじゃんって話だけど。
329デフォルトの名無しさん:2010/05/11(火) 02:46:24
>>328
おお、/\s/まで省略できるのか
初めて知った
ありがt
330デフォルトの名無しさん:2010/05/11(火) 03:42:18
$_ = " foo\nbar\tbaz" としたとき、
split(/\s+/) だと ('', 'foo', 'bar', 'baz') が返るけど、
引数なしのsplit または split(" ") なら ('foo', 'bar', 'baz') になるってことだけ注意な。
331デフォルトの名無しさん:2010/05/12(水) 01:12:21
HTTP通信するにはなんていうライブラリつかえばいいの
332デフォルトの名無しさん:2010/05/12(水) 02:31:39
socks
333デフォルトの名無しさん:2010/05/12(水) 13:31:19
えっ?
334デフォルトの名無しさん:2010/05/12(水) 13:35:41
LWP
335デフォルトの名無しさん:2010/05/12(水) 15:27:05
コードポイントからその文字を出力したいです。
#!/usr/bin/perl
use strict;
use utf8;
use Encode;
use Encode::Guess;

my $cp = "4FAE"; # 「侮」のコードポイント
my $packed = pack("S", $cp);

my $decoded = decode("utf-16be", $packed);
print $decoded, "\n";

my $decoded = decode("utf-16le", $packed);
print $decoded, "\n";

できないです。
336デフォルトの名無しさん:2010/05/12(水) 15:58:56
pack("U", 0x4FAE) じゃだめなのか
337デフォルトの名無しさん:2010/05/12(水) 16:16:02
0x4FAE または hex("4FAE") または "20398"
338デフォルトの名無しさん:2010/05/12(水) 16:22:45
#!/usr/bin/perl
use strict;
use utf8;
use Encode;
use Encode::Guess;

my $cp = "4FAE"; # 「侮」のコードポイント
my $packed = pack("U", hex($cp));
print $packed, "\n";

ありがとうできました。でもwarningがでます。
$ perl cptest2.pl
Wide character in print at cptest2.pl line 9.

$
339デフォルトの名無しさん:2010/05/12(水) 16:28:58
16進文字列からバイト列への変換が間違ってるな。

pack("S", $cp)じゃなくてpack("H*", $cp)だろ。
340デフォルトの名無しさん:2010/05/12(水) 16:32:44
>>338
wide characterをいきなりprintするとそうなる。

encodeしてバイト文字列にしてからprintするか、
printする前に文字コード指定してレイヤつけとけ。

binmode STDOUT, ':encoding(utf-8)';
341デフォルトの名無しさん:2010/05/12(水) 16:34:59
binmodeつけたら直りました。
ありがとうです。
342デフォルトの名無しさん:2010/05/13(木) 12:34:03
http://www.cgarbs.de/japana.en.html
これをwindowsで動かせた人いますか?
perlのファイル1つだけのプログラムだからlinuxで動かすのは簡単だったんだけど
windowsではうまく動いてくれない
343デフォルトの名無しさん:2010/05/14(金) 13:21:02
文字のバイトコードを得るほうほうを教えてください!
たとえば、a から 97 を得るようなことってできますか??
344デフォルトの名無しさん:2010/05/14(金) 13:23:28
ord("a")
345デフォルトの名無しさん:2010/05/14(金) 13:26:10
ありがとう!
346デフォルトの名無しさん:2010/05/15(土) 03:08:54
perlで文字をprint等で出力するとき、特定の行で改行をして出力するというようなことってできますか?
347デフォルトの名無しさん:2010/05/15(土) 03:32:34
できるよ安心して
348デフォルトの名無しさん:2010/05/15(土) 03:44:17
>>347
安心した
やり方を教えてちょ
349デフォルトの名無しさん:2010/05/15(土) 04:42:20
何だよ「特定の行」って
350デフォルトの名無しさん:2010/05/15(土) 06:11:15
質問の意図するところが分からない。このうちのどれか?
use strict; use warnings; print "is\nthis\nunko?\n";

use strict; use warnings; print << "END_OF_UNKO";
this
is
unko!
END_OF_UNKO

use strict; use warnings; use HTML::Template;
my $what_is_this = join "", <DATA>;
my $t = HTML::Template->new( scalarref => \$what_is_this );
$t->param('var', "was");
print $t->output;
__DATA__
this
<TMPL_VAR name="var">
unko!
351デフォルトの名無しさん:2010/05/15(土) 06:50:15
>>348

use IO::File;

my $fh = IO::File->new('hoge.txt', 'r');

while(my $line = $fh->getline){
print $line;
print "\n" if $line =~ /hoge/;
}

こんな漢字?
352デフォルトの名無しさん:2010/05/15(土) 09:22:29
$. == 行番号 とか。
353デフォルトの名無しさん:2010/05/15(土) 11:21:19
perlで作った掲示板の連続投稿を制限する方法を教えてください。
一定時間が経過するまで再投稿できないようにしたいです。
354デフォルトの名無しさん:2010/05/15(土) 11:59:34
投稿者のIDに対して最後の投稿時間を記録する
355デフォルトの名無しさん:2010/05/15(土) 12:24:13
小規模ならグローバルでもいいんじゃないの?

# 30秒経過してない場合returnする
return if $g_last_post + 30 > time;
$g_last_post = time;
356デフォルトの名無しさん:2010/05/15(土) 14:35:57
>>353
IPのログはとってんだろ?
そこから判定すりゃいい
samba24みたいな手にするって方法もあるな
ちょっと技術がいるかも知れないが
357デフォルトの名無しさん:2010/05/15(土) 14:55:21
普通はそんなめんどいことしないでクッキー食わせて判定だと思うぜ
358デフォルトの名無しさん:2010/05/15(土) 15:04:37
ログは巨大だからなあ
自前でテーブル持つ方が軽い
359デフォルトの名無しさん:2010/05/15(土) 15:21:54
いやだから普通はクッキーだろっての
360デフォルトの名無しさん:2010/05/15(土) 15:55:01
↑バカは喋るな
361デフォルトの名無しさん:2010/05/15(土) 15:58:24
>>359
クライアントが書き込み後にクッキー捨てたらアウトだと思うんだがそうでもないのか
もうちょっと詳しく
362デフォルトの名無しさん:2010/05/15(土) 16:01:51
>>349-352
長いテキストがあり、100文字目ごとに改行を入れるということです。
分かりにくくて申し訳ありませんでした。
363デフォルトの名無しさん:2010/05/15(土) 16:17:33
2chもクッキーだな
364デフォルトの名無しさん:2010/05/15(土) 16:27:54
>>362
Text::LineFold

>>353,354-359,361,363
板違い http://pc11.2ch.net/php/
365デフォルトの名無しさん:2010/05/15(土) 16:29:03
366デフォルトの名無しさん:2010/05/16(日) 21:25:10
funcA();
if(hoge){ funcAErr(); }
else
{
 funcB();
 if(fuga){ funcBErr(); }
 else
 {
  funcC();
  if(fuga){ resultA(); }
  else{ resultB(); }
 }
}

こんな感じで事前処理にこけたら弾き、を繰り返して最後の処理で結果Aか結果Bのいずれかを返す、
と言ったコードがあるんですが、これをもっとPerlらしくシンプルに書きたいんだがどう書けばいいだろう……。
(ifネストが実際には3階層ではなく20階層くらいあります)
367デフォルトの名無しさん:2010/05/16(日) 21:43:55
>>366
funcA() や funcB() の戻り値は無いのかとか、hoge や fuga が何を判定してるのかとか、
funcAErr() でなく funcErr('A') じゃダメなのかとか、エラー処理後に戻ってくる (if then else
で括る) 必要があるのかとか、Perlらしさ以前の問題だと思う。
368デフォルトの名無しさん:2010/05/16(日) 21:45:08
こんな感じの改造すれば良いんちゃう?
my @tasks = (
 sub { () }, # <= funcA() とかが入る。
 sub { () },
 sub { () },
 sub { () },
 sub { () },
 sub { () },
 sub { 42 }
);

my $argument ;
for ( @tasks ){
 my $flag = $_->( $argument ) ;
 next if ! $flag ; # エラー処理やりたきゃ、ここを真面に。
 print qq{${flag}hoge\n} ;
 last ;
}
369デフォルトの名無しさん:2010/05/16(日) 22:25:07
>>366
エラー処理はfuncA()、funcB()の中で例外発生させて
全体をevalブロックでくくり、例外をキャッチして処理
エラー以外の分岐は適当に処理をブロックでくくり、last、redoなどでコントロール

eval {
 funcA();
 funcB();
 {
  funcC();
  if (fuga) { resultA(); last }
  resultB();
 }
};
if ($err = $@) {
 $err->A ? funcAErr() :
 $err->B ? funcBErr() :
 $err->C ? funcCErr() : Err();
}
370デフォルトの名無しさん:2010/05/16(日) 22:49:10
メールを受信して、添付の画像ファイルを画像処理し、サーバに保存したいと考えています。
メール受信時に本プログラムにメールを渡すようにメールサーバは設定しています。
以下ソースの関係している部分です。
----mailimage.pl-----
my $parser = MIME::Parser->new;
#ファイルの一時保存場所を指定
$parser->output_dir('./tmp');
$filename='';
#標準入力からメールを取得
my $entity = $parser->parse(*STDIN);
#添付ファイルがある場合のみ処理
if($entity->is_multipart){
#パートの数(本文と添付ファイルの合計数)
$count = $entity->parts;
#メール本文以外(添付のみ)を取り出し(本文は0番目のため、一番目から取り出し)
for($i = 1; $i < $count; $i++){
#ファイル名を含むパスを取り出し
$path = $entity->parts($i)->bodyhandle->path;
#ファイル名を取り出し
$filename =time. (fileparse($path))[0];
$filenameglobal=$filename;
`./out1 $path outputimg/$filename.bmp`;
}
}
out1というプログラムが画像処理を行うファイルで、第一引数に入力を、第2引数に出力先をとるように作成しています。
mailimage.pl < sample.eml
といった具合に、ローカル環境でeメールファイルを渡してやった場合は正常に動作します。
しかし、実際にメールを受信するとtmpファイルへの保存は行われるのですがout1で得られるべき出力画像が得られません。
どうやら、tmpフォルダに保存される前にout1を呼び出しているようで、入力がない状態になってしまっているようです。
解決策のご提示をよろしくお願いいたします。
また、一度ファイルに保存することなく直接メモリ上で受け渡す方法などもご提示いただけると幸いです。
371デフォルトの名無しさん:2010/05/17(月) 01:35:34
perl から任意のアプリ(例えばメモ帳)を起動したいんだけどどう書けば良いのでしょうか?
372デフォルトの名無しさん:2010/05/17(月) 01:49:44
perl -e "`notepad`
373デフォルトの名無しさん:2010/05/17(月) 22:55:18
cpan> install XML::Atom
*********いろいろ展開されて

Please download the file manually, save it to a directory in %PATH% (e.g.
C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to
that directory, and run "Nmake15.exe" from there; that will create the
'nmake.exe' file needed by this module.

You may then resume the installation process described in README.

-------------------------------------------------------------------------------
Warning: No success on command[C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site]
MIYAGAWA/XML-Atom-0.37.tar.gz
C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site -- NOT OK
Running make test
Make had some problems, won't test
Running make install
Make had some problems, won't install
Failed during this command:
MIYAGAWA/XML-Atom-0.37.tar.gz : writemakefile NO 'C:\Perl\bin\perl.exe Makefile.PL INSTALLDIRS=site' ret
urned status 512

cpan>
と表示されてしまいました。とりあえず、nmake.exe はダウンロードしました。
これからどうすればいいでしょうか?
374デフォルトの名無しさん:2010/05/18(火) 00:12:07
>>373
今使ってるperlをアンインストールしてActivePerlの最新版をインストールし、PPMを使え
375デフォルトの名無しさん:2010/05/18(火) 00:23:08
うちcpanが成功した試しがないわ
ppmならokだけど
376デフォルトの名無しさん:2010/05/18(火) 05:28:00
XS系はことごとく失敗する気がする…
特にXMLやHTMLのパーサー関連は入らん at Ubuntu
377デフォルトの名無しさん:2010/05/18(火) 06:13:44
まさかbuild-essential入れてないとかじゃないよな
378デフォルトの名無しさん:2010/05/18(火) 06:45:12
XML-Atomはppmに無いからめんどくさいんだよな
だから俺は使ってない
あとこいつマルチだな
379デフォルトの名無しさん:2010/05/18(火) 08:46:53
今ならStrawberry Perl入れた方が楽じゃない?
XML::Atomもすんなり入ったよ
380デフォルトの名無しさん:2010/05/18(火) 08:55:06
そもそもwindows系OSでperl使うのがすでに茨の道とも言える
381デフォルトの名無しさん:2010/05/18(火) 10:03:01
なんで?
382デフォルトの名無しさん:2010/05/18(火) 11:48:53
>>378
リポジトリにこれ加えとけ。
http://trouchelle.com/ppm10/package.xml
383デフォルトの名無しさん:2010/05/18(火) 12:20:10
elseifでなく何故elsifなんですか?
384デフォルトの名無しさん:2010/05/18(火) 13:26:56
母音が続くのが気持ち悪いから

elifじゃないのと聞かれたら解答に窮するが、CPPはelifなんだよな
文化によって多少違いはあるが、やはり、母音が続くのが気持ち悪いんだと思う
385デフォルトの名無しさん:2010/05/18(火) 13:55:38
いっそのことelfでいいじゃん。
短いし。
386デフォルトの名無しさん:2010/05/18(火) 15:33:01
最近プログラミングの勉強を始めました

print "hello world";

と書いてhello.plで保存し、ターミナルで

perl hello.pl

と入力するのはわかったんですが、hello.plはどこに保存すればいいのですか?
環境はMac OS Xです
387デフォルトの名無しさん:2010/05/18(火) 16:10:27
>>386
好きな場所
388デフォルトの名無しさん:2010/05/18(火) 16:28:15
>>386
今自分がいる場所におけばいい
違う場所に置きたいならフルパスで指定すれば実行できる
389デフォルトの名無しさん:2010/05/18(火) 16:41:23
>>382
サンクス
つか、ppmguiにリポジトリのサジェストなんてあったんだな
そこにも載ってたわ
重ねてサンクス
390デフォルトの名無しさん:2010/05/18(火) 17:56:24
>>386
perlの前にターミナルの使い方を覚えるためのBash入門を読んだ方が良いかも。
391デフォルトの名無しさん:2010/05/18(火) 18:42:40
それは的外れなアドバイス
392373:2010/05/18(火) 21:37:27
ATOM::XML をWinXP/Active Perl に入れたい
なにかヒントありますか?
>>374
>>375
>>379
ストロベリー入れましたけど、Activeパールと同じエラーです。
(nmake をダウンロードして、ダウンしたパッケージをmake して、
それから、再度ACTIVE Perl で,ATOM::XMLしたときとです。
やはり、パッケージが問題なのかな?
cpan> install ATOM::XML
Fetching with LWP:
http://cpan.strawberryperl.com/authors/01ma
Fetching with LWP:
http://cpan.strawberryperl.com/modules/02pa
Fetching with LWP:
http://cpan.strawberryperl.com/modules/03mo
Creating database file ...

Gathering information from index files ...
Populating database tables ...
Done!
Warning: Cannot install ATOM::XML, don't kn
Try the command

i /ATOM::XML/

to find objects with matching identifiers.
393デフォルトの名無しさん:2010/05/18(火) 21:44:02
現在 WinXP上にActivePerlが入っています。StrawberrryPerlを入れて共存できるのでしょうか?
394デフォルトの名無しさん:2010/05/18(火) 21:49:59
エラーメッセージくらい読めよ
395デフォルトの名無しさん:2010/05/18(火) 21:52:02
普通に考えるとパッケージ名ってAtom::XMLもしくはXML::Atomだからでは
396373:2010/05/18(火) 21:57:06
とりあえず、
install XML::Atom::Feed
とすると、したみたいになった。これってATOM::XML ってインストールできたのかな
Prepending C:\strawberry\cpan\build\XML-Atom-0.37-H4btN8/blib/arch C:\strawberry
\cpan\build\XML-Atom-0.37-H4btN8/blib/lib to PERL5LIB for 'install'
Installing C:\strawberry\perl\site\lib\XML\Atom.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Base.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Category.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Client.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Content.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Entry.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\ErrorHandler.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Feed.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Link.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Person.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Server.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Thing.pm
Installing C:\strawberry\perl\site\lib\XML\Atom\Util.pm
Appending installation info to C:\strawberry\perl\lib/perllocal.pod
MIYAGAWA/XML-Atom-0.37.tar.gz
C:\strawberry\c\bin\dmake.EXE install UNINST=1 -- OK
cpan>
397デフォルトの名無しさん:2010/05/18(火) 22:13:16
perlで添付ファイル取得して、それをopencvに渡して結果を保存したいんだが、出来ない。
ローカルでemlファイル読み込ませるといけるのに、メール受信をトリガに起動するとだめだ・・。
どうして?
398デフォルトの名無しさん:2010/05/18(火) 22:32:58
>>396
OKってかいてありますやん

心配なら
$ perldoc XML::Atom
399デフォルトの名無しさん:2010/05/18(火) 22:34:23
>>396
XML::Atom と ATOM::XML は全く別のモジュールだ。
(存在すればの話しだが)
お前さんが、いくら XML::Atom を入れたとしても、
ATOM::XML は永久に入らん。


気持悪いったらありゃしない。
400デフォルトの名無しさん:2010/05/19(水) 12:22:56
アハハハ
401デフォルトの名無しさん:2010/05/19(水) 14:46:33
たとえば、[[:ascii:]]から'<'を除いた文字クラスを表わすにはどうしたらいいでしょうか?
402デフォルトの名無しさん:2010/05/19(水) 18:51:09
もともと入ってないやん
403デフォルトの名無しさん:2010/05/21(金) 21:53:00
数百のファイルを処理するPerlスクリプトがありまして、それがシーケンシャルに処理してて
クソ時間がかかるため、マルチスレッドでやらせようとPerlについて勉強しています。
で、いまんとこ、セマフォで並列処理数を制御し、joinするためだけのスレッドを動かして
かたっぱしからjoinするようにしています。おかげで処理時間は半分以下になったのですが、
これを添削していただけないでしょうか。もっとエレガントなやり方があれば教えていただきたいです。
よろしくおねがいします。

#!/usr/bin/perl
use strict;
use File::Basename;
use File::Path;
use threads;
use threads::shared;
use Thread::Semaphore;

use Codemap;
use SVG;

my $concurrency = 5;
my $semaphore = Thread::Semaphore->new($concurrency);
my $exitflag :shared = 0;
my $jointhreads = threads->new(\&joinThreads);

while (@ARGV) {
my $orig_svg = shift(@ARGV);
$semaphore->down;
threads->new(\&doSplit, $semaphore, $orig_svg);
}
$exitflag = 1;
$jointhreads->join;
exit 0;
404403のつづき:2010/05/21(金) 21:53:56

sub joinThreads {
until ($exitflag) {
foreach my $thr (threads->list) {
if ($thr->tid and !threads::equal($thr, threads->self)) {
$thr->join;
}
}
print "\nThreads joined.\n";
}
}

sub doSplit {
my $semaphore = shift;
my $orig_svg = shift;

my $svg = new SVG($orig_svg);
$svg->setdumpdir("work.d");
if ($svg->modtime() > $svg->splittime()) {
$svg->dump();
print STDERR " $svg->{filename} : splitted\n"
} else {
print STDERR " $svg->{filename} : SKIP\n"
}
$semaphore->up;
}
405デフォルトの名無しさん:2010/05/22(土) 14:07:11
UTF8の〜をshift_jis(cp932)に変換して出力するとエラーが出てしまいます。
解決策があれば教えていただきたいです。
環境はWindows 7 64bitとActivePerl v5.10.1 64bitです。

use utf8;
binmode STDOUT, ":encoding(cp932)";
print "昨日は10時〜6時まで寝た。\n";

D:\>test.pl
"\x{301c}" does not map to cp932 at D:\test.pl line 3.
昨日は10時\x{301c}6時まで寝た。
406デフォルトの名無しさん:2010/05/22(土) 14:20:39
D:\>test.pl

何故こんなところで作業しているのか
407デフォルトの名無しさん:2010/05/22(土) 14:54:09
「〜」には
FULLWIDTH TILDE (FF5E)
WAVE DASH (301C)
の二種類がある。
408デフォルトの名無しさん:2010/05/22(土) 14:57:40
〜の厄介さはMacを使ってるとよく分かる
409デフォルトの名無しさん:2010/05/22(土) 16:10:32
macでなくても〜は厄介
410デフォルトの名無しさん:2010/05/22(土) 16:13:53
Macだとプログラムとか使わなくても
普段から〜が厄介になる
411デフォルトの名無しさん:2010/05/22(土) 16:15:49
え?

俺は生粋のマカーだけど、厄介さが全然分からん。
何かトラブるっけ? "〜"って。
Mac<=>Winのデータ交換とかの話し?
412デフォルトの名無しさん:2010/05/22(土) 16:21:41
Macで〜と書き込んだら
Winだと逆向きの波線に見えたり
最近は大丈夫な気はするが
413デフォルトの名無しさん:2010/05/22(土) 16:31:53
〜が厄介なんて、OS9時代の話だろ。
昔から機種依存文字問題とか、今はUTF8-macとUTF-8とか
もっと厄介なモンがあるから。
414デフォルトの名無しさん:2010/05/22(土) 16:54:16
OSXでの話だが
415405:2010/05/22(土) 17:06:03
皆さんレスありがとうございます。

>>405はmeadowから打ち込んだ〜は\x{301c}となり、
notepad等から打ち込んだ〜は\x{ff5e}になる事が原因で表示に失敗していました。
\x{301c}はshift_jisでは表示に成功しcp932では失敗しました。
\x{ff5e}はcp932では表示に成功しshift_jisでは失敗しました。

どうやらeucとsjisの〜はutf8の\x{301c}に対応していて
cp932の〜はutf8の\x{ff5e}に対応しているようでした。
なので例えばeucの〜をutf8に変換し、それをcp932に変換すると失敗するようです。

挙動がおかしいと思った元のプログラムではネット上にあるeucのページを取ってきて
utf8に変換し出力時にcp932に変換していたので上記の理由で文字化けしていた様です。
そこでeucをutf8に変換した際に\x{301c}を\x{ff5e}に変換するようにしました。
$utf8data =~ tr/\x{301c}/\x{ff5e}/;
そうしたところprintした際に"\x{301c}" does not map to cp932というエラーも出ず、無事〜が表示されるようになりました。
416デフォルトの名無しさん:2010/05/22(土) 17:10:30
意味不明
417デフォルトの名無しさん:2010/05/22(土) 19:23:59
>>405
use utf8は「フツーは使うな」とCPANに書いてあった気がする。
Windowsを呪いながらEncode使え。

#!perl
use Encode;

my $msg = "昨日は10時〜6時まで寝た。\n";
Encode::from_to($msg, 'utf8', 'cp932');

print $msg;
418デフォルトの名無しさん:2010/05/22(土) 19:39:43
>use utf8は「フツーは使うな」
理由は?
419デフォルトの名無しさん:2010/05/22(土) 20:34:20
>>417
>use utf8は「フツーは使うな」とCPANに書いてあった気がする。
どこに書いてあったの?聞いたことない
420デフォルトの名無しさん:2010/05/22(土) 21:01:51
> Do not use this pragma for anything else than telling Perl that your script is written in UTF-8.
もしかしてこれの事か?
421デフォルトの名無しさん:2010/05/22(土) 21:08:00
>>417
そのEncodeの作者が
>スクリプトはUTF-8で書き、use utf8;するのがモダンPerlのあり方です。
って言ってるけどな。
ttp://blog.livedoor.jp/dankogai/archives/51221731.html
422デフォルトの名無しさん:2010/05/22(土) 22:19:22
文字列の切り取りに関して質問があります。
$a="aho";
$b="baka";
$str="ahomanukebaka";
$strには$aと$bで"manuke"という文字が挟まれています。
このとき$strからmanukeだけを切り抜くにはどうすればよいでしょうか?
423デフォルトの名無しさん:2010/05/22(土) 22:24:54
 substr($str, length($a), length($str)-length($a.$b));
424デフォルトの名無しさん:2010/05/22(土) 22:48:06
>>422
my $a1 = "aho";
my $b1 = "baka";
my $str = "ahomanukebaka";

$str =~ s/$a1(.*)$b1/$a1$b1/;

warn $str; # ahobaka
warn $1; # manuke
425デフォルトの名無しさん:2010/05/22(土) 23:01:54
失敗してるのに前の$1を読んでしまう
426デフォルトの名無しさん:2010/05/22(土) 23:16:31
>>425
あぁ、ごめん。本当はifとかやるけどmanukeが必要なのかどうなのかわからなくて
とりあえず$1に入ってるよって言いたかった
427デフォルトの名無しさん:2010/05/22(土) 23:22:02
>>424
できましたありがとうございます!
428417:2010/05/23(日) 01:13:47
>>420
それだ。
WWW::Mechanizeでcp932受け付けんからEncode::decode_utf8($massage)とかやってたのに、
use utf8だけで済んだのか・・・・クソアホみたいだわorz
429デフォルトの名無しさん:2010/05/23(日) 13:00:16
正規表現のグルーピングについて質問です
繰り返し表れる対象をグループ化したいのですが良いやり方ありますか?
gオプション付けたら行けるかと思ったらダメだった。

my $str = << 'END';
aba

aca

ada

END

$str =~ m{(a[^a]a)\n\n}g; # これだと初めの対象にしかマッチしない
430デフォルトの名無しさん:2010/05/23(日) 13:23:18
>>429
g(global?)オプションだけでなく
m(multi line?)オプションもいるんじゃなかったっけ
431デフォルトの名無しさん:2010/05/23(日) 13:27:20
>>429
こう?

my @matches = $str =~ m{(a[^a]a)\n\n}g;
432デフォルトの名無しさん:2010/05/23(日) 13:32:54
>>430
$str =~ m{(a[^a]a)\n\n}mg;
これも試したけどダメだったんだよね

>>431
おぉ。いけました。
ちなみに=と=~を一緒に書くとわかりにくいので別にする方法ってありますか?
普通のマッチの場合、下みたいに分けたりしてるのだけどそういう方法があれば教えてください
warn $1 if $str =~ m{(a[^a]a)\n\n}g;
433デフォルトの名無しさん:2010/05/23(日) 13:41:44
>>432
ifをwhileに変えるだけ

warn $1 while $str =~ m{(a[^a]a)\n\n}g;
434デフォルトの名無しさん:2010/05/23(日) 13:59:57
gオプションが付いても付かなくても
正規表現に括弧がひとつしかないから、$2と$3は未定義。
ループを回すたびに$1の内容が変わる。
435デフォルトの名無しさん:2010/05/23(日) 14:09:01
my @matches;
push @matches, $1 while $str =~ m{(a[^a]a)\n\n}g;
436デフォルトの名無しさん:2010/05/23(日) 14:25:05
while m//g とか while each %hash って気持ち悪いな
437429:2010/05/23(日) 14:34:43
>>433-435
なるほど!ありがとうございます。while使うのかぁ。知らなかった。
perldoc perlreに書いてあるのかなぁって探してみたら書いてあった。勉強になりました。
@matches = ( 'foo' =~ m{ o? }xg );

or

print "match: <$&>\n" while 'foo' =~ m{ o? }xg;
せっかくなのでついでにもう一つ質問ですが、>>430みたいにm付けた場合もやり方がありますか?
438デフォルトの名無しさん:2010/05/23(日) 14:59:38
>>437
ないと思う
mは^と$の意味が変わるだけだった気がする
439デフォルトの名無しさん:2010/05/23(日) 15:51:17
なんか改行コードだけ特別扱いなんだよな
440デフォルトの名無しさん:2010/05/23(日) 22:00:35
Perlのif文で質問があります。とあるデータ文書からPerlを使って情報を抜き出しているのですが、
情報1、情報2というのが存在して、情報1にヒットしたときは、情報1と情報2を出力、
情報1にヒットしないときは、無視というような判定をするにはどうすればよいのでしょうか?
441デフォルトの名無しさん:2010/05/23(日) 22:09:09
perlに関係ないような気がするけど、こういう意味じゃないの?
if (情報1にヒット) {
  print 情報1;
  print 情報2;
}
442デフォルトの名無しさん:2010/05/23(日) 22:12:57
>>441
データ文書の情報1と情報2が別々のところに記載されていてそれができないのです。
元データ文書を晒すので少々お待ちください。
443デフォルトの名無しさん:2010/05/23(日) 22:24:18
両方揃ってから判断するのだ
444デフォルトの名無しさん:2010/05/23(日) 22:32:12
このデータ文書ファイルです。
http://uploader.moe.hm/cgi-bin/upload.cgi?mode=dl&file=2067 パス:perl

内容として作家情報と執筆した作品の情報が記載されています。
このファイルでは3名しか載っていませんが、実ファイルは世界中の作家情報が載っているので、
数万単位で同じような情報が載っています。
この中から、SCHOOLの行にUOFTOKYOと書いてある作家の作品だけを抜き出して出力できるようにしたいです。
445デフォルトの名無しさん:2010/05/23(日) 22:35:10
DB_FileとかDBI使えばいいのに……Plain/textとはまた面倒な
446デフォルトの名無しさん:2010/05/23(日) 22:53:34
>>444
schoolがuoftokyoの作家の名前を抜き出し、
その名前から違う場所にあるデータを抜き出して出力したいってこと?
大して>>441とやること変わらない気がするな
if (情報1にヒット) {
  作家名から情報2を取得;
  print 情報1;
  print 情報2;
}
こうなるだけじゃない?
447デフォルトの名無しさん:2010/05/23(日) 22:57:06
>>446
仰る通りです。
コードを書いているのですが、情報1にヒットした後、
情報2を書き出してやると、UOFTOKYO以外の作家作品情報も出力されてしまい、
どうしていいのか分からない状態です。
448デフォルトの名無しさん:2010/05/23(日) 23:13:39
>>447
情報2のデータの取得方法がおかしいんじゃいの?
そっちはどういうデータなの?
449デフォルトの名無しさん:2010/05/23(日) 23:14:43
>>448
情報2はWORKSとENDの間の情報です。
450デフォルトの名無しさん:2010/05/23(日) 23:33:20
現在書いているコードも載せておきます。

http://uploader.moe.hm/cgi-bin/upload.cgi?mode=dl&file=2085 パス:perl
451デフォルトの名無しさん:2010/05/23(日) 23:41:07
while (<IN>){
$line = $_;
なんだこれ
452デフォルトの名無しさん:2010/05/23(日) 23:48:02
ああー、そんなこと書いたこともあった
453デフォルトの名無しさん:2010/05/24(月) 00:19:55
テキストファイルだと>>444のようにやるのは無理なのでしょうか?
454デフォルトの名無しさん:2010/05/24(月) 00:22:31
>>449
こんな感じかな。ネストがちょっと気持ち悪くてどうにかしたいけど
http://codepad.org/I7NaSAPC

>>450にソース上がってたのね。見てなかったわ
455デフォルトの名無しさん:2010/05/24(月) 00:37:05
綺麗なコード書くなぁ
人の書いたコードは難しくて読めないことが多い俺にはちょうど良い読み易さだった
456デフォルトの名無しさん:2010/05/24(月) 00:53:43
my $name ;
while(<>){
 $name = $_ if /^NAME/ ;
 next if ! ( /UOFTOKYO/ .. /^ID/ || eof );
 print $name and undef $name if defined $name ;
 next if !(/^WORKS/ .. /^END/ ) ;
 print ;
}
細かい所は知らん。
457デフォルトの名無しさん:2010/05/24(月) 00:57:51
× /UOFTOKYO/ .. /^ID/ || eof
◯ /UOFTOKYO/ .. /^END/
458デフォルトの名無しさん:2010/05/24(月) 01:01:27
>>456
おぉ。..ってそういう時も使えるのか。フラグ要らなかったな
459デフォルトの名無しさん:2010/05/24(月) 02:00:33
460デフォルトの名無しさん:2010/05/24(月) 07:33:10
正規表現に必ずxmsつける人ははじめて見たけど流行ってんの?
個々の意味はわかるけどこうしとくといい理由とかあるんだろうか??
461デフォルトの名無しさん:2010/05/24(月) 07:38:13
>>460
Perlベストプラクティスに書いてあった癖で書いちゃう
普通は気にしなくていいと思う
462デフォルトの名無しさん:2010/05/24(月) 10:06:39
>>461
気になるのでどういう理由でそう書いてあったか憶えてたら教えてください。
本屋に行くにせよ尼かなんかでポチるにせよ週末になっちゃうので待てないw
463デフォルトの名無しさん:2010/05/24(月) 17:45:34
464デフォルトの名無しさん:2010/05/24(月) 17:47:37
465デフォルトの名無しさん:2010/05/24(月) 19:06:38
これ全ページ無料で読めるんだね、すごい。
売上が下がるかもしれないのにオライリージャパンは許容してるの?
466デフォルトの名無しさん:2010/05/24(月) 19:11:40
多分許容してない>オライリー・ジャパン
アメリカでは既に訴えられて裁判になり和解まで行ってるようだけど日本は分からん。
訴えられるまでやりますって感じかもね。
本は実際に手にとって読みたい人がいるからこれは良い宣伝になり売上が伸びる。
ってのもあるだろうけど、これだけで済ます人も多そうだ。
467デフォルトの名無しさん:2010/05/24(月) 19:15:03
よく見るとわかるけどたまに表示されないページがあるよ。
468デフォルトの名無しさん:2010/05/24(月) 19:15:18
って左下に「O'Reilly Japanの許可を受けてページを表示しています. 」って書いてあるじゃねーかw
469デフォルトの名無しさん:2010/05/24(月) 22:51:55
少なくともおれの場合は中身が見られることで洋書を買う量が増えたよ。
見るのはgoogleより米amaの方が多いけど。
470デフォルトの名無しさん:2010/05/24(月) 23:12:24
おおー
こんなのが只で読めるとは
471デフォルトの名無しさん:2010/05/24(月) 23:34:58
レイアウト解説本に載ってるのって、俺からすると読みづらいことばっか書いてるんだ
コメントが行区切りの役果たしてるんだから空白行いらんだろ、かえって関数が盾に間延びする

よく考えたらほとんどの環境でPerlの場合コメント着色されないんだっけ・・・区切りの機能果たさないなw
472デフォルトの名無しさん:2010/05/24(月) 23:51:08
これ買うかどうか迷ってたけど欲しくなったわ
473デフォルトの名無しさん:2010/05/25(火) 00:52:16
>>467
たまにどころか途中から全部仏陀義理じゃねーかw
474デフォルトの名無しさん:2010/05/25(火) 23:02:04
そうなのか
まだ頭の方だからたまに飛ぶくらいでかなり役立ってる
475デフォルトの名無しさん:2010/05/26(水) 13:48:27
Perlに匹敵するモジュールがそろった言語って他にありますか?
具体的には
・ActiveDirectoryの操作(Net::LDAP)
・FTPs
・WWW::Mechanize
・DBI
・Net::DNS
・GD
・関数のpack
このくらいはせめて欲しいのですが・・・
476デフォルトの名無しさん:2010/05/26(水) 14:06:24
定番的なものはrubyにもpythonにも(そして多分schemeやHaskellにも)たいてい
相当するようなものはあるので好きなの使えばいいとおもうけど、そんなのは
それぞれのスレに行って聞けよ。でもわざわざ他の言語使わんでもperlでいい
んじゃね?
477475:2010/05/26(水) 14:27:29
>>476
ありがとう。
Perlしか分からないので、Perlで書いたものを他に移植することで
勉強はじめようかと思いまして。
とりあえずスクリプト言語はPerlを嫁にして、
C/C++、Javaあたり覗いてきます。
478デフォルトの名無しさん:2010/05/26(水) 17:00:41
http://usamimi.info/~pochi/perl/pochitate01.html
にあるような感じで縦書きテキストビューワーを作っています。
引き数として与えられるファイルが、
テキストファイルなのかバイナリファイルなのか判定したいのですが、
-T でのテキストファイル判定はその判定方法から
UTF-8以外の日本語文字コードでは上手く機能しないらしくて困ってしまいました。
テキストファイルかバイナリファイルかを判定する良い方法は無いでしょうか?
479デフォルトの名無しさん:2010/05/26(水) 19:28:28
Encode::guessで判定して、decodeするときにFB_CROAKを指定して
エラーにならなきゃOKとか?
480デフォルトの名無しさん:2010/05/26(水) 19:29:25
guess_encoding()使ってるみたいだから、guessに失敗したら中断(現行コードのまま)でえーんでないの?
そもそも -T の精度も疑わしいし、ましてやWindows環境だとマジックナンバー照合による判定は無理なんでは?

判定精度を上げたいなら
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/;
  ↓
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp cp932/;
481デフォルトの名無しさん:2010/05/26(水) 20:21:46
全走査して\0が無ければテキストファイル。でもutf16/32は勘弁な。
482デフォルトの名無しさん:2010/05/26(水) 21:11:04
>>478
テキストビューワなら、常にテキストと仮定しちゃえばいいんじゃないの?
483デフォルトの名無しさん:2010/05/26(水) 21:55:51
>>482
まあ普通はそうだよなぁ
判定するようなエディタは少ない
484478:2010/05/26(水) 23:48:34
>>479-483
レスありがとうございます。

guess しに行く前にどうにか判定出来ないかと
都合の良い事を考えていたのですけども、
>>482さんや>>483さんの仰るように常に対象はテキストファイルだと仮定して、
>>480さんのご指摘の通り現行コードのままにする事にしましす。

>>480
cp932 の事をうっかり忘れていました。
寧ろ shiftjis より cp932 の方が重要なのに…。
ご指摘ありがとうございます。
485デフォルトの名無しさん:2010/05/27(木) 09:17:39
shiftjisとcp932の両方を候補に入れるとほとんどの場合区別がつかなくて
Encode::Guess->guessがエラー返すと思うのだが。

おおざっぱにいうとEncode::Guessの判定アルゴリズムは

1行ずつ候補のencodingでdecodeしていって、候補が1つになったら
それを返す。候補がなくなったり複数残ったらエラー(ただしasciiが
最終候補に含まれていたらascii)

だからね。
486478:2010/05/27(木) 09:36:54
>>485
その通りなのです。
事実上、shiftjis よりも cp932 のテキストファイルを扱う方が圧倒的に多いと思って、
より現実に即して、判別候補の shiftjis を cp932 に変更しました。
487デフォルトの名無しさん:2010/05/27(木) 09:49:56
どっちを扱うのが多いかより「〜」などのunicodeへのマッピングが異なる文字を
どうしたいかの方が重要なきがする。
488デフォルトの名無しさん:2010/05/27(木) 12:31:50
俺も縦書きやったことあるけど
unicodeに縦書き用のものがマッピングされてない約物({}…〜など)は
回転するしかなくて、そのなかでも波ダッシュは鬼門だったな。

ちなみに《》()「」『』【】〔〕の約物については縦書き用の文字が用意されてる。
489デフォルトの名無しさん:2010/05/27(木) 14:39:56
日本語フォントには縦書き用のグリフが含まれるからそれを使えばいいんだよ
490デフォルトの名無しさん:2010/05/27(木) 19:23:42
EncodeでUTF-8にして扱うなら波ダッシュは全角チルダになっちゃうんじゃないの?
491デフォルトの名無しさん:2010/05/28(金) 10:03:55
>>490
いやそれはおかしい。
492デフォルトの名無しさん:2010/05/28(金) 19:01:24
上の方に出てたけどeucとsjisの〜をutf-8に変換するとWAVE DASH (301C)になり
cp932の〜をutf-8に変換するとFULLWIDTH TILDE (FF5E)になるみたいだね。
493デフォルトの名無しさん:2010/05/31(月) 16:35:35
20年前に少しかじったBasic言語しか知らないおらが、突然Perlを学ぶことに目覚めました。
たぶん初めてのPerlという良書のおかげです。
C言語とかJavaとかPythonとか色々学ぼうとして挫折を繰り返していました。

いきなりですが、質問があります。お教えください。

#!/usr/bin/perl
print "Please enter a number \n";
chop($number=<STDIN>);
while($number=~/|\D/){print "Please enter only a number! \n";chop($number=<STDIN>);}
以下数字が入力された場合に続く。

上記のように、何も入力されなかった(改行のみ)り、数字以外が入力されたときに
エラーメッセージを出す方法を教えてください。

上記ではおそらくwhile($number=~/|\D/)の正規表現が間違っていると思います。
また、上記目的を叶えるためのエレガントな方法があればお教えください。
494デフォルトの名無しさん:2010/05/31(月) 17:09:38
$number!~/^\d+$/
かねえ

#!/usr/bin/perl
print "Please enter a number \n";
while(1){
chop($number=<STDIN>);
last if $number=~/^\d+$/;
print STDERR "Please enter only a number! \n";
}
とか…?
495デフォルトの名無しさん:2010/05/31(月) 17:42:19
>>493
繰り返しループ処理のやりかたがわからないワケだな。
プログラミングの基礎が備わってないな。perl以前の問題。
フローチャートから勉強しなおしなさい。
496デフォルトの名無しさん:2010/05/31(月) 19:29:57
この時代にフローチャートかよw
497デフォルトの名無しさん:2010/05/31(月) 19:34:20
オブジェクト指向とかカプセル化とか言っても訳わかんない気がする
498デフォルトの名無しさん:2010/05/31(月) 20:08:51
>>494
ありがとうございます!
上手く動きました!!
空文字列のみを見つける正規表現があるのかと考えていましたが、
数字以外はダメという表記で良かったんですね。

ネットで探しても空文字列のみを見つける方法がよくわからなかったので悩んでいました。

>>497
自信を持って分かりますとは言えませんが、
サブルーチンなどで、プログラムの部品(パッケージ化とかカプセル化というのでしょうか)を
作って、プログラムを汎用性が高く、分かりやすく作ることかと理解しています。

初めてのPerlには、変数の扱いがCとは異なり、グローバル変数として扱われてしまう
と書かれていたので、Perlはオブジェクト指向としては、少し扱いにくい言語ということ
なんでしょうか?
499デフォルトの名無しさん:2010/05/31(月) 20:18:17
>>498
Perlはオブジェクト指向もサポートしている。
変数については、myを使えばローカルな変数になる。
my $hensu;
500デフォルトの名無しさん:2010/05/31(月) 20:18:17
>>498
20点くらいだな、その理解は
501デフォルトの名無しさん:2010/05/31(月) 20:47:35
>>495,500
こういうのが癌
502デフォルトの名無しさん:2010/05/31(月) 21:07:18
「いじめられる側にもいじめの原因がある」
「死刑には抑止力がある」
「何か言われて不快になったらその原因は発言者にある」


これまで当たり前だと思って、深く考えなかったこと・・・
周りに言われるままに、何の疑問も抱かなかったこと・・・
それらが本当に正しいのか、ちょっと立ち止まって考えてみませんか


虐めに関するよくある勘違い
http://jbbs.livedoor.jp/bbs/read.cgi/game/46573/1273655633/1-7

死刑制度に関するよくある勘違い
http://jbbs.livedoor.jp/bbs/read.cgi/game/46573/1273498488/1-7

外界は内界を映し出す鏡だって言ってたよ裏庭の鶏も
http://academy6.2ch.net/test/read.cgi/philo/1273156931/1-3
503デフォルトの名無しさん:2010/05/31(月) 21:27:52
>>498
>空文字列のみを見つける正規表現

"\n"にもマッチしていいなら/^$/
504デフォルトの名無しさん:2010/05/31(月) 21:43:52
>>498が何版目の「初めてのPerl」を読んだのかが気になる。
まさか 1995年刊行の Perl4時代のソフトバンク版じゃあるまいな?
505デフォルトの名無しさん:2010/05/31(月) 23:25:06
手元の第三版にはchopは索引に載ってなかった。
chompの頁に「古いperlではchop演算子が使われていることがあります。」ってちょろっと書かれてるくらい。
506デフォルトの名無しさん:2010/05/31(月) 23:45:07
誤解されそうなコメがあるから、おいらが補足。
ラクダ本第三版の索引にはchopは普通に載ってるし、それ以前にこんなの最新版Perlでちょろっと確認すれば済む話。
chopが何故か忌避されるのは、鋏の使い方を知らない馬鹿が多すぎたってことかな。
現在主流の馬鹿御用達言語PHPで、文字列末尾1文字を無条件に削除したい場合、使えねーsubstr()とか、preg_replace('/.$/u','',$hoge)とか使ってると、頭に蛆湧いてくるぜ。
507デフォルトの名無しさん:2010/06/01(火) 00:08:25
おおー。ここ勉強になりますね!
>>499
知りませんでした。
手元にあるPerl本は古本屋で買ったので
初めてのPerl 1995年6月16日 初版
Perlプログラミング1995年6月5日 第7版
でした。

>>500
後の80点はどの辺が足りないのかお教えください。
パッケージ化することで、グローバル変数が氾濫しプログラムが読みにくくなったり、
エラーが起きやすくなることを防ぐ。ということも(あっていれば)知っています。

>>503
正規表現面白いッス!
while($answer!~/^\d+$/)
while($answer=~/^$|\D/)
この二つはほぼ同じと考えて良いんでしょうね!

>>504
まさかの初版でした!!

これからもよろしくお願いしマース!
なにせ、読み始めたのが昨日からなんです。

508デフォルトの名無しさん:2010/06/01(火) 00:09:28
連続投稿すみません
自分の勉強のために
汚いコードでスレ汚しになりますが、Chap2の私の回答も載せますね。
#!/usr/bin/perl
$pai=3.141592654;
while($pronum!=5){
print "Chose program # (1-4 or to quit 5).\n";
chop($pronum=<STDIN>);
if ($pronum==1){
$pro1result=12.5*2*$pai; print "The result is $pro1result \n";}
elsif($pronum==2){
print 'Enter the radius'."\n";
chop( $radius=<stdin>);$radius *= $pai *2;
print "The result is $radius\n";}
elsif($pronum==3){print 'Plese enter 2 variables'."\n";
$first=<stdin>; $second=<stdin>; $first *=$second;
print "The result is $first \n";}
elsif($pronum==4){print "Please enter num and character \n";
chop($num=<stdin>);chop($char=<stdin>);$char=$char x $num;
print "The result is $char \n";}
elsif($pronum==5){print "Thank you for playing! \n";}
else{ print "Try again!\n";}
}
509デフォルトの名無しさん:2010/06/01(火) 00:15:04
>>507
どうしても「初めてのPerl」を参考にして勉強したいというなら、
悪い事は言わないから第5版にした方が良い。
今、Perl4時代の本で勉強しても百害あって一利無しだと思うぞ?
いくらなんでも時代遅れ過ぎる。
>>507 が使ってる Perl まで Perl4 というわでもあるまいに。
510デフォルトの名無しさん:2010/06/01(火) 00:22:42
>>507に必要なのは perldoc で perlintro を読む事
511507:2010/06/01(火) 06:24:42
>>509
そうですか。うーん。
正規表現とか、考え方とかはそんなに変わらないかと思ったんですが、
有害なんですね。
できれば、オンラインで学習できるのが一番なんですが、まとまったサイトってありますか?

>>510
ありがとうございます。
でも読むコマンドがわかりませんでした。
私は、Macなので、ターミナルを起動して
>perldoc perlintroとコマンドを入力してみましたが、
perlintroというドキュメントはないというようなエラーが出ました。
No documentation found for "perlintro".
512デフォルトの名無しさん:2010/06/01(火) 07:15:01
513デフォルトの名無しさん:2010/06/01(火) 08:34:09
>>511
サンプルコードによるPerl入門
http://d.hatena.ne.jp/perlcodesample/

日本の Perl ユーザのためのハブサイト
http://perl-users.jp/
514デフォルトの名無しさん:2010/06/01(火) 14:55:03
http://qb5.2ch.net/test/read.cgi/saku2ch/1269144264/183 2010/04/01 21:55:59 HOST:softbank221101001151.bbtec.net
http://qb5.2ch.net/test/read.cgi/sakud/1268731363/209 2010/04/13 22:40:00 HOST:softbank221101001151.bbtec.net
http://qb5.2ch.net/test/read.cgi/sakukb/1267978152/196 2010/04/16 23:34:20 ID:GYnmPEAj0
http://qb5.2ch.net/test/read.cgi/sec2chd/1274948647/904 2010/05/30 16:54:09 ID:NuvDjPvV0

http://schiphol.2ch.net/test/read.cgi/stadium/1252943434/687 2010/04/01 22:00:01 ID:mB5AiSFL
http://schiphol.2ch.net/test/read.cgi/tennis/1269837495/27 2010/04/01 22:01:15 ID:+EaxE3Yd
http://schiphol.2ch.net/test/read.cgi/sports/1269560639/78 2010/04/13 22:44:20 ID:bew0Nrvf
http://schiphol.2ch.net/test/read.cgi/sports/1268430764/294 2010/04/14 09:35:45 ID:hjGULPLG
http://schiphol.2ch.net/test/read.cgi/war/1270527178/319 2010/04/14 18:23:30 ID:+lNQ2DXA
http://schiphol.2ch.net/test/read.cgi/kyozin/1270206821/91 2010/04/14 18:29:06 ID:3CDN5Ccw0
http://schiphol.2ch.net/test/read.cgi/wres/1270861626/47 2010/04/14 18:30:38 ID:9IsRU2FN0
http://schiphol.2ch.net/test/read.cgi/ski/1268925479/573 2010/04/16 23:39:04
http://schiphol.2ch.net/test/read.cgi/goveract/1259841553/510 2010/04/18 17:31:32 ID:pk5WfpDm
http://schiphol.2ch.net/test/read.cgi/gutter/1264177302/517 2010/04/18 17:34:51 ID:34DVdrjm

http://schiphol.2ch.net/test/read.cgi/stadium/1251865219/707 2010/05/10 22:44:12 ID:hX93YGf3
http://schiphol.2ch.net/test/read.cgi/cancer/1268747646/273 2010/05/10 22:46:25 ID:nHvjUfwZ
http://schiphol.2ch.net/test/read.cgi/sports/1260967753/636 2010/05/11 18:17:35 ID:yYc33zVj
http://schiphol.2ch.net/test/read.cgi/war/1271752424/342 2010/05/16 18:50:43 ID:6cddBk0z
http://schiphol.2ch.net/test/read.cgi/war/1243407044/217 2010/05/30 16:50:31 ID:2FL8NGA8
http://schiphol.2ch.net/test/read.cgi/equestrian/1231931323/760 2010/05/31 21:06:11 ID:34qn98Gz
515507:2010/06/01(火) 22:30:15
>>512
>>513
丁寧にありがとうございます。
無事Perlintroを読み終えることができました。
まだデータ形式のハッシュはよく理解していませんが、少しずつ理解しようと思います。
サンプルコードによる・・には、新しい版用のコードの書き方の解説もあったので、
今持っている初めてのPerl本と見比べながら学びたいと思います。

ありがとうございました!
516デフォルトの名無しさん:2010/06/03(木) 16:42:25
2ちゃんねるにアクセスしたいんですがもうずっと人大杉となってしまいます。
回避する方法はありますか?
517デフォルトの名無しさん:2010/06/03(木) 16:55:32
まず服を脱ぎます。
518デフォルトの名無しさん:2010/06/03(木) 18:23:10
脱ぎました。
次はどうすればいいですか?
519デフォルトの名無しさん:2010/06/03(木) 18:50:55
>>518
口に鉛筆を咥える。
520デフォルトの名無しさん:2010/06/03(木) 19:02:34
マジレスすると2chはUser-Agentがlibwww-perlとかだと弾くようになってる
521デフォルトの名無しさん:2010/06/08(火) 11:05:28
文字列をutf8からsjisに変換するのに、jcode を使用すると特定の文字が変換されずに?になってしまいます。('1〜5' → '1?5')
正しく変換するにはどのようにすればよいのでしょうか。

#!/usr/bin/perl

use Jcode;

my $utf = "1〜5";
my $sjis = jcode($utf)->sjis;
my $euc = jcode($utf)->euc;

print jcode($sjis)->utf8 . "/" . $utf . "/" . jcode($euc)->utf8;
522デフォルトの名無しさん:2010/06/08(火) 11:28:59
>>521
すみません。自己解決しました。
use Jcode; を use Jcode::CP932; に変えるだけでした。
523デフォルトの名無しさん:2010/06/08(火) 11:35:22
昔の人がユニコードと既存の文字コードの対応関係を決めるときに
統一に失敗したので面倒なことになってます。ほんと迷惑。
524デフォルトの名無しさん:2010/06/09(水) 11:02:37
Apache2+mod_perlやってるんですが、
その回のリクエストが終わっても残り続けるグローバルな変数って
ありますか?
メモリ上に残り続けるフラグを持ってリクエストのたびに処理を分岐したいです。
525デフォルトの名無しさん:2010/06/09(水) 11:13:11
>>524
ファイルか、DBに残せばよいのでは?
526デフォルトの名無しさん:2010/06/09(水) 11:40:52
アクセス数(マルチスレッド)が半端ないので
ファイルはなるべく避けたいです。
フラグ一つのためにDB構築するのもなんか微妙なので。
527デフォルトの名無しさん:2010/06/09(水) 11:51:05
IPC::ShareLiteとか使うのがいいんじゃね?
528デフォルトの名無しさん:2010/06/09(水) 11:53:33
printf "%.2f\n", 90.1730;
printf "%.2f\n", 90.1740;
printf "%.2f\n", 90.1750;
printf "%.2f\n", 90.1760;
printf "%.2f\n", 90.1770;

printf "%.2f\n", 90.1630;
printf "%.2f\n", 90.1640;
printf "%.2f\n", 90.1650;
printf "%.2f\n", 90.1660;
printf "%.2f\n", 90.1670;

この処理ですが、上の段は、5捨6入しているのですが、
下の段は4捨5入の処理をしています。

90.17
90.17
90.17
90.18
90.18

90.16
90.16
90.17
90.17
90.17

いろいろと試したのですが、printfがどういったルールで
丸めの処理をしているのかまったくわかりませんでした。
ググッてもこの処理の違いに関する説明もでてきません。
この処理の違いがわかる人はいませんか?
529デフォルトの名無しさん:2010/06/09(水) 12:08:50
>>528
内部は2進数なので、2進数だと無限小数になっちゃう
数は有限桁数で表すと誤差が出るんだよな。

もう少し先の桁まで出すと

% perl -e 'printf "%.20f\n", 90.1750;'
90.17499999999999715783

なので四捨五入だと切り捨ての方になっちゃうんだよね。
530デフォルトの名無しさん:2010/06/09(水) 12:09:59
>>526
なら、WebPage側にhidden項目でも作って、そこに保存しておくとか・・・
531デフォルトの名無しさん:2010/06/09(水) 12:22:41
mod_perlは使ったことないけどmod_speedycgiなら……
532デフォルトの名無しさん:2010/06/09(水) 13:35:48
>>530
533デフォルトの名無しさん:2010/06/09(水) 16:10:35
>>524
グローバル変数で変数を持たせるとセッションが続く限り、内部データは引き継がれる。
これはspeedycgiでも同じ。

普通は変数が引き継がれると困るので、局所変数で宣言するが、普通のcgiだと、cgiが
実行されるごとに、グローバル変数はリセットされるため、局所でもグローバルでもあま
りあまり関係ない。そのため後からuse strict;で変数管理をしようとしてもエラーだらけで、
直しようがなくなる。
534デフォルトの名無しさん:2010/06/09(水) 22:41:24
use strict するとエラーが発生するCPANモジュールは登録しないで欲しい。
535デフォルトの名無しさん:2010/06/10(木) 00:15:55
>>534
まさかstrictにrefs入れてないよね?
536デフォルトの名無しさん:2010/06/10(木) 02:01:07
use stritc;
しておいて必要なところだけブロック切って
no strict 'refs';
だろjk
537デフォルトの名無しさん:2010/06/10(木) 12:14:48
>>534
obsoleteなブツなんでないの?
同等以上の新しいモジュールがあるだろ。
538デフォルトの名無しさん:2010/06/10(木) 17:21:59
test.txt文書内にある
abc001.jpg
abc002.jpg
という2行の文字列を
<Vol.001>abc001.jpg
<Vol.002>abc002.jpg
と書き換えてoutput.txtに書き出すPerlスクリプトを書きたいと思っています。
しかし、test.txt内の文字列が1行の場合には上手くいきますが、
例のような複数行では
<Vol.001>abc001.jpg
abc002.jpg
となってしまいます。
どこが間違っているのでしょうか?

#!/usr/bin/perl
use strict;
use warnings;
$a="test.txt";
$b="output.txt";
open my $in , '<', $a or die "Cannot open '$a': $!";
open my $out, '>', $b or die "Cannot open '$b': $!";
while(<$in>){
s/abc(.+?)\.jpg/<Vol\.$1>abc$1\.jpg/;
print $out $_;
};
close($in);
close($out);
539デフォルトの名無しさん:2010/06/10(木) 17:55:00
そのままコピペしたけどちゃんと動いたぞ?
あと関係ないけど、せっかくuse strictしてるんだから$a , $b はつかうな
540デフォルトの名無しさん:2010/06/10(木) 20:11:20
配列の宣言についての質問なんですが
my @x=(1,2,3,4,5,6,7,8);
my $y=100;
my @pi =(@x/$y);

この様に@で配列を制限し
my @piの中身を1/100,2/100,3/100,4/100,・・・
として以下の計算につなげたいのですが、
どうしても上手くいきません・・・

foreach文なども試してみましたがダメでした
非常に低レベルの質問ですがどうかご教授よろしくお願いします
541デフォルトの名無しさん:2010/06/10(木) 20:19:29
my @x=(1,2,3,4,5,6,7,8);
my $y=100;
my @pi;

foreach my $tmp (@x){
    push(@pi, $tmp/$y);
}

foreach my $tmp (@pi){
    print "$tmp, ";
}
542デフォルトの名無しさん:2010/06/10(木) 21:06:34
key1, key2, ..., keyN, Value (N=10程度)
のようなレコードを持ったCSVファイルに対して,
keyA=AAAかつkeyB=BBBのレコードのValueの合計,平均,...etc
といった統計を計算する最もスマートな方法を教えてください.
レコード数は数十万〜数百万行を想定しています.
543デフォルトの名無しさん:2010/06/10(木) 21:38:31
>>524
ourで宣言すればおk。
でも保持できるのはプロセス単位だから共有メモリ使った方がいいと思う。storableとか
544デフォルトの名無しさん:2010/06/10(木) 22:03:32
545デフォルトの名無しさん:2010/06/10(木) 22:19:50
my @pi = map {$_ / 100} (1 .. 8);
print "$_, " for (@pi);
546540:2010/06/10(木) 23:13:47
>>541>>544>>545
わざわざ理解しやすい回答ありがとうございます
早速スプリクトに組み込んでみます
547デフォルトの名無しさん:2010/06/11(金) 00:01:18
>>542
その数ならDBに突っ込んでSQLでやる
548デフォルトの名無しさん:2010/06/11(金) 00:24:13
合計と平均なら頭から読んで足したり数えたりするだけで
いいと思うけど。
549デフォルトの名無しさん:2010/06/11(金) 03:47:48
>>539
コメントありがとうございます。
問題点は、入力用ファイルの改行コードでした。
改行コードをUnixではなくMacの改行コードにしていたので、
2行が1行と認識されてしまっていたようです。

ずっと正規表現の問題だと思っていたので、コメントのおかげで別の観点で見直すことができました。

素人なのでもう一つ質問させてください。
>$a , $b はつかうな
というのは、意味のない変数名を使うのではなく、
$infile,$outputfileなどのように一目で意味のわかる変数名を使いなさいということでしょうか?
550デフォルトの名無しさん:2010/06/11(金) 03:51:22
>>549
$aと$bはsortの時に使われる。つか、use strictしてるのにmyなしで動いてる時点で「あれ?」ってなったでしょ?
perldoc -f sort
> global variables $a and $b
551507:2010/06/11(金) 06:33:39
>>550
丁寧にありがとうございます。
色々調べてやっと仰っていることが理解できた気がします。
やはり、初めてのPerl初版本を読んでいた弊害がありそうです。

でもこのサンプルコードによるPerl入門は素晴らしいですね。
http://d.hatena.ne.jp/perlcodesample/20091120/1246679588
552デフォルトの名無しさん:2010/06/15(火) 18:38:48
指定の処理を行いログを出力するプログラム hoge.plと
そのログを読み込み解析し出力する analyst.plを作り、
普段はhoge.plを使いたまにanalyst.plを実行するという事をしてきました。

今回その解析済みログを利用するためにhoge.plの中でanalyst.plを実行させたくなったのですが
require('analyst.pl');としたところ"\x{00cd}" does not map to cp932 at analyst.pl line 12.
というエラーが大量に出ました。

これは両方のplファイルにuse utf8; binmode STDOUT ":encoding(cp932)";があり
analyst.plでutf8からcp932に変換されたものがhoge.plでさらにcp932に変換されているからのようで
analyst.pl内のbinmode〜;をコメントアウトするとうまく動くようになりました。
しかしanalyst.plの単独実行時にうまく動かなくなりました。

このような場合どうすれば両立させることができるのでしょうか?お知恵を貸して欲しいです。

This is perl, v5.10.1 built for MSWin32-x64-multi-thread
553デフォルトの名無しさん:2010/06/15(火) 19:01:09
>>552
ちょっと面倒だけど新たにAnalyst.pmを作成し、そこにanalyst.plの機能を全部放り込んだサブルーチンを作り、
hoge.plとanalyst.plはそれを読み込み実行すれば両立出来るよ。

hoge.plとanalyst.plの二つのファイルだけでは・・・できるのかな?
554デフォルトの名無しさん:2010/06/15(火) 20:02:21
>>553
そこまでするならモジュール化すればいいだろw
555デフォルトの名無しさん:2010/06/15(火) 20:06:22
試してないけど ':raw :encoding(cp932)' みたいにレイヤー重ねがけすればとりあえず動くんじゃね
556デフォルトの名無しさん:2010/06/15(火) 20:43:23
>>552
requireする前にbinmode STDOUT=>":raw";
あるいはanalyst.pl内のbinmode文をbinmode STDOUT=>":raw:encoding(cp932)";
557552:2010/06/15(火) 21:25:50
なるほど、:rawを重ねると生データにリセットできるんですね。
requireする前に一行追加することで簡単に実現出来ました。
呼び出し前に:rawにして呼び出し先で:cp932に再セットされるという流れもなんだか良いです。

>>553-556
みなさんレスありがとうございました。
558552:2010/06/15(火) 21:54:21
このスレ雰囲気良いね
559デフォルトの名無しさん:2010/06/16(水) 03:43:58
一気に雰囲気が悪くなった
560デフォルトの名無しさん:2010/06/16(水) 05:22:30
そんなこというなよ…
561デフォルトの名無しさん:2010/06/16(水) 17:53:09
perlスクリプトファイルのコメント部分だけ取得する良い方法はないでしょうか?

単純に # より前を消すみたいのを自分で作ってたんですが、print '#'; とか、s#a#b#;
というのも考えられるなとか、ヒアドキュメント中の # はどうするとか、、、

私の脳みそでは確実に無理なので、なにかないでしょうか?
562デフォルトの名無しさん:2010/06/16(水) 19:11:59
つ正規表現
563デフォルトの名無しさん:2010/06/16(水) 19:59:14
m{
hoge # not comment
}



m{
hoge # comment
}x

の区別とか想像しただけで嫌になるよなw
564デフォルトの名無しさん:2010/06/16(水) 20:23:53
>>561
perltidyとかは?
565デフォルトの名無しさん:2010/06/16(水) 20:30:46
$_ = '1"##"#a"';
print qq#\# match #, '#', "\n" if /"#a/ && m#[^\#]\##; # こめんと; { #" ですよ}

考えてみようとして例を作っただけでつらくなってきた
566デフォルトの名無しさん:2010/06/16(水) 20:42:23
PPIとか使ってみれば? 正規表現の中のコメントは対応
できてないみたいだけど、他は結構いけるようだよ。
567デフォルトの名無しさん:2010/06/16(水) 23:08:27
正規表現のxオプション使ってる?
568デフォルトの名無しさん:2010/06/17(木) 00:40:40
>>561
Text::Balanced とかは?
569デフォルトの名無しさん:2010/06/17(木) 03:22:58
とりあえず#の後に;がない行を抜き出してみて、それでどれくらい引っかかるか見てみれば?
厳密にやろうと思えば何らかのPerlパーサを使わないと、正規表現でちょいちょいやるっていうのは無理だろうな。
570561:2010/06/17(木) 10:33:00
>>562-569
ありがとうございます。なかなか難しいんですね・・。

気づいたのですが、秀丸とか(ほぼ)ちゃんとコメント色分け出来てますよね。
やっぱり偉大なソフトですね・・。
571デフォルトの名無しさん:2010/06/17(木) 11:57:22
どの辺までフォローしてるのかしらんけど
Regexp::Common::commentとか
572デフォルトの名無しさん:2010/06/18(金) 00:40:03
秀丸の構文ハイライトルールと同程度で良いならそれこそ正規表現で十分だよ。
573デフォルトの名無しさん:2010/06/18(金) 05:17:34
>>572
おまい、秀丸つかったこと無いだろ
574デフォルトの名無しさん:2010/06/20(日) 13:23:25
Windows上じゃ書かないし Emacs で充分だしなあ…。
575デフォルトの名無しさん:2010/06/20(日) 17:43:06
LWP、HTTP::Requestの質問なのですが
POSTでログインしても次の操作で
APサーバからセッションタイムアウトという
レスポンスが返ってきてしまいます。
(WEBサーバのエラーではないです)

VBのCOM MSXML.XMLHTTPRequest
だと、perlの $ua->request($req);
と同等のメソッド:open()のパラメータで非同期動作をfalseにすることに
より、今回の動作もきちんと動作します。
ttp://www.ki.rim.or.jp/~kuro/WebDAV/MSXML01.html
の一番最後の文章を参考にしてください。

LWP、HTTP::RequestでVBのCOMのような非同期動作を
キャンセルして同期的にどうさせる方法をご教示ください。
稼働OSがLinuxなので、Perlで行っています。
576デフォルトの名無しさん:2010/06/20(日) 17:45:46
>>575のコードです
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my $res;
my $req;
my %param;
my $ua = LWP::UserAgent->new();

%param = ('username' => 'user', 'password' => 'pass');
$req = POST('ログインURL(サーブレット)',[%param]);
$res = $ua->request($req); #<-ここで同期的に動作させたい。
(VBだとvarAsync=falseで可能)

%param = ();
%param = ('number' => '3' );
$req = POST('ログイン後のURL(サーブレット)',[%param]);
$res = $ua->request($req);
print $res->content
これがセッションタイムアウトとAPメッセージが返ってきてしまう
577デフォルトの名無しさん:2010/06/20(日) 17:50:58
LWP::UserAgentに非同期オプションなんざあったか?
578デフォルトの名無しさん:2010/06/20(日) 17:57:06
>>577
ありがとうございます。

ttp://homepage3.nifty.com/hippo2000/perltips/LWP/UserAgent.html
このあたりとか調べているのですが、
同期/非同期オプションはないようです。
なんとか実現したいのですが、
perl使いの方はどのように回避しているのでしょうか?
579デフォルトの名無しさん:2010/06/20(日) 18:52:54
my $ua = LWP::UserAgent->new(keep_alive => 1);
でもダメでした。

ちなみにVBでも
Dim dom As New MSXML.XMLHTTPRequest
dom.Open "POST", "ログインURL(サーブレット)", true <-非同期
にすると今回のperlと同じ現象が起きるので
このあたりだと思いますが・・・
580デフォルトの名無しさん:2010/06/20(日) 19:23:47
VB事情はよくわかんないけど cookie_jar 使えば解決するとかいう話ではないの?

576のコードだと cookie を食わないから session cookie が届いてても
次の $req で全く使われないよ。
581デフォルトの名無しさん:2010/06/20(日) 19:34:54
ああ、そういえばcookieの問題のようにも見えるな
582デフォルトの名無しさん:2010/06/20(日) 20:36:28
>>580-581
ありがとうございました。
できました。
cookieでした、基本的なことだったんですね。
本当に助かりました。
VBのCOM(WEBブラウザ)では自動でやってくれていた
ことだったんですね。

%param = ('username' => 'user', 'password' => 'pass');
$req = POST('ログインURL(サーブレット)',[%param]);
$res = $ua->request($req);
my $cookie_jar = HTTP::Cookies->new( autosave => 1 );
$cookie_jar->extract_cookies( $res );
ua->cookie_jar( $cookie_jar );
以下・・・
583デフォルトの名無しさん:2010/06/20(日) 21:48:51
perlで
"\x11\x22\x33"という文字列後ろに0x4455という数値を追加して"\x11\x22\x33\x44\x55"という
文字列を作成したいのですがどのように記述すればいいでしょうか?
584デフォルトの名無しさん:2010/06/20(日) 22:00:41
えっ
585デフォルトの名無しさん:2010/06/20(日) 22:29:28
これでどうよ。\は適当に調整してくれ。

use strict;
use utf8;
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";

my $str="\\x11\\x22\\x33";
my $num=0x4455;
my $str2=sprintf("%X", $num);

if ($str2 =~ /^(..)(..)$/) {
$str="$str\\x$1\\x$2";
} else {
print "$str2 が指定の形式でない。";
}

print $str."\n";
586デフォルトの名無しさん:2010/06/21(月) 11:32:34
「Perlベストプラクティス」等を読んでいるのですが、

私的には読みやすいし誤解が無いと思うので組み込み関数を、
 substr $s, 0, 1;
といった書き方よりも、
 substr($s, 0, 1);
という風に括弧を付けた書き方をしたいのですが、こういう無駄な括弧は止めた方がいいのでしょうか?

------------
将来、複数人と一緒に開発することもあるかもしれないので、
どちらのほうが主流なのか、もしくはどちらのほうがより好ましいのか教えて頂けないでしょうか。
587デフォルトの名無しさん:2010/06/21(月) 13:55:45
>>586
それぞれ色んな流儀があるので一概には言えないが、
少し古い本ではあるけけども、

Perlプログラミング救命病棟
http://d.hatena.ne.jp/asin/4798109401

あたりは参考になるかもしれない。
588デフォルトの名無しさん:2010/06/21(月) 13:57:54
引数可変のsubstrなら目的をはっきりさせる為にも括弧は、必要です。
自分がやった勘違いの例
perl -e '$str = "12345"; print substr($str,2,4),"end";'
perl -e '$str = "12345"; print substr $str,2,4,"end";'
589デフォルトの名無しさん:2010/06/21(月) 19:36:22
Text::Txのppmはまだ無いのでしょうか?
590デフォルトの名無しさん:2010/06/21(月) 20:25:52
拡張子がc,cc,hなファイルからcall_handlerという文字列を探してファイル名と該当行を表示させたいのですが
xargsが渡してきたファイル群の何番目を処理中か知るにはどのようにすればいいでしょうか?

find . -regex '.*\.\(c\|cc\|h\)' -print0 | xargs -0 perl -ne 'if(/.*call_handler.*/g){print($ARGV[?????????], ": " ,$&, "\n")}'

591デフォルトの名無しさん:2010/06/21(月) 21:15:41
>>590
perl 使わずに grep じゃだめなのかな?
find . -regex '.*\.\(c\|cc\|h\)' -print0 | xargs -0 grep -H -n call_handler
./a.c:1:call_handler hogehoge

perl スレということで perl 使うというならちょっと考えてくる
592デフォルトの名無しさん:2010/06/21(月) 22:34:01
>>590 find . -regex '.*\.\(c\|cc\|h\)' -print0 | xargs -0 perl -ne 'print "$ARGV:$_" if /.*call_signal_handler.*/'
593591:2010/06/21(月) 23:47:58
>>592
なるほど、$ARGV でとれるのか〜。
勉強になった。
# call_signal_handler になってて始めテストしたとき
# 引っかからなくってあれれってなってしまった^^;
594586:2010/06/21(月) 23:59:46
>>587-588
ありがとうございます。
でも、あんまり反応無いんですね。
ほとんどの現場で特に決まってないってことなんでしょうかね・・。
595デフォルトの名無しさん:2010/06/22(火) 00:32:18
PBPのp190に書いてあるから、みんなレスしなかっただけじゃねーの?

hoge( 'foo', 'bar' ) # <= サブルーチン。
substr $str,2,4 # <= 内部関数。
PBPにあったか不明だが、上記を守ると必然的に、
内部関数の引数を明確に区切りたい場合は、
( substr $str,2,4 )
596デフォルトの名無しさん:2010/06/22(火) 01:00:10
以下のコードで""が"?"に化けてしまうのですが何が原因でしょうか?
ファイルはUT-8で作成しています。(""は口ではなく目になっている奴です)

use Encode;

$string = decode('utf8', "あ");
printf "%s\n", encode('shiftjis', $string);

$string = decode('utf8', "");
printf "%s\n", encode('shiftjis', $string);

597デフォルトの名無しさん:2010/06/22(火) 01:10:57
>>596
出力するターミナルはshiftjisなの?
598デフォルトの名無しさん:2010/06/22(火) 02:50:47
shiftjisにハシゴ高は無い
cp932にはあるけど
599デフォルトの名無しさん:2010/06/22(火) 03:26:17
ありがとうございます、CP932を指定して出るようになりました。
600デフォルトの名無しさん:2010/06/22(火) 09:07:45
>>595
それが例だとそういうときは

substr($str,2,4)

にしろってなってるんだよな。俺は595のように全体を
カッコでくくる方が統一的でいいと思うんだが。
601デフォルトの名無しさん:2010/06/22(火) 09:17:11
なるほど、いいね。
602デフォルトの名無しさん:2010/06/22(火) 10:00:37
普通に考えると、統一する理由がないな
理不尽なクレームをつけてくる奴が「現場」にいたとしても
そいつが何を考えてるのかは誰にも分からない
603デフォルトの名無しさん:2010/06/22(火) 11:01:45
つ「C言語脳」
604デフォルトの名無しさん:2010/06/22(火) 12:12:28
rubyも()省力できるよな。
605デフォルトの名無しさん:2010/06/22(火) 13:08:34
rubyは()を省略できると言うか、文字ごと省略できることに驚いた
606586:2010/06/22(火) 13:17:58
>>595, >>600

PBPって通称があるんですね。ページ数までありがとうございます。
該当のページには、組み込み関数には括弧を付けるなとありますね・・。

でも、私の感性がヘンなのかもしれませんが括弧は付けた方が見やすいかなと思いまして。

 my $t = substr($str,2,4);
 my $t = substr $str,2,4;
 my $t = (substr $str,2,4);

でも、確かに3番目の書き方でも良い感じですね。見やすい。
最初に(をタイプするというのは打ちにくいかもしれないですけど。
607デフォルトの名無しさん:2010/06/22(火) 15:35:29
まずコンパイラが誤解しないように書くのが大前提として、
括弧があってもなくても問題ないような場合は人間にとって見やすいと思うほうにすればいい。
全てを機械的に統一する必要も、PBPを盲信する必要もない。

>>606の例みたくシンプルに1文で済むような場合は誤解の生じようもないし好きに書けばいい。
ただ、この場合3番目は不自然というか意味ねーと思うけど。

↓みたいな場合は括弧を使わざるを得ない。けどこれもどっちがいいかはケースバイケースかな。
print +(substr $foo, 0, 1), "が1文字目\n";
print substr($foo, 0, 1), "が1文字目\n";

っと、そういえば組込み関数に括弧つけたい派の>>586は、print使うときも
print("hoge"); とか (print "fuga"); みたいに書くのかね?
608デフォルトの名無しさん:2010/06/22(火) 15:46:59
組み込みかどうかって分け方も微妙だよなぁ。List::Utilぐらいの
有名モジュールになると気分的にはほとんど組み込みみたいな
もんだし。

結局なんとなくオレ基準で決めてるな。同じ関数はだいたい同じ
にはしてるけど。
609デフォルトの名無しさん:2010/06/22(火) 21:41:02
関数か、関数でないか。
そこが意見の分かれ目じゃないか。
小学校だか中学校だか忘れたが
関数には y=f(x) みたいにカッコをつけるって習っただろ。
printが関数なら、カッコつけるだろうし
関数ではない、と思うならカッコつけない。
C言語脳に冒されたヤツらは何でもかんでも関数にしちまった。
挙句の果てに値を返さないvoid関数というクソまで生み出しちまった。
610デフォルトの名無しさん:2010/06/22(火) 21:41:57
print(print("うんこ"));
611デフォルトの名無しさん:2010/06/22(火) 23:17:04
>>609
でもprintfにつけないんならsprintfにもつけたくないんだよなぁ。
sprintfは明らかに関数なんだけど。
612デフォルトの名無しさん:2010/06/23(水) 00:08:21
『C言語脳』ってちょくちょく出てきていますが、

これはバカにしてるの?
613デフォルトの名無しさん:2010/06/23(水) 01:06:53
一人の人が言ってるだけだから、ほっとけば?
珍しく長文書いたと思ったら頓珍漢だし。
614デフォルトの名無しさん:2010/06/23(水) 22:37:14
以下のような場合に、色々なコンテキストに対応するにはどのようにしたらよいのでしょうか?

my @a = &wrapper(); # リスト
my $s = &wrapper(); # スカラー

sub wrapper{
 print "-start-\n";
 my @re = &func; # ★ リストしか・・
 print "-end-\n";
 return @re;
}

sub func{}
615デフォルトの名無しさん:2010/06/23(水) 22:41:29
私ではこういうのしか思いつかないんですが、
なんとなく格好悪いしもっとスマートな方法は無いでしょうか?

sub wrapper{
 print "-start-\n";
 if(wantarray()){
  my @re = &func; # ★ リスト
  print "-end-\n";
  return @re;
 }else{
  my $re = &func; # ★ スカラー
  print "-end-\n";
  return $re;
 }
}
616デフォルトの名無しさん:2010/06/23(水) 22:56:26
wantarray
617デフォルトの名無しさん:2010/06/23(水) 23:28:22
その例だと、func サブルーチンの中も wantarray したい様に
見えるんだが。

sub func { ( 1,2,3,4) ;} # 取り敢えずの例でリストを返しとく。
sub wrapper{
 print "-start-\n";
 my @re = func ; # func がスカラーを返したとしても配列にセット。
 print "-end-\n";
 return wantarray ? @re : $re[0] ;
}
printf "%s\n", join ",", wrapper ; # リスト
printf "%s\n", scalar wrapper ; # スカラー
618デフォルトの名無しさん:2010/06/23(水) 23:41:51
私の文章力が足りなくてすみません。
sub func{} も同じコンテキストで動かしたいのですが・・。
619デフォルトの名無しさん:2010/06/23(水) 23:44:16
じゃ617でいいじゃん。
620デフォルトの名無しさん:2010/06/23(水) 23:52:20
>>619は間違い。
sub func{} の中もwantarrayしたいって事だよね?
sub func { wantarray ? ( 1,2,3,4) : 1 ;}
sub wrapper{ return func; }
#print文なんて飾りです。偉い人には(略
621デフォルトの名無しさん:2010/06/24(木) 00:05:37
sub func { return $_[0] ? ( 1,2,3,4) : 2 ;}
#sub wrapper{ return func wantarray; }
sub wrapper{ my $f = wantarray ; return func $f ; }
こっちの方が適切か?
何れにしても617からのレスで例は十分出したから、
肉付けは御自分でどーぞ。
622デフォルトの名無しさん:2010/06/24(木) 06:47:07
十分て
if を?:で書き換えただけなのに無意味に偉そうだな
623614:2010/06/24(木) 11:49:44

やっぱり、私の文章力が足りなかったようですみません。

>>614 のような場合にコンテキストが func では変わってしまう場合があるので、
変わらないようなスマートな書き方無いかなという質問でした。

 return &func;

という書き方ではコンテキスト変わらないので困らないのですが、例のように
returnから引き離したときにどうすればいいのかなと。

で、恥ずかしながら稚拙な >>615 の例を書いてみたのですが。
624デフォルトの名無しさん:2010/06/24(木) 19:49:07
変数の中身の16進ダンプを行うため、

printf "data=%20.20s\n", unpack("H*", data);

などとやっているのですが ”313e1cb8f94b” と表示され見難いので
”31 3e 1c b8 f9 4b”と空白を入れて表示したいのですが、できるだけ
シンプルなコードで表示するにはどのように書けばいいでしょうか?
625デフォルトの名無しさん:2010/06/24(木) 20:44:31
printf "data=%20.20s\n", join " ", (unpack "H*", "hoge" ) =~ /(.{1,2})/g ;
626デフォルトの名無しさん:2010/06/24(木) 22:53:20
ありがとうございます、使わせていただきます。
627デフォルトの名無しさん:2010/06/25(金) 03:10:40
ずぶの素人なのですのでお手柔らかにお願いします

今2つのテキストファイルがあって、内容はおおよそ下のようです

--------------テキストA-------------------
fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04
-0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04
-0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04
getden1 0
------------------------------------------

--------------テキストB--------------------
xred 0.0 0.0 0.047843858990
0.0 0.0 0.000434433306
1/3 2/3 -0.011730466739
#Definition of the planewave basis set
------------------------------------------
テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが
どのようにしたらいいでしょうか
ご教授お願いします
628デフォルトの名無しさん:2010/06/25(金) 12:57:12
>>615
wantarray ? func() : scalar func();
629デフォルトの名無しさん:2010/06/25(金) 16:15:17
1.
print Dumper( $hoge);
---
$VAR1 = {
'entry' => [
{
'title' => ' aaa',
'-id' => 'aaa'
},
{
'title' => ' aaa',
'-id' => 'aaa'
}
]
};
---
2.
foreach( $hoge->{entry}){
print Dumper( $_);
}
---
$VAR1 = [
{
'title' => ' aaa',
'-id' => 'aaa'
},
{
'title' => ' aaa',
'-id' => 'aaa'
}
];
---
630628:2010/06/25(金) 16:17:18
3.
foreach( @$hoge->{entry}){
print Dumper( $_);
}
---
(出力なし)
---

4.
my $foo = $hoge->{entry};
foreach( @$foo){
print Dumper( $_);
}
---
$VAR1 = {
'title' => ' aaa',
'-id' => 'aaa'
};
$VAR2 = {
'title' => ' aaa',
'-id' => 'aaa'
};


1.のデータ構造を持つ変数があり、その内容をforeachで抜き出したいのですが、なかなか理解が出来ません。
4.の方法で実現できたのですが、どうして3.では実現が出来ないのでしょうか?
もしよろしければ、解説いただければと思います。
631デフォルトの名無しさん:2010/06/25(金) 16:43:29
foreach (@{$hoge->{entry}}) {
632デフォルトの名無しさん:2010/06/25(金) 18:12:03
@$hogeで一つの項になるのかな
矢印演算子の優先順位って相当高いよね
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
633デフォルトの名無しさん:2010/06/25(金) 19:00:42
Perlでプログラムの練習をしているのですが、わからないことがあります。

ハッシュの配列で、
[
{
"id" => "1",
"com"=> "2"
},
{
"id" => "2",
"com"=> "2"
}
]
のような物があったとして、idが1のハッシュのcomの値を取得したいのですが、
foreach等でスキャンするしか方法はないのでしょうか?
ハッシュの配列がかなり大きく、idの呼び出しもかなりの回数行うことがあるので負荷などを考えると、効率のいい探し方はないかと調べております。

634デフォルトの名無しさん:2010/06/25(金) 19:18:06
その通りだろうなあ
id値→配列インデックスなどの逆引きでも作っておかない限りは…
635デフォルトの名無しさん:2010/06/25(金) 19:33:49
>>633
そういうのはデータベース使った方がいいんじゃね?
確かDBD::SQLiteあたりならデータベースをメモリ上に持てたはずだし。
636デフォルトの名無しさん:2010/06/25(金) 22:16:43
>>633
そのデータ構造じゃ、>>634みたいなことしない限り無理だろう
idをキーにするほうが自然じゃね?
{
    1 => {
        "com" => "2",
    },
    2 => {
        "com" => "2",
    },
}
637デフォルトの名無しさん:2010/06/25(金) 23:15:50
ハッシュの配列 => @hoge
求めたいid => $id
だったとしたら単純に
$hoge[$id - 1]->{com}じゃん。
638デフォルトの名無しさん:2010/06/25(金) 23:57:45
$idと配列番号の差が定数ならそれでいいんだろうけど…
639デフォルトの名無しさん:2010/06/26(土) 10:38:26
>>636
俺もそうすると思う
640デフォルトの名無しさん:2010/06/27(日) 09:23:43
調査の為に、<STDIN>の内容を一気に
ファイル出力するコードを入れたのですが
my $data = do{ local $/; <STDIN>};
open(FILE,">./stdin.eml");
print FILE $data;
close (FILE);
#↑これは成功

その後にSTDINを入れた$dataを再利用しようとして、
以下のコードを書きましたが
while (<$data>) {
 print $_ . "\n";
}
としても$dataを表示することができません。
while ($data)
もだめでした

配列に代入する方法ではできたのですが、
perlならシンプルなコードが書けそうな
気もしますので、配列以外の方法で実現する方法
をご教示ください。
641デフォルトの名無しさん:2010/06/27(日) 10:09:20
ん?なんで$dataをブラケット<>で囲むんだ?

while (<$data>) {}だと$dataに格納されている文字列が示す名前の
ファイルをオープンして順次$_にセットする挙動…のはず

print $data; #でOK

そもそもこれは成功コードでprint FILE $data;ってあるじゃん…
642デフォルトの名無しさん:2010/06/27(日) 10:48:21
>>641
ファイル出力後、
$dataの内容を1行ずつ処理したいということです。
while内処理のprint はあくまで例でした。

以下のコードで実現できますが、
配列を使わずに、シンプルにでき方法があれば
ご教示ください。

my $data = do{ local $/; <STDIN>};
open(FILE,">./t3.eml");
print FILE $data;
close (FILE);

@lines = split("\n",$data);
for(my $i = 0;$i <= $#lines;$i++){
 $r = $lines[$i];
 if ($r =~ /From:/i){
  print "$r\n";
 }
}
643デフォルトの名無しさん:2010/06/27(日) 11:13:13
配列を忌避する理由がわからないな…

どうしてもというならfor句に直接splitを突っ込んで
見かけだけ配列を避けるとか、m//使うとか考えられるけど…

やっぱりSTDINからとってくるときに$/そのままにして
一行ごとに配列に入れるようにしない?やっぱり嫌?
644デフォルトの名無しさん:2010/06/27(日) 12:47:58
readlineぽくやるってことなら
while (my $r = /(.*?)\n/g) {
}
645デフォルトの名無しさん:2010/06/27(日) 13:37:13
>>643-644
ありがとうございます。

配列が嫌ってわけではないです。
シェルスクリプト(sh系)なら
recs=`cat ./data.txt`
for rec in $recs; do
 処理・・・
done
こんな感じでできるのでperlも
直接処理ができるのかと思いました。

元々のコードは
while(<STDIN>){
 $r = $_;
 処理・・・
}
なのですが、
今回<STDIN>の中に
複数のOSの改行コードが存在する
疑惑があり、処理が正常に動かなかった為、
調査のために、ファイルに一気に出力しました。

素直に配列でやります。
646デフォルトの名無しさん:2010/06/27(日) 14:24:24
「大きいファイルを複数行な正規表現にマッチさせたいんだけどいったん変数に
全部読み込むのはどうよ」問題なのですが
正規表現ライブラリ側で「もうちょい食わしてくれたら完全にマッチするかもしれない」
みたいな意思表示をしてくれたら解決すると思うのですが、そんな素敵ライブラリありますか?
647デフォルトの名無しさん:2010/06/27(日) 14:45:37
あまりに巨大なマッチングなら
マッチングを前半と後半とかに分解した方が素直な場合があるけど
それはどうしても避けたいパターン?
648デフォルトの名無しさん:2010/06/27(日) 15:51:32
>>645
open my $fh,'<',\$data; # 詳細は PerlIO::scalar 参照
while(<$fh>) { ... }
みたいなやり方はあるけどね。
でも、自分が素直だと思う方法を迷わずに使うのは充分にperlらしいやり方だと思う。
649デフォルトの名無しさん:2010/06/27(日) 16:16:35
>>645のシェルスクリプトっぽい形なら、>>643がいってるように↓じゃダメ?
my $data = do{ local $/; <STDIN>};
for my $r (split /\n/, $data) {
    print "$r\n" if ($r =~ /From:/i);
}

>>648のほうが無駄はなさそうだけど
650646:2010/06/27(日) 20:27:04
>>647 どうしても避けたいパターン? というよりはどうにかして避けるべきパターンだと思うのです
651デフォルトの名無しさん:2010/06/27(日) 21:24:00
よくわからないけど、Perlで書くなら、大きいファイルでも全部変数に読みこむ方が
望ましいと思う
652デフォルトの名無しさん:2010/06/27(日) 23:27:10
具体例を挙げないから、「どうにかして避けるべきパターン」っ
てーのが想像出来ん。

653デフォルトの名無しさん:2010/06/27(日) 23:45:42
メモリが2Gしかないのに、対象が10Gもある
654デフォルトの名無しさん:2010/06/28(月) 01:06:43
??

それだと、>>647氏の指摘通り、マッチング分解して
各行解析するしか無いんじゃねーの?
655デフォルトの名無しさん:2010/06/28(月) 02:13:44
パターンを分けられたら範囲演算子で /start/ .. /end/ みたいにして
ループぶん回せるんだけど、これもできない事情が何かあるのかな
656デフォルトの名無しさん:2010/06/28(月) 03:43:11
File::Stream::findでそれっぽいことやってるかしらん
657507:2010/06/28(月) 17:48:16
Perlでリアルタイムキー入力ってどうやったらいいんでしょうか?
やりたいことは、文字列+Enterでなくて、矢印キーなどでリアルタイムに信号を送って
動くプログラムを作りたいと思います。何かヒントはあるでしょうか?

リアルタイムキー入力に関しては、
http://aplawrence.com/Unix/perlinput.html
にあった、vec($rin,fileno(STDIN),1)=1;
がひとつの方法かと思いますが、これをどう利用したらいいかまだ分かっていません。
矢印キーなどはPerl内ではASCIIコードで表現するのでしょうか?
658デフォルトの名無しさん:2010/06/28(月) 19:30:54
selectじゃなくてvecがキモだと思って
いるようでは先がおもいやられる
659デフォルトの名無しさん:2010/06/28(月) 21:13:48
>>657
Term::ReadKey
660507:2010/06/29(火) 00:45:15
>>658
私にはまだ、理解できないスクリプトです。selectあたりをもっと勉強してみます。
>>659
コメントありがとうございます。
use Term::ReadKeyで取り敢えずリアルタイムキー入力はできるようになりました。
次の課題は、方向キー(矢印キー)の入力をどう判定するかです。
アドバイスを頂けたらありがたいです。

現在のスクリプト

#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadKey;
ReadMode 4;
END { ReadMode 0 }
print "q to quit \n";
my $key = ReadKey;
while ($key ne 'q'){print $key;$key = ReadKey;}
print "\n";
661デフォルトの名無しさん:2010/06/29(火) 01:32:23
普通引数無いなら()つけるだろ……分かりにくい
662デフォルトの名無しさん:2010/06/29(火) 01:39:42
つーかTerm::ReadLine使えよ……
663507:2010/06/29(火) 03:23:49
>>661
>>662
すんません。
もっと勉強します。
矢印キーの受け取りについても教えてください。
ASCIIコードをつかうのではと思うのですが。
664デフォルトの名無しさん:2010/06/29(火) 04:42:58
カッコ付けたがり>>661
665デフォルトの名無しさん:2010/06/29(火) 06:05:05
実際に押してみてどんなキーコードが入力されるか一つ一つ調べればよくね?
666507:2010/06/29(火) 13:36:48
>>665
出来れば、その方法を詳しく教えてください。

色々しらべてだんだん分かってきました。
ASCIIコード内の文字の表記法は分かりました。
\100=8進数表記で@を表す。\x..は16進数表記。
しかし、矢印はASCIIコードじゃないですね。
ASCIIコードの制御コードは33個しかなくて、矢印キーは入っていませんでした。

ググってJAVAプログラムの例とかは見つけました。
そこから推測するにTerm::ReadKey あるいはTerm::ReadLineの
パッケージにそれようのコマンドがあるのではないかと想像しています。

もうひとつの方法は、キー入力で受け取った値を別の文字コードに変換して
出力することですが、まだ出来ていません。

667507:2010/06/29(火) 15:09:15
いろいろ調べて、
Term::TransKeys;
このモジュールを使えば矢印キーを認識できるようになることは分かりました。
しかし、紹介されているsampleプログラムが難解すぎて使いこなせていません。
668デフォルトの名無しさん:2010/06/29(火) 16:55:23
ここのレスの要件を満たすように書いたスクリプトです
アウトラインプロセッサ Part17
http://pc12.2ch.net/test/read.cgi/software/1268128564/224

ttp://codepad.org/jxOB6Qio

ディレクトリをなぞってテキストをピリオド階層テキストにするスクリプトです
危ないところとかないでしょうか
669デフォルトの名無しさん:2010/06/29(火) 18:18:30
急に「ピリオド階層テキスト」とか言われても、意味わからん
670デフォルトの名無しさん:2010/06/29(火) 18:57:39
これでどうだ
http://codepad.org/1jQpKm0f
671デフォルトの名無しさん:2010/06/29(火) 19:20:50
>>668
通りすがりだけど
テキストファイルのエンコーディングが単一でない限り
連結した際にぶっ壊れたファイルが出来上がるような気が

Perlが自動的に面倒みてくれるとかだったらごめんね
672デフォルトの名無しさん:2010/06/29(火) 19:29:55
>>669
ツリー型メモ帳で使われているファイル形式です
実体はただのテキストファイルです
正確には「階層付きテキスト形式」と呼ばれています

文書を木で表現する形式です
ノードの名前にピリオドを付けて深さを表します
ノードの内容(本文)にはピリオドはつきません

ここが詳しいです
ttp://www.wikihouse.com/windows/?%A5%A2%A5%A6%A5%C8%A5%E9%A5%A4%A5%F3%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5
ttp://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A6%E3%83%88%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5


>>670
フォルダにあるテキストの内容も@wzに入れたいのです
673デフォルトの名無しさん:2010/06/29(火) 19:48:01
そういう特定のアプリケーションを出されても、知らない人は知らないんだからさ。
そのスレッド最初から全部読めとでも言うの?
どういう結果がほしいのかだけ書いてくれれば、仕様どおりにコーディングできるんだけど。
674デフォルトの名無しさん:2010/06/29(火) 20:31:55
ほれ。こんどはどうだ?
http://codepad.org/LoQquCL9
675デフォルトの名無しさん:2010/06/29(火) 21:26:22
>>673
・とあるディレクトリd0以下に存在する全てのディレクトリをなぞる。

・このとき、今位置するディレクトリdnの相対的な深さをdとして、
 d個のピリオドをディレクトリdnの名前の前に足した文字列 をファイルFに出力する。

・また、このとき、今位置するディレクトリdnにテキストファイルがあれば、
 d+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列 をファイルFに出力する。
・さらに、そのテキストファイルtnの内容をそのままファイルFに出力する。
 テキストファイルtnの内容の各行頭には、ピリオドはつけない。
 テキストファイルtnの内容のとある行頭にピリオドがある場合は、ピリオドの前に半角空白を入れる。

このような仕様です


>>674
ありがとうございます

まったくの期待通りですが、
ピリオドの数が合わない部分がありました

下のようなディレクトリで試しました
ttp://www1.axfc.net/uploader/Sc/so/128829.zip
ウイルスチェックはしましたが、念のためもう一度お願いします
676デフォルトの名無しさん:2010/06/29(火) 21:30:17
すみませんこちらでお願いします
ttp://www1.axfc.net/uploader/Sc/so/128834.zip
677507:2010/06/30(水) 13:10:10
TransKeysのソースコードを見たらこんなだった。
'27-91-65' => '<UP>',
'27-91-66' => '<DOWN>',
'27-91-67' => '<RIGHT>',
'27-91-68' => '<LEFT>',
ぐぐったらREBOLというのに関係ありそうだけど
素直にモジュール使うほうが楽なんだろうなぁ。
678デフォルトの名無しさん:2010/06/30(水) 14:45:18
Perlの継承について質問させてください。

親クラスも初期化し、子クラスも初期化して使う書き方がよく分からず混乱しています。
例えば以下のコードのように、親クラスも初期化する必要があるが、子クラスに追加フィールドを持ちたい場合、
どうやって両方を初期化して、全て子クラスのオブジェクトとして持ち歩けばよいか分かりません。
このコードの場合だと、親クラスのコンストラクタを呼んで、その参照を bless しただけで、子クラスの
追加フィールドを bless 出来ません…
bless は唯一つのハッシュリファレンをクラスと紐付けるものだと理解していますが、
この場合はどうすれば良いのでしょうか?アドバイスいただけますと幸いです。

#!/usr/bin/perl
package Parent;
sub new {
my ( $class, $arg ) = @_;
return bless { "parent" => $arg }, $class; #引数をparentにセット
}
sub print {
print "Parent: " . shift->{"parent"} . "\n"; #parentの内容をprint
}

package Child;
use base qw(Parent);
sub new {
my ( $class, $arg ) = @_;
my $super = $class->SUPER::new($arg); #親クラスコンストラクタ呼び出し
my $field = { 'child' => '20' }; #子クラスの追加フィールド
return bless $super, $class;
}

package main;
my $child = new Child(10); #子クラスのインスタンス作成
print $child->print(); #親クラスのfieldをprint
679デフォルトの名無しさん:2010/06/30(水) 14:59:32
>>678
初期化処理は別メソッドにしてnewはblessした後に初期化メソッドを呼ぶだけ
にする。

package Parent;

sub new {
my($class, @args) = @_;

my $self = bless {}, $class;
$self->initialize(@args);
return $self;
}

sub initialize {
my($self, ...) = @_;

# Parentの初期化処理
...
}

package Child;
use base qw(Parent);

sub initialize {
my($self, ...) = @_;

$self->SUPER::initialize(...);

# Child の初期化処理
...
}
680デフォルトの名無しさん:2010/06/30(水) 15:05:14
Child->SUPER::new()の返り値はParentじゃなくてChildオブジェクトとしてblessされたhashrefなんだから、
あとは普通のhashrefに対してするように必要なフィールドを足してやるだけでいい。

package Child;
use base qw(Parent);
sub new {
my ( $class, $arg ) = @_;
my $self = $class->SUPER::new($arg);
$self->{child} = 20;
$self;
}
681678:2010/06/30(水) 15:58:41
>>679
レスありがとうございます。
お示しいただいたコード例では、以下のように子クラスのinitializeを明示的に呼んでやるというイメージであっていますか?

my $child = new Child(); #親のnewが呼ばれる
$child->initialize(); #子クラスの初期化メソッド。中で親クラスの初期化メソッドも呼ばれる

子クラスで新たにフィールドにハッシュを追加したい場合は

package Child;
use base qw(Parent);

sub initialize {
my($self, ...) = @_;

$self->SUPER::initialize(...);
$self->{'newField'} = "something new"; #追加
}

のような感じですかね?とてもとても勉強になりました。ありがとうございました。
682678:2010/06/30(水) 15:59:44
>>680
明快かつ簡潔な答えありがとうございました。仰るとおりですね。
まだ脳がPerlに慣れていないようですぐにはそのことに思い当たりませんでした。勉強になりました。
683678:2010/06/30(水) 16:33:17
678です。多重継承でも同様の質問があるので、私の理解で合っているか確認させてください。
複数の親クラスを別の引数で初期化する時は >>679 さんの方法はそのままでは使えないので
初期化用のメソッド名を重複しない様にするぐらいしか自分では思いつかなかったのですが、
もっとスマートなやり方がありましたら是非ご指導ください。

以下の例では、>>679 のように、親クラスのnewは初期化メソッドを呼ぶだけだが、
初期化メソッドの名前をそれぞれ initA(), initB() としたつもりです。

use base(ParentA ParentB)
sub new {
my $class | shift;
return $class->NEXT::new(); #両方の親クラスのnewを実行
}
sub init {
my $self | shift;
$self->SUPER::initA();
$self->SUPER::initB();
}

my $child = new Child();
$child->init();
$child->parentAmethod(); #ParentAにしかないメソッド
$child->parentBmedhod(); #ParentBにしかないメソッド
684678:2010/06/30(水) 17:06:14
678です。

>>681 で大きな勘違いをしていました。
new Child(); したときに呼ばれる initialize() は、親クラスのそれではなく
子クラスのそれなのですね…目からうろこでした。

今日一日でずいぶん疑問が氷解しました。ありがとうございました。
685デフォルトの名無しさん:2010/06/30(水) 19:21:25
>>675
直下のディレクトリの内容を表示する時はピリオドがひとつ増える。
カレントディレクトリのファイル名もピリオドがひとつ増えるのだとすると、
区別がつけ難い。なにか仕様に誤りがあるのでは?
686デフォルトの名無しさん:2010/06/30(水) 21:01:18
丸投げしないで。
ちった自分で考えろ
687デフォルトの名無しさん:2010/06/30(水) 21:44:48
>>685
「ディレクトリの内容」が
@file = readdir ( DIR ) ;
での@fileを指すならば、それは出力しませんし、ピリオドも増えません。
688デフォルトの名無しさん:2010/06/30(水) 23:01:54
以前から不思議だったんだけど、パスの一覧作るのに、
再帰呼び出し使うのってどっかの参考本にでも載ってるの?
普通にsplice利用すれば良いのに。

use Data::Dumper ;
use Cwd ;
sub make_list {
 my $i = 0 ;
 for ( @_ ){ $i ++ ; -d $_ and splice @_, $i, 0, sort grep !/^\./, glob "$_/*" ; }
 @_ ;
}
print Dumper [ make_list getcwd ] ;

もっと言えば、coreのFile::Find使えって話しになるけどさ。
perl -MFile::Find -MCwd -le 'find sub{ print $File::Find::name }, getcwd '
689デフォルトの名無しさん:2010/06/30(水) 23:14:16
×$i ++ ; -d $_ and splice @_, $i, 0, sort grep !/^\./, glob "$_/*" ;
◯$i ++ ; -d $_ and splice @_, $i, 0, sort glob "$_/*" ;
690507:2010/07/01(木) 00:42:40
>>665
やっと自己解決しました。

use Term::ReadKey;
ReadMode 4;
END { ReadMode 0 }
while ((my $key=ReadKey) ne 'q'){print ord($key)."\n";}

これで押したキーのASCIIコードが表示されるようになりました。
しかし矢印キーは一度押すと同時に3つのアスキーコードを
送ってくるようなので、矢印キーが押されたかどうかを判定するスクリプトを
どう処理したら良いの困っています。ヒントを下さい。
691デフォルトの名無しさん:2010/07/01(木) 01:00:11
>>688
$.でカウントされている@_での$_[$.]が$_、
とかはperlerには「普通」なのか……
692507:2010/07/01(木) 01:11:07
>>690
まだ不完全ですが、なんとなく自己解決しました。
矢印キーを押すと挙動不審になりますが、いちおう
矢印キーが押されたら、その方向を表示し、通常のキーが押されたら、
そのキャラクタを表示するプログラムです。

改善点があればぜひご指導下さい。

use Term::ReadKey;
ReadMode 4;
END { ReadMode 0 }
while ((my $key=ReadKey) ne 'q'){
if(ord($key)==27){
if(ord($key=ReadKey)==91){
if(ord($key=ReadKey)==65){print "<UP>\n";}
elsif(ord($key)==66){print "<DOWN>\n";}
elsif(ord($key)==67){print "<RIGHT>\n";}
elsif(ord($key)==68){print "<LEFT>\n";}
$key=ReadKey;
}
}
print $key;
}
693デフォルトの名無しさん:2010/07/01(木) 05:39:41
>>691
@_は$.でカウントなんてされてないぞ。
694688:2010/07/01(木) 06:23:06
>>691
「普通にsplice利用すれば良い」ってだけだから
for文は好みにすればいいよ。
(実際の所はspliceもキモでもないんだけどw)
sub make_list{
 my @list = @_ ;
 my @out ;
 while( my $file = shift @list ){
  push @out, $file;
  next if ! -d $file;
  unshift @list, sort glob "$file/*" ;
 }
 return @out;
}

695デフォルトの名無しさん:2010/07/01(木) 13:38:06
>>693
じゃあforの@_はどうやってカウントしてるんだ?
696デフォルトの名無しさん:2010/07/01(木) 17:12:18
splice使うのが「普通」なのか。
perlなんてさ、ただの一時しのぎだろ。
ロジックの確認するだけ。
とりあえず間に合わせでperlで書いといて
あとで他の言語に書き換えたいよな。
できるだけperl固有のやりかたは避けたい。
つぶしが利かん。
それに、「普通」だと言っておきながら
>>689みたいなミスを犯すならバカらしいじゃん。
もっともっと複雑な処理をしたいとき、どーするよ?
697デフォルトの名無しさん:2010/07/01(木) 17:40:10
一時しのぎなんだから使って結果を得たらおしまいだろw
あとで他の言語に書き換えるぐらいならはじめからそっちで
書くわい。
698デフォルトの名無しさん:2010/07/01(木) 18:22:45
一定のフォーマットで出力されるcsvやテキストデータを処理してから、
ExcelやAccessに渡したりするにはPerlが便利だと思う。
699デフォルトの名無しさん:2010/07/01(木) 18:33:55
open(SYS, "dir /s /b |");
while (<SYS>) { print $_; }
close(SYS);
700デフォルトの名無しさん:2010/07/01(木) 18:54:22
>>694
ループで配列をshiftしつつunshift、
長さが変わる@listのshift位置を何が記憶してるのかが謎。
$.ではないし、何か専用のポインタのようなものでもあるの??
701デフォルトの名無しさん:2010/07/01(木) 19:12:05
長さがかわろうがなにしようが配列自体が変更されてるんだkら
shift位置の記録とかそんな考え方はいらんだろ。常にその時点
での配列の先頭要素を削って取り出すのがshift。
702デフォルトの名無しさん:2010/07/01(木) 19:54:40
じゃ>>688の for (@_) はどうやってるんだ?
703デフォルトの名無しさん:2010/07/01(木) 20:07:20
たまたま動いているだけだな。
perlsynにはやっちゃいけないと書いてある。

LIST のいずれかの部分が配列であった場合に、たとえば splice を使って ループの本体でその要素を削除したりあるいは追加したりすると foreach は非常に混乱してしまいます。 ですからそういうことをしてはいけません。
704デフォルトの名無しさん:2010/07/01(木) 20:49:10
ディレクトリ構造自体が再帰的構造なんだから
再帰を使うのは至って自然なことだと言ってみる。
705デフォルトの名無しさん:2010/07/01(木) 21:28:02
再帰って goto と同じレベルで使用禁止になってるもんだと思ってた。
706デフォルトの名無しさん:2010/07/01(木) 22:10:57
え?
707デフォルトの名無しさん:2010/07/01(木) 22:15:28
フィボナッチ数の計算とか明らかに再帰使うだろ
708デフォルトの名無しさん:2010/07/01(木) 22:20:47
フィボナッチごときで再帰いらねーだろw
709デフォルトの名無しさん:2010/07/01(木) 22:23:26
分かりやすく綺麗に書こうと思ったら再帰になるとおもうんだけどな
それとも再帰以外に分かりやすくて綺麗な方法があるのか?
710デフォルトの名無しさん:2010/07/01(木) 22:33:13
再帰つかうまでもなく、思いつくレベル
$num=10;
($a,$fib)=(0,1);
for (1..$num) {
 ($a,$fib)=($fib,$a+$fib):
 print "$fib\n";
}
711507:2010/07/02(金) 01:03:22
つまらない質問で済みませんが、色々探したんですが、
見つからなかったので教えて下さい。

Perlでテキスト出力をしたとき、通常はどんどん新しい行が追加されて
流れてしまいます。

出力場所を固定して、その場で出力を書き換える方法はどうしたら良いのでしょうか?
712デフォルトの名無しさん:2010/07/02(金) 01:29:52
$|=1;
for($i=0; $i<10; $i++){
print "$i\r";
sleep(1);
}
713デフォルトの名無しさん:2010/07/02(金) 03:01:28
なんじゃこりゃ。
perlが商標登録って。
北畠徹也って誰?
ttp://neta.ywcafe.net/001095.html
714507:2010/07/02(金) 05:41:12
>>712
最初は、自分への返信ということも気がつかないところでした。
実行してみてよく分かりました。
キーワードは、復帰文字、特殊変数、バッファリングですね。
バッファリングはまだ理解が不十分なのでもっと勉強してみます。
ありがとうございました。
715デフォルトの名無しさん:2010/07/02(金) 18:01:10
そういえばGoogleの「perl GoogleAPP」ってどうなったの?

凍結してんの?
716デフォルトの名無しさん:2010/07/03(土) 17:57:43
Perl/Tk のインストールに失敗してしまいます。
環境は MacOSX Snow Leopard の X11 上で、
Perl のバージョンは 5.10.0 、Perl/Tk は Tk-804.029.tar.gz を使っています。

手順は perl Makefile.PL を行った後 make するだけで、make 時にエラーになります。
エラーは以下のようになっています。

/usr/bin/ar cr libpTk.a ClientWin.o Lang_f.o ...
/usr/bin/ranlib: archive library: libpTk.a will be fat and ar(1) will not be able to operate on it
/usr/bin/ranlib: for architecture: x86_64 file: libpTk.a(tclAsync.o) has no symbols
       :

どうもファイルが多すぎて ar に失敗してるようです。
全 Makefile 内(結構ある)の ar を libtool に置き換えたらなんとかなるかもしれませんが、
このようなエラーが出てインストールできないという情報がネット上に特にないので、
そんなことをしなくても何とかなるのでしょうか?
何か知ってる方がいればお願いします。
717デフォルトの名無しさん:2010/07/03(土) 20:33:45
$x = <STDIN>;$Data = <STDIN>;$y = <STDIN>;
if ($Data eq "+") {
$k = $x + $y; } elsif ($Data eq "-") {
$x - $y; } elsif ($Data eq "*") {
$x * $y; } elsif ($Data eq "/") {
$x / $y; };
print $k;

if文でDataに入力された記号を見分けてそれに対応した計算をしたいんだけど $kの中身がnullになるのはなぜ?
718デフォルトの名無しさん:2010/07/03(土) 20:36:10
>>717
行末の改行コードを落としてないから
719デフォルトの名無しさん:2010/07/03(土) 23:15:14
>>717
標準入力受けたら、ファイルから一行読んだら、chomp。
そして暇だから書いてみた。

foreach ($x, $Data, $y) {
chomp($_ = <STDIN>);
}
$k = ($Data eq "+") ? $x + $y :
($Data eq "-") ? $x - $y :
($Data eq "*") ? $x * $y :
($Data eq "/") ? $x / $y :
"non support" ;
print $k;
720デフォルトの名無しさん:2010/07/03(土) 23:36:12
>>716
Macってのはx86の64ビットなのか?
それ、Windowsのじゃない?
721デフォルトの名無しさん:2010/07/03(土) 23:55:53
PPCなんてとっくに捨てたよ
722デフォルトの名無しさん:2010/07/04(日) 00:28:30
環境はx86の32ビットです。
なのに、確かになぜか -arch x86_64 が指定されているようですね・・・。
Snow Leopardだからということで、
64ビット版とのユニバーサルバイナリを作る設定になってるのかも。
CPANの設定が面倒くさかったので全部デフォルトのままだったのがマズかったのかもしれません。
明日ちょっと設定を見直してみます。ありがとうございました。
723デフォルトの名無しさん:2010/07/04(日) 06:27:31
>>719
foreachってこういう使い方もできるのか。
$_に代入すると元の変数の値も変わるんだな。
配列で使うときには何も感じずに使ってたけど、なんか不思議な感じ。

$_に各変数のポインタが入るなら$$_としないといけないのに。
まぁ、特殊変数というぐらいだからあれか。
724デフォルトの名無しさん:2010/07/04(日) 06:59:55
$_が特殊なんじゃ無い。
my $dat ;
my $foo ;
for $dat ($foo){ $dat = q{bar} ;}
print "$foo\n" ; # => bar
725デフォルトの名無しさん:2010/07/04(日) 07:48:24
なるほど、$_は単なる変数でforeachが代入処理をやってるってことか。

($,, $\) = (", ", "\n");
@names = ('太郎', '花子');

foreach $name (@names) {
$name .= 'くん';
}
print @names;

for($i=0,$name=$names[$i]; $i<@names; $names[$i]=$name, $name='', $i++, $name=$names[$i]){
$name .="さん";
}
print @names;
726デフォルトの名無しさん:2010/07/04(日) 07:54:29
namenamenamenamenamenamename
727デフォルトの名無しさん:2010/07/04(日) 08:56:56
my $dat = q{ini};
my $dat2 = q{ini};
my $foo ;
for $dat ($foo){ $dat = q{bar} ; $dat2 = q{aaa}; }
print "$foo\n" ; # => bar
print "$dat\n";
print "$dat2\n";

こんな風にすると、forのループ変数の特殊さが判る
まあ、普通に効率のいいコードを作れば参照渡しにするから当然だけど
728デフォルトの名無しさん:2010/07/04(日) 09:52:28
ループ変数$datのスコープがfor内に限られているってだけじゃない?
729デフォルトの名無しさん:2010/07/04(日) 10:08:47
mapやgrepの$_もエイリアスだってこと忘れないであげてください

my @list1 = qw(hoge fuga piyo);
my @list2 = map { tr/o//d } @list1;
print "@list1\n"; #=> hge fuga piy
print "@list2\n"; #=> 1 0 1 (trで削除された文字数)
730722:2010/07/04(日) 12:20:40
CPANの設定関係なかったようなので
Makefile を無理矢理置換して -arch i386 のみにするとインストールは成功しましたが、
実行しようとするとアーキテクチャが合わないとか言われてしまいました。

仕方がないので ar を libtool に置き換えて実行してみても、途中で失敗。
複数 -arch 指定してるとだめみたいなこと言われる箇所が。
gcc-4.2: -E, -S, -save-temps and -M options are not allowed with multiple -arch flags

仕方がないので -arch x86_64 のみにしてみたところ、うまくいきました。
Core 2 Duo って x86-32 と x86-64 の両方に対応していたんですね・・・。今頃知った。
そして、Snow Leopard は x86-64 モードで動いている・・・ということなのだと思います。

以上報告まで。
731デフォルトの名無しさん:2010/07/04(日) 12:49:35
>>728
スコープとは少し違う
ループ変数はsortの$a $bみたいなガチアイデンティファイア
732デフォルトの名無しさん:2010/07/04(日) 17:36:44
Perlのif倒置良いなぁ。

createWindow("パラメータ");
createShadow("パラメータ") if (useShadow);

こういうの良いなぁ。
733デフォルトの名無しさん:2010/07/04(日) 18:34:12
倒置じゃなくて修飾詞だけど、一切使わなくても書けるし、
それで不都合ないので、使わない方が保守が楽
734デフォルトの名無しさん:2010/07/04(日) 18:52:33
倒置(とうち)とは、言語において通常の語順を変更させることである。
735デフォルトの名無しさん:2010/07/04(日) 18:53:54
倒置じゃなくて後置って言うんだぜ
豆な
736デフォルトの名無しさん:2010/07/04(日) 19:04:58
C言語に入っててもよかったよね>if文後置
つーか今からでも入れてほしい。
737デフォルトの名無しさん:2010/07/04(日) 19:06:28
Perlは1文でも{ }が必要だから重宝するのであって
Cには別になくてもいいと思う
738デフォルトの名無しさん:2010/07/04(日) 19:11:31
>>736
dowhile使ってればいいじゃん
739デフォルトの名無しさん:2010/07/04(日) 19:12:42
それは本気で言っているのか?
740デフォルトの名無しさん:2010/07/04(日) 23:59:09
XPで以下のプログラムを実行すると
〜‖|…
 と表示されるはずが
??|…
と最初の2文字は"?"に変換されてしまいます。
どうも区点の1区にある文字でうまく変換できない文字があるようなのですが
何か設定が必要でしょうか?

use Encode;

$x  = "\x21\x41\x21\x42\x21\x43\x21\x44"; # "〜‖|…"
$y = Encode::decode('jis0208-raw', $x);
print Encode::encode('CP932', $y);
741デフォルトの名無しさん:2010/07/05(月) 02:04:48
cp932 でなくて shiftjis を指定してみる。
742デフォルトの名無しさん:2010/07/05(月) 14:28:33
また波ダッシュか
743デフォルトの名無しさん:2010/07/05(月) 15:50:52
>>741
ありがとうございます。shiftjisで出ることを確認しました。
cp932 と shiftjisでググってみたらUncode規格のバグ文字に当たる問題みたいですね。
cp932を使いたいのでcp932でも表示できるUTF文字に置き換えることにしました。
744デフォルトの名無しさん:2010/07/06(火) 15:27:39
中身が被ってない配列を得たいんだけど、ハッシュに突っ込んでkeysが一番楽だよね?
745デフォルトの名無しさん:2010/07/06(火) 15:42:26
List::MoreUtils::uniqを使わずにってこと?
リストの順番が変わってもいいんならそれでいいと思うけど
746デフォルトの名無しさん:2010/07/06(火) 17:39:14
とん。
問題なさそうだし、それで行く。
747デフォルトの名無しさん:2010/07/06(火) 18:16:31
1. List::MoreUtils の中身そのまんま
sub uniq (@) { my %h; map { $h{$_}++ == 0 ? $_ : () } @_; }
# grepがこの様なケースの為に存在するのに何故mapで?

2. 定番
%h ;
@uniq = grep { ! $h{$_}++ } @arr ;

3. ハッシュに突っ込んでkeys
%h ;
@h{@arr} = (1) x @arr ;
@uniq = keys %h ;

…手間は一番掛ると思う。
748デフォルトの名無しさん:2010/07/06(火) 19:50:19
3番目の2行目って実行できなくない?
749デフォルトの名無しさん:2010/07/06(火) 20:00:27
普通に出来るが?
750デフォルトの名無しさん:2010/07/06(火) 21:19:09
出来なかった
751デフォルトの名無しさん:2010/07/06(火) 21:35:36
perl -Mstrict -we 'my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr} = (1) x @arr;my @uniq = keys %h;print "@uniq¥n"'
結果:4 1 3 2 5
perl 5.8.6で確認。だいじょb
752デフォルトの名無しさん:2010/07/06(火) 22:55:38
twitterのライムラインではなくフォローしてる人の最新20件のつぶやきを取得できるモジュールってありますか?
753デフォルトの名無しさん:2010/07/06(火) 22:56:04
これくらいしかミスり様が無いんだが
@arr = 1 x 5 ; # => ( '11111' )
@arr = (1) x 5 ; # => ( 1,1,1,1,1)

自己フォロー
my $c = my $d = '';
my @arr = ( 1,2,3,$c,$d,undef,undef,1,2,3);
このケースを想定したら、自ずと2番以外の選択肢は消える
grep をちょっと変更しなきゃならんけど
754デフォルトの名無しさん:2010/07/06(火) 23:23:04
D:\>perl -Mstrict -we 'my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr} = (1) x @arr;my @uniq = keys %h;print "@uniq\n"'
Can't find string terminator "'" anywhere before EOF at -e line 1.

This is perl, v5.10.1 built for MSWin32-x64-multi-thread
755デフォルトの名無しさん:2010/07/06(火) 23:28:47
winのperlワンライナーはクォーテーションを変えなきゃダメだろ
perl -Mstrict -we "my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr} = (1) x @arr;my @uniq = keys %h;print qq{@uniq\n}"

環境が無いから実行出来るかは知らんけどさ。
756デフォルトの名無しさん:2010/07/06(火) 23:44:08
通りすがりが>>755でやってみた

C:\> perl -v
This is perl 5, version 12, subversion 0 (v5.12.0) built for MSWin32-x64-multi-t
hread
[...]

# 一行で
C:\> C:\Users\foobar>perl -Mstrict -we "my @arr = qw( 1 2 3 4 5 3 4 );my %h;@h{@arr}
= (1) x @arr;my @uniq = keys %h;print qq{@uniq\n}"
4 1 3 2 5

めでたしめでたし
757デフォルトの名無しさん:2010/07/07(水) 19:54:26
こういうときはベンチマークでどれが最速か比較する方向に話が進むのに、
なんでワンライナー自慢になって終わってるんだ?w
758デフォルトの名無しさん:2010/07/07(水) 20:19:14
他人のベンチマークの結果はストックできないけど
ワンライナーはストックできるから……じゃね
759デフォルトの名無しさん:2010/07/07(水) 20:20:59
別に自慢じゃなくて他人がコマンドラインからすぐ試せるようにって言う
思いやりがそうさせたんだろう
760デフォルトの名無しさん:2010/07/08(木) 00:16:02
while ( chomp(my ($id, $name) = split /,/, <FILEHANDLE>) )
上の文のchompは何に対して処理しているのか教えてください
761デフォルトの名無しさん:2010/07/08(木) 00:26:18
$idと$nameに対して、それぞれchompしてる。
762デフォルトの名無しさん:2010/07/08(木) 00:50:39
ありがとうございました
763デフォルトの名無しさん:2010/07/08(木) 01:54:50
>>747の3.の2行目は@arrの各要素を%hのキーにして、
1が@arr個ある配列をそれぞれに代入しているようなのですが、
このハッシュに@を付けて{}の中にキー配列を入れる用法はなんと言うんでしょうか?
ハッシュ プレフィクス @ 配列 初期化などでぐぐりましたが見つけられませんでした。
764デフォルトの名無しさん:2010/07/08(木) 02:29:09
スライス
765デフォルトの名無しさん:2010/07/08(木) 02:59:47
>>764
ありがとうございます。
色々な例を見つけることが出来ました。
766デフォルトの名無しさん:2010/07/09(金) 01:04:48
@arr=('hoge', 'huga', 'foo', 'bar', 'hoge', 'foo');

$start = (times)[0];
for($i=0;$i<1000000;$i++){
my %h ;
my @uniq = grep { ! $h{$_}++ } @arr ;
}
printf "2.にかかった時間:%f\n", (times)[0]-$start;

$start = (times)[0];
for($i=0;$i<1000000;$i++){
my %h ;
@h{@arr} = (1) x @arr ;
my @uniq = keys %h ;
}
printf "3.にかかった時間:%f\n", (times)[0]-$start;



D:\>test.pl
2.にかかった時間:4.290000
3.にかかった時間:3.838000


あら3の方が早い
767デフォルトの名無しさん:2010/07/09(金) 01:21:28
ブラックジャックで2枚の親のカードの内、1枚だけ表示させる書き方教えてください。
while ($#stack >= 11) {
undef @myHands;
undef @hisHands;

push (@myHands, pop (@stack));
push (@hisHands, pop (@stack));
push (@myHands, pop (@stack));
push (@hisHands, pop (@stack));


print "MyCards:", join (", ", @myHands), "\n";
print "HisCards:", join (", ",@hisHands), "\n";

ここで親のカードを1枚だけ表示させたい!
stackには51枚のカードが入っています。
お願いします。
768デフォルトの名無しさん:2010/07/09(金) 11:33:14
>>767
一枚目だけ表示すればいいの?こんな感じ
print join(",", map { $_ ? "xx":$hisHands[$_] } (0..$#hisHands) ), "¥n";
769デフォルトの名無しさん:2010/07/09(金) 21:30:03
>>768
ありがとうございます!
perl初心者の僕には難しすぎましたね・・・!
もっと色んな本を読んで、高レベルなプログラミングが出来るように頑張ります!
770名無しさん@そうだ選挙に行こう:2010/07/10(土) 15:12:24
WinでのPerlの実行はCMD.exeからやってますかね?
utf8の文字コードだと化ける・・。ググったらutf8でも表示する方法が載ってたけど
Win2kだとダメでした。
binmode STDIN, ":encoding(cp932)";なんかも試したけど文字がたまに化けるなぁ・・・
771名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:41:48
HTTP::Proxyのモジュールをインストールしたいんですが
PPMでダウンロードする場合は何ていう名前のを指定してやればいいんですかね
iHTTP::ProxyでPPMにてサーチしても変なのしか出てこない・・・

色々ぐぐっても分からず
772名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:56:12
unicodeのテキストって自由に読み書きできる?
CRLFすら無いので、<>で読めるんだろうか
773名無しさん@そうだ選挙に行こう:2010/07/10(土) 23:38:13
>>771
ppmのリストには載ってない。
ttp://aspn.activestate.com/ASPN/Modules?module_name=H&order=name&query_start=106

ttp://search.cpan.org/~book/HTTP-Proxy/lib/HTTP/Proxy.pm
からソースダウンロードして適当に突っ込むしか無いんじゃねーの?
774名無しさん@そうだ選挙に行こう:2010/07/10(土) 23:38:45
>>771
CPAN

Perl core and CPAN modules documentation

HTTP::Proxy in Modules Search

HTTP::Proxy

> Win32 PPM packages for "HTTP-Proxy"
> uwinnipeg Perl 5.10 repository [ v 0.24 ]
> uwinnipeg Perl 5.8 repository [ v 0.20 ]
775名無しさん@そうだ選挙に行こう:2010/07/10(土) 23:46:00
>>772
バイナリでも読めるんだから、改行無くても読めるだろ。
読込んだ後にエンコードなりデコードなりしちゃえばいいし。
my $content = ’’;
open my $fh, "foo" or die $!;
binmode $fh;
{
local $/;
$content = <$fh>;
}
close $fh;
776名無しさん@そうだ選挙に行こう:2010/07/11(日) 00:12:18
つまりテキストで読めないということか
777名無しさん@そうだ選挙に行こう:2010/07/11(日) 00:20:40
UTF8なuse utf8;でおkだろ
778名無しさん@そうだ選挙に行こう:2010/07/11(日) 00:25:03
>>つまりテキストで読めないということか
binmodeの事かな?
まあ、windowsでしか使わんからな。>binmode
binmode指定しとけば、なんだって読めるよ。
779名無しさん@そうだ選挙に行こう:2010/07/11(日) 00:32:40
符号化方式によるな
780名無しさん@そうだ選挙に行こう:2010/07/11(日) 02:26:24
>>773 >>774
どうもありがとう。PPMにないんですか通りでいくら探してもないはずだ
Win環境ではCPANは色々と面倒そうですね・・・。
ソースからも大変そうだ。HTTP::Proxyは凄い面倒そうだ・・・
781名無しさん@そうだ選挙に行こう:2010/07/11(日) 04:24:17
>>780
ppm リポジトリ 追加
でggr
782名無しさん@そうだ選挙に行こう:2010/07/11(日) 07:31:14
ActivePerlのバージョンは何で使ってますか
たくさんあって選びにくい
やっぱり最新のがいいんだろうか
783名無しさん@そうだ選挙に行こう:2010/07/11(日) 09:40:41
枯れてきてるという意味で5.10が鉄板だけど
5.12でも問題ないと思うよ
784名無しさん@そうだ選挙に行こう:2010/07/11(日) 12:17:38
>>780
WindowsでCPAN使いたいならActivePerlじゃなくてStrawberry Perlにするといい
インストールするだけでコンパイラとかも含めて必要なもの全部入るから何も面倒なことないよ
785名無しさん@そうだ選挙に行こう:2010/07/11(日) 12:23:04
最近のActivePerlはMinGW同梱じゃなかったっけ?
786名無しさん@そうだ選挙に行こう:2010/07/11(日) 13:33:49
5.8使ってるけど5.10が多いのか
787名無しさん@そうだ選挙に行こう:2010/07/11(日) 14:31:49
>>781
>>784
どうもありがとう。色々試してみます
788名無しさん@そうだ選挙に行こう:2010/07/11(日) 15:26:52
自分で使いたいだけなら最新安定版
テスト環境として使うなら実運用先のバージョンに合わせる
人柱なら開発版でもなんでも使えばいいじゃない
789名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:03:30
ちょっとバージョンあげるだけで動かなくなるからな・・
790名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:12:40
選択基準はPPMにモジュールがあるか、無いか。
使いたいモジュールがPerlの最新版に無ければ古いのを使う。
モジュールが出た時点で最新版に移行するよ。
791名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:19:32
URI/QueryParam.pmモジュールが登録されているリポジトリを探しているんだけど
どうやってググって探せばいいのかな。
モジュール類が登録されているリポジトリの探し方を教えてください
792名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:21:40
793名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:28:31
ちなみにActivePerl v5.8.0 の古い奴です・・
794名無しさん@そうだ選挙に行こう:2010/07/11(日) 18:00:46
5.10を使っている人が多いので
ActivePerl 5.10.1.1007を入れてみた。
795名無しさん@そうだ選挙に行こう:2010/07/11(日) 18:05:23
バージョンあげるときは思いっきり動かなくなる可能性があるから古いのは残しておいて
いつでも戻して置けるようにしておくことをお勧めする。結構安易にバージョンあげると面倒だよ
796名無しさん@そうだ選挙に行こう:2010/07/11(日) 22:44:06
んなーこたーない。PHPじゃないんだから。
797デフォルトの名無しさん:2010/07/12(月) 08:15:21
>>785
5.10.1.1007からはそうだね
>On 32-bit Windows CPAN shell automatically downloads and installs
>the MinGW GCC compiler
798デフォルトの名無しさん:2010/07/12(月) 21:11:56
変数に入っているデータが 01 の文字列として入っている場合に
文字列 01 を数値の 1 に変換したいんですけど一番スマートな方法ってどんな感じで指定するのですかね?
799デフォルトの名無しさん:2010/07/12(月) 21:14:41
>>798
文字列が10のときは二進の2にするの?それとも十進での10にするの?
800デフォルトの名無しさん:2010/07/12(月) 21:18:46
>>799
すみません。十進での10にする予定です
全部十進で考えています
801デフォルトの名無しさん:2010/07/12(月) 21:33:14
気にせんでも「数字として扱えば数字として扱われる」んだから、
文字列のままで良いんでねーの?
明示的にどーしてもやりたいなら、0足すのが一番スマートか?
my $i = '01' ;
print 0+ $i ;
printf "%d\n", $i ;

802デフォルトの名無しさん:2010/07/12(月) 21:35:33
>>801
なるほど気にしなくてもいいんですね
どうもありがとうございました
803最強:2010/07/12(月) 22:17:09
CPANから
Pod::PerldocJp
いれてperldocjp実行したけど文字化けしてしまう

utf-8撰んで表示させてるんだけど

perldocjp -f
Option f needs a following argument!
???: perldocjp [-h] [-V] [-r] [-i] [-D] [-t] [-u] [-m]
[-n nroffer_program] [-l] [-J] [-T] [-d output_filename] [-o output_format]
[-M FormatterModuleNameToUse] [-w formatter_option:option_value] [-L translation_code] [-F]
[-X] PageName|ModuleName|ProgramName|URL
perldocjp -f PerlFunc
perldocjp -q FAQKeywords
perldocjp -A PerlVar

-h????????????????????????????
???"perldocjp perldocjp"????????
[PerldocJp v0.13 based on Perldoc v3.15]

ってでてしまう
sjisとかeucとかためしたけど全部????って表示される 誰か教えてください
804デフォルトの名無しさん:2010/07/12(月) 22:51:36
-Tで適当な奴出力して問題なかったら、pagerの問題。
問題あったら、端末のエンコーディングの問題も加わる

何れにせよ、cpanのマイナーモジュールの質問を2chでしても
あんまり有用な答えは帰って来んよ
普通にググった方は早いんじゃない?
805デフォルトの名無しさん:2010/07/12(月) 23:25:28
http://www.ujiya-denshi.com/adiary/adiary.cgi/0156
Perlのデバッグ環境でこれよさげなんだけど
使っている人いるかな。感想を聞きたいな
806デフォルトの名無しさん:2010/07/13(火) 11:51:07
Linux+perl5.7で
コマンドラインから実行すればsystemコマンドがきちんと動作して
Apache上でcgiとして動作させればsystemコマンドが-1を返して来てしまいます。

cgiでsystemコマンドを使うためには何か特殊な記述が必要でしょうか?
Apacheのエラーログには特に何も出ていません。

コマンド自体は大したことしてなくて
system("ls"); だけです。とりあえず今のところは。
807デフォルトの名無しさん:2010/07/13(火) 11:56:17
>>806
>>1
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://pc11.2ch.net/php/)

CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
808デフォルトの名無しさん:2010/07/13(火) 15:19:26
>>807
失礼しました。
とりあえず自己解決しました。
お騒がせしました。
809デフォルトの名無しさん:2010/07/13(火) 15:24:10
>>805
eclipes と EPIC だね。使ってるよ。ステップ実行できて超べんり〜
810デフォルトの名無しさん:2010/07/14(水) 12:52:15
CPANの使えない環境でもDBIを使いたいので
CPAN Searchから以下のTARボールをダウンロード展開しました。
http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.611.tar.gz

展開したディレクトリからDBI.pmを取り出し、さらにlibの下からDBD, DBIを取り出して
自分の作業ディレクトリ mylib にコピーし、

use lib 'mylib';
use DBI;
my $dbh = DBI->connect(); #ドライバを指定していないのはわざとです

してみましたが、DBI.pmの265行目でコンパイルエラーがあると表示されて、当該場所を見ても
中括弧の終わりがあるだけで何でこけているのか判断がつきません。

CGI::Sessionモジュールや、Template Toolkitなどは、同じようにCPAN Searchから
拾ってきたものを展開して、ディレクトリ構成に注意してただしく配置し、use libしたら、
CPANが使えずに自前でライブラリを用意するしかない環境でも正しく動作しています。

ただ、DBIはTARボールを取ってきて展開して使えるような代物ではないのでしょうか…?
些細なアドバイスでも良いのでお願いします。
811デフォルトの名無しさん:2010/07/14(水) 13:07:12
↑の者ですが、READMEにしたがって

perl Makemake.pl; make & make install

したらDBIはちゃんと動いているようですが、そうやってインストールした場合は
DBI.so というライブラリが生成されており、異なったCPUアーキテクチャ上では
動作しませんでした…
CPANはすべてPerlで書かれたライブラリだと思っていたのですが、これは勘違い
ということでしょうか…?
812デフォルトの名無しさん:2010/07/14(水) 13:19:29
Pure perl のモジュールもあるけど
パフォーマンスのためにXS使ってるものはmake必要だよ
そのためのCPAN
813デフォルトの名無しさん:2010/07/14(水) 13:23:01
>>812
なるほど、今回はどうも仕方がなさそうですね…
勉強になりました。ありがとうございました。
814デフォルトの名無しさん:2010/07/14(水) 19:19:18
純粋に DBI を Pure Perl でつかいたいだけなら、できますよね?
http://search.cpan.org/~timb/DBI-1.611/lib/DBI/PurePerl.pm
815デフォルトの名無しさん:2010/07/14(水) 19:27:14
>>809
凄い便利そうでそうですね。土日か暇なときに入れてみます
ありがとう
816デフォルトの名無しさん:2010/07/14(水) 22:54:38
step実行がスゴイ!って何十年前の話してんだよ。
817デフォルトの名無しさん:2010/07/15(木) 07:38:49
あれれ・・・step実行はもう古いの?
じゃぁ今のトレンドは何?
818デフォルトの名無しさん:2010/07/15(木) 08:15:28
emacs から perldebuger 使ってる俺の立場は…
819デフォルトの名無しさん:2010/07/15(木) 17:22:43
ヒアドキュメントの部分を外部ファイルにしたいんだけど
なんかスマートでかっこいい方法ない?
820デフォルトの名無しさん:2010/07/15(木) 17:57:05
・HTML::Template
・Text::Template
・Text::MicroTemplate
・Template-Toolkit
・ClearSilver
・40 行で作るPerl用テンプレートエンジン

MicroTemplate使うのがいいんじゃね
821名無し:2010/07/15(木) 18:52:42
ダイヤモンド演算子<>のなかで
<${$self}{handle}>ってやるとエラーのですが
use strict;
use warnings;
package kuroppu;
sub new{
return bless{
handle=>undef,
};
}
sub open{
my $self=shift;
my $name=shift;
$self->close();
open $self->{handle},$name or die "file open error:$!";
}
sub read{
my $self=shift;
my $fh=${$self}{handle};
while(<$fh>)
{
print;
}
}
1;
$fh=${$self}{handle};ってやって
while(<$fh>)ってやるとうまく行くのですが
上のwhile(<${$self}{handle}>)だとエラーがでてしまうんですが
どうやって<>のなかでfhに代入させず入力させればいいですか?
822デフォルトの名無しさん:2010/07/15(木) 19:21:20
>>821
できない。単純変数に代入するか、readline関数を使ってください。
<>は中にグロブのファイル名パターンも書ける関係で変な仕様に
なっております。

$pat = '*.c';
while (<${pat}>) {...}

みたいなのできるんで。
823名無し:2010/07/15(木) 19:22:04
>>822
ありがとう・・・・
824名無し:2010/07/15(木) 23:38:45
Perlでオブジェクト指向のカプセル化って微妙だけどなんなの????


>とは、言っても、Perlのカプセル化は、ガチガチではないので、
>カプセルの中に入ることができます。以下のことは、あんまりやってはいけないことです。

ってあるけどそうなの?

オブジェクト指向とうたってるのに カプセル化とか曖昧だとむかついてくる
825デフォルトの名無しさん:2010/07/15(木) 23:44:42
オブジェクト指向とかもモジュールとかリファレンスとかを組み合わせて実装したわけだしなあ
そう言うのが嫌な人はPerl向いてないよ
826名無し:2010/07/15(木) 23:56:30
向いてないよとかいうなよ〜〜〜〜〜〜^^
827デフォルトの名無しさん:2010/07/16(金) 00:05:21
みんなはどんなモジュール使っている?
参考までにどんなものを使っているか聞きたいな
828デフォルトの名無しさん:2010/07/16(金) 00:12:27
strictとwarningsを一番よく使ってるかな。
829デフォルトの名無しさん:2010/07/16(金) 00:14:30
utf8も
830デフォルトの名無しさん:2010/07/16(金) 00:18:18
断然、Mechanizeだな
便利すぎ
831デフォルトの名無しさん:2010/07/16(金) 00:32:02
>>824
やろうと思えば覗けるけどカプセル化したい人は
覗くなってことさ。強制はしてないだけ。
832デフォルトの名無しさん:2010/07/16(金) 01:18:50
WWW::Mechanizeのパッケージでデフォルトだと
クッキーはどこに保存されますか?再読み込みとか保存とかどうなっているのだろうか
833デフォルトの名無しさん:2010/07/16(金) 01:39:32
834デフォルトの名無しさん:2010/07/16(金) 02:56:58
>>820
うちの環境は :: が使えないことが多いので
40行を改造して使うわ・・・
835デフォルトの名無しさん:2010/07/16(金) 02:59:56
意味がわからねぇ
836デフォルトの名無しさん:2010/07/16(金) 03:47:12
>>835
意味がわからないだろ?
俺にもなんでそんな環境でやらされんのかわかんないんだぜ
837デフォルトの名無しさん:2010/07/16(金) 07:01:40
>>834
Text'Template
を使えw

>>824
何の引用?
ttp://www.rwds.net/kuroita/program/Perl_oo.html
の事だったら、カプセル化の方法の説明は一切してないよ。
「perlのオブジェクト指向プログラムは、普通の状態だとカプセル化してない」
ってだけで。カプセル化したきゃ、自分ですれば良い。
(まあ、それでも他の言語と比べると…)
package Hoge;
use Scalar::Util qw(refaddr) ;
my %hash ; # dont use Grobal
my $code = sub {} ; # inner code
sub new { my $obj = bless \do{''}, shift ; $hash{ refaddr $obj } = shift ; $obj ;}
sub getter { $hash{ refaddr shift} ; }
sub setter { $hash{ refaddr shift} = pop ; return ; }
sub DESTROY { delete $hash{ refaddr shift } ; }
1;
package main;
my $obj = Hoge->new('hoge');
printf "%s\n", $obj->getter;
838デフォルトの名無しさん:2010/07/16(金) 09:43:03
> :: が使えないことが多いので
これがCPAN使うなモジュール入れるなっていうお達しなら、
perl使う意味が八割減ジャネーノ?
839デフォルトの名無しさん:2010/07/16(金) 09:48:24
::が使えないってまさかperl4?
840名無し:2010/07/16(金) 10:02:46
誰か教えたがりの人perlのオブジェクト指向詳しくおしえて
http://chat.studio.cx/o-cha/jsp/superbeginner/
ここに緑蛇でいるから誰か教えてください
841デフォルトの名無しさん:2010/07/16(金) 12:32:37
40行のテンプレートエンジンはやってること単純で
分かりやすいし使い勝手がいいんで改造して多用してる
ありがたや
842デフォルトの名無しさん:2010/07/16(金) 13:00:31
>>840
せっかく Perl付属のドキュメントがあるんだから
まずは手近なところから perldoc で少なくとも

perlboot
perlobj
perltoot
perltooc
perlbot

を読んで、理解出来ない部分を確認してから
他人に尋ねた方が良くないか?
843デフォルトの名無しさん:2010/07/16(金) 16:34:36
>>838
最も限りなく正解に近い
844デフォルトの名無しさん:2010/07/16(金) 16:52:07
>>843
Cに満たない言語も多いので油断は禁物です
845デフォルトの名無しさん:2010/07/16(金) 20:21:03
Template-Toolkitは非XS版もあるじゃん。
「::」も無いし
846デフォルトの名無しさん:2010/07/17(土) 01:01:17
Config::Multiって凄い便利だな
お前らちゃんと使ってるか?
847デフォルトの名無しさん:2010/07/17(土) 01:02:28
俺は、Config::Auto派だな
848デフォルトの名無しさん:2010/07/17(土) 01:04:13
>>827
Data::Dumper;
849デフォルトの名無しさん:2010/07/17(土) 01:13:20
>>841
0行のテンプレートエンジン使ってろ!
850デフォルトの名無しさん:2010/07/17(土) 16:25:14
WWW::Mechanizeでfirefoxのクッキーを共用させたいんだけど
どう書けばいいんですかね?
そしてfirefoxのクッキーが見当たらない場合は処理しないようにしたい
851デフォルトの名無しさん:2010/07/17(土) 16:31:53
firefoxのcookieファイル読み取れよと、
852デフォルトの名無しさん:2010/07/17(土) 16:42:18
Mechanizeなんか敷居が高すぎる
853デフォルトの名無しさん:2010/07/17(土) 17:15:54
>>851
具体的にコード書いてみて
854デフォルトの名無しさん:2010/07/17(土) 17:52:04
0行のテンプレートエンジンなんてあるのか
855デフォルトの名無しさん:2010/07/17(土) 17:55:53
あれはネタにしてもセンス無いなと思った
856デフォルトの名無しさん:2010/07/17(土) 18:26:57
>>853
やる気が出ないので却下
XMLを適当にパースすればいいだけだろJK
857デフォルトの名無しさん:2010/07/17(土) 19:00:52
今はcookies.sqliteになってる
ある意味XMLより簡単だな
プロファイルフォルダを探す方が面倒なくらいだ
858デフォルトの名無しさん:2010/07/17(土) 19:27:42
sqlitewwww
パースする必要すらないじゃねえか
859デフォルトの名無しさん:2010/07/17(土) 20:11:16
どうすりゃいいんだ
860デフォルトの名無しさん:2010/07/17(土) 22:49:36
あるブロックを5分間だけ実行させたいとかどうコード書けばいいんですかね
具体的に教えてもらえるとありがたい・・
861デフォルトの名無しさん:2010/07/17(土) 23:07:21
タイマーを5分後に設定して割り込みを発生させる
割り込みルーチンでスリープモードに移行させる
862デフォルトの名無しさん:2010/07/18(日) 02:12:45
メジャーブラウザのクッキーを利用してくれるパッケージ作ってくれればいいのにな
863591:2010/07/18(日) 08:25:55
864デフォルトの名無しさん:2010/07/18(日) 09:53:56
>>861
ありがとう。さっぱりわからないから調べてみる
865デフォルトの名無しさん:2010/07/18(日) 12:08:57
レンタルサーバでMySQLもSQLiteも使えない状況なんですが、
なんかいい代替手段はないでしょうか?
リレーションはなくてもなんとかなるので、DB_Fileを検討しているのですが、気になるのが
SELECT * FROM t ORDER BY key LIMIT 10;
みたいなことをするには
foreach $key ( sort keys %hash )
しかないですよね?
レコード数が数万になるとちょっと嫌な感じがするのですが。
866デフォルトの名無しさん:2010/07/18(日) 12:15:39
>>863
おお。そんなものがあったとは
どうもありがとう
867デフォルトの名無しさん:2010/07/18(日) 12:35:50
>>865
最初からDBをわければよくね?リレーションないんでしょ?
868デフォルトの名無しさん:2010/07/18(日) 12:59:10
レンタルサーバでもSQLiteくらい使えるんでないの?
MySQLみたいなデーモン型でポートを専有するタイプは無理だろうけど。
VMwareか何でレンタルサーバと同じOS環境を作ってSQLiteをインストールして、そのバイナリをレンタルサーバにアップロードすればOK...と思うよ。
869865:2010/07/18(日) 13:17:37
>>867
1000レコードぐらいずつDBを分けるということですか?
それは管理が非常に大変かつ不整合が生じやすいような。
1レコード1DBだと、主キーをファイル名にして、レコード内容をテキストファイル
にするのと大して変わらないですよね。その方が編集・閲覧は簡単だし。
なので、DB_Fileって便利なように思えて使える局面がかなり限定される気がしています。

>>868
古いレンサバなのでDBD::SQLiteが入ってないんです。
原理的には可能でしょうが、セグフォりそうで…
870デフォルトの名無しさん:2010/07/18(日) 13:28:54
そのレンサバで使えるpm一覧はこんな感じです。
http://www1.axfc.net/uploader/Sc/so/135047.txt
871デフォルトの名無しさん:2010/07/18(日) 14:02:24
500行ものテキスト上げるのはいいけど
それ見せてどうしようって言うんだ。

あれこれ悩んでごまかし技使うよか
サーバ代上乗せしてSQLマトモに使えるのにすりゃいいじゃん
872デフォルトの名無しさん:2010/07/18(日) 14:09:32
自前でドメインとってない場合
URLが変わるのヤダヤダとか色々事情があるんだよたぶん
873デフォルトの名無しさん:2010/07/18(日) 14:45:33
無料鯖のatpagesとかでもSQL使えんだから別の鯖にしろよ。

そしてスレ違いだ。
テンプレぐらい見ろクズ。
874名無し:2010/07/18(日) 14:56:10
>>873
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
Perlコミュニティの人たちは、率直にいって、地球上で最も親切な人たちである。
875デフォルトの名無しさん:2010/07/18(日) 14:57:23
残念。ここは2chだ。
テンプレを読まない厨房に厳しい。
876デフォルトの名無しさん:2010/07/18(日) 14:59:58
地球上で最も親切な一方で
「自分でぐぐったらすぐ答えが出るのに、わざわざなんで質問するの?死ぬの?」
とか言う人たちでもある
877デフォルトの名無しさん:2010/07/18(日) 15:01:39
英語ならググると出てくるが日本語あんまりねえんだよな・・・
878デフォルトの名無しさん:2010/07/18(日) 15:20:17
英語読めよ
879デフォルトの名無しさん:2010/07/18(日) 15:28:55
日本語じゃないとまったく話にならないよな
880デフォルトの名無しさん:2010/07/18(日) 15:29:51
>>877
英語にしてからぐぐるといいよ
881デフォルトの名無しさん:2010/07/18(日) 16:23:01
>>869
その「大して変わりない」方法でまずは実装したらどうだろう。

検索処理部分なんてブロック化してメインから追い出せるんだから
あとでSQL使うように直してもそこだけ差し替えが利くだろ。
882デフォルトの名無しさん:2010/07/18(日) 18:17:05
だろ だな クズ とか大人ぶってるやつは

好きな音楽 ジャズとかクラシック

好きな酒は黒ビールとかほざいてる大人病だろバカが!
883デフォルトの名無しさん:2010/07/18(日) 18:24:07
>>860
直列な処理でいいなら
LWPのリクエストをタイムアウトさせる定番処理を応用すればいいんじゃね
こんなやつ

my $TIMEOUT = 60 * 5;
 eval {
  local $SIG{ALRM} = sub { die 'timeout'; };
  alarm $TIMEOUT;
  $response = $ua->request($request);
  alarm 0;
 };
 unless ($@ =~ /timeout/) {
  if ($response->is_success) {
  return $response->content;
  }
 }
884デフォルトの名無しさん:2010/07/18(日) 20:58:47
>>860
こういう高度なコードが考えられる

ラベルTIMEOUTからifまでが目的のブロック
do-whileでも問題なし

好みでsleepの秒数を延ばしてもいい
sleepが無いと恐ろしいことになる


main () ;

sub main {
   my $min = 1 ;
   my $timeout = time + 60 * $min ;

   TIMEOUT: {
     print "sleep.\n" ;
     sleep 5 ; # 5sec.
   } if ( time < $timeout ) { goto ("TIMEOUT") ; }

   return 1 ;
}
885865:2010/07/18(日) 22:40:13
サーバをどうこうしろとかいう提案を求めているんじゃない。
Perlでの解法はないかと聞いているんだ。この馬鹿どもが。
886865:2010/07/18(日) 22:44:36
>>881
失礼、見逃していました。助言ありがとうございます。
「大して変わりない」方法も依然検討中です。
887デフォルトの名無しさん:2010/07/18(日) 22:46:25
>>885
BDBならある意味キーはソート済みなので
ソートに時間かかるとかそういうことはないです。
なので数万件程度なら別に大したことはないです。
888デフォルトの名無しさん:2010/07/18(日) 22:49:20
あ、BTREEで使うのが前提で
889デフォルトの名無しさん:2010/07/18(日) 22:52:14
>>883
>>884
丁寧にコードまで考えてもらって感謝です。ありがとう
参考にして組み込んでみます。
890デフォルトの名無しさん:2010/07/19(月) 00:11:58
>>885
> CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
> CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
消え失せろゴミ
891デフォルトの名無しさん:2010/07/19(月) 00:19:38
>>890
お前が消えろよ・・・
892デフォルトの名無しさん:2010/07/19(月) 00:21:37
まあ、聞いてもないことを返してくる人いるよね
俺の聞きたいのはそれじゃねえ
日本語分かってるのかお前ってやつ
893デフォルトの名無しさん:2010/07/19(月) 00:22:36
板違いぐらい誘導しろよクズども
>>891 逆上すんなゴミ
894デフォルトの名無しさん:2010/07/19(月) 00:49:30
>>806 >>810 >>865 は同一人物?
895デフォルトの名無しさん:2010/07/19(月) 01:08:17
違うよ
896デフォルトの名無しさん:2010/07/19(月) 01:27:38
同一人物だろうな
897デフォルトの名無しさん:2010/07/19(月) 01:30:42
>>895>>896は同一人物
898デフォルトの名無しさん:2010/07/19(月) 01:33:55
お前の目は節穴か
899デフォルトの名無しさん:2010/07/19(月) 12:08:36
そういえばそろそろ夏だったなあ
900デフォルトの名無しさん:2010/07/19(月) 12:25:22
Perlってどれだけパッケージを知っているかで全然違ってくるね
そのパッケージで苦労しているだが
901デフォルトの名無しさん:2010/07/19(月) 12:28:33
パッケージじゃなくてモジュールでしょう
902デフォルトの名無しさん:2010/07/19(月) 12:40:16
ホームページのhtmlを丸ごとゲットするパッケージで一番軽くて
早くゲット出来るモジュールってなにかな?
HTTP::Liteあたり
903デフォルトの名無しさん:2010/07/19(月) 13:18:34
>>902
HTTP::Liteでもいいんじゃね
軽くて速いかどうかは、アクセスするサーバーによる
から、なんとも言えん。
LWP::SimpleとかLWP::UserAgentでも変らんと思う。
好きなの使え
904デフォルトの名無しさん:2010/07/19(月) 13:22:14
>>903
ありがとう
速度にかわりがないならインストールが面倒だから
LWP::Simpleあたりでやってみようかな
905デフォルトの名無しさん:2010/07/19(月) 14:02:23
wgetがあるよ。
一番ラクな方法あるならperlに限らずコレを勧める。
906デフォルトの名無しさん:2010/07/19(月) 14:10:11
>>900
いいよな。うちは標準のすらまったく使えないんだが、私は元気です。
907デフォルトの名無しさん:2010/07/19(月) 14:14:38
908デフォルトの名無しさん:2010/07/19(月) 14:34:45
WWW::Curl::Easyっていうのか結構早いんだな
909デフォルトの名無しさん:2010/07/20(火) 02:55:27
>>902
URI::Fetch
910デフォルトの名無しさん:2010/07/20(火) 13:32:55
タイムリーにこんなエントリが
ttp://d.hatena.ne.jp/tokuhirom/20100719/1279550759
911デフォルトの名無しさん:2010/07/20(火) 22:59:08
質問です
Perlから、現在既に実行中のfirefoxのウィンドウに
新しいタブでページを開くにはどうすれば良いのでしょうか?
OSはMacOSX Snow Leopard、Perlはv5.10.0です
912デフォルトの名無しさん:2010/07/21(水) 11:51:52
>>911
WWW::Mechanize::Firefox
インストールの方法とか使い方は自分で探してね。
913デフォルトの名無しさん:2010/07/21(水) 19:28:15
ありがとうございます
モジュールなしで行う方法があれば一番良いのですが、
なければそれを使わせていただきます
914デフォルトの名無しさん:2010/07/21(水) 21:34:42
モジュールありで行う方法が一番いい方法だろ
速度的にも
915デフォルトの名無しさん:2010/07/21(水) 21:47:25
ちょっと互換性の問題がありまして、
なるべくなら実行ファイルを叩いて開けるならそれが一番良いのです
今までWindowsのみで使われているプログラムで、
Windowsだと問題ないようなのですが、
Macで動かしてみると二重起動できないとか言われてしまいまして・・・

モジュール使うしかないようなら
実行ファイルの代わりにモジュールを使うこともできる仕様を追加するつもりなので
それでも問題ないと言えば問題ないのですが、
なるべくなら仕様変更が小さい方がいいかなと

まあ仕事ってわけじゃないので(オープンソースのツールの改良)
仕様変更しまくって怒られるわけではないのですが
916デフォルトの名無しさん:2010/07/21(水) 22:46:56
917デフォルトの名無しさん:2010/07/21(水) 23:09:29
それやってもこうなっちゃうんですよね・・・
ttp://brunhild.sakura.ne.jp/up/src/up454545.png

でも確かにPerlはあまり関係ないかもしれませんね
Firefoxスレとかで聞く事にします
918デフォルトの名無しさん:2010/07/21(水) 23:13:18
っと、ありがとうございました
919デフォルトの名無しさん:2010/07/21(水) 23:21:56
おっとユーザ名が・・・修正
ttp://brunhild.sakura.ne.jp/up/src/up454549.png
920デフォルトの名無しさん:2010/07/22(木) 00:07:36
ユーザー名隠すとかダサ
久しぶりにObjective-Cやったけど
メモリ管理とかほんとくそ

メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)
メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)
メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)
メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)
メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)
メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)メモリ管理やりたくないよ〜(泣)
921デフォルトの名無しさん:2010/07/22(木) 00:36:31
オレはPerlという重力が0.5倍で暮らしてきずいた・・・
perl星の敵は楽勝だろうとなめていた

この星では通訳者がメモリ管理してくるし・・・すみごこちがよかった
そして地図を片手にwebアプリの洞窟へむかつのであった
途中には $や@,%みたいな意味分からないオブジェクトが散乱していた
向かう途中 use strict + use warning兄弟というやっかいものが参上してオレの行く手をはばんだ・・・
オレは必死にアロー演算でつきまくって攻撃してもやつらの 怒鳴り声はとまらない
myとかいわないと 自分の名前を名乗れとかほざかれて怒鳴られて殴られる
この兄弟を無事に倒すと楽な道に進めるが
こいつらを相手にしないと、過酷な道で遠回りになるときいた・・・
そして歩き続けた
途中でCPANというお店に立ちよって武装するが、LWPが人気なのでそれをかっといた
さまよってるうちに、製作所みたいな場所にたどりついた・・・
なんかオブジェクトといってモノをつくっている
オレ「なにつくってるの???」
???「newつくってんだよ・・・」
オレ「そんなの作る必要ない そこらへんにおちてる」
???「この星ではnewは自作しなくちゃいけないんだよ・・・」
オレはよくわからずとりあえず webアプリの洞窟まですすんでいった・・・
この国はおかしいときずきはじめた・・・道ばたで土下座してる人がいた さっきの街でみかけた
???という金の仏像の方角をむいて 皆おがんでいるのである
薄々きがつきはじめた 宗教なんじゃね?って
なんかcatalystとsledgeっていう伝説の剣があるらしくて
それは困難をくぐりぬけた者しか抜けないのであるときいた
オレはそれを抜こうとしたが ピクりともいわなかった 
もうオレはつかれたから宿でねることにした
922デフォルトの名無しさん:2010/07/22(木) 00:50:20
>>921
ぜひ、続きをお願いします。
923デフォルトの名無しさん:2010/07/22(木) 10:39:47
>>921
わっふるわっふる
924デフォルトの名無しさん:2010/07/22(木) 10:55:06
オレは目が覚めた・・・
ふと思った。
この星にきてまだ1日目 自分が最初にいった C星にいたときとの重力が違いすぎて体が弱くなった
C星の時に、宇宙旅行でObjective-C星の旅行プランを立てて雑誌等を見てみて 良いなーって思っていたのであった
っで2年前に、Objective-C星に言ったときは、オブジェクト指向という街の方針をよくよんでなくて住み心地がわるかったのである・・・
その理由は家にすんでいた時に、その星はおかしく 夜中になると毎日dealloc大魔神という破壊神が家を壊しにくるのだ・・・
だからretainという魔法を使って星の住民は毎晩家をまもっている そして朝に魔法を解除しないと外出ができなくなる
そのためにreleaseという魔法をつかって結界を破壊するのである。 そんなめんどくさい星にはいたくない!という過去の事を思い出した

悩んでる結果 Perl星への旅行が決まったのである、その結果が今である。
今現在はまだ慣れてないだけであって苦労している。そしてwebアプリの洞窟を目指している途中 MySQL大図書館という所に立ち寄る
そこは膨大な本が置いてあり、一人の魔法使いらしき男が「select! insert!」などと杖をもって叫んでいるのである
オレ「ほ〜〜〜こうやって本を魔法であやつっているんだ」と思いみていた
そしたら横にいる戦士っぽい人が「param! fetch! サニタイジング剣法!!」といって本をばしばし切り裂いている
すごいと思い話かけてみると、「XSSって言う危険な生物が入り込んでる場合があるからね」1回本を切り裂いてチェックしてるんだよ
戦士「もしかして、君はwebアプリの洞窟にいくのか?」
オレ「うん」
戦士「よかったらこれをもってくんだ  mod_perl2のお守りだ これをもってれば洞窟の強力な磁場に耐えられる もってないと体が張り付いて重くなるんだ」
戦士「あとこれもだ DBIの剣 CGI.pmの盾 MySQL図書館の受信機 これくらいあれば安心して探索くらいはできるだろ 健闘を祈る」
925デフォルトの名無しさん:2010/07/22(木) 11:07:52
オレは進んでいった 進んでいる最中に すごいでかいモンスターがでてきた
???「我はハッシャー・・・ お前がここを通るなら我はお前を倒す」
オレ「さっきもらった 武器があるからいける!!」
オレ「hassher?attack=9999999&fireelement=100&send='%20%00login.html」
ハッシャー「そんなもの効かないよ バリバリ はははははは!!!」
オレ「!!!・・・」
???「しねえ!!ハッシャースライス!!! ブハンブハンナウブハン!! (岩がまっぷたつ」
オレ「なんだあれは?!  やばいほんとに よけないと」
と思って避けたが 足にヒットしで大けがをして動けなくなってしまった オレはwebアプリ洞窟にいくまえに訓練場にいっておけばよかったと後悔して
ハッシャー「氏ね!」 おれは死を覚悟した・・・
そのとき!! ???「くらえ・・・」
???「念のため・・・$SIG[ALRM] alerm 20 xxxxx」
???「killall -hasher・・・ rm -rf ps aux 完了」
ハッシャー「うわああああああ!!グアアアアア!体が やめろ・・おまえは・・・」
???「PSGI PSGI・・・ node.jsハッ!!!」
ハッシャー「苦しい 毒がからだに・・・」
???「これで終わりだな・・・」
ハッシャー「うははははお前もこれで道ずれだ、ハッシュ解放・・・」 ハッシャーの腹から沢山のモンスターが溢れかえった
???「20秒経った」といったあと 一気に沢山のモンスターが消えていく
オレ「助けてくれてありがとう」と言おうとしたら姿を消していた
近くにいた老人「あの人たちはPerl大国ジパンーグを守る JPAギルドの聖騎士たちじゃよ そりゃ強い その強さは・・・」

926デフォルトの名無しさん:2010/07/22(木) 14:36:53
ネット閲覧専用のAndroid端末ってないの?
927デフォルトの名無しさん:2010/07/22(木) 17:21:00
意外と面白くてワロタ
928デフォルトの名無しさん:2010/07/22(木) 17:24:16
そしてオレは そのギルドJPAの後をおった・・・そしたらだんだん気が遠くなってきた



気がついたらパソコンの前にいた、今までのは夢だったのろうか いやちゃんと痛みもあった
時計をみてみたが 全然時間が経っていなかったのである。

とりあえず気にせず Perlの勉強をしようとしたら 本が見当たらない
オレ「じゃあ インターネットでPerlしらべるか〜」
カタカタ・・・
オレ「あれ?Perlの情報がヒットしない でてくるのは真珠とかだけだ プログラミング perlでもでない」
なんかおかしい 異変にきずいた JPAのサイトを見に行ってみたがそんなサイトは無かったのである

オレ「もしかしたら・・・ この世からPerl言語が消されたのか!!?」
オレ「夢らしき世界の最後の時に、???と名乗る人物が「この星には未来がない 立ち去れ・・・」といっていたのを聞いた気がする」

消えてるっておかしいだろ?!そんなことはあるはずない と思いツイッターでPerlをやっている人のページをみた
口をそろえてこういっている
「Python最高!」といっている これは何かの間違え

ツイッターでPerlはどう?と質問したら Perlってなに?と回答される

オレはおかしさのあまりIRCにいった そしたら
「俺も変な夢をみた Perl星という世界で、敵に襲われていた旅人を助けた」
「Perlがこの世から消されているきがするんだけど」と会話しているのがきこえた」
どうやら記憶がある人たちがいるようだ でも問題は、どうやって記憶を取り戻すか

この星に言った人たちはPerlプログラミングの作業中に突然意識を失って perl星へいったといっている
pythonとの因果関係 なにかが裏でこの世界をpython色で染めようとしているのかもしれない

そして俺ふくめperlコミュニティの人々は立ちあがる・・・
929デフォルトの名無しさん:2010/07/22(木) 17:39:17
これ以上むずかしくておもいつかねえ〜
930デフォルトの名無しさん:2010/07/22(木) 19:34:42
これ、売れるんじゃね?
931デフォルトの名無しさん:2010/07/22(木) 19:55:38
921先生の次回作にご期待ください!!
932デフォルトの名無しさん:2010/07/22(木) 21:02:39
オライリー・ジャパンに売り込むのがよろし
実用Perlプログラミングの次の版に、息抜きのページとして、入れてもらおうw
933デフォルトの名無しさん:2010/07/22(木) 21:05:39
意外にもワロタ
934デフォルトの名無しさん:2010/07/22(木) 21:27:32
そして俺たちは、夜の9時ちょうどに Perlの勉強をして再びPerlの世界へ行こうと約束をした
待ち合わせはMySQL図書館にした・・・

よしパソコンの前で勉強を開始・・・ そしてだんだん気を失っていった

オレ「あれ?・・・ここはどこだ 凄いグルグルまわっている 何かがおかしい」
オレ「break!!!」
回転がとまった・・・ 
しかし、そこは一面真っ暗で何も見えない グォオオオオオ・・・・と何かのうめき声が聞こえてくる
怖くなったのでひたすらおびえながらかがんでいた。でも早くIRCの人たちを捜さないとと困り果てていた
っとその時、突然誰かの声が聞こえた
???「取りあえずここは居てはまずい 他の場所へいこうか 少し目をつぶってくれ」
???「go to MySQL Library・・・」

オレ「すげえワープだ こんな能力があるとは・・・」
アーヘン「自己紹介遅れました 私の名前はアヘン IRCからきました 一応魔法使いです」
オレ「よろしく 俺は戦士みたい・・・魔法とかあんまつかえないし」
アーヘン「では MySQL図書館へと参りましょう」
そしてMySQL図書館へ・・・

アーヘン「なんていうことだ 図書館が崩壊している これはどういう事だ」
オレ「なんか地面や空間が歪んで見える・・・」

ジパンーグ兵「旅の人ですか?! 危ないです!! 向こうの方で巨大なメモリリークが怒っています!!逃げてください!」
オレ「メモリリーク?この星ではどんなかんじなんだろう・・・」
ジパンーグ兵「この世界では地面、物体などが全てメモリという見えない空間に格納されてできています メモリリークが起きたらそこの空間が崩壊しはじめ異次元へと飲み込まれてしまいます!!」
オレ/アーヘン「?!」
アーヘン「このままではまずい 一時テレポートしよう・・・ 目をつぶって・・・ go to mixser・・・」
アーヘン「おかしい 魔法が使えない どういうことだ!!!!!!」
ジパンーグ兵「もう終わりです・・・うああああ・・」
935デフォルトの名無しさん:2010/07/22(木) 21:40:19
ジパンーグ兵がのみこまれてしまった
オレ「やばい・・・ 解放!解放!」
だめだ全然解放されない 力が足りなさすぎる
アーヘン「逃げた方が良い!!」
オレ「飲み込まれる!!! うあああああ!!」

誰かの声「まだ死んではいかん・・・グルウルルル・・・ お前に力をやろう 逃げろ お前は臆病者だ!!」
オレ「だれ?だれなんだよ!! なんだなんだ力が湧いてくる なんだこれは 体が再生している 早く逃げないと!!!」

シュルルルルルルル・・・ドロンッ
伝説の魔術師「dmesg... mysqlLibrary near memory Liberating!! kill 112」
伝説の魔術師「とりあえず治まりましたね topでプロセスを監視していたんですがメモリの異常事態にきずいてやってきました」

オレ/アーヘン「あなたは?・・・」

伝説の魔術師「私はミーガワ ではごきげんよう」
ドロンッ・・・
近くに居た老人「フォフォフォフォ・・・彼もここまで成長するとはの」
オレ「あなたはさっきも居た 誰なの?」
ンケト大王「フォフォフォフォ 気にするな ワシは ンケトワールドの元大王でな ワシの魔法はもう古いのじゃよ」
アーヘン「あなたがあの有名なンケトワールドの大王様? 私はあなたのweb魔法を参考にして学んできました」
アーヘン「あえて光栄です!」
ンケト大王「ッフォフォフォフォ まあガンバリたまえ 君等にCGIの大魔法を与えよう・・・ アンガタエ!!」
ンケト大王「param escape redirectなどが使えこなせるはずじゃ・・・」
オレ/アーヘン「ありがとう!」
ヒヒーン!!パカパカ 馬の走る音が聞こえる
JPA隊長「遅かったか・・・ もう解決していたのか」
mixser隊長「やつの仕業か」
ライブア隊長「ああ・・ やつだな」
続く・・・
936デフォルトの名無しさん:2010/07/22(木) 22:11:33
つまんねーから他所でやれよ
調子のんな
937デフォルトの名無しさん:2010/07/22(木) 22:14:11
何度読み返しても素晴らしいと思うんだが。
Perl初心者がたどるであろう部分を的確に表現していると思う。
938デフォルトの名無しさん:2010/07/22(木) 22:14:57
ンケト大王に目頭が厚くなった
939デフォルトの名無しさん:2010/07/22(木) 22:20:05
256倍シリーズのコラムならイける
940デフォルトの名無しさん:2010/07/22(木) 22:20:21
ここは質問箱。
面白いか面白くないかも関係無く、単なるスレ違い。又は板違い。

要するに、 VIP でやれ。
941デフォルトの名無しさん:2010/07/22(木) 22:29:46
これ以上は無理なら続きは

Perlについて
http://pc12.2ch.net/test/read.cgi/tech/1217851121/

でやってくれ
942デフォルトの名無しさん:2010/07/23(金) 10:27:58
やっとNG完了した
943デフォルトの名無しさん:2010/07/23(金) 10:47:48
シネ
944デフォルトの名無しさん:2010/07/23(金) 10:50:56
>>942
てめえみたいなクソガリチビはゴミみたいな発想しかできねえんだろ?
頭湧いてんのかおまえw死んじまえよザコ
なあ?てめえ書いてみろよ雑魚

おいクソガリちゃんよクソみたいなPerl書いてんだろゴミ
てめえのクソコードなんてゴミPerl書いてるお前にNGされる筋合いはねえんだよざこ
ケトルベル60kgで頭ぶっ叩かれたら死にそうなクソガリクソチビは死んどけ
945デフォルトの名無しさん:2010/07/23(金) 20:13:30
これが夏厨なら致し方ないがある程度知識ある奴が壮大にぶっ壊れてるのが切ない
946デフォルトの名無しさん:2010/07/23(金) 21:28:14
引き際って大事よね
947デフォルトの名無しさん:2010/07/23(金) 23:36:24
デスマって恐ろしいな…
948デフォルトの名無しさん:2010/07/24(土) 00:29:35
>>945

切ない

1 悲しさや恋しさで、胸がしめつけられるようである。やりきれない。やるせない。「―・い思い」

>>945 946 947
君たちスレチ
949デフォルトの名無しさん:2010/07/24(土) 01:02:53
WWW::Mechanize::Firefoxをぐぐって見たけど明らかに
日本語の資料は少ないね・・・。スクリーンショットぐらいかな
950デフォルトの名無しさん:2010/07/24(土) 02:19:46
>>863
もしかしてこれってcookies.txt のfox2しか対応してない?
3のcookies.sqlite だとダメかな
951デフォルトの名無しさん:2010/07/24(土) 04:11:52
節穴かよ
説明読めばちゃんと対応してるの明らかに分かるだろ
952デフォルトの名無しさん:2010/07/24(土) 12:55:17
死ねよ
953デフォルトの名無しさん:2010/07/24(土) 17:10:03
HTTP::Cookies::Mozilla;

でcookies.sqlite をやってみたけど挫折。難しいなこれ
日本語サイトも殆どやっている人いないだけある
954デフォルトの名無しさん:2010/07/24(土) 17:26:50
せっかくのsqlite何だから自分でやればいいだろ
955デフォルトの名無しさん:2010/07/24(土) 17:32:25
http://maaash.jp/perl/wwwmechanizefirefox%E3%81%A7%E7%B0%A1%E5%8D%98%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/
WWW::Mechanize::Firefoxで簡単スクリーンショット

WWW::Mechanize::Firefoxってもしかしてmozreplと組み合わせてつかうもの?
956デフォルトの名無しさん:2010/07/24(土) 17:34:07
そうっしょ
957デフォルトの名無しさん:2010/07/24(土) 17:38:38
ありがとう。そうなんか
どおりで動かないはずだ
958デフォルトの名無しさん:2010/07/24(土) 17:49:53
HTTP::Cookies::Mozilla;

http://d.hatena.ne.jp/fuba/20070314/1173858739
わずかな日本語で書かれたサイトを見ても
みんなfirefox2.0用の奴なんだよな・・・
959デフォルトの名無しさん:2010/07/24(土) 20:00:19
無名配列のサイズの取得について質問です。
以下のようにすると、ARRAY(0x1fa7d48)と表示されて、
サイズ(要素数)が取得できませんでした。

取得する方法を教えてください。

$arrayRef = [1, 2, 3];
print scalar $arrayRef;

960デフォルトの名無しさん:2010/07/24(土) 20:12:18
scalar @$arrayRef
961デフォルトの名無しさん:2010/07/24(土) 20:14:24
>>960
それもやってみたのですが、0と表示されてしまいます。
962デフォルトの名無しさん:2010/07/24(土) 20:15:22
>>960
勘違いしてました。

無事、取得出来ました。
ありがとうございます。
963デフォルトの名無しさん:2010/07/24(土) 22:29:43
どう見てもスカラーなコンテキストなのに、@a + 0 とかしないと
ちゃんと動かないことがある
964デフォルトの名無しさん:2010/07/26(月) 16:53:07
Perlで、PHPのob関数のような出力制御ができるモジュールなどはありますか?
965PHP最強戦士:2010/07/26(月) 16:59:13
ありますよ!!
966デフォルトの名無しさん:2010/07/26(月) 23:59:32
もちろん用意してございます。
967PHP=クソ(笑):2010/07/27(火) 00:36:31
今後、コンピュータ関連の著作物・表現物等に対しては、「Perl (R) は株式会社テラ・インターナショナルの登録商標です。」
と表記くださいますよう、宜しくお願い申し上げます。
-- http://an.to/perl_tm

こいつなんですか?教えてください!!
968デフォルトの名無しさん:2010/07/27(火) 00:41:13
>>967
こいつだけは人生破滅させてやろうと思った。
969デフォルトの名無しさん:2010/07/27(火) 00:43:56
>>967
……殺したい
死ねばいいのに
970デフォルトの名無しさん:2010/07/27(火) 01:05:04
>>967の名前欄もどーかと思うがな
971デフォルトの名無しさん:2010/07/27(火) 01:27:57
それには触れないお約束
972デフォルトの名無しさん:2010/07/27(火) 01:59:59
        うんこをうんこっていったら、
            じぶんがうんこにされたよ!

                 ハ_ハ  
               ('(゚∀゚∩ されたよ!
                ヽ  〈 
                 ヽヽ_)
973デフォルトの名無しさん:2010/07/27(火) 05:19:42
>>967
こいつの名前を商標登録してやりたいわ
974デフォルトの名無しさん:2010/07/27(火) 07:42:36
>>967
以降全員スレチしね^^


940 :デフォルトの名無しさん:2010/07/22(木) 22:20:21
ここは質問箱。
面白いか面白くないかも関係無く、単なるスレ違い。又は板違い。

要するに、 VIP でやれ。

おめえもスレチだろ?しねよ 悔しいのか?凄い書き手が誕生して御前くやしがてんだろ?
そしてしね
975デフォルトの名無しさん:2010/07/27(火) 08:13:18
朝から御前等ゴミみるとむしゃむしゃするんだよね^^;
早くこのスレ潰れないかな
976デフォルトの名無しさん:2010/07/27(火) 14:29:00
性欲がたまってんだろ
オナれ
977デフォルトの名無しさん:2010/07/29(木) 13:43:44
PerlとSQLiteを勉強中なのですが、なかなかうまくいかないため質問させてください。

PerlでSQLiteを使い、ログを取るというものを作っています。
PerlでData::Dumperを使い、そのDumperの出力をレコードに追加したいのですが、
my @Str = Dumper ( $entity);
my $insertLog = "insert into lLog ( time, log) values ( $time, \@Str)";
$timeは追加されるのですが、@Strがnullになっています。

どのようにすれば挿入することが出来ますでしょうか?
978デフォルトの名無しさん:2010/07/29(木) 14:09:10
掲示板もどきを作っているのですが、timeを使って投稿IDを生成しているので
1秒間に1件以上の投稿があった際に問題が起きてしまいます。
この問題は一般的にはどうやって解決しているのですか?
979デフォルトの名無しさん:2010/07/29(木) 14:13:16
Time::HiRes
980デフォルトの名無しさん:2010/07/29(木) 14:31:13
IDなら普通に投稿者のIP使えよ……
981デフォルトの名無しさん:2010/07/29(木) 14:31:59
あと、これな

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

982PHPオタク:2010/07/29(木) 15:30:11

ぼくみたいなばかでもCGIのくべつつきますよ
ぼくは30ねんかんPHPつかってるにーとですが
983デフォルトの名無しさん:2010/07/29(木) 16:22:02
>>978
while ( -e $file ) { ファイル名変更処理 };
とか
alarm前提で

1秒に数十回アクセスあるんだよ! とかならごめん。俺専門家じゃないからわかんね
984デフォルトの名無しさん:2010/07/29(木) 19:58:47
>>980
それじゃ同一IPで二回目以降投稿出来ないだろ・・・
985デフォルトの名無しさん:2010/07/29(木) 20:08:33
投稿IDを100個/秒作ってpush、
受付順でpopすりゃいいじゃん
986デフォルトの名無しさん:2010/07/29(木) 20:25:50
スレ違いだからやめろ
987デフォルトの名無しさん:2010/07/30(金) 02:48:12
>>977
SQLクエリに直接変数を代入するのはやめれ
プレースホルダを使おう
my $sth = $dbh->prepare('INSERT INTO lLog (time, log) VALUES (?, ?)');
$sth->execute($time, \@Str);

あと\@Strだと参照を挿入することになるけどいいの?
join "\n", @Strの間違いじゃなくて?
988デフォルトの名無しさん:2010/07/30(金) 05:54:22
>>986
この問題は
1)Perlは秒単位でしか時間が取れないのか?
2)大量に作成するファイル名、重複を避けるにはどうする?

と分解できるから、入り口がCGIでもPerlの処理の話とみなせるだろ
俺は見てて参考になったぞ
989デフォルトの名無しさん:2010/07/30(金) 08:02:04
>>988
関係ない
CGIならwebプログラミング板
990デフォルトの名無しさん:2010/07/30(金) 08:43:09
ある条件によってuse Hogehogeしたりしなかったりを制御することはできますか。
use Hogehoge; するのが重いモジュールがあって、必要な時だけuseしたいのですが、どうやったらいいのかわかりません。

if (条件) {
 use Hogehoge;
}

とすると、条件によらず Hogehoge が読み込まれてしまうようです。
991デフォルトの名無しさん:2010/07/30(金) 09:03:00
if (条件) {
eval 'use Hogehoge;';
}
992デフォルトの名無しさん:2010/07/30(金) 10:55:21
>>991
それで行けました。ありがとうございます。
もうひとつ質問ですが、Hogehogeがuseされたかどうかを調べる方法はありますか。
今は
unless (defined($Hogehoge::varname)) {
 eval 'use Hogehoge;';
}
としていて、これはこれでうまくうごくのですが、もっとうまいやり方があれば教えてください。
993デフォルトの名無しさん:2010/07/30(金) 11:09:11
if ( exists $INC{'Hogehoge.pm'} )
とか
994デフォルトの名無しさん:2010/07/30(金) 11:56:22
>>993
できました。ありがとうございます。
995デフォルトの名無しさん:2010/07/30(金) 12:01:05
すみません、%INCを教えてもらって感謝なんですが、質問があります。
%INCのキーはファイル名ですが、ファイル名の区切りはどのプラットフォームでも「/」でしょうか。
今は unless ($INC{'Foo/Bar/Baz.pm'}) { eval 'use Foo::Bar::Baz;'; } としているんですけど、
%INC のキーに指定している Foo/Bar/Baz.pm が、他のプラットフォームでも使えるのかどうか心配です。

よろしくお願いします。
996PHPオタク:2010/07/30(金) 13:42:09
997PHPオタク:2010/07/30(金) 13:43:31
998PHPオタク:2010/07/30(金) 13:45:29
999PHPオタク:2010/07/30(金) 13:46:14
1000PHPオタク:2010/07/30(金) 13:46:54
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。