10/02/19 16:47:06
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: URLリンク(pc11.2ch.net))
CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
URLリンク(www.perl.org)
● 2010/02/19 現在の最新版: 5.10.1
▼ 前スレ
Perlについての質問箱 42箱目
スレリンク(tech板)
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-7 あたり
2:デフォルトの名無しさん
10/02/19 16:47:21
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: URLリンク(www.site-cooler.com)
[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp) (修正)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)
[オンラインマニュアル]
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.x のドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp) (停止中)
perldoc.jp: URLリンク(www.perldoc.jp)
perldoc.com: URLリンク(www.perldoc.com)
3:デフォルトの名無しさん
10/02/19 16:47:26
[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)
[テクニック]
Perl メモ: URLリンク(www.din.or.jp)
Perl のページ: URLリンク(homepage1.nifty.com)
Perl の小技: URLリンク(homepage3.nifty.com)
[Perl 5.8 Unicodeメモ]
URLリンク(www.rwds.net) (修正)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)
4:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/19 16:47:34
[過去スレ1]
1 URLリンク(pc.2ch.net)
2 URLリンク(pc3.2ch.net)
3 URLリンク(pc2.2ch.net)
4 URLリンク(pc2.2ch.net)
5 URLリンク(pc5.2ch.net)
6 URLリンク(pc5.2ch.net)
7 スレリンク(tech板) (事故により消滅)
8 スレリンク(tech板) (事故により消滅)
9 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
13 スレリンク(tech板)
14 スレリンク(tech板)
15 スレリンク(tech板)
16 スレリンク(tech板)
17 スレリンク(tech板)
18 スレリンク(tech板)
19 スレリンク(tech板)
20 スレリンク(tech板)
6:デフォルトの名無しさん
10/02/19 16:47:36
[過去スレ2]
21 スレリンク(tech板)
22 スレリンク(tech板)
23 スレリンク(tech板)
24 スレリンク(tech板)
25 スレリンク(tech板)
26 スレリンク(tech板)
27 スレリンク(tech板)
28 スレリンク(tech板)
29 スレリンク(tech板)
30 スレリンク(tech板)
31 スレリンク(tech板)
32 スレリンク(tech板)
33 スレリンク(tech板)
34 スレリンク(tech板)
35 スレリンク(tech板)
36 スレリンク(tech板)
37 スレリンク(tech板)
38 スレリンク(tech板)
39 スレリンク(tech板)
40 スレリンク(tech板)
7:デフォルトの名無しさん
10/02/19 16:47:39
[過去スレ3]
41 スレリンク(tech板)
42 スレリンク(tech板)
8:デフォルトの名無しさん
10/02/21 10:33:23
1,1,4
1,2,7
1,3,2
という(X,Y,値)というメッシュ(グリッド)データがあって
例えば座標が1ごとに値があるのを、5毎にして今までの値を平均して入れるというのを組みたいのですが
どうすればよいでしょうか?
どう処理して良いかわからず困っています。
9:デフォルトの名無しさん
10/02/21 10:56:54
>>8
5ごとのメッシュを作っておいてそこにコピーする、というのは何となく思いついたんだけど、
「今までの値の平均」っていうのがよくわからんな。
10:デフォルトの名無しさん
10/02/21 11:19:03
eval {
...
};
if (@_){
...
}
って感じで例外処理できるっていろんなとこに書いてるけど、これがサブルーチンの中で既に@_の中埋まってたりする場合evalの最後でundef(@_)とかしなきゃいけないの?
なんか他にいい方法ない?
11:8
10/02/21 11:41:27
>>9
今までの値の平均というのは5ごとのメッシュにした場合そのメッシュには
(1,2),(1,3),(1,4),(1,5)(2,1)・・・・・(5,5)のそれぞれのメッシュの値の平均を入れたいんです。
この場合このメッシュは変換後(2,5、2,5)の座標となって上記の平均が値となるようにです。
12:デフォルトの名無しさん
10/02/21 11:42:26
>10
@_ じゃなくて $@ じゃないのか?
13:デフォルトの名無しさん
10/02/21 13:19:22
>>12
ありがと...orz
14:デフォルトの名無しさん
10/02/21 15:22:58
evalの前でlocal $@すればいいんじゃない
15:デフォルトの名無しさん
10/02/21 16:14:53
>>11
2.5×{1+INT(座標)}で変換すりゃいーんじゃないか
16:デフォルトの名無しさん
10/02/21 16:15:38
ごめん
座標÷5
17:デフォルトの名無しさん
10/02/21 16:21:26
二次元配列に入れてforでsum取って25で割るだけだろ?
18:8
10/02/21 17:06:36
>>15,16
おお、座標の変換は出来そうですね。
あとはそれで値を平均していくというのができればいいのですね。
>>17
forでsumとって25で割るっていうのは値の平均ですよね?
二次元配列に入れるのは座標ですか?
19:デフォルトの名無しさん
10/02/21 21:45:13
Perlに二次元配列なんてねえよ
リファンレスな
20:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/21 22:20:20
×Array of Array
◯Array of arrays
22:デフォルトの名無しさん
10/02/21 22:23:08
呼び方はかってだろうけれど、どっちにしろリファンレスを使ってた次元配列を実現しているのだから、同じこと
23:デフォルトの名無しさん
10/02/21 22:24:40
そうじゃなくて
24:デフォルトの名無しさん
10/02/21 22:25:38
そうじゃなくて何?
25:デフォルトの名無しさん
10/02/21 22:25:56
refanless
26:デフォルトの名無しさん
10/02/21 22:26:10
リ「ファレ」ンスだよ。
27:デフォルトの名無しさん
10/02/21 22:30:05
恥ずかしい
28:デフォルトの名無しさん
10/02/22 05:55:04
低レベル化、ここに極まれり。
29:デフォルトの名無しさん
10/02/23 16:40:49
前スレから、用語がどうとか本捨てろとか話の腰を折っては
自己満足してる初心者がいるな
30:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/24 16:05:22
削ればいいと思うよ。その後の動作は保証しないが。
32:30
10/02/24 20:26:30
なんか{is_success}にしたらとりあえず大丈夫な気がしないでもないけど、
Perlってそもそも変数に原始性はもってないものなの?
ECCメモリ使ってないせいなのかな?
33:デフォルトの名無しさん
10/02/24 20:34:59
その話を続けるつもりなら、CPAN モジュールならモジュール名を晒せよ。
じゃなきゃ、こっちが分かるわけないだろ。
34:デフォルトの名無しさん
10/02/24 21:58:33
HTTP::Response でしょ。コードで use してるのは LWP::UserAgent 辺りかもしれないけど。
35:デフォルトの名無しさん
10/02/24 22:09:35
HTTP::Status
36:デフォルトの名無しさん
10/02/24 22:55:42
とりあえずData::Dumperで$resの値を晒してもらうのがいいんじゃないか?
37:デフォルトの名無しさん
10/02/24 22:59:36
「Can't call method」って出てるのにデータ構造見せられてもね
38:デフォルトの名無しさん
10/02/25 00:12:20
どのパッケージにblessされてるかわかるだろ。もっともそれだけなら
ref $resをprintするだけでいいけどな。
39:デフォルトの名無しさん
10/02/25 16:40:46
AUTOLOADが実行されてない時点で何かおかしいだろ
40:デフォルトの名無しさん
10/02/26 11:49:00
>>33 お父さんかよ!
>>34 お母さんかよ!
>>35 お兄ちゃんかよ!
>>36 家庭訪問の先生かよ!
>>37 たまたま居合わせた水道屋かよ!
>>38 とりあえず呼ばれてきた親戚かよ!
>>39 とりあえず呼ばれてきたお巡りさんかよ!
41:デフォルトの名無しさん
10/02/26 12:11:25
mooseでis => 'bare'して、自分でアクセサ書く時に、そのアクセサの中で型制約したい時はどうするの?
42:デフォルトの名無しさん
10/02/26 20:45:28
has 'hoge' => ( is => 'bare', isa => 'Foo', reader => '_get_hoge', writer => '_set_hoge' );
最終的にhogeに値をセットするんなら最初にhogeに対して指定した制約(Foo)が適用されるんじゃないの?
俺が素人だからかもしれんが何がしたいのかよくわからん
43:デフォルトの名無しさん
10/02/28 09:44:33
web上の画像ファイルを自動でダウンロードするにはどうるすれば良いですか?
たとえばURLリンク(hogehoge)を自動でダウンロードする場合です。
44:デフォルトの名無しさん
10/02/28 09:51:13
use LWP;
45:デフォルトの名無しさん
10/03/01 00:00:24
新Perldocって死んだの?
Googleグループもスパムが飛んでるし
46:デフォルトの名無しさん
10/03/01 01:51:13
URLリンク(perldoc.perl.org) ならこっちからは繋がるけど?
47:デフォルトの名無しさん
10/03/01 02:48:27
requireで実行した処理に引数を送りつけるにはどうしたら良いでしょうか?
requireで実行でなくても構わないんですが、
1: 実行中に外部から文字列 (フィル名と引数) を受け取る。
2: その文字列をrequireして返って来た内容を処理する。
と言うのがしたいのです。
コマンドとかではなくて、同じプロセス内で実行できたらいいなと思ってます。
48:47
10/03/01 03:27:24
eval( qq[ local \@_ = @外部から受け取った引数\; \n] . $openで読んだファイル内容 );
とやるのはあまりに強引でしょうか?
49:デフォルトの名無しさん
10/03/01 05:19:14
>>46
あ、新PerldocJPだった
年末に空中分解したような感触を受けたんだけど
50:デフォルトの名無しさん
10/03/01 06:02:22
>49
分解以前に、始まってるようにも見えなかったが
51:デフォルトの名無しさん
10/03/01 21:58:27
貴重な生きてる板だから何かしようぜ
52:デフォルトの名無しさん
10/03/02 23:17:42
これからやろうぜ!って集まったけど年開けてみんな忙しくてはや3月って感じだろ
53:デフォルトの名無しさん
10/03/03 09:05:51
5.11使ってる人いる?
54:デフォルトの名無しさん
10/03/03 13:30:51
CPANTSってメンテ中?
>>53
12月に5.12が出ると思ったら難航しているみたいだから使っているよ、5.11.5を。
55:デフォルトの名無しさん
10/03/03 19:38:03
($var) = unpack(...)
こんなかんじのコードがあるんですけど$varに括弧を付ける意味ってなんですか?
56:デフォルトの名無しさん
10/03/03 19:45:27
リストコンテキストになる
57:デフォルトの名無しさん
10/03/03 19:57:36
>>56
ありがとうございます。
ググってもうまく探せなかったので助かりました。
58:デフォルトの名無しさん
10/03/04 02:00:32
1~1000の整数の先頭に0を付け加えて、4桁にしたい
1 →0001
100 →0100
1000→1000
s/~/~/;
で一発で置換するには~の部分はどう書けばいいですか?
59:デフォルトの名無しさん
10/03/04 02:03:10
スレ違い
60:デフォルトの名無しさん
10/03/04 02:39:02
sprintf 禁止なのかな。
61:デフォルトの名無しさん
10/03/04 03:09:27
全角だから工夫が必要かもね
62:デフォルトの名無しさん
10/03/04 03:14:54
Pythonでやればいいのに
63:デフォルトの名無しさん
10/03/04 03:15:30
Python厨
64:デフォルトの名無しさん
10/03/04 03:20:21
いやだからその部分だけPythonにやらせてPerlから呼び出せばいいじゃん
そういう使い方ができるのがPythonなんんだから
65:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/04 05:05:06
なんかたまたま全角で書いてるだけだったりしてな・・・整数って書いてるし。
ということで俺は つsprintf
69:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/08 06:52:00
*{__PACKAGE__ . "p"} = \&CORE::print;
p(); #=> Undefined subroutine &main::p called at - line 2.
これは print 関数の厳密なエイリアスは作れないということでしょうか
71:デフォルトの名無しさん
10/03/08 10:49:27
>>70
作れないかどうかはわからないが、コードだけ見ると名前空間の::がないからでは?
*{__PACKAGE__."::p"}
72:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/10 12:33:34
とりあえず受信と送信一度に書くとどこに問題があるかわかりにくいので、
・受信したメールを適当なファイルに格納するプログラム
・適当な内容のメールを送信するプログラム
を別々に書くところからはじめるのをお勧めする。
74:デフォルトの名無しさん
10/03/10 23:23:28
perlの前にmailを勉強すべきかもしれない
ちゃんとヘッダを作ってないのに /usr/bin/sendmail を
使うのはよくない。
75:デフォルトの名無しさん
10/03/11 01:57:19
sendmailは本当に/usr/binにあるのか?
76:72
10/03/11 09:21:14
レスありがとうございました。いろいろ試してみて、.forwardを作り直したら
上手くいきました。記述は全然変えていないのですが、.plで作成してサーバー
で変更をしていたのがよくなかったようです。
原因がわからず解決まで半日もかかってしまいましたorz
上のコードは社内でperlができる人のを真似たものでした。
77:デフォルトの名無しさん
10/03/11 17:54:42
続けてですみません。
私が作りたいと思っているプログラムが
「携帯Aから(絵文字などを含む)メールを受け取り、携帯Bに転送する」
というものなのですが、>>72で書いたコードではデコメは良いのですが
絵文字が全て〓に化けてしまいました。
サーバーで受け取った時点で〓に置換されてしまうので、送る各キャリ
アに合わせて文字コードを変換しなくてはならないとわかりました。
URLリンク(cgipon.specters.net)で紹介されているサン
プルを試してみたりしているのですが、上手く変換してやることができ
ずにいます。 どのような方法を試してみればよいでしょうか?
78:デフォルトの名無しさん
10/03/11 19:35:50
〓に変換されたらもとが何の絵文字だったか知りようがないのでは?
79:デフォルトの名無しさん
10/03/11 21:27:10
SoftBankの絵文字に変換されてるって意味じゃないよな
80:デフォルトの名無しさん
10/03/12 01:59:19
>>77
> どのような方法を試してみればよいでしょうか?
どこが悪いのか突き止めて、そこを修正するといいよ。
81:デフォルトの名無しさん
10/03/12 07:40:31
バッチファイルに以下のように記述し、放り込んだファイルの名前に応じて
テキストファイルの一部を置換したいんですが、よく文字化けしてしまいます
>>4を使ったplファイルを別途用意せず、バッチファイルへの記述だけで
文字化けに対応する方法はないでしょうか?
perl -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
82:デフォルトの名無しさん
10/03/12 09:30:44
>>77です。
>>78
全てを試したのではないのですが〓に変換されたのは、ほぼ全ての絵文字
でした。
>>79
SoftBankではないです、言われてみれば〓はSoftBankのロゴなんですね。
>>80
上記のサイトのサンプルの関数を通して変化しなかったので、他のサイト
を一生懸命探していました。
絵文字はこんなに難しかったのですね
83:デフォルトの名無しさん
10/03/12 11:35:37
>>81
perl -Mencoding=xxx かな。
PERLIOとかPERL_ENCODINGは効かないのか...
84:デフォルトの名無しさん
10/03/13 03:58:23
>>83
ありがとうございます
が、恥ずかしながらうまく使えません・・・
以下みたいなのとは根本的に使い方が違うんでしょうか?
perl -Mencoding=sjis -pe s/"置換前文字列"/"置換後文字列"/ "置換前.txt" > "置換後.txt"
85:デフォルトの名無しさん
10/03/13 06:34:22
実はsjisじゃなくてcp932ってオチだったりして
86:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/16 09:11:14
>>86
どの携帯キャリアの分岐だったのか、encode_base64を通す前が問題なのか
通した後が問題なのか、ぐらいは切り分けてから質問しろよ。
88:デフォルトの名無しさん
10/03/16 14:21:01
プログラムを組む際は use strict を最初に書いておく事といわれたので、
これをつけて.plファイルを実行すると、
下記のようなエラーが多く出ます。どう対応すればいいでしょうか_?
use strict をつけないと特にエラーは出ません。
Global symbol "$xxxx" requires explicit package name at xxxx.cgi line 16.
89:デフォルトの名無しさん
10/03/16 14:55:14
>>88
「use strict を付けた状態でエラーにならないように書け」ってこと。
変数にmy付けてスコープを明確にせよ
90:デフォルトの名無しさん
10/03/16 15:10:35
>>89
thanks
91:デフォルトの名無しさん
10/03/16 18:26:58
>>87
不十分でした、すみません。
キャリアはdocomoなのでis_imodeの分岐を通っています。
encode_base64の前と後、どちらに問題があるのかつかめていない状
態です。
utf-8にデコードした文字列をそこに通すだけで良いのかと考えてしま
っていたのですが、使い方を間違っているようです。
絵文字について調べてEncode::JP::Mobileを見つける事ができたので
すが、携帯から受け取ったメールをそのまま返信するというコードに、
どう当てはめていけばよいのかわからずに苦戦中です。
92:デフォルトの名無しさん
10/03/16 20:46:44
使い方はそんなもんのような気がするので、入力段階で化けてそうだが。
単に化けたというんじゃなくて、具体的に$subjectがこれこれのときに
結果がこうなって化けてますというのを示して欲しい。
93:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/17 09:17:32
>>92
レスありがとうございます。
URLリンク(yanor.net)
こちらのメール送信を参考にさせてもらっています。
my $email_to = '00000000000@docomo.ne.jp';
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:デフォルトの名無しさん
10/03/17 10:24:53
だからどうやって処理してるかじゃなくて具体的にどういう
$subjectの値がどう文字化けしたかを示せと。
俺の予想では「このプログラムに入る前から絵文字が
〓に置き換わっている」だけどなw
96:デフォルトの名無しさん
10/03/17 11:31:02
どんな絵文字かわからないけど、もし携帯で使うような絵文字のことなら文字コードで定義されてないんじゃない?
入出力結果はほしいね。
97:デフォルトの名無しさん
10/03/17 11:54:10
>>95
debugで確認して
「今日の天気は[雲の絵文字]です」が「莉頑律縺ョ螟ゥ豌励・縲薙〒縺・」
となっていました。
>俺の予想では「このプログラムに入る前から絵文字が
>〓に置き換わっている」だけどなw
受け取った段階で〓ということでしょうか?
98:デフォルトの名無しさん
10/03/17 11:57:56
こういうときは普通16進ダンプにするものだ。
99:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/17 13:04:28
>>99
どれもハズレ
101:デフォルトの名無しさん
10/03/17 13:11:57
id=ID情報
memo=メモ内容
って普通に情報を記録すればいいんでないの?
102:デフォルトの名無しさん
10/03/17 13:51:05
>>101
thank you,
>id=ID情報
>memo=メモ内容
このあたり、もう少しソースコードも交えて教えてください
よろしくお願いします。
103:デフォルトの名無しさん
10/03/17 14:11:17
どうぞおググりください
104:デフォルトの名無しさん
10/03/17 14:16:35
ここの"SYNOPSIS"の項目を見てピンとこなければ、>>101の内容も理解できないし、CGI::Cookieも理解してないことになる。
URLリンク(search.cpan.org)
質問見る限り、Cookieについて理解がないようだからもう少しCookieというものについて調べたほうがいいよ。
105:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/17 15:05:59
pythonを主に使ってたのですが
他の言語がわかってる人向けのperlの教科書みたいのないですか?
107:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/17 15:38:26
>>108
thanks
Data::Dumper;
こんな便利なモジュールがあるんですね、ありがとうございます。
>>[15:03]% perl -MCGI::Cookie -MData::Dumper
このあたり、perl -M で二つのモジュールを指定してどのような処理を行いるかすこしわからないのですが調べてみます。
110:デフォルトの名無しさん
10/03/17 16:05:19
>>98
すみません、ダンプするにはどうしたらよいのでしょうか?
111:デフォルトの名無しさん
10/03/17 16:13:46
URLリンク(www.ietf.org)
によりますと、クッキーの情報に関して、
>> 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
となっております。クッキーに関しては、
>>URLリンク(www.thinkit.co.jp)
を読みました。
>>101のアドバイスによる、
>>id=ID情報
>>memo=メモ内容
>>って普通に情報を記録すればいいんでないの?
ですが、これは、どうも、new CGI::Cookie 内に書くところがないような気がします。
どこに書いてやればいいでしょうか?
アドバイスお願いします。
112:デフォルトの名無しさん
10/03/17 16:14:08
unpack("H*", $str);
113:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/17 16:54:30
>>112
レスありがとうございます。
早速unpackの使い方を調べて
@chr = unpack("H*", $subject);
print "@chr\n";
を試してみました。結果は空白です。やっぱり変な変換のされ方を
してしまっているのかもしれません。
115:デフォルトの名無しさん
10/03/17 17:05:22
>>113
thank you
理解できました。
116:デフォルトの名無しさん
10/03/17 17:10:35
>>112
ワイド文字列をunpack 'H*'に食わせると各文字の下位8bitしか
出てこないので、俺はこんな感じの自作サブルーチン
使ってる。
sub hexdump {
my($s) = @_;
$s =~ s/(.)/sprintf "[%x]", ord($1)/ge;
return $s
}
117:デフォルトの名無しさん
10/03/17 17:17:38
>>116
それは>>86のプログラムに食わす前の$subjectの値が空白だったということか?
そんなら〓はどっから出てくんだよ。なんかおかしくね?
118:デフォルトの名無しさん
10/03/17 17:18:22
ごめんアンカミスった。>>116じゃなくて>>114
119:デフォルトの名無しさん
10/03/17 17:29:42
>>117
>>86を通る前の表示が記述ミスしていました。
「今日の天気は[雲の絵文字]です」が「cae56e29176f1367590a」となって
いて、同じ方法で>>86後の$subject_encodedをダンプすると空白になって
しまいました。
120:デフォルトの名無しさん
10/03/17 17:45:06
>>119
雲の絵文字があるはずの7文字目の文字コードの下2桁が
13ってことだな。
雲はU+E63F
〓はU+3013
なのですでにその時点で〓になってる疑いが濃厚。
URLリンク(www.nttdocomo.co.jp)
121:デフォルトの名無しさん
10/03/17 18:41:41
>>120
文字コードを調べたらUTF-8で3013は〓でした。perlを置くサーバーにメール
が届いた段階で〓に変えられているのでは、>>86を通しても…
〓にしないでメールを受け取る方法があるのでしょうか?
122:デフォルトの名無しさん
10/03/17 20:17:55
絵文字を〓に変換してるのは携帯キャリアのメル鯖。
123:デフォルトの名無しさん
10/03/17 23:34:13
>>121
gmailぐらいの交渉力があれば個別対応してもらえるけど、普通は
無理なんじゃないかなぁ。
124:デフォルトの名無しさん
10/03/18 09:14:35
>>122>>123
まずは自社サーバーで〓に変換されていない状態で受け取れないと無理ですね。
同じようなプログラムに挑戦した方が結構いるのかと思っていました。
125:デフォルトの名無しさん
10/03/18 13:38:39
サーバー、クライアントがあります。
クライアントがサーバーに対して
GET リクエストを出します。
この際、クライアントは、
GET xxxx HTTP/1.1
User-Agent:test1
とUser-Agent のヘッダを追加します。
つまり、クライアントからのリクエスには、上のUser-Agnet
のヘッダが含まれています。
サーバー上のパールプログラムの中でで、このUser-Agent の
test1 を変数として保持したいのですが、具体的な実装方法に
ついてアドバイスをお願いします。
126:デフォルトの名無しさん
10/03/18 13:50:15
>>125
$ENV{HTTP_USER_AGENT}
127:デフォルトの名無しさん
10/03/18 14:10:35
>>126
ありがとうございます。
128:デフォルトの名無しさん
10/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 を取得したいと考えています。
しかし、
URLリンク(ja.wikipedia.org)
をみますと、これに該当する環境変数がありません。
この場合、どうやって、pp-pppp を取得できますでしょうか?
129:デフォルトの名無しさん
10/03/18 15:07:57
>>125,128
板違い
>>126みたいに板違いなのに回答するとこうやって図にのるのでみんなやめようね
130:デフォルトの名無しさん
10/03/18 16:00:44
>>129
どこの板に質問すればいいでしょうか?
131:デフォルトの名無しさん
10/03/18 16:03:03
>>130
>>1読め
132:デフォルトの名無しさん
10/03/18 16:03:13
>>130
>>1読め
133:デフォルトの名無しさん
10/03/18 16:07:58
>>131
>>132
thank you.
134:デフォルトの名無しさん
10/03/19 10:18:39
初歩的な質問ですみません。
改行コードを変換したいんですが
・次行の先頭が 'A' で始まる場合のみ、行末の改行を削除
これを
perl -pe 's/\nA//g'
とやっても期待した結果になりません(全く完全に何も置換されない)
環境はCygwin1.7です。
135:デフォルトの名無しさん
10/03/19 10:42:54
Treat string as multiple lines
136:デフォルトの名無しさん
10/03/19 10:54:20
>>134 s/\n(?=:A)//sg
137:デフォルトの名無しさん
10/03/19 10:59:03
間違えた
>>134 s/\n(?=A)//sg
138:デフォルトの名無しさん
10/03/19 15:57:58
改行区切りで読み込んでるからだろ
perl -p0e 's/\n(?=A)//g'
139:デフォルトの名無しさん
10/03/20 06:01:46
otsuneさんがウザくてamachangが爽やかなのはperlのせいですか?
140:デフォルトの名無しさん
10/03/20 06:21:57
はてなに帰れ
141:デフォルトの名無しさん
10/03/20 08:43:37
「処理済み」を表すフラグの変数名は何がいいですか?
142:デフォルトの名無しさん
10/03/20 08:56:41
done
143:デフォルトの名無しさん
10/03/20 09:02:41
ああ、それはいいな
finishとかprocessedとか、どうもしっくり来なかった
144:デフォルトの名無しさん
10/03/26 13:04:37
http::request の使用に関しての問題ですが、perl のプログラム(リフェレンス)の問題に
なりますのでここで質問させてもらいます。
URLリンク(search.cpan.org)
によりますと、
$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;
と三番目の引数をセットしています。
URLリンク(ftp.ics.uci.edu)
解決方法は、このあたりに書いてあるとおもうのですが、どのように三番目の引数をセットしてやればいいでしょうかアドバイス願います。
145:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/26 13:25:15
エラーメッセージの行のまわりを見ればこうなっているわけだが。
if (ref($header) eq "ARRAY") {
$header = HTTP::Headers->new(@$header);
}
else {
$header = $header->clone;
}
148:デフォルトの名無しさん
10/03/26 13:50:13
レスありがとうございました。
解決いたしました。
>>145
オブジェクトを指定してうまく動作しました。
>>146
plain array reference を読み間違えておりました。配列であってハッシュではありませんでした。
>>147
アドバイス ありがとうございました。
149:デフォルトの名無しさん
10/03/27 00:11:17
perlから外部コマンドを実行して出力を格納するのに
バッククオートを使用しているのですが、
コマンドの文字列に$を含むような場合(環境変数とか)に
変数として展開されないようにする方法ってありませんでしょうか。
150:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/27 16:02:53
お前らモダンPerlで書いてる?
俺はまだ勉強してないんだけど
モダンPerlの利点って何があるのか簡潔に書け。
152:デフォルトの名無しさん
10/03/27 17:14:04
Perl4互換で書いてる。念のため
153:デフォルトの名無しさん
10/03/27 17:42:38
Mooseとかは使わないけどPerl4互換とか絶対あり得ないわw
154:デフォルトの名無しさん
10/03/27 18:45:16
自分で使うためのものしか考えてないから、5.10で追加されたものも普通に使って書いてる
いまさらPerl4互換とかないわー
155:デフォルトの名無しさん
10/03/27 18:49:09
perl4ってどんなの?
localとか使うん?
156:デフォルトの名無しさん
10/03/27 19:38:50
>>155
URLリンク(www2n.biglobe.ne.jp)
157:デフォルトの名無しさん
10/03/27 19:48:28
関数の引数は、localで受ける方が自然に見えるのは俺だけ?
sub func
{
local($x, $y)=@_;
まあ慣れなんだけど
158:デフォルトの名無しさん
10/03/27 20:10:32
おまえとKENTだけ
159:デフォルトの名無しさん
10/03/27 20:21:09
myだろ普通
JavaとかPHPとか他の言語は自動的に局所変数だ
160:デフォルトの名無しさん
10/03/28 09:35:47
最近は受ける変数名を考えるのが面倒だから
$_[0]とかを直接使ってるw
161:デフォルトの名無しさん
10/03/28 13:56:50
pythonのctypesに相当するものはありますか?
162:デフォルトの名無しさん
10/03/28 14:03:11
ん?PythonってCのやり方に頼りだしたんだw
163:デフォルトの名無しさん
10/03/28 14:04:47
書き忘れた
CPANでCtypeで検索しろ
164:デフォルトの名無しさん
10/03/29 11:12:09
swigしかないようです
165:デフォルトの名無しさん
10/03/29 12:40:00
Archive::Zipの解説しているWebPageないでしょうか。
できれば日本語で・・・
ぐぐっても、圧縮/解凍のやりかたしか出てない;;
166:デフォルトの名無しさん
10/03/29 16:31:31
>>165
「圧縮/解凍のやりかた」以外の何を知りたいのか
具体的に書くべきだろうな、そういう時は。
「マニュアルに書かれている内容が理解できないので
噛み砕いて教えて下さい」って言ってるのと同義なんだから。
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)
167:デフォルトの名無しさん
10/03/29 16:48:45
>>166
すみませんでした。
具体的にやりたいのは、画像ファイルを無圧縮ZIPに固めておき、それを解凍せずにブラウザに表示したいのです。
ローカルファイルを開いたハンドルから表示するのは出来たので、
ZIP内のファイルのハンドルが取れれば、出来そうなのですが・・・
my $zip = Archive::Zip->new('test.zip');
my $fh = $zip->open('hoge.jpg');
みたいに出来たらな・・・と。
168:デフォルトの名無しさん
10/03/29 19:22:43
>>167
お望みの物はArchive::Zip::MemberReadかい
169:デフォルトの名無しさん
10/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 ②
$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);
①を生かし、②を殺すとうまくいきますが、逆だと binmode $IMG の箇所でNot a GLOB referenceとなります
170:デフォルトの名無しさん
10/03/30 16:28:22
Archive::Zip::MemberReadは中をのぞいてみたけど
ハッシュをblessしただけの普通のオブジェクトだから
ファイルハンドルとしては使えない。あくまで同じような
メソッドが用意してあるだけの普通のオブジェクト。
binmodeとかはムリ。
IO::Stringみたいにグロブにtieしていろいろがんばれば
なんとかなるけどそこまではやってないようです。
171:デフォルトの名無しさん
10/03/30 16:55:00
テンポラリに展開して、それを読み込んだほうが良さそうですね。
そういう方向で修正していって見ます。
わざわざ中をのぞいていただき、ありがとうございました。
172:デフォルトの名無しさん
10/03/31 21:16:21
ドキュメントぐらい読めよ関数名見りゃだいたい分かるだろ
$zip->contents(FILENAME);
173:デフォルトの名無しさん
10/04/01 11:14:51
>>172
テンポラリファイルを使用する形で出来上がっていましたが、$zip->contents(FILENAME)を使用することで
「ファイルの書き込み→読み込み→出力」が、「ファイルの読み込み→出力」にすることが出来ました。
画像の縮小をさせるとレスポンスが遅いのですが、玄箱には重過ぎるのでしょう。
まだフロント(iアプリ)はテスト用でしか試してませんが、なんとか目処がつきました。
ありがとうございます。
174:デフォルトの名無しさん
10/04/01 17:09:07
Perlのバイブル本って何?
175:デフォルトの名無しさん
10/04/01 17:12:59
プログラミング言語Perl
176:デフォルトの名無しさん
10/04/01 17:31:06
正直最初にその1冊買ってそれが最後の本になるなw
あとはCPANとかでいろいろ探しまくる作業が残りの半分。
177:デフォルトの名無しさん
10/04/01 17:40:50
>>175
どの本ですか?
アマゾンなどのリンクください。
プログラミング言語Perlマスターコース
プログラミングPerl
という本なら見つかるのですが
178:176
10/04/01 17:43:19
ああ、俺が言ってるヤツは プログラミングPerl。
オライリーのらくだ絵の本。Perl開発者が書いたやつ。
179:デフォルトの名無しさん
10/04/01 19:04:29
モダンPerl読んだ方がいいと思う
180:デフォルトの名無しさん
10/04/01 19:14:03
それバイブルどころか入門書じゃないの?
181:デフォルトの名無しさん
10/04/01 19:30:19
プログラミングPerlって説明が古いじゃん
182:デフォルトの名無しさん
10/04/01 23:06:19
Effective Perlがいいぞ
183:デフォルトの名無しさん
10/04/01 23:17:35
モダンPerlはサスペンダーが大絶賛してたから意地でも読まない
184:デフォルトの名無しさん
10/04/01 23:57:33
江川達也さんは何の本でもたいしてちゃんと読まずに大絶賛するだろうが
185:デフォルトの名無しさん
10/04/02 00:19:10
モダンPerl読んだけど、情報がとびとびでさっぱり理解できない
初心者にすすめるもんじゃないよありゃ
186:デフォルトの名無しさん
10/04/02 02:40:11
プログラミングPerlは思想的に面白い。
Perl6なんて本当は完成させたくないんだよ。
綺麗すぎる言語は退屈だ。
187:デフォルトの名無しさん
10/04/06 00:05:27
Linux上で動かすPerlについて質問があります。
ファイルリストに記載されているファイルのみを
別のディレクトリにコピーしたいのですが、
どのようなコードを書けばよいのでしょうか?
ファイルリストを読み込み、$file_listで1文字ずつ表示させる状態にして、
system("cp $file_list $dir_name");とやっているのですが、うまくいきません。
188:デフォルトの名無しさん
10/04/06 00:16:52
>>187
print `cp $file_list $dir_name`;
エラーがあるならこれで分かるんじゃないか
189:デフォルトの名無しさん
10/04/06 00:31:12
俺の予想では、chompするとうまくいく
190:デフォルトの名無しさん
10/04/06 04:09:32
俺が touch ';rm -fr /;' しといてやるぜw >>187
191:デフォルトの名無しさん
10/04/06 20:19:04
blessしたオブジェクトをscalar($self)した時に
任意の文字列を返すにはどうすればよいでしょうか?
例えばDateTimeモジュールはDateTime->now()でオブジェクトを取得しますが、
scalar($now)すると現在時間が文字列で返ってくるのですが、
こういうのはどう実装すればよいでしょうか?
192:デフォルトの名無しさん
10/04/06 20:38:04
少なくともDateTimeではscalar使った時点で文字列に変わったりはしない
print $now; とか my $datestr = "$now"; で文字列になることを言ってるんなら、overload
193:デフォルトの名無しさん
10/04/08 01:08:37
>191
use overload ( 略
'""' => '_stringify',
略
194:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/10 00:43:24
Encode::from_to($data_str, "utf8", "cp932");
196:デフォルトの名無しさん
10/04/10 01:25:59
>>194
わかってないなら弾の言う通りに書けよ。
197:194
10/04/10 02:00:29
単純にdos窓で表示できない、と言う訳ではありません。Emacsで開いているので。
ブラウザで落とすとUTF8になっているので、ファイルはUTF8なんだと思うんですが。。
Mechanizeのcontent には独特なエンコードルールが有るんでしょうか?
contentのデータをencodeするのがマズイのかな。
198:デフォルトの名無しさん
10/04/10 02:23:11
Mech使わないから知らんけど、LWP::UserAgentとかみたいにHTTP::Responseでデータ返してくれるんなら
my $content = $res->decoded_content(charset => 'none'); # $res isa HTTP::Response
で生データ取れるからそれをそのまま保存するなりすればいいかと。
199:デフォルトの名無しさん
10/04/10 02:42:18
文字化けとかUTF8と思うとか曖昧なこと言わないで
バイナリエディタで中身見ればいいのに
200:デフォルトの名無しさん
10/04/10 02:54:08
>ファイルはUTF8なんだと思うんですが。
思うってなんだそりゃw
自分で見てから判断しれよ
201:デフォルトの名無しさん
10/04/10 04:20:49
>>194
とりあえずDevel::Peekなりでdumpしてutf8flagが立ってるかどうかをちゃんと確認した方がいい。
曖昧なまんまの推測だと答えも推測になるからなかなか答えにたどり着かんよ
202:デフォルトの名無しさん
10/04/10 05:28:58
>>194
iso-8859-1なんじゃねえの?
203:デフォルトの名無しさん
10/04/11 00:35:30
Spidering Hacksに載ってたな
204:デフォルトの名無しさん
10/04/11 00:42:17
Spidering Hacksの内容は今となってはさすがに古過ぎる
スクレイピングのマナーとか心構えとかは参考になるけどな
205:デフォルトの名無しさん
10/04/14 19:52:51
もう5年以上前になると思いますが、
Perlで書かれたプログラムを実行するとラクダの形で文字列が出力され、
そのプログラム自体もラクダの形に揃えられていたものをみたのですが、
探してみてもなかなかみつかりません。
少ない情報ですが、お分かりの方はいませんでしょうか?
206:デフォルトの名無しさん
10/04/14 20:21:48
Acme::EyeDropsじゃねーの
207:デフォルトの名無しさん
10/04/15 23:32:19
URLを画面に表示する時に、指定した文字数より長すぎる場合、
ディレクトリ階層を優先してまびくようにするにはどうしたらいいでしょうか?
例:
$url = "URLリンク(www.abc123.net)" ←65文字
$url = omiturl($url, 50);
print $url;
この結果としてこんな感じにしたいです
URLリンク(www.abc123.net) ... /vwxyz/foo1234.html ←47文字
208:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/16 04:53:00
>>208
便利につかわさせて頂きます。
ありがとうございました。
210:デフォルトの名無しさん
10/04/16 05:59:51
localhost/p2/read.php?host=pc12.2ch.net&bbs=tech&key=1266565626&ls=208-#r208
のようなクエリ文字列 or フラグメントの長いURLを>>208に通すと無限ループするな
見た感じだとマッチしなくなった時点でループを抜けるように書かれてると思うけど、なぜだろう
211:デフォルトの名無しさん
10/04/16 06:53:08
マッチもしないし文字数もこれ以上短く出来なくなったら無限ループだな。
例えば文字の長さを10とかやったら絶対無限ループ
212:208
10/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:デフォルトの名無しさん
10/04/16 22:26:22
Cだと
static char hoge[128];
write(fd, hoge, 128);
とすれば128バイト分の0x00が書き込まれると思うのですが
perlだとどのように記述すればいいでしょうか?
214:デフォルトの名無しさん
10/04/16 22:45:34
print 0x00 x 128;
215:デフォルトの名無しさん
10/04/16 22:46:25
あ、ごめん "\x00" x 128 だ
216:デフォルトの名無しさん
10/04/17 00:38:56
>>214
>>215
ありがとうございます、繰り返し演算子という奴を使うんですね。
217:デフォルトの名無しさん
10/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
218:208
10/04/17 17:34:11
splice @arr, $i, 0, "z";
219:デフォルトの名無しさん
10/04/17 18:05:40
>>218
㌧
できました
220:デフォルトの名無しさん
10/04/21 18:25:44
require HOGE::FUGA; を require $foo; みたいにして、
HOGE::FUGAの代わりにHOGE::PIYOを読むように動的に変更したいのですが、
この場合'HOGE/FUGA.pm'ってパス指定しないとうまくいきません。
出来ればHOGE::PIYOのような形式で指定したいのですが、
上手い方法はないでしょうか?
221:デフォルトの名無しさん
10/04/21 18:26:35
なるほど、evalの中でrequireするか、でなければUNIVERSAL::require使えばよいのか。
222:デフォルトの名無しさん
10/04/22 00:53:15
こんばんは
Perlでグラフを書く必要がありGD::Graphというモジュールを発見したので
使おうと思っていろいろ調べました。
その結果、このモジュールは軸を対数表示にすることができない?ようなんですが
この認識であってますかね?
URLリンク(search.cpan.org)
223:デフォルトの名無しさん
10/04/22 00:58:38
対数計算した座標渡せばいいだけでは
224:デフォルトの名無しさん
10/04/22 02:12:27
それだとグラフ自体は意図通りに描画されるかも試練が
軸の目盛り(?)が意図したようにならんのでは?
225:デフォルトの名無しさん
10/04/22 05:03:24
じゃあ使うのやめれば
226:224
10/04/22 11:20:42
おれは使ってないぞw
227:デフォルトの名無しさん
10/04/22 19:34:23
>>223
レスありがとうございます。
描画はそれでいけますが素直にgnuplotのほうが無難かな。
228:デフォルトの名無しさん
10/04/22 22:51:17
データだけ吐いてR言語がいいぞ
229:194
10/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:デフォルトの名無しさん
10/04/23 02:37:56
>>229
試してみたけど文字化けしないな
使い方も問題なさそうだけど
231:デフォルトの名無しさん
10/04/23 15:55:39
>>229
cpan moduleがencodeに対応してたりしてなかったりするものを混ぜると
わけわかんなくなる場合がある。
関係してそうなmoduleかたっぱしからupdateしてみ
232:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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
235:232
10/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:デフォルトの名無しさん
10/04/23 17:18:56
use strictしなかった結果がこれだよ!
237:デフォルトの名無しさん
10/04/23 17:40:45
$a!
238:デフォルトの名無しさん
10/04/23 17:43:02
$a ≠ @a
239:デフォルトの名無しさん
10/04/23 17:44:47
$aと@aは全くの別物。このプログラムに登場する@aはmyで宣言されてない
から常に同じパッケージ変数が使われてる
あと$a, $bはsortが使う特別な変数なのでそれ以外の用途で使うとろくな目に
会わないからやめとけ。
240:デフォルトの名無しさん
10/04/23 20:07:59
$a使った結果がこれだよ!
241:デフォルトの名無しさん
10/04/23 20:08:54
sortが$a, $bを使うという仕様を見た時は目ん玉飛び出たな
どんな糞仕様だよと
242:デフォルトの名無しさん
10/04/23 20:56:57
どこが?
Perlなら妥当な仕様だろ。
243:デフォルトの名無しさん
10/04/23 21:14:28
$_ とか $@ とか $! とかも糞仕様
244:デフォルトの名無しさん
10/04/23 21:26:09
つまりPerlは糞言語だから糞仕様なのがむしろ妥当だと
245:デフォルトの名無しさん
10/04/23 22:34:24
$aと$bをどう使うと降順になるのか何度やっても覚えない
そもそも、降順と昇順の意味がピンと来ない
246:232
10/04/23 22:44:39
返答が遅くなり申し訳ありません。
色々と得心がいきました。
解決したところで引き続き頭をこねこねしたいと思います。
ありがとうございました。
247:デフォルトの名無しさん
10/04/23 23:26:38
$_やら$@やら$!はだれがプログラムしても同じ変数だから分かりやすい
っていう話があってだな
248:デフォルトの名無しさん
10/04/24 00:01:40
>>247
なるほど
そう考えると確かにと思わざるを得ない
ただあまり使わない特殊変数は検索かけても引っかかってこないのがウザい
249:デフォルトの名無しさん
10/04/24 00:03:24
perldoc perlvar
250:デフォルトの名無しさん
10/04/24 00:26:59
とりあえず>>245が頭が悪いと言う事はわかった
251:デフォルトの名無しさん
10/04/24 01:56:06
UTF-8 で書かれたテキストファイル hoge.txt の内容を
Windowsのバッチファイルからワンライナーで
msg="おはよう"
から
msg=こんにちは
に置換したいんですが・・・
perl -i.BAK -pe "s/(?<=msg=).*/こんにちは/" hoge.txt
これだとシフトJISで書き込まれてしまうんです。
UTF-8 で書き込む方法があれば教えてください。
252:デフォルトの名無しさん
10/04/24 10:37:27
見つけたよ特殊変数のスレ
同じプログラム板じゃないか
Perlの特殊変数は氏ね。絶対に使うな。可読性下がる
スレリンク(tech板:34番)
34 名前:デフォルトの名無しさん[sage] 投稿日:2006/03/11(土) 22:02:24
特殊変数は、他人や「昔の自分」が書いたソースに出てきても
まったく可読性に影響の無い、数少ない構成要素の一つだろう。
同じ名前の変数には、常に同じ意味を持つものが入ってるんだから。
「これ何のためにあるの?何が入ってるの?」って状態になるのは普通の変数のほう。
253:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/24 18:26:39
$@%があるからスカラなのか配列なのか、分かりやすくて良いと思う俺って少数派?
255:デフォルトの名無しさん
10/04/24 18:27:43
多数派
256:デフォルトの名無しさん
10/04/24 20:20:59
じゃあリファレンスも別のプリフィクスを採用するべきだったよね
あと配列もハッシュも中身にアクセスするとき$プリフィクスを要求するのは分かりにくいよね(これはperl6で変更になるけど)
257:デフォルトの名無しさん
10/04/24 20:23:23
あれはあれでいいんだよ
258:194
10/04/24 20:59:32
>>231,230
Macだといけました。
Windowsだと化けるんだな。。
ppmのモジュールは確かに古かったから、cpanで入れ直してみようかと思います。
ちなみにeshellで出力してるので、winでもcp932にencodeしなくても大丈夫です。
てかこれで途中までは日本語がきちんと表示されます。
259:デフォルトの名無しさん
10/04/25 01:08:38
>>256
おれはperl5の方が好きだ
スカラだから$で統一されててわかりやすい
260:デフォルトの名無しさん
10/04/25 03:03:46
最終的に得るものがスカラ、という考え方か
例えばデリファレンスで配列を得たけりゃ@$array_refだし
確かにそりゃそうだなぁ
261:デフォルトの名無しさん
10/04/25 05:23:43
あれだよな。@は配列変数 って書くサイトや本が悪いよな。
配列へのアクセスなのに。
262:デフォルトの名無しさん
10/04/25 10:58:03
>>260
そういう思想で作ってあるって習ったから覚えやすかった
263:デフォルトの名無しさん
10/04/25 14:29:25
@names = ('OZA-', 'POPPO', 'MASZOE');
@mes = ('012345678901234567890123456789', 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ', いいいいい);
例えばこのようなものを、次のように2つのカラムがあるかのように出力したいのですが、どうしたらできるでしょうか?
OZA- .| 012345678901234567890123
...| 456789
POPPO | あいうえおかきくけこさしすせそたちつてとなにぬ
...| ねのはひふへほ
MASZOE .| いいいいい
こんなのでできるかなと思ったのですが無理でした…
format AAA =
@<<<<<<<<<< | @<<<<<<<<<<<<<<<<<<<<
~~ | @<<<<<<<<<<<<<<<<<<<<
.
よろしくお願いします。
264:デフォルトの名無しさん
10/04/25 14:47:40
と思ったらformatでできました。お騒がせしました。
265:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/26 12:59:43
Perlの特殊変数って言っても、使うのは $_ $@ @_ とかほとんどこんなもんだろ。全部覚えてる奴なんてまずいない。
267:デフォルトの名無しさん
10/04/26 14:39:27
最低限:$_ @_ $1~$9 $a $b
覚えてると便利:$@ $! $. $/ $? $$
ゴルフやるなら:$\ $, $" $& $` $' @F
268:デフォルトの名無しさん
10/04/26 21:46:22
open IN,"file";
while(<IN>){
$str .= $_;
}
file内のテキスト全てを、$strというスカラー変数に代入してみました。
ファイルサイズが小さければ問題ないが何万行とかだと代入処理に失敗しますよね?
269:(!>>268)
10/04/26 22:29:11
そういえば数値はスカラに2^1023以上、2^1024未満が入ったけど、
このヘンの上限というか仕様ってどこか載ってます?
270:デフォルトの名無しさん
10/04/26 23:29:24
>>266
それは文法の一部で、特殊変数じゃない
271:デフォルトの名無しさん
10/04/27 02:49:33
>>268
open IN,"file";
read IN,$str,-s IN;
272:デフォルトの名無しさん
10/04/27 03:17:45
use File::Slurp;
$str = read_file('filename');
>>268
メモリあれば大丈夫だよ。ただ毎行 .= すると遅い
273:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/04/27 17:49:04
>>273
それスカラじゃなくてたまたま1要素の配列スライス。
配列スライス自体はperl4の昔からすでにあった。
それより前はシラネ
275:デフォルトの名無しさん
10/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];
276:273
10/04/27 18:08:51
>>274,275
なるほど!とんくす!
277:デフォルトの名無しさん
10/04/29 21:10:07
xpでactiveperl v5.8.9を使ってたら、
使えてたスクリプトが急に「問題が発生したため」云々のウィンドウを出して止まるようになった
ファイルが12728あるディレクトリでreaddirをしたのが原因みたい
ファイルの少ないところで使うと問題ない
なんか制限あったっけ
278:デフォルトの名無しさん
10/04/29 21:25:34
違った
260文字あるファイル名のせいだった
279:デフォルトの名無しさん
10/04/30 17:50:08
Perl/Tkで作ったテキストウィジェットに1秒置きに1-10の数字を表示させるにはどうすれば良いですか?
280:デフォルトの名無しさん
10/04/30 22:56:37
>>279
URLリンク(search.cpan.org)
281:デフォルトの名無しさん
10/05/05 15:50:31
バッチファイル(hoge.bat)の1行目に
PATH C:\hage;%PATH%
と「挿入」したいんですけど、
ワンライナーでできますか?
できるならやり方を教えてください。
282:デフォルトの名無しさん
10/05/05 16:00:35
open BAT '>hoge.bat'; print BAT 'PATH C:\hage;%PATH%';print BAT <BAT>;
こんな感じ?
283:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/05 16:15:23
perl -p0i -e 's/^/PATH C:\\hage;%PATH%\n/' hoge.bat
Windowsだとシングルクオートじゃなくてダブルクオートじゃないとだめなんだっけか
でもこのままやると%PATH%が展開されちゃったりするのか?よくわからんから適当に直してくれ
285:デフォルトの名無しさん
10/05/05 17:13:28
>>284
できました!ありがとう。
perl -i.BAK -p0 -e "s/^/PATH C:\\hage;%%PATH%%\n/" hoge.bat
286:デフォルトの名無しさん
10/05/07 01:58:11
perlのスクリプトを含むWindowsのパッケージを
setup.exe
みたいな塊にまとめたいのですが
何がおすすめでしょうか?
昔単なる実行ファイルだけのときは
innoSetup使ってたけど
287:デフォルトの名無しさん
10/05/07 07:21:30
PAL
Perl2EXE
288:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/07 12:16:00
いきなりファイル名でというのは知らないけど、強いて言えば
IO::Handleのgetlinesが近いかなぁ。
本題とは関係ないが、せめてopenのエラー処理( or die $!
をつける程度でいいよ)はやっとけ。後で苦労するぞ。
290:デフォルトの名無しさん
10/05/07 12:27:01
「ファイルを読み込んで配列を返す」処理につける名前にしちゃ arraylize は筋が悪いな
readfile なり readlines なりでいいだろ
どうしても array が重要だっつーんなら make_array
291:デフォルトの名無しさん
10/05/07 12:30:10
まんまでいいなら、file2array
292:デフォルトの名無しさん
10/05/07 12:35:40
sub arraylize {
my $name = shift ;
open ( my $fh ,"<", $name ) ;
my @listArray = <$fh> ;
close ($fh) ;
return @listArray ;
}
関係ないけど
293:デフォルトの名無しさん
10/05/07 12:39:50
>「arraylize」「arrailise」「arrailize」
l はどっから出てきたんだよ
294:デフォルトの名無しさん
10/05/07 13:18:58
セパレータが指定されたら split した配列を返したり、
配列だったらそのまま返したり、
ハッシュだったら key/value をセパレータで繋げた配列を返したり・・・
そこまでやって、初めて arraylize を名乗っていい。
そう思うんだ。
どうでもいいけど
295:デフォルトの名無しさん
10/05/07 13:37:18
to_arrayじゃダメなん?
296:デフォルトの名無しさん
10/05/07 14:12:49
ありがとうございます
単純にfile2arrayにします
エラー処理や
ファイルハンドルに$fh、
そこのところ貰います
297:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/07 14:51:29
>>288
わざわざ作らんで
use File::Slurp;
my @list = read_file("list.dat");
しなよ。
299:デフォルトの名無しさん
10/05/07 14:58:34
>>297
> (foo, bar, baz, 1, 2, 3) なリストを (foo, 1, bar, 2, baz, 3) に変換する関数があればいいんだけど。
List::MoreUtilsになにかあるんじゃ
300:デフォルトの名無しさん
10/05/07 15:01:31
perl -e "print ((qw(foo bar baz),split(/,/, 'xxx,yyy,zzz'))[map{$_,$_+3}(0..2)]);
fooxxxbaryyybazzzz
あんまやるもんじゃないな
301:デフォルトの名無しさん
10/05/07 16:11:01
頭がおかしくなりそうだ
TMTOWTDIと言うけど、杉樽歯泳場猿画五都市と言う名言もあるし
302:デフォルトの名無しさん
10/05/07 16:17:03
>>297
use List::MoreUtils qw(zip);
$_ = '1,2,3';
push @result, {zip @{[qw(foo bar baz)]}, @{[split /,/, $_, 3]}};
303:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/07 16:25:12
>>302
入れ違いになりました。
素晴らしい。使わせていただきます。ありがとうございます。
305:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/07 17:07:39
>>302
いったん無名配列への参照[]にして
それを@{}で、参照先の配列に戻して渡している
という理解でいいのかな?
307:デフォルトの名無しさん
10/05/07 17:10:34
>>306
そだね
URLリンク(perl-users.jp)
308:デフォルトの名無しさん
10/05/07 17:12:08
>>305
なんで3行で済ます方法を書いたの?
309:デフォルトの名無しさん
10/05/07 17:14:06
>>308
二行だろ
310:デフォルトの名無しさん
10/05/07 17:18:09
>>308
何揚げ足とろうとしてんのw
311:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/07 17:51:55
>>305
sub zip{ map { $_, shift @{$_[1]} } @{$_[0]} }
print zip [1,2,3],[4,5,6] ;
313:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/07 21:28:38
>>293
ヒント:シノラー
315:デフォルトの名無しさん
10/05/07 22:52:02
TwitterのAPI叩くにはどうすればいいですか
Net::Twitterとかじゃなくて、純粋にHTTP使ってその辺から学習したいのです
316:デフォルトの名無しさん
10/05/07 23:18:20
URLリンク(usy.jp)
サンプル集
317:デフォルトの名無しさん
10/05/07 23:51:12
use Net::Twitter;
役にたたなかった
318:デフォルトの名無しさん
10/05/08 19:37:45
win32でパスを含めて 256 バイト以上のファイル
URLリンク(www.namazu.org)
この問題ってもう解決されています?
319:デフォルトの名無しさん
10/05/11 00:00:10
Perlのファイル読み込みと配列格納について質問があります。
エクセルから出力した行列状態になっているcvsファイルをPerlに読み込ませて、
@a、@b、@cにそれぞれの行のデータを格納したいです。
なので、二次元配列のようなことをしないといけないと思うのですが、
Perlで二次元配列のような処理をするにはどうすればよいのでしょうか?
また行列状態になっているファイルを配列に格納する他の良い方法はありますでしょうか?
よろしくお願いします。
320:319
10/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:デフォルトの名無しさん
10/05/11 00:16:24
>>319
・「perl 配列の配列」でググる
・「perl CSV」でググる
322:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/11 01:17:33
>>322
ありがとうございます。
外部からファイルを読み込む場合はどうすればよいのでしょうか?
324:321
10/05/11 01:45:17
>>323
だから「perl CSV」でググれと教えたのに。ググれば
”csvファイルを読み込んで配列の配列に変換に変換する”
URLリンク(d.hatena.ne.jp)
こんくらいすぐに出てくるだろ
325:デフォルトの名無しさん
10/05/11 01:51:03
>>322を改良できんレベルの人なら>>324のリンク先飛んでもイミフだろ
326:デフォルトの名無しさん
10/05/11 01:53:57
>>323
use IO::File;
my @data = IO::File->new('data.txt', 'r')->getlines;
chomp @data;
327:デフォルトの名無しさん
10/05/11 02:04:22
use File::Slurp;
my @csv = read_file('hoge.csv');
chomp @csv;
328:デフォルトの名無しさん
10/05/11 02:19:44
>>322
[@{[split(/\s+/, $_)]}[3..5]]
は
[(split /\s+/, $_)[3..5]]
のほうがいいよね。この場合に限れば /\s+/, $_ が無くてもよし。
つーかCSVなら最初からText::CSV(_XS)?使えばいいじゃんって話だけど。
329:デフォルトの名無しさん
10/05/11 02:46:24
>>328
おお、/\s/まで省略できるのか
初めて知った
ありがt
330:デフォルトの名無しさん
10/05/11 03:42:18
$_ = " foo\nbar\tbaz" としたとき、
split(/\s+/) だと ('', 'foo', 'bar', 'baz') が返るけど、
引数なしのsplit または split(" ") なら ('foo', 'bar', 'baz') になるってことだけ注意な。
331:デフォルトの名無しさん
10/05/12 01:12:21
HTTP通信するにはなんていうライブラリつかえばいいの
332:デフォルトの名無しさん
10/05/12 02:31:39
socks
333:デフォルトの名無しさん
10/05/12 13:31:19
えっ?
334:デフォルトの名無しさん
10/05/12 13:35:41
LWP
335:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/12 15:58:56
pack("U", 0x4FAE) じゃだめなのか
337:デフォルトの名無しさん
10/05/12 16:16:02
0x4FAE または hex("4FAE") または "20398"
338:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/12 16:28:58
16進文字列からバイト列への変換が間違ってるな。
pack("S", $cp)じゃなくてpack("H*", $cp)だろ。
340:デフォルトの名無しさん
10/05/12 16:32:44
>>338
wide characterをいきなりprintするとそうなる。
encodeしてバイト文字列にしてからprintするか、
printする前に文字コード指定してレイヤつけとけ。
binmode STDOUT, ':encoding(utf-8)';
341:デフォルトの名無しさん
10/05/12 16:34:59
binmodeつけたら直りました。
ありがとうです。
342:デフォルトの名無しさん
10/05/13 12:34:03
URLリンク(www.cgarbs.de)
これをwindowsで動かせた人いますか?
perlのファイル1つだけのプログラムだからlinuxで動かすのは簡単だったんだけど
windowsではうまく動いてくれない
343:デフォルトの名無しさん
10/05/14 13:21:02
文字のバイトコードを得るほうほうを教えてください!
たとえば、a から 97 を得るようなことってできますか??
344:デフォルトの名無しさん
10/05/14 13:23:28
ord("a")
345:デフォルトの名無しさん
10/05/14 13:26:10
ありがとう!
346:デフォルトの名無しさん
10/05/15 03:08:54
perlで文字をprint等で出力するとき、特定の行で改行をして出力するというようなことってできますか?
347:デフォルトの名無しさん
10/05/15 03:32:34
できるよ安心して
348:デフォルトの名無しさん
10/05/15 03:44:17
>>347
安心した
やり方を教えてちょ
349:デフォルトの名無しさん
10/05/15 04:42:20
何だよ「特定の行」って
350:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/15 09:22:29
$. == 行番号 とか。
353:デフォルトの名無しさん
10/05/15 11:21:19
perlで作った掲示板の連続投稿を制限する方法を教えてください。
一定時間が経過するまで再投稿できないようにしたいです。
354:デフォルトの名無しさん
10/05/15 11:59:34
投稿者のIDに対して最後の投稿時間を記録する
355:デフォルトの名無しさん
10/05/15 12:24:13
小規模ならグローバルでもいいんじゃないの?
# 30秒経過してない場合returnする
return if $g_last_post + 30 > time;
$g_last_post = time;
356:デフォルトの名無しさん
10/05/15 14:35:57
>>353
IPのログはとってんだろ?
そこから判定すりゃいい
samba24みたいな手にするって方法もあるな
ちょっと技術がいるかも知れないが
357:デフォルトの名無しさん
10/05/15 14:55:21
普通はそんなめんどいことしないでクッキー食わせて判定だと思うぜ
358:デフォルトの名無しさん
10/05/15 15:04:37
ログは巨大だからなあ
自前でテーブル持つ方が軽い
359:デフォルトの名無しさん
10/05/15 15:21:54
いやだから普通はクッキーだろっての
360:デフォルトの名無しさん
10/05/15 15:55:01
↑バカは喋るな
361:デフォルトの名無しさん
10/05/15 15:58:24
>>359
クライアントが書き込み後にクッキー捨てたらアウトだと思うんだがそうでもないのか
もうちょっと詳しく
362:デフォルトの名無しさん
10/05/15 16:01:51
>>349-352
長いテキストがあり、100文字目ごとに改行を入れるということです。
分かりにくくて申し訳ありませんでした。
363:デフォルトの名無しさん
10/05/15 16:17:33
2chもクッキーだな
364:デフォルトの名無しさん
10/05/15 16:27:54
>>362
Text::LineFold
>>353,354-359,361,363
板違い URLリンク(pc11.2ch.net)
365:デフォルトの名無しさん
10/05/15 16:29:03
一足遅かったか
>>362
>>3
URLリンク(www.din.or.jp)
URLリンク(search.cpan.org)
>>353
△▲ WebProg 初心者の質問 Part22 ▼▽
スレリンク(php板)
366:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/05/16 21:43:55
>>366
funcA() や funcB() の戻り値は無いのかとか、hoge や fuga が何を判定してるのかとか、
funcAErr() でなく funcErr('A') じゃダメなのかとか、エラー処理後に戻ってくる (if then else
で括る) 必要があるのかとか、Perlらしさ以前の問題だと思う。
368:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/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を呼び出しているようで、入力がない状態になってしまっているようです。
解決策のご提示をよろしくお願いいたします。
また、一度ファイルに保存することなく直接メモリ上で受け渡す方法などもご提示いただけると幸いです。