トップページ⇒tech
1001コメント303KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/05/25(水) 23:18:12.33
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )

このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

http://www.perl.org/get.html
● 2011/05/25 現在の最新版: 5.14.0

▼ 前スレ
Perlについての質問箱 46箱目
http://hibari.2ch.net/test/read.cgi/tech/1297677532/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-7 あたり
0002デフォルトの名無しさん2011/05/25(水) 23:18:52.40
[プログラミング自体の経験が無い奴はまずココを読め]
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://ascii.asciimw.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/
perldoc.jp: ttp://www.perldoc.jp/
perldoc.perl.org: ttp://perldoc.perl.org/
0003デフォルトの名無しさん2011/05/25(水) 23:19:02.02
[モジュール]
CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perl メモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perl のページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perl の小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl 5.8 Unicodeメモ]
ttp://www.rwds.net/kuroita/program/Perl_unicode.html (修正)
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん2011/05/25(水) 23:19:12.89
# [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 でエンコードする必要があります。
0005デフォルトの名無しさん2011/05/25(水) 23:19:21.98
[過去スレ1]
1 http://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 http://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 http://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 http://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 http://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 http://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 http://pc2.2ch.net/test/read.cgi/tech/1068051036/ (事故により消滅)
8 http://pc2.2ch.net/test/read.cgi/tech/1074151549/ (事故により消滅)
9 http://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 http://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 http://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 http://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 http://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 http://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 http://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 http://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 http://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 http://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 http://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 http://pc8.2ch.net/test/read.cgi/tech/1131286411/
0006デフォルトの名無しさん2011/05/25(水) 23:19:28.30
[過去スレ2]
21 http://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 http://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 http://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 http://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 http://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 http://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 http://pc8.2ch.net/test/read.cgi/tech/1157874614/
28 http://pc8.2ch.net/test/read.cgi/tech/1162273941/
29 http://pc11.2ch.net/test/read.cgi/tech/1166708139/
30 http://pc11.2ch.net/test/read.cgi/tech/1173880452/
31 http://pc11.2ch.net/test/read.cgi/tech/1181500187/
32 http://pc11.2ch.net/test/read.cgi/tech/1186995713/
33 http://pc11.2ch.net/test/read.cgi/tech/1192463997/
34 http://pc11.2ch.net/test/read.cgi/tech/1199977642/
35 http://pc11.2ch.net/test/read.cgi/tech/1208674881/
36 http://pc11.2ch.net/test/read.cgi/tech/1215569470/
37 http://pc11.2ch.net/test/read.cgi/tech/1218449440/
38 http://pc11.2ch.net/test/read.cgi/tech/1221967332/
39 http://pc12.2ch.net/test/read.cgi/tech/1234181856/
40 http://pc12.2ch.net/test/read.cgi/tech/1243631674/
0007デフォルトの名無しさん2011/05/25(水) 23:19:36.28
[過去スレ3]
41 http://pc12.2ch.net/test/read.cgi/tech/1249581780/
42 http://pc12.2ch.net/test/read.cgi/tech/1257139591/
43 http://pc12.2ch.net/test/read.cgi/tech/1266565626/
44 http://hibari.2ch.net/test/read.cgi/tech/1280541200/
45 http://hibari.2ch.net/test/read.cgi/tech/1287755129/
46 http://hibari.2ch.net/test/read.cgi/tech/1297677532/
0008デフォルトの名無しさん2011/05/25(水) 23:21:56.41
>>1乙

テンプレなげーよ。
0009デフォルトの名無しさん2011/05/26(木) 02:10:26.60
JPerl からひさしぶりに Perl な世界でよくわかりませんが >>4 の

binmode STDIN => ":encoding(cp932)"; 
binmode STDOUT => ":encoding(cp932)"; 

が

use encoding "cp932";

でも、いいような気がしるけど、いまいち理解できてないです…
0010デフォルトの名無しさん2011/05/26(木) 02:38:46.95
それは気のせいだよ
0011デフォルトの名無しさん2011/05/26(木) 06:36:42.24
>>9
全然ダメ
0012デフォルトの名無しさん2011/05/26(木) 12:40:27.81
>>10-11
kwsk
0013デフォルトの名無しさん2011/05/26(木) 13:14:43.30
use encoding "cp932"にするとソースもcp932で書かなきゃ
いけなくなるのが余計ってことなんじゃ。
001492011/05/26(木) 13:15:44.46
>>12さんどうもです。

とりあえず、最初は

use utf8;
use encoding "cp932";
use open IO => ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";

こんな感じで、UTF-8形式でソース保存しています。
あ…ファイル名に全角文字だとさらにややこしくなるんですね… orz
001592011/05/26(木) 13:17:59.16
実行環境は、Win7 64bit コマンドプロンプトのローカル環境です。
0016デフォルトの名無しさん2011/05/26(木) 14:19:17.56
use utf8 するとめんどくさいので、use utf8 は使わないなぁ
ソースを utf8 で保存しれりゃ別にえぇんとちゃうのん?と思う。

文字数を数えたいなら decode してフラグ付けりゃいいだけだしさ。
0017デフォルトの名無しさん2011/05/26(木) 14:33:53.73
もつ
0018デフォルトの名無しさん2011/05/26(木) 15:11:12.92
>>1 乙

テンプレが長いのは過去スレが多いからだが、過去スレはやめても
いいんじゃない?
他のスレでも、省略しているものが多いみたいだし。
0019デフォルトの名無しさん2011/05/26(木) 17:37:42.78
フォームから入力されたデータ
例えば<font size="6">www</font>"aaa"<font color="#0000ff">www</font>"bbb"という文字列の
タグの中の"を'にタグ外の"は&quot;に変換して
<font size='6'>www</font>&quot;aaa&quot;<font color='#0000ff'>www</font>&quot;bbb&quot;というようにするには
どうしたらいいんでしょうか?
0020デフォルトの名無しさん2011/05/26(木) 18:19:43.27
>>19
そんなこと聞いてるやつがインジェクション攻撃に
対処できると思わないからタグ自体禁止する。
0021デフォルトの名無しさん2011/05/26(木) 18:44:50.03
たぶん聞かないなこりゃ<タグ禁止
0022デフォルトの名無しさん2011/05/26(木) 18:50:12.18
>>19
1.行全部のクォートを"にする
2.タグの中の"を'に変換する
3.SQLなどへのインジェクションで泣きを見る
4.あなたは晴れて失業
5.perl忍者が増える
0023デフォルトの名無しさん2011/05/26(木) 21:40:54.68
すみません初歩的な質問なのですが
ハッシュ変数wordに$word{"テスト"}="だよ";
のような感じで値を渡しているのですが
いざif文で if ($word{$a} == "だよ")で判別しようとすると
$aがどんな値でも上記の条件式が必ず実行されてしまいます。
意味不明だと思いますがエスパーの方いましたらよろしくお願いします。
0024デフォルトの名無しさん2011/05/26(木) 22:03:53.54
初歩の初歩だ
文字列比較には==ではなくeqを使え
0025デフォルトの名無しさん2011/05/26(木) 22:33:22.35
== eq
!= ne
常識
0026デフォルトの名無しさん2011/05/26(木) 22:42:03.07
>>24-25
無事解決しました!
なるほど文字列の比較の仕方が間違ってたんですね。
どうもありがとうございました。
0027デフォルトの名無しさん2011/05/26(木) 23:01:20.86
>>19
タグの外ってことは > と < にはさまれてるって考えれば良いかと
0028デフォルトの名無しさん2011/05/26(木) 23:10:34.54
>>27
<img/>とか<br/>はどうすんの
0029デフォルトの名無しさん2011/05/26(木) 23:30:08.44
>>14
> use utf8;
> use encoding "cp932";
両方同時に使うのは間違い

ttp://perldoc.jp/docs/perl/5.8.1/utf8.pod
ttp://blog.livedoor.jp/dankogai/archives/51221731.html
0030デフォルトの名無しさん2011/05/27(金) 03:45:12.00
うーむ、>>14の例がどうしてutf8が優先されるのか分からない。
それは置いといて、encodingを使うと、
binmode STDIN => ":raw :encoding(cp932)";
binmode STDOUT => ":raw :encoding(cp932)";
こうなって、"\n"の挙動が変わるから注意は必要だね。
0031デフォルトの名無しさん2011/05/27(金) 08:24:04.59
単に記述を短くしたいだけなら以下でいいのでは?

use utf8;
use open qw(:encoding(cp932) :std);
0032デフォルトの名無しさん2011/05/27(金) 10:32:06.73
>>19
>フォームから入力されたデータ
この意味がよくわかんないんだけど、単なる文字列の変換なら

my $str = '<font size="6">www</font>"aaa"<font color="#0000ff">www</font>"bbb"';
$str =~ s/(<[^>]*?)"(.*?)"/\1'\2'/g;
$str =~ s/"/&quot;/g;
0033デフォルトの名無しさん2011/05/27(金) 13:05:02.52
文字列の #ff4500ff とか 16進数の 0xff4500ff とかを
0 から 1 までの範囲の RGBA の配列に変換してくれるモジュールには
どういったのがあるのでしょうか?
サブルーチンを自分で書いた方が早い気がしますが、
CPAN にあるのならそれを使った方が良いかなあ?と思って
0034デフォルトの名無しさん2011/05/27(金) 13:25:00.08
正規表現で.(ドット)は改行以外の任意の1文字ですが
改行を含む任意の1文字はどう表現すればいいですか?
0035デフォルトの名無しさん2011/05/27(金) 13:39:48.57
>>34
s修飾子を使うか | で並べる

/./s
/.|¥n/

お好きな方で。
0036デフォルトの名無しさん2011/05/27(金) 14:42:25.83
>>30
よく解らなかったので検索したら、たとえば

binmode STDOUT => ":crlf:encoding(cp932)";

という指定で大丈夫でしょうか?
0037デフォルトの名無しさん2011/05/27(金) 17:58:40.36
>>36
礼儀正しくやるならそうなるね。
面倒ならSTDINだけ:crlfを追加とか。
binmode STDIN => ":crlf";
0038デフォルトの名無しさん2011/05/27(金) 18:52:12.71
$str="aaa{aaabbbccc}aaa{aaabbbccc}";の
{}の中のaaaをAAAにしたいんですけど
$str=~s/{aaa}/AAA/g;としてもうまくいきません
どうすればうまくいくんでしょうか?
0039デフォルトの名無しさん2011/05/27(金) 19:03:27.46
Perlはじめようと思ったのですが
やめたほうがいいといわれたのでやめます
0040デフォルトの名無しさん2011/05/27(金) 19:23:35.56
>>38
$str="aaa{aaa}aaa{aaa}";
なら $str=~s/{aaa}/AAA/g;でうまくいくよ。
0041デフォルトの名無しさん2011/05/27(金) 22:48:57.57
こえぇ…pmとかでお伺いを立てないで
CPANにUPすると容赦なくdisられるのな…。
0042デフォルトの名無しさん2011/05/27(金) 23:22:45.70
初歩の初歩だけど


#!C:/Perl/bin/perl

require 'cgi-lib.pl';
require 'jcode.pl';

print "Content-type: text/html\n";
print "\n";

%form = &read_input('euc');

$name= $form['name'];

print "$name";


これでなんで何も表示されないのか全くわからん。
ディレクトリ内の「cgi-lib.pl」の名前を変えてみたところサーバーエラーになったらから、
「cgi-lib.pl」の読み込みはちゃんとできていたということになるんだけど。
0043デフォルトの名無しさん2011/05/27(金) 23:24:08.08
$name= $form['name'];
これなに
0044デフォルトの名無しさん2011/05/27(金) 23:27:48.26
連想配列のnameの要素を参照したんだけど。
0045デフォルトの名無しさん2011/05/27(金) 23:37:14.62
$name = $form{'name'};
0046デフォルトの名無しさん2011/05/27(金) 23:49:49.21
[] 配列
{} ハッシュパピー
0047デフォルトの名無しさん2011/05/27(金) 23:56:18.76
あ、そっか。ありがとう!

よーし治……らない! なぜ。
0048デフォルトの名無しさん2011/05/27(金) 23:59:50.55
print $
0049デフォルトの名無しさん2011/05/28(土) 00:00:50.35
print %form

した結果はどうなる?
0050デフォルトの名無しさん2011/05/28(土) 00:07:35.23
>>49 相変わらず何も出ませんの。
0051デフォルトの名無しさん2011/05/28(土) 00:10:44.02
&read_input('euc');
ジャッジメントですの!
0052デフォルトの名無しさん2011/05/28(土) 00:19:17.65
cgi-lib.plで使える関数ですってよ?
というか
http://www.tiu.ac.jp/~nakabasa/Internet/CGI/cgi4.html
このページの下のほうを参考にしたんで、負ける気がしない!
0053デフォルトの名無しさん2011/05/28(土) 00:24:03.09
Perl4とかゴミだろ
0054デフォルトの名無しさん2011/05/28(土) 00:24:44.84
めんどくさいので以下のように書き換えるがよろし


use CGI;
my $form = CGI->new;
print $form->param('name');

0055デフォルトの名無しさん2011/05/28(土) 00:32:24.33
500エラー来ました。

もう1度検討を重ねてから出直してきます。
0056デフォルトの名無しさん2011/05/28(土) 01:20:02.71
ああ、なんか&read_input('euc');が入ってると問答無用で何一つ出力されなくなるみたい。
0057デフォルトの名無しさん2011/05/28(土) 01:28:18.81
なんかよくわかんないけど
&read_input('euc');
をやめて
&ReadParse;
にしたらできた。ていうかcgi-lib.plに「read_input」なんて文字列自体存在しなかったぞ。どうなってんだ^o^
0058デフォルトの名無しさん2011/05/28(土) 02:33:27.61
初歩の初歩以前の問題だったようだな
0059デフォルトの名無しさん2011/05/28(土) 05:41:01.87
cgi-lib.pl は古いから CGI.pm 使えって
0060デフォルトの名無しさん2011/05/28(土) 07:12:47.44
cgi-lib互換モードもあるよ

use CGI ':cgi-lib';
%form = Vars;
0061デフォルトの名無しさん2011/05/28(土) 12:29:11.06
ご丁寧にありがとうございました。
でもすでに手作業で移行しますた
0062デフォルトの名無しさん2011/05/29(日) 03:13:18.36
>>61
> でもすでに手作業で移行しますた
なってねえな〜「でもすでに」じゃねーだろ
そういう時はウソでも「参考になりました」とか「もっと精進します」とか書いとけよ
0063デフォルトの名無しさん2011/05/29(日) 03:23:49.62
これ以上ゴミコードを増やす意味はないだろ。
0064デフォルトの名無しさん2011/05/29(日) 04:26:29.99
>>63
日本語でおk
0065デフォルトの名無しさん2011/05/30(月) 11:26:36.12
cpan> install Gtk2
Running install for module 'Gtk2'
Running make for F/FL/FLORA/Gtk2-1.223.tar.gz
Has already been unwrapped into directory C:\strawberry\cpan\build\Gtk2-1.223-C10W1L
'C:\strawberry\perl\bin\perl.exe Makefile.PL' returned status 512, won't make
Running make test
Make had some problems, won't test
Running make install
Make had some problems, won't install

なんかこうなるようになっちゃったんですけど
最初からやり直すにはどうしたらいいんざましょ?
0066デフォルトの名無しさん2011/05/30(月) 13:26:37.32
>65
エラーメッセージで
「Gtk2-1.223.tar.gz は C:\strawberry\cpan\build\Gtk2-1.223-C10W1L にもう展開してあるよ!」って言ってるんだから
コマンドプロンプトで C:\strawberry\cpan\build\Gtk2-1.223-C10W1L に移動して、

make
make test
make install

で良いんじゃないの?
0067デフォルトの名無しさん2011/05/30(月) 14:15:45.27
cpan> look Gtk2
0068デフォルトの名無しさん2011/05/30(月) 21:53:49.88
while(<>){
}
この<>はなんですか?
0069デフォルトの名無しさん2011/05/30(月) 22:06:24.93
>>68
@ARGVに設定された引数のファイル名の内容を順に1行読むか、引数がない場合は標準入力から読む 、という指定。
I/O Operators in perldoc perlop
0070デフォルトの名無しさん2011/05/30(月) 22:10:13.37
>>68
山カッコ演算子。
ダイヤモンド演算子とも呼ばれる。
0071デフォルトの名無しさん2011/05/30(月) 22:10:56.31
ダイヤモンド演算子
0072702011/05/30(月) 22:35:16.91
>>71
ん?間違ってる?
0073デフォルトの名無しさん2011/05/30(月) 22:40:02.95
>>69-71
ありがとうございます。検索しても記号だと見つからないようなので助かりました。
0074デフォルトの名無しさん2011/05/30(月) 22:43:00.98
いえいえ、どういたしまして。
0075デフォルトの名無しさん2011/05/31(火) 09:24:40.69

暇な人に対するアホな質問です。

昔自分で作った記述ですが、昔すぎて作ってた時の記憶が出てきません。
特定のケースで不備が出る場合とか、そうゆうのを思いついたら教えてください。

処理の目的はどんな文字でも一緒に混ぜても大丈夫、みたいな感じです。
たぶん一般的な通信のヘッダーとかの分解にも使えたような気がします。



sub Separator_join ($$;@) {

    my $separat =  shift           or return();
    my $enclose =  shift           or return();
    my @entity  =  @_              or return();
       $separat ne $enclose        or return();

    map {s/($separat+)/$separat$1/go}  @entity;
    return( join qq[$enclose$separat$enclose], @entity );

}
#▼Separator_joinで生成されたスカラーに対し、安全にセパレータで分割してリストを返す
sub Separator_split ($$$) {

    my ($separat, $enclose, $all) = @_;
    my @entity = split /$enclose$separat$enclose/, $all;

    map{s/$separat(?!$separat)//go} @entity;
    return(@entity);
0076デフォルトの名無しさん2011/05/31(火) 10:25:46.36
q{0}
0077752011/05/31(火) 13:01:56.41
>>76
ありがとうございます。Perlだったか!という感じです。

アルゴリズム的な問題とか、想定範囲の抜け目とか、その変もお願いします。
おかしな事が起きない確証(?)って言うか確信みたいなのが欲しい感じです。

メモリが足りない場合……とか、そうゆう関数に直接関係ないのはいいですけど。
別に暇な人でいいんで、お願いします。

曖昧な記憶ではメールの仕様と同じだったと思うんで、
どんな内容でもデータは壊れないし復元できると信じたい想いなんですが。
0078デフォルトの名無しさん2011/05/31(火) 13:19:05.51
文字が化けちゃうんですけど化けないようにするにはどうしたらいいんでしょうかね?
>>4のやり方で、MechanizeでShift_JISのページを取得してファイルに出力したところ、
�@�U�пァが
\x{fffd}@\x{fffd}K\x{fffd}Z〒に
なってました。
0079デフォルトの名無しさん2011/05/31(火) 13:21:12.04
MovableTypeのカスタマイズのためだけにPerlをこれから覚えるのは時間かかりますか?
0080デフォルトの名無しさん2011/05/31(火) 13:31:09.93
$separatと同じ文字が$encloseに混じってたりすると嫌なことが
起こりそうとか、メタキャラクタのエスケープしてないぞとか
s///o使ってるので$separatや$encloseを違う文字列で呼んだら
おかしくなりそうとかその辺が突っ込みどころかなぁ。

ちゃんと仕様を残しましょうww
0081デフォルトの名無しさん2011/05/31(火) 13:47:15.14
外部コードは処理する前に内部コードに変換
0082752011/05/31(火) 15:33:04.61
ありがとうございます。

>$separatと同じ文字が$encloseに混じってたりすると嫌なことが
>起こりそうと

考えてみた結果、

$separat = q(/);
$enclose = q(_/);
@entity = (q(_/_/));

これで見事におかしくなる予感がしました。
こんな引数使う馬鹿誰だよ、って少し思いますけど。
一文字限定とか仕様変えてもいいんですが、既存のどっかにバグが出たら嫌なので
重複文字列の全チェック関数を作ります。無駄に重たくなりそうだけど…。

>メタキャラクタのエスケープしてない
仰るとおりです。


>s///o使ってるので$separatや$encloseを違う文字列で呼んだら
>おかしくなりそうとかその辺が突っ込みどころかなぁ。

あれ、関数を再度呼んだらoは初期化されないんですか?
ループの中だけで有効で、スコープ抜けたら初期化される物と勝手に思ってました。
すみません検索してきます。
0083デフォルトの名無しさん2011/05/31(火) 19:44:13.28
>>81
decode('cp932',$cp932_char);
decode('utf8',$utf8_char);
とかやってから処理すればいいんですかね?
なんだかどれがどれと一緒なのかわからなくなっとります
0084デフォルトの名無しさん2011/06/01(水) 15:03:51.07
まだこいつ文字コードのことやってんの
きもちわる
0085デフォルトの名無しさん2011/06/01(水) 15:57:02.30
波ダッシュとか意味わかんないんだもん・・・
0086デフォルトの名無しさん2011/06/01(水) 17:39:27.81
やっと解決したよ!
Mechanizeが悪かったこの野郎!
勝手にデコードしやがって!
寝る
0087デフォルトの名無しさん2011/06/01(水) 22:32:35.23
オブジェクト作るときにエラーが起きたとき bless の結果を返さずに undef を返しても OK なんですよね?

new{
 $obj = {'is_error' => 0};
 bless $obj, $pkg;
 return $obj;
}

my $test = TEST->new();
if($test->{'is_error'}){〜}

みたいに一々書く必要は無いですよね?(サンプル自体が分かりにくいかもしれませんが・・・^-^;)
0088デフォルトの名無しさん2011/06/01(水) 23:33:59.13
TEST->new() or die;
むしろ$test->{is_error}でハッシュを参照するのがよろしくない
0089デフォルトの名無しさん2011/06/02(木) 00:01:01.82
あっ、ほんとは is_error() の予定だったんだけど、記述を減らしたかったので便宜上そう書かせていただきました。


new() or die みたいな書き方を書かれてるってことは、new でエラーを返したい場合は undef を返しても OK という事ですよね?
0090822011/06/02(木) 00:44:32.99
仕事の都合上書くの遅れました。


sub test_1{
    my $test  = $_[0];
    my $test2 = 'aabb';
    { $test2 =~ s/$test//og }

    print "$test2\n";
}

&test_1("a");
&test_1("b");

いったいこの o の仕様はどうゆうこと。
スコープ抜けてもoは継続されるわ、
myの変数だからサブルーチン呼んだら新しい変数になってるハズなのに、oがそのまま記憶されてるわ、
なんですかこの仕様。

サブルーチンで o 使えないじゃないですか。
Perl作った人は何考えてるんですか。

なんかoを「ここでoを初期化させる!」みたいな記述とかないんですか?
0091デフォルトの名無しさん2011/06/02(木) 01:05:24.66
/oの仕様って知ってる?
0092デフォルトの名無しさん2011/06/02(木) 01:14:17.30
>>89
他のモジュールでも参考にして好きにすりゃいいよ
あとreturnはundefじゃなくて引数なしにしとけ
0093デフォルトの名無しさん2011/06/02(木) 01:24:31.62
>>90
http://perldoc.jp/docs/perl/5.10.0/perlfaq6.pod#What32is32o32really32for63
0094902011/06/02(木) 01:42:21.43
>>93
ありがとう。
なんとも言いがたいルールでした。
0095デフォルトの名無しさん2011/06/02(木) 02:07:27.26
なるほど
undef を含む配列となる場合があるから return undef じゃなくて return のみ
書くと良い訳ですね。


ふと思ったけど、たしか関数が何で評価されてるか知る関数ありましたよね?

スカラなら return undef で、配列なら return で返せるといいなぁ。

やっぱ undef をちゃんと返したい (^_^;)
0096デフォルトの名無しさん2011/06/02(木) 02:18:51.37
>>95
質問の前に関数一覧ぐらい確認しろ
http://perldoc.jp/index/function
0097デフォルトの名無しさん2011/06/02(木) 07:00:23.29
2011-06-01 の形式で与えられる日付から
前日(2011-05-31)と、一週間前(2011-05-25)を求めたい
丁度いいモジュールか計算方法を教えて下さい
0098デフォルトの名無しさん2011/06/02(木) 07:20:17.60
use Date::Simple;
0099デフォルトの名無しさん2011/06/02(木) 07:30:12.77
>>97
use Time::Piece;
use Time::Seconds;
my $t = Time::Piece->strptime("2011-06-01","%Y-%m-%d");
say ($t - ONE_DAY); # Tue May 31 00:00:00 2011
say ($t - ONE_WEEK); # Wed May 25 00:00:00 2011

>>98
Date::Simple もたしかにいいね
0100デフォルトの名無しさん2011/06/02(木) 14:14:14.98
>>75
separator やenclosure 自体のエスケープがないのだから、 $enclose$separat$enclose をそのまま並べた文字列がきたらアウトだろ。
CSVの """" や application/x-www-form-urlencoded の %HH のようなエスケープ処理がないと無理。
0101デフォルトの名無しさん2011/06/02(木) 15:35:44.19
必ずしもそうではないんだなそれが。元データに$separatが含まれていたら
$separatを1つ付け加えることで、$enclose$separat$encloseという並びが
付け加える処理を行った後のデータには含まれてないことが保証されるように
するって考えなわけです。$separatは前処理で少なくとも2回以上の繰り返し
になっているはずなので一つだけなら区切りだとわかるわけだな。
■ このスレッドは過去ログ倉庫に格納されています