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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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/08/20 現在の最新版: 5.14.1

▼ 前スレ
Perlについての質問箱 47箱目
http://hibari.2ch.net/test/read.cgi/tech/1306333092/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り
2デフォルトの名無しさん:2011/08/20(土) 20:36:55.47
[プログラミング自体の経験が無い奴はまずココを読め]
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://perldoc.jp/
perldoc.perl.org: ttp://perldoc.perl.org/
3デフォルトの名無しさん:2011/08/20(土) 20:37:00.45
4デフォルトの名無しさん:2011/08/20(土) 20:37:09.20
# [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デフォルトの名無しさん:2011/08/20(土) 20:49:10.67
>>1
6デフォルトの名無しさん:2011/08/20(土) 21:32:27.30
_ノ乙(、ン、)
7デフォルトの名無しさん:2011/08/21(日) 12:47:37.75
初めてのPerlって本に
my @lunch_choices = grep &is_edible($_), @gilligans_posessions;
って書いてあったんだけど、$_は自分が展開されるタイミングを自分で
決められるように見えるんだけど、どう理解すればいいですか?

あとこういう事ができる変数を自分で作れるの? $_だけ特別なの?
8デフォルトの名無しさん:2011/08/21(日) 13:25:03.25
$_だけ特別です
$_は手抜きや省力化のための大変素晴らしい特殊な変数です
$_をマスターすることがperlへの理解の第一歩でありかつ終着地点です
$_を制する者がperlを制します
9デフォルトの名無しさん:2011/08/21(日) 13:49:10.04
>>7
確かに言われてみればだけど、 grep 式, @array の形だと何か不思議に見えるかもねえ。
この場合同じ意味の grep { 式 } @array に書き換えたほうがわかりやすい。
つまり foreach (@array) { 式 } と同じように、 @array の要素を順に $_ に代入して式を実行してるだけってこと。
10デフォルトの名無しさん:2011/08/21(日) 14:14:47.95
my @lunch_choices = grep { &is_edible($_) } @gilligans_posessions;
11デフォルトの名無しさん:2011/08/21(日) 14:18:09.53
my @lunch_choices = grep(@gilligans_posessions) {&is_edible($_)}

12デフォルトの名無しさん:2011/08/21(日) 15:24:22.22
>>10 >>11
その記法だと今度はブロック内の普通の関数呼び出しでは
&つけなくていいのになんでgrepのときはつけなきゃいけないのーふえぇぇんってなっちゃう
13デフォルトの名無しさん:2011/08/21(日) 15:34:39.81
意味不明だ。grep内で&が必須なんて誰が言った?
BLOCKだろーとEXPRだろーとコードがまともなら、
&付けなくても動く

sub yojyou { $_[0] % 2 };
sub yojyou2($){ $_[0] % 2 };
my @dat = grep yojyou ($_) , 1 .. 10 ;
#my @dat = grep yojyou $_ , 1 .. 10 ; # <= 動かん
#my @dat = grep { yojyou $_ } 1 .. 10 ;
#my @dat = grep yojyou2 $_ , 1 .. 10 ;
#my @dat = grep sub{ $_[0] % 2 }->($_), 1 .. 10 ;

14デフォルトの名無しさん:2011/08/21(日) 15:51:08.23
&とかPerl4記法ってだけだろw
古い古い。

今じゃ特殊な例でない限り使わん。
15デフォルトの名無しさん:2011/08/21(日) 15:56:07.46
>>14=ケント脳
16デフォルトの名無しさん:2011/08/21(日) 16:18:34.49
grepだけじゃなく他にもあるから厨カッコのほうがなんとなく統一感がでて上級者として見てもらえる
mapとかsortとか。
17デフォルトの名無しさん:2011/08/21(日) 16:54:19.54
>>15
ケント脳って煽り。
「ケント否定派乙」って煽りなの?それとも「ケント信者乙」って煽りなの?

後者だと思ってたんだけど、ここ最近、ケントの名前を使って
煽ってる人がどうやら前者で煽ってるみたいで、非常に不思議だ。
18デフォルトの名無しさん:2011/08/21(日) 17:15:25.40
>>17
ケントとレベルが変わらんコードしか書けない連中のことだよ。
その連中の主観では、「ぼくちんはケントみたいな化石とは違う」と思ってるんだろうが。
19tokuhirom:2011/08/21(日) 17:23:23.10
これから新しいあおり考えたよ

ケント脳

はい 決定 これ使お
20デフォルトの名無しさん:2011/08/21(日) 17:26:23.07
KENT 汚染者も同じ意味なのかな?
つーか煽りのタイミングも意図も全く不明で
忍者のレスを見てる気分だったわw
21デフォルトの名無しさん:2011/08/21(日) 17:29:54.30
TPO合ってないよ?
TPO考えたら?
22デフォルトの名無しさん:2011/08/21(日) 17:50:44.96
>>16
中括弧は速度が落ちるので、中括弧でないバージョンは速度が欲しい時かな
23デフォルトの名無しさん:2011/08/21(日) 20:13:21.23
自分で考えた煽りを、自分で解説するってすげえ惨めじゃね?
今のは、ここが面白い所。って、自分のコントの説明をするお笑いみたいだ。
24デフォルトの名無しさん:2011/08/21(日) 22:26:53.85
中のひとは自分が思いっきり外していることになかなか
気がつかない。
外から見てる人は冷静なんで、またこの人...と思っては
いるが、いちいち教えてあげない。

それがここ数年のPerlのトレンド。
25デフォルトの名無しさん:2011/08/22(月) 18:37:18.03
デコードの処理ですが
$value =~ s/%(..)/pack("c",hex($1))/ge;
と書いてあるところと
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
と書いてあるところがありますがどちらも同じ意味なんでしょうか?

それとエンコードですが
$value =~ s/(\W)/'%'.unpack('H2',$1)/eg;と
$value =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
は同じ意味なんでしょうか?
26デフォルトの名無しさん:2011/08/22(月) 19:40:14.94
>>25
前者:
同じ意味ではない。
後者:
同じ結果にはなるが同じ意味ではない。
27デフォルトの名無しさん:2011/08/22(月) 20:04:53.24
>>26
前者は同じ結果になりますか?
28デフォルトの名無しさん:2011/08/22(月) 21:22:02.85
>>27
なる場合とならない場合がある。
29デフォルトの名無しさん:2011/08/22(月) 21:24:24.53
>>28
前者はどっちを使った方がいいですか?
30デフォルトの名無しさん:2011/08/22(月) 21:51:46.51
>>29
Perlを勉強する気があるなら…自分で考えてみよう。正規表現の基礎です。
Perlを勉強する気がないなら…サヨウナラ。
31デフォルトの名無しさん:2011/08/22(月) 21:53:34.73
packのcとCで、符号の有無が変わるんじゃなかったっけ
32デフォルトの名無しさん:2011/08/22(月) 22:54:59.45
>>26
後者も同じ結果にはならない。unpack 'H2' は A-F が小文字として、
sprintf '%%%02X' は A-F が大文字として出力される。
33デフォルトの名無しさん:2011/08/23(火) 00:14:25.87
>>26
お前も間違ってるよ。

嘘回答するなよ。
34デフォルトの名無しさん:2011/08/23(火) 00:38:23.77
そうか。すまん。
35デフォルトの名無しさん:2011/08/23(火) 11:10:28.58
迷ったら実験コードを書いてしまえばいい。
use strict;
use warnings;

foreach my $n1 (qw(0 1 8 9 A B E F a b e f x -)){
foreach my $n2 (qw(0 1 8 9 A B E F a b e f x -)){
my $d = '%' . $n1 . $n2;
(my $v1 = $d) =~ s/%(..)/pack("c",hex($1))/ge;
(my $v2 = $d) =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
printf("%s: %0*v2X %0*v2X\n", $d, ",", $v1, ",", $v2);
}
}
print "\n";
foreach(0x00..0xff){
(my $v1 = chr($_)) =~ s/(\W)/'%'.unpack('H2',$1)/eg;
(my $v2 = chr($_)) =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
printf("%d: %s %s\n", $_, $v1, $v2);
}
36デフォルトの名無しさん:2011/08/23(火) 11:52:57.60
次のように、ループの最中にそのhashを変更してしまうとき、
keys %hash は、ループ開始時の値のままで、変更されない、
と安心していいんですか。

my $hash= {abc => q(abc), def => q(def) };
foreach my $alph (keys %$hash) {
$hash->{q(A) . $alph}= $hash->{$alph};
}

それとも、my @hash_keys= keys %$hash; と確保してから
foreach alph (@hash_keys) {...} とループ回した方が安全でしょうか。

37デフォルトの名無しさん:2011/08/23(火) 12:10:01.48
いろんな解説サイト見てみると
s/(\W)/'%' . unpack('H2', $1)/eg;

上のように.の前後と$1の前に半角スペースが入っているんだが
このスペースは必要なのか?削除してはだめなのか?
38デフォルトの名無しさん:2011/08/23(火) 12:12:02.59
このところsageずに質問を連続でかましてる奴は
自分で確かめるって術を知らんのかな
39デフォルトの名無しさん:2011/08/23(火) 15:52:20.35
use CGI; してる解説サイトを見たり URI::Escape のドキュメントを見たりすれば
悩み事も減っていいような気がする。
40デフォルトの名無しさん:2011/08/23(火) 16:28:29.75
>>37
可読性向上のためのスペースでなくても処理に影響はない
演算子の両側、コンマの後だけ、は割と一般的なスタイル
41デフォルトの名無しさん:2011/08/23(火) 19:29:44.42
>>36
keysが配列を返して、foreachの引数にした時点で別の配列になってるから大丈夫。
42デフォルトの名無しさん:2011/08/23(火) 23:02:20.73
ファイルを読んでるだけなのですが、while (<FN>) のところでFNと<や>の間にスペースを入れると
うまく動きません。
my $filename = $ARGV[0];
open (FN, $filename);
while (<FN>) {
print $_;
}
どうしてでしょうか。
43デフォルトの名無しさん:2011/08/23(火) 23:29:21.43
44デフォルトの名無しさん:2011/08/23(火) 23:41:02.55
スペース無しだとファイルハンドルと見做す
スペース在りだとグロブと見做す
perldoc perlop では<$fh >と例が書いてあるが、
実際の所は、< $fh>だろうとグロブする。
45デフォルトの名無しさん:2011/08/24(水) 00:20:34.07
プログラムに関して勉強し始めたばかりの者です。質問があります。

メールフォームを作成し、fake sendmailを使用して実際にメールが送れるかどうか確認しようとしていますが上手くいきません。
Apacheを使用しているのでerror.logを調べてみるとfake sendmailへのパスの記述が上手くいっていないようでした。

具体的には、

$SENDMAIL = 'C:\Program Files(x86)\sendmail\sendmail' ;

とパスを指定して代入し、

poen(MAIL, "| $SENDMAIL -i -t -f $FORM{'email'}")

というようにしてパイプを形成するつもりなのですが上手くいかず、error.logを確認すると

C:\\Program' \x82\xcd\x81A\x93\xe0\x95\x94\x83R\x83}\x83\x93\x83h\x82\xdc\x82\xbd\x82\xcd\x8aO\x95\x94\x83R\x83}\x83\x93\x83h\x81A\r,

というような記述があります。指定したパスのスペースのせいでおかしくなってしまっているようなのですが、
この場合、スカラー変数$SENDMAILに代入する「C:\Program Files(x86)\sendmail\sendmail」というパスはどのように記述すればよいのでしょうか?

初歩的な質問ですみません。よろしくお願いします。
46デフォルトの名無しさん:2011/08/24(水) 02:08:59.31
空白あり PATH にインストールすること自体が危険だと思ってくれれば。
あなたが思ってるよりも PATH に関してはシビアですよ。サーバーのソフトは。

c:\sendmail にインストールしませう。

再インストール出来ないのなら

$SENDMAIL = '"C:\Program Files(x86)\sendmail\sendmail"';

とダブルクォーテーションで囲ってみませう。
47デフォルトの名無しさん:2011/08/24(水) 14:52:35.52
前スレで複数配列の受け渡しの質問があったけど
これが正しい

@aaa1=("aaa1,"aaa2","aaa3"");
@bbb=("bbb1","bbb2","bbb3");

&test(*aaa1,*bbb1);

sub test{
(*aaa2,*bbb2)=@_;

}

(@aaa2,@bbb2)=@_;では@bbb2が受け取れない
48デフォルトの名無しさん:2011/08/24(水) 14:53:39.02
訂正
@bbb=("bbb1","bbb2","bbb3"); ではなく
@bbb1=("bbb1","bbb2","bbb3"); ね
49デフォルトの名無しさん:2011/08/24(水) 15:40:32.70
だからー型グロブ使わないでリファレンス使えってーの
50デフォルトの名無しさん:2011/08/24(水) 15:58:18.50
>>47
グローバルな変数に代入したら引数渡しをする意味が薄れるのでは?
51デフォルトの名無しさん:2011/08/24(水) 18:17:43.84
今時、perl4記法を使いまくる奴は、そう居て欲しくない。
前スレの質問者の自演か?

それはそうとして、前スレの質問者の希望は、&func(@lines,$aaa); だぞ。
(@aaa でも良いけどさ。)
正しいと主張するからには、せめて受け渡しをグロブではなく
見掛けだけでも配列にしろっての、、、
52デフォルトの名無しさん:2011/08/24(水) 20:09:16.74
func(¥@array1, ¥@array2);
sub func {
my ($array1_ref, $array2_ref) = (shift, shift);
}
じゃだめなのか
どうしてグロブを使うのか
53デフォルトの名無しさん:2011/08/24(水) 20:25:33.59
ダメじゃん、そのコード。
(多分意図とは違うコードを書いたんだろうとは思うけど)
54デフォルトの名無しさん:2011/08/24(水) 20:26:59.41
失礼、専ブラが円マーク消してくれてました。
53のレスは無し。
55デフォルトの名無しさん:2011/08/24(水) 21:37:48.64
sub func(\@\@){ my @aaa2 = @{$_[0]} ; my @bbb2 = @{$_[1]} ; }
func @aaa1, @bbb1 ;
5645:2011/08/24(水) 21:49:05.73
>>46
お返事ありがとうございます。
空白ありのPATHが危険であるということは知りませんでした。今後は気を付けたい思います。
仰る通りにC:直下にsendmailを移し、パスを設定し直したところ正常に動作しました。ありがとうございました。

ただ、PATHに空白がある場合の設定なのですが、"C:\Program Files(x86)\sendmail\sendmail"
というように" "で括っても、やはり正常に動作しませんでした。やはり空白の部分で区切られてしまうようです。
また、" "で括るようにご指導いただきましたが、" "で括った場合はエスケープシーケンスが
動作してしまうと考えてPATHを' 'で括っていたのですが、これは間違った考え方なんでしょうか?

よく考えるとパイプを形成するところを" "で括っているから、PATHを記述するところだけ''で括っても意味ないのかな・・・?

もし今後、このような空白が存在したり、\sや\nのようなエスケープシーケンスと同じような記述の並びが存在する
ディレクトリを指定しなければならなくなった場合、どのようにすればよいのか知っておきたいのですが、どうすればよいでしょうか。
57デフォルトの名無しさん:2011/08/24(水) 21:58:33.57
>>46は空白まじりの文字列を二重引用符で囲った上で
さらに単一引用符で囲ってるように見えるよ
5846:2011/08/24(水) 22:36:37.52
>>57
やっぱりそうですよね。

" "という空白文字に対して"\ "というようにしてみたりしたんですが、上手くいかないです。
" "で括った範囲内の空白は、どのように記述すれば空白文字として認識されるようになるんでしょうか?
59デフォルトの名無しさん:2011/08/25(木) 01:32:51.95
空白を含む PATH は "" で囲めばよいというのは分かりますよね?
"PATH" ってゆう風になるわけですが、これをさらに1つの文字列として解釈するには
' か " で囲めばいいわけですが、" で囲む場合は " をエスケープする必要があります。


'"PATH"' または "\"PATH\"" です。
6046:2011/08/25(木) 06:40:31.92
>>59
お返事ありがとうございます。

あなたが仰られていることは、例えば「\n」という文字列は" "内ではエスケープシーケンスとして判別されてしまうので、
" "内で「\n」をエスケープシーケンスとして表現しないようにするときには「\\n」と記述すればよいというようなことですよね?
それは分かるのですが、それと同様に" "内における空白文字「 」に対してはどのような記述をすればよいかが分からないのです。
それとも空白文字は" "内では一切エスケープシーケンスや区切りの記号としての働きはしないということなのでしょうか?

>>45の内容ですが、'"PATH"'で囲い、エスケープシーケンスが働かないように\で防いでもやはりダメでした。
6146あらため45:2011/08/25(木) 06:42:53.85
私のレスは45であるのに、今まで46と間違って名乗っておりました。
申し訳ありません;;
62デフォルトの名無しさん:2011/08/25(木) 06:48:24.44
open(IN, "cat -n \"$file_name\" |") ;
63デフォルトの名無しさん:2011/08/25(木) 08:50:33.44
>>60
http://www.atmarkit.co.jp/fwin2k/operation/command001/command4.html
> 一部ファイル名やパス名には、名前の中にスペース(空白記号)が含まれたものがある。
> たとえば、プログラムがインストールされる「Program Files」ディレクトリなどがこれに該当する。
> スペースは、コマンド プロンプトでは、引数やオプションの区切りに使われるため、
> このようなパスを指定する場合、引数全体をダブルクオートでくくる必要がある。
> 具体的には、
> dir "c:\program files\common files"
> などとする。
64デフォルトの名無しさん:2011/08/25(木) 09:14:42.07
>>60
perlに対するエスケープとOSに対するエスケープが混ざってるよ。
OSに対して"PATH"を渡す必要がある。

別の方法としてはdir /Xとかで表示される短いファイル名を使う。
>>63 の例だと dir C:\PROGRA~1\COMMON~1
65デフォルトの名無しさん:2011/08/25(木) 12:42:11.81
おれはWindows上のCygwinで使ってるからよくわからんわ。
Cygwinだとpathの区切りは'/'だし、スペースは'\'でエスケープできるし。
/cygdrive/c/Program\ Files\(x86\)/sendmail/sendmail

どっちにしても丸ごと「"」で括ればスペースがあっても問題ないけどね。
"/cygdrive/c/Program Files(x86)/sendmail/sendmail"

ところでpath区切りは「\」のままで大丈夫なの? 「\\」じゃなくてもいいの?
"C:\\Program\ Files\(x86\)\\sendmail\\sendmail"
66デフォルトの名無しさん:2011/08/25(木) 14:08:16.32
パイプだとcmd.exeのコマンドになるのかもな
67デフォルトの名無しさん:2011/08/26(金) 17:18:47.69
>>65
http://msdn.microsoft.com/ja-jp/library/78f4aasd%28VS.80%29.aspx
> 二重引用符の直前にある円記号以外は、円記号 (\) として解釈されます。

↓ここからPerlの質問。
68デフォルトの名無しさん:2011/08/27(土) 01:16:06.12
mixiのPerlコミュの質問レベル低いわー
ただ回答者はみんな紳士的だがな
69デフォルトの名無しさん:2011/08/27(土) 01:20:23.90
↓改めてここからPerlの質問。
70デフォルトの名無しさん:2011/08/27(土) 07:03:53.92
雑談スレは一応ありますよ

Perlについて
http://hibari.2ch.net/test/read.cgi/tech/1217851121/
71デフォルトの名無しさん:2011/08/27(土) 10:43:00.53
リャマ本をひと通り読んだけど、正直わからないことだらけで、覚えられなかったことも多々ある
主に正規表現とファイル、ディレクトリの扱い
どう勉強したらいいんだろ
72デフォルトの名無しさん:2011/08/27(土) 10:44:25.12
怖がらずに試す
73デフォルトの名無しさん:2011/08/27(土) 11:17:30.29
正規表現は文章じゃ覚えられなかったな
細部まで理解しないで正規表現が必要になったときに書いてみて「この文字はこういうもの」って覚えてた
74デフォルトの名無しさん:2011/08/27(土) 11:24:10.40
正規表現わからないならperlの1/3が分からないのと同じ
正規表現使わないならperlを使う意味がない
75デフォルトの名無しさん:2011/08/27(土) 11:41:45.31
>>72
たくさんプログラム書いたほうがいいのはわかるけど
理解がいまいち浅いから中々難しいわ
>>73
しばらくはそ場面で参照しながら段々覚えていけばいいか
>>74
テキスト処理考えると当然重要になってくるもんな
その内詳説正規表現かクックブック買おうと思ってるんだが
76デフォルトの名無しさん:2011/08/27(土) 12:03:25.13
>>75
正規表現なんてPerlに限らずエディタとかgrep/sedでも使えるから
そういうので正規表現検索や置換やって覚えりゃいいんじゃないかな
あとはPerlでその正規表現をどうやって利用するかだけ覚えりゃいい
77デフォルトの名無しさん:2011/08/27(土) 12:46:49.28
10進数を16進数に変換するのはできたけど
0〜Zまでの36進数に変換するにはどうしたらいいんですか?
78デフォルトの名無しさん:2011/08/27(土) 13:54:56.00
36の累乗で割っていく
商を置換する
79デフォルトの名無しさん:2011/08/27(土) 14:27:09.40
80デフォルトの名無しさん:2011/08/27(土) 15:12:25.75
>>77
Math::BaseCalc
81デフォルトの名無しさん:2011/08/27(土) 20:55:42.09
>>51
昔のperlの組み方の方が使いやすいから使ってるよ
上司もそうだし
モジュールも全く使ってないし、使っているのはjcode.plだけ
サブルーチンは.plファイルをrequireして&呼び出しで使っている。
あと使っているはprint,foreach,open,push,popなどの基本的な関数だけ
それでもちゃんと動作するからいいんだよ
82デフォルトの名無しさん:2011/08/27(土) 20:59:46.98
釣り針大きすぎ
83デフォルトの名無しさん:2011/08/27(土) 22:59:49.18
>>81
みたいな使い方で用が足りているなら
それはそれで問題ない

この先もずっとそれで用が足りる保証はないけどね
84デフォルトの名無しさん:2011/08/27(土) 23:08:44.46
どんな旧時代的な手法を使おうと勝手だけどそれを他人に勧めるなよ
釣りなんだろうけど
85デフォルトの名無しさん:2011/08/28(日) 00:25:14.70
>>81
jcodeだめだわーw

だって中国語を扱えない。
86デフォルトの名無しさん:2011/08/28(日) 00:38:55.96
>>85
データ保存ファイルがANSI形式で、ユニコード文字を送信して書き込んだ場合
ブラウザが勝手に&#〜;の形にしてくれるから、それを読み出せば
ブラウザにはユニコード文字が表示される
だから問題なかったよ
87デフォルトの名無しさん:2011/08/28(日) 00:40:29.59
アプリ作ってる最中で、そのアプリ専用のモジュールが3個ほど出来たんだけど、
モジュールにする時点で、出来る限り汎用性を持たせた方が良いの?
88デフォルトの名無しさん:2011/08/28(日) 00:44:49.37
>>86
データ保存ファイルがANSI形式じゃなかったら?


そりゃ、お前に都合のいい条件なら、
できるだろうさw

でもな。それはお前の限界の範囲までの話だ。
お前の上司も限界が低そうだな。
89デフォルトの名無しさん:2011/08/28(日) 00:49:11.47
俺はPerlを本格的に始めてから、一年半ぐらいだが、
>>81の上司よりもPerlに詳しい自信があるなw
まあ他の言語も多数やってきたからってのもあるんだろうが。

新しいことに手を出さない人間はダメだよ。
「これで今までやってこれた」は自慢じゃなくて
諦めた人間のセリフだから。
90デフォルトの名無しさん:2011/08/28(日) 01:02:17.92
結局Perl6が出てもPerl5はそのまま残るんだろ?
7以降はどうなるの?
91デフォルトの名無しさん:2011/08/28(日) 01:08:38.70
ちゅーかぶっちゃけ、社会人ですら無く
「時代に背を向け古いコードを書く俺って、なんかかっこ良くね?」
って中二病患者のガキだろ。

>>90
6がvaporwareなのに7の心配をして何の意味がある?
92デフォルトの名無しさん:2011/08/28(日) 20:08:39.14
今でもモジュールが使えないサーバーとかあるからね
そういうサーバーだと昔のperlで書くしかないね
93デフォルトの名無しさん:2011/08/28(日) 21:03:52.08
94デフォルトの名無しさん:2011/08/28(日) 21:16:01.49
>>93
アホか? 薦めてないだろ。
お前みたいな独りよがりは死ねよ。
95デフォルトの名無しさん:2011/08/28(日) 21:25:08.04
>>92
スレの流れを読んだうえで、その擁護レスとも取れるレスを書いたのか?

>>47

>>51

>>81

この流れだと読み方によっては「昔のperl」=「perl4記法」だぞ。
96デフォルトの名無しさん:2011/08/28(日) 21:27:21.27
×読み方によっては
◯普通に読めば
97nobodyさん:2011/08/28(日) 23:58:47.23
7は5と6の両方を継承して欲しい。
仮面ライダーV3みたいなもん。
98デフォルトの名無しさん:2011/08/29(月) 00:01:06.01
それじゃ何のために互換性捨ててまで新しいのつくろうとしているのかの意味がなくなる
99デフォルトの名無しさん:2011/08/29(月) 00:38:56.42
>>92
> 今でもモジュールが使えないサーバーとかあるからね
今はVPSでroot権限持てるサーバーが格安であるんだが?

開発したいのなら、開発向けのサーバー使えよ。

> そういうサーバーだと昔のperlで書くしかないね
”昔の”ってPerlのバージョンなんだ?言ってみろ。
知らないから昔のって言ってるんだろ?

俺にとっては昔のはオブジェクト指向はもとより
Encodeモジュールも搭載してないPerlだ。
それはPer.5.8よりも前のPerl。5.8は2002年登場。

10年近く前のPerlで書くしかない状況なんてまず無い。
10年以上前のPerlでそこから成長してない奴はプログラマ失格だ。
100デフォルトの名無しさん:2011/08/29(月) 00:39:43.10
はい
101デフォルトの名無しさん:2011/08/29(月) 00:51:32.95
改修案件でperl -vしたらPerl5.005だった・・・
102デフォルトの名無しさん:2011/08/29(月) 01:26:09.78
改修案件の要件に、新しいバージョンへの
対応が含まれてないのならご愁傷さまだよなw

ハードで言えば、ハードウェアが古くなったのでリプレイスしますが、
ハードウェアは全く同じものにリプレイスします。性能は変わりません。

みたいなw
103デフォルトの名無しさん:2011/08/29(月) 06:37:55.46
1993/02/05 perl4.036(最終版)
1993/02/28 programming perl 日本語第一版(赤ラクダ、perl4対応版)
1994/10/17 perl5.000
1997/12/25 programming perl 日本語第二版(perl5対応版)
ttp://examples.oreilly.com/cjkvinfo/doc/jp-trans.catalog

2000/XX/XX Larry: Perl6 開発開始
2001/04/08 perl5.6.1
2002/XX/XX Larry:「クリスマスにはリリースするよ。いつのクリスマスかは解んないけど(意訳)」
2003/09/25 perl5.8.1 => 以降のperl5系は「メンテバージョンになるだろう」と皆が思った
2003/12/25 裸で PC の前で一晩待った
2005/02/06 Audrey姐さん、あまりの遅さに切れ Pugs 発表
2007/12/18 perl5.10.0 => ああ、これが5系の最終ver.か…、にしては新機能てんこ盛り??
2009/04/17 Parrot1.0 => 9年すか…、、、
2009/XX/XX Rakudo Perl 開発スタート、これが perl6 になるのか?
2010/04/12 perl5.12.0 => えっ?
2010/07/29 Rakudo Perl 最初のリリース
2011/04/14 perl5.14.0 => おいおい
104デフォルトの名無しさん:2011/08/29(月) 06:57:40.36
1900年1月1日から始めて今日まで(2011/08/29まで)一日ずつ祭日とかチェックしつつ
ループを回したいのですが、どうやればいいですか?
Date::manipとかTime:Pieceとかを使うんでしょうか?
105デフォルトの名無しさん:2011/08/29(月) 11:53:12.34
100年前とじゃ祝日違ってくる
106デフォルトの名無しさん:2011/08/29(月) 11:58:13.66
use Time::Piece;
my $start = Time::Piece->strptime('1900-01-01', "%Y-%m-%d");
my $end = Time::Piece->strptime('2011-08-29', "%Y-%m-%d");
my $day = 24 * 3600;
for (my $t = $start; $t < $end; $t += $day) {
## 祝日判定
}
こんな感じでやりましたが、まだ祝日判定がうまく行ってません。
107デフォルトの名無しさん:2011/08/29(月) 12:24:33.24
Calendar::Japanese::Holiday を元に1900年まで拡張するのがいいんじゃ
ないかと。

1900年からならもう明治になってるし、どういう日が祝日かは調べりゃ
わかると思う。
108デフォルトの名無しさん:2011/08/29(月) 18:12:25.04
べつにどっちのやり方でもいいんじゃないか?
プログラムなんてエラーが出なくて動作して使えればいいわけだから
好きな方の組み方で良いと思う。
109デフォルトの名無しさん:2011/08/29(月) 18:26:04.82
もしかしてこれがガチの銀行業務に使われるんじゃあ……
110デフォルトの名無しさん:2011/08/29(月) 18:45:37.83
えー銀行業務にPerl使うかね
111デフォルトの名無しさん:2011/08/29(月) 18:59:22.76
銀行はLISP
112デフォルトの名無しさん:2011/08/29(月) 19:56:14.14
ここ100年の祝日のリストが必要で
祝日と、そしてもしかして土日で何か分岐するような
大掛かりなことをやりそうなのは銀行かそれに携わる人かなぁと

祝日の他に、もう一つ、処理すべき巨大で長大な時系列のデータが背後に控えてる……ってのが直感
113デフォルトの名無しさん:2011/08/29(月) 20:02:54.52
>>112
想像力不足だな
114デフォルトの名無しさん:2011/08/29(月) 20:23:58.88
>>113
他にどんなものが……
115デフォルトの名無しさん:2011/08/29(月) 20:47:43.27
銀行業務のシステムに関わる人なんて、
大手IT会社とかの人間だぞ、三菱とか。
それが、平日の昼間に2chに書き込むか?
logで直ぐバレるのに?

って言う具合の想像力の事じゃね?


俺は単なる宿題に一票。
116デフォルトの名無しさん:2011/08/29(月) 20:51:11.58
>>115
そんなアタリマエのことどうでもいい。
117デフォルトの名無しさん:2011/08/29(月) 21:04:47.57
2ch耐性、無い奴だな、、、昨日の92氏か?
118デフォルトの名無しさん:2011/08/29(月) 21:06:16.17
それもどうでもいい。
119nobodyさん:2011/08/30(火) 22:35:03.30
とりあえず

祝日判定用マクロ
http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm
120104:2011/08/31(水) 00:34:05.18
ありがとうございます。119のリンクからPerlの関数をとりました。
ちなみに銀行関係ではありません。

121デフォルトの名無しさん:2011/08/31(水) 00:41:21.92
ちなみになんのためにそんな処理をするのだけが気がかりになって
このまま教えてくれないままだったら俺の夏が終わりそうにない
ね、お願い
122デフォルトの名無しさん:2011/08/31(水) 00:58:36.19
100年前と今の祝日は違うから、>>119 のスクリプトじゃ不備だらけじゃない?

祝日が増えたり、定義が変わった段階でのパターンファイルを用意するとかすれば
色々対応できそうだが。。。
123デフォルトの名無しさん:2011/08/31(水) 01:01:44.36
まあコードとしてはあまりおもしろみがないからどうでも良いんじゃね。
124デフォルトの名無しさん:2011/08/31(水) 01:33:14.95
>>107の Calendar::Japanese::Holiday ならソース見た感じ1900年くらいまで考慮されてるように見えるけど
125デフォルトの名無しさん:2011/08/31(水) 02:08:36.44
1948年の祝日法以前にも対応したモジュールは見たことない。
126124:2011/08/31(水) 02:27:29.10
ああ、なるほど、そりゃそうだ……
春分と秋分の計算式が1900年まで考慮されてたから早合点したわ
1948年より前なら春分・秋分に相当する日でもちゃんと祝日扱いしないようになってるね
http://api.metacpan.org/source/KZTOMITA/Calendar-Japanese-Holiday-0.03/lib/Calendar/Japanese/Holiday.pm
127デフォルトの名無しさん:2011/08/31(水) 14:41:42.22
POSIXキューをperlから使う方法を教えて
128104:2011/08/31(水) 21:00:21.02
おそくなってすいません。あまり詳しくかけませんが、
ほかにも大量の雑多なデータがあって、、、
1948以前に対応しようとすると、大変なのですね。、
129デフォルトの名無しさん:2011/08/31(水) 21:08:47.27
いや、対応しようとも何も1948年以前は法に定められた祝日ってものがなかったってことでしょ?
130デフォルトの名無しさん:2011/08/31(水) 22:08:57.05
131デフォルトの名無しさん:2011/08/31(水) 22:10:41.67
とりあえず江戸時代の祝日を教えてくれ。
132デフォルトの名無しさん:2011/08/31(水) 22:23:19.33
株……かね?

ここ100年間の祝日つまり休みの日のリストが欲しいってことは、
銀行じゃなきゃ何かしらの史学科の学生か、
それとも株か。
史学科や民俗学系統の文系の学生ならそういう祝日リストを研究室単位で持ってそうなモンで、
でもそれはない。
時系列で記録された大量のデータを喰わせて、そのレコードの祝日判定してく……
ってな案件はそうそう転がってない。
133デフォルトの名無しさん:2011/08/31(水) 22:33:13.16
江戸まで行くと、休日さえ地方で異なるらしい。
1900年以降なら、明治33年以降だから、問題ないだろう。

一応wikipedia
http://ja.wikipedia.org/wiki/%E4%BC%91%E6%97%A5
134デフォルトの名無しさん:2011/09/01(木) 02:03:41.76
1948 以前は実際に祝日だったってのが分かってるんだから、決め打ちでいいじゃん
135デフォルトの名無しさん:2011/09/01(木) 23:03:37.46
数行の文でこれだけのキモさと頭の悪さが伝わってくるのはすごいな
136デフォルトの名無しさん:2011/09/01(木) 23:23:45.90
ちょっとなにをいってるのかわからない
137デフォルトの名無しさん:2011/09/02(金) 03:03:06.02
135がぶっとびすぎててアレw
138デフォルトの名無しさん:2011/09/02(金) 10:00:10.76
正規表現で、fugaで始まらないhogeにマッチさせたくて
(?!fuga)hoge
と書いたらうまくいきません。どうしたらいいの
ちなみに条件判断とかじゃなくて、できれば正規表現だけでやりたいです
139デフォルトの名無しさん:2011/09/02(金) 10:05:08.04
条件判断では出来たの?
140デフォルトの名無しさん:2011/09/02(金) 10:27:10.84
>>139
いえ、やってないです
もっと厳密にいうと、ほんとは「fugaではじまらない」でなくても「fugaが含まれない」でもいいんです。なので条件判断と組み合わせれば可能だと思うのですが、できれば正規表現だけでやりたいのです
141デフォルトの名無しさん:2011/09/02(金) 10:39:39.22
hogeの直前にfugaがないという意味ではないよね?
142デフォルトの名無しさん:2011/09/02(金) 10:41:13.22
一般的にはそれでfugaで始まらないhogeにマッチするよ。

もし期待した結果が得られないなら正規表現が間違って
いるんじゃないかなぁ。fugaとhogeを具体的に示して
駄目な例も出さないと一般論では難しいな。

たぶん正規表現は書いたとおりに動いてると思うw
143デフォルトの名無しさん:2011/09/02(金) 10:49:34.34
>>141
直前でなくてもいいです

>>142
これなんですけど
use strict;
use warnings;

while (my $str = <STDIN>) {
chomp ($str);
last if ($str eq 'end');
if (
$str =~ /
(?!fuga)hoge
/x
) {
print "$& --- match¥n";
} else {
print "no¥n";
}
}

実行すると
fugahoge
hoge --- match
となって、fugaがついているhogeにもマッチしてしまうんです
勉強中の初心者なのでなにかとんでもない勘違いしてたらすみません
144デフォルトの名無しさん:2011/09/02(金) 11:21:37.15
(?! ) はマッチした部分の“後続文字列”の指示、なので、
たとえば $str =~ / hoge(?!fuga) /x と指定すると
hogehoge にはマッチするが hogefuga にはマッチしない。

ということのようだ。

条件式も併用してたとえば
$str =~ / (.*)hoge /x and $1 !~ /fuga/
みたいにしないとだめっぽいが。
あとは識者待ち。
145デフォルトの名無しさん:2011/09/02(金) 11:22:15.60
$strにfugaが含まれていないときにマッチしたいという意味でしょうか?
要するに以下のような条件を1つの正規表現にまとめたいと?

if ( $str !~ /fuga/ and $str =~ /hoge/ )
146デフォルトの名無しさん:2011/09/02(金) 11:28:33.90
>>144
そうなんです。hoge(?!fuga) だと前方には効かなくて

>>145
そうです。
やはり正規表現だけでは無理なものなんですかね
147デフォルトの名無しさん:2011/09/02(金) 11:37:45.51
(?<!fuga)
148デフォルトの名無しさん:2011/09/02(金) 11:44:37.44
>>147
すごい、できました!ありがとうございます
みなさんもありがとうございました
149デフォルトの名無しさん:2011/09/02(金) 11:47:13.97
>>147
> (?<!fuga)
これってバージョンいくつ以降で有効?
150デフォルトの名無しさん:2011/09/02(金) 11:52:07.16
直前以外にも対応させようと思えばこんな感じかな?
取出しは$&でなく$1になるけど。

/^(?:(?!fuga).)*(hoge)(?!.*fuga)/
151デフォルトの名無しさん:2011/09/02(金) 13:06:14.75
文字列のpopとか作ったんですけど、
$str = pops ($str) ; とかの代入なしで、 pops ($str) ; と書ける方法ありませんか?
下は書いたモンです

sub pops ($) {
my @t = split // , shift ;
pop @t ;
return join "", @t ;
}
sub pushs ($$) {
my $c = shift ;
my @t = split // , shift ;
push @t , $c ;
return join "", @t ;
}

my $str = "apple" ;
print "original : $str\n" ;

$str = pops ($str) ;
print "pops : $str\n" ;

$str = "apple" ;
$str = pushs ("s",$str) ;
print "pushs : $str\n" ;
152デフォルトの名無しさん:2011/09/02(金) 13:26:32.54
>>149
1998年リリースの5.005から
http://perldoc.perl.org/perl5005delta.html#New-regular-expression-constructs

>>151
プロトタイプを(\$)とかにしてリファレンスで受ければできるけど、
ところでchopという標準関数をご存知だろうか
153デフォルトの名無しさん:2011/09/02(金) 13:57:22.51
>>151
use utf8 してれば、各関数はそれぞれ下の1行で済む。

pops → substr($str, 0, 1);
pushs → $str .= 'TEST';


もっと付加価値を付けなきゃ作る意味が無いよ。
154デフォルトの名無しさん:2011/09/02(金) 15:47:46.46
>>151
$_[0]が引数のエイリアスだからそれを操作すれば呼び出し元を操作したことになるよ

sub pops ($) {
my @t = split // , $_[0] ;
pop @t ;
$_[0] = join "", @t ;
}
155デフォルトの名無しさん:2011/09/02(金) 16:27:18.62
>>152
> 1998年リリースの5.005から

おお。ありがとう。
手元の「新Perlの国へようこそ Perl5対応版」には (?<= ) と (?<! ) は載ってなかった。
かわりに ?PATTERN? なんてのを再発見。こんなの使ったことなかったなあ。
いい機会なんで正規表現の仕様を見直して覚え直しておきます。
156デフォルトの名無しさん:2011/09/02(金) 16:30:51.29
詳説 正規表現
157デフォルトの名無しさん:2011/09/02(金) 16:36:34.01
>>155
(?<= ) と同じような機能で量指定子も使える\Kというのも最近できたよ
158デフォルトの名無しさん:2011/09/02(金) 16:40:03.27
>>146
/^(?!.*?fuga)(?=.*?hoge)/
でどう?

>>154
返り値は?
159デフォルトの名無しさん:2011/09/02(金) 22:45:51.20
negative (positive) lookahead (lookbehind) assertion は可変長文字列受けつけないだろ。
どうしても lookahead で表現したいとなると、以下みたいな超絶マゾ正規表現になる。
メリット皆無。
while( <DATA> ){
chomp ;
if (m{ (?: # キャプチャしない。
(?<=(?!fuga).{4}) # fuga じゃない 4 文字 の右にカーソル
| # か、
(?<=^.{3}) # 行頭の任意の 3 文字 の右にカーソル
| # か、
(?<=^.{2}) # 行頭の 2 文字 の右にカーソル
| # か、
(?<=^.) # 行頭の 1 文字 の右にカーソル
| # か、
(?<=^) # 行頭の 0 文字 の右にカーソル
)
hoge # で且つ hoge
}x ){
print "$_: hit!\n" ;
}
}

__DATA__
fugahoge
hoge
dhoge
ddhoge
dddhoge
ddddhoge
dddddhoge
160デフォルトの名無しさん:2011/09/02(金) 23:06:02.14
すまん少し前のレスくらい読むべきだった。
5.14.1だと、m{\K(?:(?!fuga).{4}|^.{0,3})hoge} で行けるみたい。
へ〜
161デフォルトの名無しさん:2011/09/03(土) 00:35:11.96
後読みは固定長限定だけど先読みは可変長でも使える
162デフォルトの名無しさん:2011/09/03(土) 01:03:35.71
そうだったorz...
163デフォルトの名無しさん:2011/09/04(日) 14:22:30.05
WWW::Mechanizeに関する質問です。
imgタグでdata-src属性のURLが特定の正規表現にマッチするもののみを、全て抽出することは出来るでしょうか?
imgタグのsrc属性であれば$mech->find_all_images(url_regex => qr//)としてやることで出来ると分かったのですが、
data-src属性の場合のやり方がわかりません。どなたかご助言していただけると幸いです _ _
164デフォルトの名無しさん:2011/09/04(日) 18:39:36.69
そもそもそのimg要素のdata-src属性ってのはいったい何なんだ?
聞いたことないんだが。
165デフォルトの名無しさん:2011/09/04(日) 19:15:05.12
その書き方は HTML5 だよ
166デフォルトの名無しさん:2011/09/04(日) 21:38:51.91
>>163
$mech->content()を別のパーザに突っ込むしかない。
167デフォルトの名無しさん:2011/09/04(日) 22:43:02.41
もしくはWWW::MechanizeがHTML5対応になるのを待つか。
しかしHTML5ってまだ勧告レベルでもないんだろ。(2014年仕様確定予定らしい)
世の中気の早い奴が多すぎるわな。
168163:2011/09/05(月) 09:10:35.64
>>164 自分も始めて見ました。なお、件のサイトはpixivです。
>>165 ありがとうございます。なるほど・・・
>>166 ありがとうございます!そうしますー
>>167 ですねー
ありがとうございました!
169デフォルトの名無しさん:2011/09/05(月) 19:14:38.22
質問があります。
最近のメールフォーム用CGIは機能が多すぎてJqueryのバリデーションと機能が被ってしまいます。
そこでJqueryでバリデーションしてデータだけをpostさせたいのですが、ただデータを送るだけのメールフォームCGIはどういうふうに書けばいいのでしょうか。
170デフォルトの名無しさん:2011/09/05(月) 19:19:38.27
>>169

>>1
webprogへ行け
171デフォルトの名無しさん:2011/09/05(月) 21:34:28.95
>>169
既存のCGIからバリデーション部分を削除すれば目的は達せられる。
だがJavaScript(jQuery)の動作しない環境から送られたデータはどうするつもりだ。
あるいは悪意をもって偽装したデータを投げてくる奴がいないとも限らないぞ。

スレ違いでアレだが、送信されてきたデータは常に疑ってかかれ。検証しろ。
問題ないシロモノという前提で扱ってるといつか痛い目をみるぞ。
172デフォルトの名無しさん:2011/09/05(月) 22:11:49.39
スレ違いってここでセキュリティネタ話してもぜんぜんOKだろ
171さんはmalaさんですか???

まじ頭がセキュオタになってますよ
173デフォルトの名無しさん:2011/09/05(月) 22:14:18.16
それ以前に、CGIの話しで誘導済みだろ
174171:2011/09/05(月) 22:35:02.65
>>172
いや、セキュオタ(?)でなくてもこれくらいは普通に気を使うでしょ?JK
ユーザが自分だけなら多少のコーディングの手抜きは運用でカバーもできるけど。
受付フォーム(を受け取るCGI)なんて誰がどう使うかわかんないんだからさ。
175デフォルトの名無しさん:2011/09/05(月) 22:36:28.72
言っている自分が一番知識ないというオチ
176デフォルトの名無しさん:2011/09/05(月) 22:44:39.38
>>174
誘導されてるんだから煽りにかまってないで放置でおk
177171:2011/09/05(月) 22:48:41.24
>>175
> 言っている自分が一番知識ないというオチ

まあその可能性も十分ある。自戒自戒。
では名無しに戻ります。
178Perl忍者:2011/09/05(月) 22:52:25.12
171みたいなバカは

なにを今更感でっぱなし
179デフォルトの名無しさん:2011/09/05(月) 22:54:42.61
久し振りに見たなお前perl卒業するんじゃなかったのか?
180Perl忍者:2011/09/05(月) 22:54:50.43
当たり前のことを説明してるやつみるとむかついてくるな
181デフォルトの名無しさん:2011/09/06(火) 00:37:35.04
そこでノーガード戦法ですよ
182デフォルトの名無しさん:2011/09/06(火) 01:49:50.97
perl貧者まだ生きてたの?
183デフォルトの名無しさん:2011/09/06(火) 03:20:52.67
Strawberry Perlの5.14系が滞っているのは、
何が原因なんでしょうか? 技術面、それとも人的資源面?
ttp://strawberryperl.com/

リポジトリもコミットが途絶えているみたいですし、心配です。
ttp://hg.curtisjewell.name/Perl-Dist-Strawberry-BuildPerl-5140
ttp://hg.curtisjewell.name/Perl-Dist-Strawberry-BuildPerl-5141

ここでもドンピシャな回答はなかったみたいです。
ttp://www.perlmonks.org/?node_id=910099
184デフォルトの名無しさん:2011/09/06(火) 06:31:53.13
Perl賢者とかいちいち絡まなくていいと思うよ
放置放置
185デフォルトの名無しさん:2011/09/06(火) 15:19:26.18
デスクトップに出力させたい場合、うまくスペースが設定できません。
どのようにしたら良いのでしょうか?
ためしにglobで拾ってみると下記のようになります。
@の部分をデスクトップディレクトリにしたいのですが、どう書けばよいのでしょうか?

use utf8;
use Encode;

#拾える(Documents and SettingsをDocuments*としてスペースを書かない)
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', "/Documents*/user/デスクトップ/*" ) ) ];
#拾えない
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', "/Documents and Settings/user/デスクトップ/*" ) ) ];

my $outPath = "@どう書いたらいい???";
open(OUT, ">$outPath")
print OUT encode('utf8', "あああああ");
close(OUT);
186185:2011/09/06(火) 15:27:11.93
動作環境はeclipseを使っています。
今ググっていたらeclipseの問題のような気がしてきた。。
187デフォルトの名無しさん:2011/09/06(火) 16:02:43.69
データをハッシュにまとめたいけどキーの順序も保存しておきたい場合は
1ハッシュとは別にキーの配列作る
2ハッシュの持つ要素に順序数を含める

どっちがよさそうですか?

1は
@key=(qw/aaa bbb ccc/);
@hash{@key} = (9,8,7);

2は
$hash{aaa}=[0, 9]

のような感じです
それとも単純に[0, 'aaa', 9]と全部配列にまとめてしまうのがいいでしょうか?
188デフォルトの名無しさん:2011/09/06(火) 16:07:20.10
189デフォルトの名無しさん:2011/09/06(火) 17:45:02.85
下記のような正規表現でカッコ()の値を配列に入れるにはどのようにすればよいでしょうか?
個数が変化するので$1などは使えないです。

m|value=([^ ]+)|gxms;
190デフォルトの名無しさん:2011/09/06(火) 18:32:17.11
>>189
while等でループまわして$1を適当な配列にpush
191デフォルトの名無しさん:2011/09/06(火) 18:34:40.10
>>187
2.はhash呼ぶ度に、sort かけなきゃいけないから、
頻繁に呼ぶ場合にはメリットがない
for ( sort keys %hash ){ #normal
for ( sort { $hash{$a}->[0] <=> $hash{$b}->[0] } keys %hash ){ #順序数を含める

1.は良く使う手段。

>>188はウィザードのやる事で、
>本当にこれが必要ですか? :)
てーのは、1.みたいな手段を念頭に入れた上での記載。と、いらぬフォロー。

>>189
my @dat = m|value=([^ ]+)|gxms;
my @dat = ( $hoge =~ m|value=([^ ]+)|gxms ) ;
192デフォルトの名無しさん:2011/09/06(火) 18:41:30.76
>>189
my $str = <<'EOD';
value=foo
value=bar value=baz
value=
quux
value=
lvalue=corge
rvalue=grault
EOD
my(@v1, @v2);
push @v1, "[$1]\n" while $str =~ m|value=([^ ]+)|gxms;
push @v2, "[$1]\n" while $str =~ /\bvalue=(\S+)/g;
print @v1, "---\n", @v2;
193デフォルトの名無しさん:2011/09/06(火) 19:47:00.69
>>185
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', q{"/Documents and Settings/user/デスクトップ/*"} ) ) ];

my $outPath = "/Documents and Settings/user/デスクトップ/foo.txt";
194185:2011/09/07(水) 01:10:47.58
>>193

一つ目は出来ました。
二つ目はやはりできないようです。
eclipseでググッたらスペースうんたらとあるのでやはりeclipseの問題のようです。

ありがとうございました。
195デフォルトの名無しさん:2011/09/07(水) 02:36:27.74
これからPerlに手をだそうとしているのですが、質問があります。

perlは、SJIS、EUC、UTF-8の3つの文字コードの中で何が一番適しているのですか?
それぞれの良い点と悪い点も教えていただきたいです。

もし、ほとんど差がないとすれば、ホームページをつくる上でこれから主流になると
考えられる文字コードがどれか教えてください。よろしくお願いします。
196デフォルトの名無しさん:2011/09/07(水) 02:42:19.81
UTF

あとは内部表現でggr
197デフォルトの名無しさん:2011/09/07(水) 03:39:06.29
>>195
今のPerlはUTF-8(かLatin-1かascii)で書くことが前提なのでUTF-8一択。
他のコードで書けなくもないけど実行前にフィルターかけるだけでいろいろ問題がでるので強く非推奨とされている。

ホームページ → 個人的な感触では既にUTF-8が主流
198デフォルトの名無しさん:2011/09/07(水) 08:27:35.87
あるフォルダに
-------------------
AAAA_A9999.jpg
AAAA_B1111.jpg
AAAA_C0000a.jpg
-------------------

といった感じでファイルがあるんですが、
これを _[ABC]以降の文字列でソートした結果を得たいです。

AAAA_C0000a.jpg
AAAA_B1111.jpg
AAAA_A9999.jpg

が期待する結果

dir /b | perl -ne "〜"

とワンライナーで行いたいです、ご教授お願いします。

199デフォルトの名無しさん:2011/09/07(水) 08:46:47.40
>>198
http://perldoc.jp/docs/perl/5.10.1/perlfaq4.pod#How32do32I32sort32an32array32by32anything41

dir /b | perl -e "@i=map/(?<=_[ABC])(.+)/,@f=<>;print@f[sort{$i[$a]cmp$i[$b]}0..$#i]"
200デフォルトの名無しさん:2011/09/07(水) 08:47:27.92
dir /b | sort
201デフォルトの名無しさん:2011/09/07(水) 09:59:03.82
>>194
$outPathをencodeし忘れてない?
202189:2011/09/07(水) 10:43:18.03
>>190-192

うまく処理できました。
色んなやり方がありますね。
ありがとうございました。
203デフォルトの名無しさん:2011/09/07(水) 14:53:17.89
>>194


'"document files"'
204194:2011/09/07(水) 16:47:53.40
>>201,203

おおおーーー!!
出来ました。
冷静に考えればglob()の時encodeしてるんだからopen()の時もencodeしないとですね。
スコーンと抜けてました。
ありがとうございます。
205デフォルトの名無しさん:2011/09/08(木) 00:54:41.53
ファイル名とかを並び替えする時に人間が見やすいsortはありませんか
大文字や小文字を同一視したり、
9の次に10が来たりするような感じの
206デフォルトの名無しさん:2011/09/08(木) 01:21:17.16
Sort::Naturallyとかどう?
使ったことはないけど
207デフォルトの名無しさん:2011/09/08(木) 18:58:02.37
Java,PHPとやってきてPerlも覚えろと会社から
何時間ぐらいで身につくの?
208 忍法帖【Lv=40,xxxPT】 :2011/09/08(木) 19:01:19.03
>>207
やる気さえあれば 
209デフォルトの名無しさん:2011/09/08(木) 19:13:46.16
それだけやって来たなら
トリッキーなやり方気にしないなら数時間〜数十時間?
当分の間はファニー文字付け忘れてコンパイラに怒られると思うがw
210デフォルトの名無しさん:2011/09/08(木) 19:30:43.37
多分phpからで突っかかって爆死するのは配列の@だ
211デフォルトの名無しさん:2011/09/08(木) 19:45:28.90
PHPも$付けるけど、Perlの付け方とは違うからね
最初のうちは???だろうなあ
212デフォルトの名無しさん:2011/09/08(木) 20:08:31.89
「身に付く」レベルだったら…100時間くらい?
213デフォルトの名無しさん:2011/09/08(木) 20:26:09.45
Cからならリファレンスとプロトタイプ…かな? 未だに混乱する。
214デフォルトの名無しさん:2011/09/09(金) 02:16:57.82
作った関数の引数をハッシュで受け取ると楽だという事に気が付いた。

その流れからか、% や @ を使わずに、無駄に
$data = []
とか、
$data = {}
とかやるクセが付いたw
215デフォルトの名無しさん:2011/09/09(金) 07:21:31.56
Hoge( foo=>1, bar=>2, baz=>3 ) ってやつ?
216デフォルトの名無しさん:2011/09/09(金) 09:17:53.50
Hoge( {foo=>1, bar=>2, baz=>3} ) じゃなくて?
217デフォルトの名無しさん:2011/09/09(金) 12:27:31.84
ハッシュではなくリファレンスだと予想
218デフォルトの名無しさん:2011/09/09(金) 12:33:28.67
すいません、少々分からない事があるので教えていただきたいのですが

use lib qw(/cgi-bin/mycpan/);
use URI::Escape;
use SHA::PurePerl qw(hmac_sha256_base64);

なぜかこれが通りません
Escape.pmは/cgi-bin/mycpan/URI/に
PurePerl.pmは/cgi-bin/mycpan/SHA/に入っており、実行ファイル(test.cgi)は/にあります。

/ test.cgi
└cgi-bin−mycpan┬SHA−Escape.pm
            └URI−PurePerl.pm という感じになっています。

これだけでエラーの原因が分かる方いませんか?
219デフォルトの名無しさん:2011/09/09(金) 12:34:49.64
ちなみにパーミッションはすべて705にしています。
220デフォルトの名無しさん:2011/09/09(金) 12:44:57.74
通りませんじゃなくてエラーメッセージ晒せよ。
221デフォルトの名無しさん:2011/09/09(金) 12:47:42.11
エラーメッセージが表示されないんですよ
だから困っていて・・・

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, xxx@xxx and inform them of the time the error occurred,
and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
222デフォルトの名無しさん:2011/09/09(金) 12:56:10.32
@hogeにある文字列を@fugaにハッシュリファレンスで入れたい場合、
下記よりシンプル&同等以上の速度で処理するにはどのように書けばよいでしょうか?

my @hoge = ( "AAA","BBB" )
my @fuga = ();
map{ push( @fuga, { NAME => $_ } ) } @hoge;
223デフォルトの名無しさん:2011/09/09(金) 12:57:00.58
>>221
板違いだからwebprog板へどうぞ。
ブラウザの結果じゃなくて鯖側にエラーログのファイルがあるから探すように。
224デフォルトの名無しさん:2011/09/09(金) 12:58:50.71
>>223
失礼しました
225デフォルトの名無しさん:2011/09/09(金) 13:06:07.88
>>222
文面どおりに解釈すると
my @fuga = ( {NAME=>'AAA'}, {NAME=>'BBB'} );
とか?

でも速度の問題は実際に計ってみないとわからないし、そんな些細な部分の速度を気にしても費用対効果が悪すぎる。
>>222の書き方でも十分シンプル&高速だと思うよ。
226デフォルトの名無しさん:2011/09/09(金) 13:28:50.21
>>222
速度はほとんどかわらないが(ちょっとだけ速かった)、シンプルはシンプル。
my @fuga = map {NAME => $_}, @hoge;
227デフォルトの名無しさん:2011/09/09(金) 13:54:03.03
push分だけ速くなるのか
228デフォルトの名無しさん:2011/09/09(金) 14:11:01.97
>>216-217
うん。そゆこと。
2個ぐらいなら、普通に Hoge($opt1, $opt2, $opt3) とか渡してるんだけど、
3個以上になったり、その戻り値をそのまま他の関数に渡したいときはハッシュのリファレンスが
もの凄く楽ちん。
229222:2011/09/09(金) 17:56:43.80
>>225,226

出来ました!
ありがとうございました。
230デフォルトの名無しさん:2011/09/09(金) 18:13:32.03
print "Content-type: text/html\n";

if($LOGIN==0){
print  "location:login_form.cgi\n";
}
print "\n";

if($FORM{'soushin'} ne ""){
&toukou_write;   #投稿の書き込み
}

書き込みのsoushinボタンを押したとき、ログインしてないときはログインフォームに飛ばすようにしていますが
ログインフォームに飛んだはずなのに投稿の書き込みが実行されてしまいます。

locationで飛んだらそれ以降は実行されないんじゃないんですか?
231デフォルトの名無しさん:2011/09/09(金) 18:20:05.47
>>230
誘導も面倒だから答えてあげるけど
Content-typeの記述したらそうなるさ。
232デフォルトの名無しさん:2011/09/09(金) 18:25:30.02
'location: URI'をprintすると以降の処理が打ち切られるとかこえーよ
233デフォルトの名無しさん:2011/09/09(金) 18:39:24.00
>>207
#perlでは全てが文字列

use strict ;
use warnings ;

my $s = 4 ;
my $t = 7 ;

print $s . $t,"\n"; # 「47」を出力 (文字列として結合)
print $s + $t,"\n"; # 「11」を出力 (数値として足し算)
print $s x $t,"\n"; # 「4444444」を出力 (文字「4」を7回出力)
print $t x $s,"\n"; # 「7777」を出力 (文字「7」を4回出力)
234デフォルトの名無しさん:2011/09/09(金) 18:55:17.30
>>233
全て文字列…ではないぞ
. + x といった演算子が文字列として解釈するだけだ
235デフォルトの名無しさん:2011/09/09(金) 23:55:58.63
内部的には、文字列、整数、倍精度実数が自動的に変換されているんだけどな
236デフォルトの名無しさん:2011/09/10(土) 01:19:17.94
1時、2時というリファレンスがあります。
これに5を足して下記のようにしたいのですが、シンプルに書くとどんな感じになりますか?
mapあたりを活用するんでしょうか。

my $aaa = [ '01:00', '02:00', '04:00',〜,〜 ];

my $bbb = 〜

結果→ $bbb = '06:00;07:00;0900;〜;〜'
237デフォルトの名無しさん:2011/09/10(土) 01:35:23.27
いいえ、for(each)あたりを活用します。
238236:2011/09/10(土) 01:47:53.41
>>237

どんな書き方になりますか?
今はこんなどんくさいことになっています。。↓

my $aaa = [ '01:00', '02:00', '04:00',〜,〜 ];
foreach( @$aaa ){
if( m|^(\d+):(\d+)$|xms ){
$time .= sprintf(",%02d:%02d",$1+5,$2);
}
}
$time =~ s/^,//xms;
239デフォルトの名無しさん:2011/09/10(土) 03:16:52.14
$bbb = join ';', @aaa;
$bbb =~ s/([0-9]{2}):/sprintf '%02d:', $1 + 5/ge;

こんな感じでどう?
19時以降だとありえない時間になるけどw
240デフォルトの名無しさん:2011/09/10(土) 03:58:39.44
>>236
my $bbb = join(';',
map{
m/(\d\d):(\d\d)/ ? sprintf("%02d:%02d", ($1 + 5) % 24, $2) : $_
} @{$aaa}
);
241デフォルトの名無しさん:2011/09/10(土) 06:17:52.52
>>238
その m// と s/// についてる xms ってオプション、すげー気持ち悪いんだけど…。
242デフォルトの名無しさん:2011/09/10(土) 06:30:16.08
PBP推奨だよ
strict, warnings と同様、空気同然に付ける人もいる
243デフォルトの名無しさん:2011/09/10(土) 06:31:08.89
ベストプラクティスにかぶれるとつけちゃうんだよな〜
244デフォルトの名無しさん:2011/09/10(土) 07:18:08.96
意味わかってて使うんならいいけど、
/x 使ってる割には空白も入れてないし、
/m 使うんなら ^ $ と \A \z の使い分けも普段から正確にしといたほうがいい
245デフォルトの名無しさん:2011/09/10(土) 07:20:03.08
なるほどそういうことか。PBP読んだことないモグリなんで知らなかった。ありがとう。
246デフォルトの名無しさん:2011/09/10(土) 08:05:06.64
>>235
1つのスカラー変数に文字列と数値が共存してるから各々を使い分けたりもできるね

404 Blog Not Found:perl - Scalar::Util::dualvar()
http://blog.livedoor.jp/dankogai/archives/51129553.html
247デフォルトの名無しさん:2011/09/10(土) 09:29:42.31
すべてが文字列というければ、
バイナリデータと文字列って区別つくの?
248デフォルトの名無しさん:2011/09/10(土) 10:21:18.94
いうければ、ってどこのコトバだよ
249デフォルトの名無しさん:2011/09/10(土) 10:37:44.32
文字列はバイナリデータの部分集合と考えられる。
つまり一般的に

  文字列 ⊆ バイナリデータ

が成り立つ。
これを

  文字列 = バイナリデータ

とするのが、UNIX に古くから伝わるテクニック
で、UNIX 版の Perl は binmode 関数を必要と
していない。binmode 関数はDOS系のOS、あるいは
DOS系OS用スクリプトと互換性を持たせたい場合
に用意されている。
250デフォルトの名無しさん:2011/09/10(土) 10:47:39.10
>>247
テキストデータとバイナリデータの区別はつくのかという一般的な命題?
251デフォルトの名無しさん:2011/09/10(土) 11:31:15.68
>>250
そうそう。文字列はバイナリデータと違ってメタ情報を含んでいる。

バイナリデータは単なるバイトの並びだが、文字列は、文字コードというメタ情報
1文字を構成する要素(1文字=何バイトか)とかそういう情報を含んでいる。

だから、数値はどの文字コードでも1バイトで同じコードであるように(文字コード側が譲歩して)
作られているから数値も文字列で扱うのは可能だけど、少なくともバイナリと文字を見分けるための
型情報が必要になるのではないかと。

数値は同じコードって書いたけどJIS系は同じコードで数値じゃない場合もあるか。
でも、JISは最初は(エスケープシーケンスがでるまでは)ASCIIモードであると定義されているよね。

ということで、バイナリデータを扱うなら全部文字列として扱うってのは不可能でしょ?
型情報が必要になる。
252デフォルトの名無しさん:2011/09/10(土) 11:56:35.15
ばかだなぁ。
メタ情報はおれ達の頭の中にあるんじゃないか。
253デフォルトの名無しさん:2011/09/10(土) 12:24:15.48
ここの変数は今Shift JISでそのままでは\が入っていて
関数呼び出しに使えないから、一旦EUCに変換して呼び出してまた戻して・・・

あれ? 今この変数の文字コードはどうなってるんだ?
とかやりたいわけですね。

わかりますwww
254デフォルトの名無しさん:2011/09/10(土) 17:50:25.87
>>251
> そうそう。文字列はバイナリデータと違ってメタ情報を含んでいる。

「含んで」はいないだろ。
同じバイト列を、バイナリとしてでも文字列としてでも、
扱う人間の側がそう扱いたいと思うように扱えばいいだけでしょ。

ただ、その構造が一般的なテキストデータとして破綻していた時に、
一般的なテキストデータとして扱おうとすると不都合が生じるってだけの話。

そのへんを必要に応じてチェックするのは扱う人間の側の仕事で、
データがその属性を「含んで」いる訳ではないと思うんだが。

そしてそれは別にPerlに限った話じゃないし。
どんな言語のどんな「文字列」データでも事情は同じことでしょ。

「文字コード」とか「1文字何バイト」とかの「メタ情報」を「含んで」いる
文字列のデータフォーマットなんて聞いたことない。
少なくともPerlで扱えるのはそんな特殊なフォーマットのデータじゃないんじゃ。

ってことを >>252 が一言で言っちゃってるね。(今気づくな>俺)
255デフォルトの名無しさん:2011/09/10(土) 19:48:27.93
\0が含まれる可能性があればバイナリ
なければ文字列
256デフォルトの名無しさん:2011/09/10(土) 19:55:15.26
>>222
map{ push( @fuga, { NAME => $_ } ) } @hoge;
mapの中で処理が多すぎると気持ち悪くないか
push( @fuga, { NAME => $_ } ) for @hoge;
のほうが見やすいなぁ

>>242
自動的に付加されるモジュールも紹介されてたけど、さすがにないわwと思った


257デフォルトの名無しさん:2011/09/10(土) 19:57:42.06
linuxでしかperl使わないんだけど、
binmode必要ないとか知らなかった、、、、
258デフォルトの名無しさん:2011/09/10(土) 20:09:30.62
>>256
関数に書き出せばいいじゃん
259デフォルトの名無しさん:2011/09/10(土) 20:21:27.24
>>255
バイナリでも \0 が含まれない可能性もあるわけだが
260デフォルトの名無しさん:2011/09/10(土) 20:23:45.30
>>255
> \0が含まれる可能性があればバイナリ
> なければ文字列

UTF16やUTF32は?
16bit、32bit単位で見れば、\0は含まれていないが
8bit単位でみると\0を含んでいる。
261デフォルトの名無しさん:2011/09/10(土) 20:44:37.10
>>254
> 「文字コード」とか「1文字何バイト」とかの「メタ情報」を「含んで」いる
> 文字列のデータフォーマットなんて聞いたことない。

そうか? たとえばJavaではUTF16というメタ情報を含んでいる。

正確に言えばString型はかならずUTF16でなければならないので、
String型がそのメタ情報のかわりになってる。
262デフォルトの名無しさん:2011/09/10(土) 20:56:22.04
>>261
> そうか? たとえばJavaではUTF16というメタ情報を含んでいる。
> 正確に言えばString型はかならずUTF16でなければならないので、
> String型がそのメタ情報のかわりになってる。

それは「含んでいる」とは言わないんじゃないの普通。
データに「含んでいる」っていったら、普通は具体的な
フラグなり識別子なりの形で保持しているってことだろ。

とりあえずおまえの言葉の使い方がおかしいということはわかった。
263デフォルトの名無しさん:2011/09/10(土) 21:03:43.46
UTFのBOMなんかはメタ情報だな
でもBOMの並びから始まるバイナリだって広い世界には一つくらいはあるはずだ
結局やっぱりメタ情報は人間の頭の中にしかないよ
264デフォルトの名無しさん:2011/09/10(土) 21:13:07.68
>>262
> データに「含んでいる」っていったら、普通は具体的な
> フラグなり識別子なりの形で保持しているってことだろ。

つまり、Perlで言えば、UTF8フラグのことですね?
265デフォルトの名無しさん:2011/09/10(土) 21:15:44.45
UTF8フラグに関しては向うでおなかいっぱいw
# UTF8フラグ ON
% export PERL5OPT=-MDevel::Peek
% echo "ほげ" | perl -CSDL -ne 'Dump $_ ' #2.
SV = PV(0x100801130) at 0x100834478
REFCNT = 1
FLAGS = (POK,pPOK,UTF8)
PV = 0x100206180 "\343\201\273\343\201\222\n"\0 [UTF8 "\x{307b}\x{3052}\n"] #2.
CUR = 7
LEN = 80

>>256
見やすさの問題では無く、左辺値を用いないmap使用(=前者)は、
コストの問題から良く無い。と、されて来た。
5.8.1にて解消されてはいるが、お作法として前者の使用は嫌われる。

ttp://logsoku.com/thread/hibari.2ch.net/tech/1306333092/
の997からも参照の事。

266デフォルトの名無しさん:2011/09/10(土) 21:15:45.51
>つまり、Perlで言えば、UTF8フラグのことですね?
ちがう
267デフォルトの名無しさん:2011/09/10(土) 21:16:36.99
データの並びだけで、文字列とバイナリを見分けることはできないのだから、
型で見分けるか、データにフラグをもたせるかの
どちらかしかや利用がないだろう。

あとは人間が自分で判断するという、ご苦労なやり方もあるがw
268デフォルトの名無しさん:2011/09/10(土) 21:17:11.88
>>266
あってるだろw
269デフォルトの名無しさん:2011/09/10(土) 21:19:59.53
>>267
> データの並びだけで、文字列とバイナリを見分けることはできないのだから、
> 型で見分けるか、データにフラグをもたせるかの
> どちらかしかや利用がないだろう。

未知のデータを処理する時の話?
そりゃ中身で見分けるしかないだろ。
「どちらかしかや」がどういう意味かはわからんが。

> あとは人間が自分で判断するという、ご苦労なやり方もあるがw

必要に応じてそれをプログラムにやらせるんだろ。
270デフォルトの名無しさん:2011/09/10(土) 21:22:20.49
> そりゃ中身で見分けるしかないだろ。
中身じゃ見分けられんぞ。
文字コードの自動判定なんてあてにならんし。
271デフォルトの名無しさん:2011/09/10(土) 21:23:51.61
そういやHTMLやXMLは、データの中に文字コードが書かれているよね。
272デフォルトの名無しさん:2011/09/10(土) 21:35:29.77
>>260
つまり文字列には\0が含まれてないってことですよ。
273デフォルトの名無しさん:2011/09/10(土) 21:35:50.40
>>271
あんなの当てにするやついるのかよw
274デフォルトの名無しさん:2011/09/10(土) 21:38:22.19
>>268
ちがう。
use utf8; するとバイト列に utf8フラグが付く。

データにutfのフラグそのものが含まれていれば、わざわざutf8フラグなんてものは要らないし、
それにデータにutfのフラグが含まれていても、そのフラグがUTFだ何だと分かることはない。

データに含まれる自己言及的なメタデータは、それを解釈する側が、まずはその自己言及的な部分があるかどうかを知っているとき、
そして言及する対象がどのくらい・何種類あるか、つまりはメタデータそのものの種類やそれらの表記方法を知っている時にだけ、有効。
275デフォルトの名無しさん:2011/09/10(土) 21:40:43.25
> use utf8; するとバイト列に utf8フラグが付く。

は? use utf8の意味わかってないじゃん。

use utf8はソースコードに書かれた文字の話であって、
バイト列とか関係ないんだけど。

http://perldoc.jp/docs/perl/5.8.1/utf8.pod
> utf8 - ソースコード内に、UTF-8(か、UTF-EBCDIC)を有効/無効にするためのプラグマ
> use utf8プラグマは、Perl パーサーに、現在のレキシカルスコープ内の
> プログラムのテキストに、UTF-8(EBCDICベースのプラットフォームなら、
> UTF-EBCDIC) を許すように伝えます。
276デフォルトの名無しさん:2011/09/10(土) 21:50:26.75
>>275
バイト列の意味わかってないのか?
とりあえず上のURLでバイト列が関係する部分を抜き出しておいた
>no utf8 プラグマは Perl に、現在のレキシカルスコープのソーステキストを リテラルなバイトとして扱うように伝えます。
>ソースコード中の恣意的なバイト列を許していました。
>高ビットのセットのあるソーステキストにあるバイトは、
>バイト列は、ほとんどの場合、適切なUTF-8ではないからです。 そのようなバイト列がいるなら、
>たとえば、例で使われているように、ISO 8859-1 (Latin-1) のバイト列を
>または 文字列がバイトとして保持されている場合に真を
277デフォルトの名無しさん:2011/09/10(土) 21:56:03.64
>>276
だから、あくまでソースコードにかいてある文字列の話だって。
ソーステキストってのが見えないの?

データにフラグを持ってるというのは
>>265から明らかだろ。
278デフォルトの名無しさん:2011/09/10(土) 21:56:40.23
もう一つ。画面に表示されるものだけがデータじゃないぞ。
見えないところに追加されているのも、データだ。
279デフォルトの名無しさん:2011/09/10(土) 22:01:42.28
% export PERL5OPT=-MDevel::Peek
% perl -e 'Dump "ほげ"'
SV = PV(0x100801280) at 0x1008275e8
REFCNT = 1
FLAGS = (POK,READONLY,pPOK)
PV = 0x100208560 "\343\201\273\343\201\222"\0
CUR = 6
LEN = 16
% perl -MO=Deparse -e 'print "ほげ"'
use Devel::Peek;
print "\343\201\273\343\201\222";
-e syntax OK

% perl -Mutf8 -e 'Dump "ほげ"'
SV = PV(0x100801090) at 0x100827618
REFCNT = 1
FLAGS = (POK,READONLY,pPOK,UTF8)
PV = 0x10020ac40 "\343\201\273\343\201\222"\0 [UTF8 "\x{307b}\x{3052}"]
CUR = 6
LEN = 16
% perl -MO=Deparse -Mutf8 -e 'print "ほげ"'
Wide character in print at /PATH/TO/lib/5.14.1/B/Deparse.pm line 1213.
use utf8;
use Devel::Peek;
print 'ほげ';
-e syntax OK
280デフォルトの名無しさん:2011/09/10(土) 22:02:10.61
ソースコードに書いてある文字にUTF8フラグがつくのであって、
ファイルなどから読み込んだ文字にはuse utf8したからって
勝手にUTF8フラグはつかない。

こっちの値はUTF8フラグ付き。こっちはついてないと
データごとにもっている情報。
もちろんすべてのバイナリにUTF8フラグがつくわけもない。
281デフォルトの名無しさん:2011/09/10(土) 22:03:50.69
>>279
コメントが何もかかれてないんで、何を言いたいのかサッパリわからないけど
念の為にいっておくけど、-e の後に書いたものも、
ソースコードだからね。
282デフォルトの名無しさん:2011/09/10(土) 22:05:11.06
>>278
>>> データに「含んでいる」っていったら、普通は具体的な
>>> フラグなり識別子なりの形で保持しているってことだろ。
>>つまり、Perlで言えば、UTF8フラグのことですね?

>見えないところに追加されているのも、データだ。

元データにはメタ情報が含まれてんの?
それとも、含まれていないからわざわざ追加してるの?
どっち?
283デフォルトの名無しさん:2011/09/10(土) 22:13:02.74
>>274
>use utf8; するとバイト列に utf8フラグが付く。
これの先頭に「一例として、」って入れとけば良かったのに。

>>279
>念の為にいっておくけど、-e の後に書いたものも、
>ソースコードだからね。
もちろんw
284デフォルトの名無しさん:2011/09/10(土) 22:21:55.04
>>282
元データにメタ情報が付いているのなら、
文字列とバイナリの区別つくだろw

元データにメタ情報がついてなくて
コーディングが面倒になるので、
ある言語では型に入れることでメタ情報を付加したり、
PerlではUTF8をつけることでメタ情報を付加するわけだ。
285デフォルトの名無しさん:2011/09/10(土) 22:59:48.54
>>284
>元データにメタ情報が付いているのなら、
>文字列とバイナリの区別つくだろw
区別できない。

お前はプログラムの中だけで考え過ぎだ。そこがおかしい。
ソースコードの中だけで考えれば、JavaのStringは必ずUTF16になるだろうけど、

例えば、ネットの某所で拾った、とあるバイナリファイルがあるとき。
そのバイナリがテキストファイルなのか、
それ以外の意味(画像・音楽・動画など)を持つバイナリなのか、
はたまた、全く意味の無いランダムなバイナリなのか、
そのバイナリだけでそれらの判定ができるのか?
メタ情報が付いていたとしても、そのメタ情報が正しいことをそのバイナリからどうやって保証するんだ?
286デフォルトの名無しさん:2011/09/10(土) 23:03:11.52
>>285
日本語が不自由なの?

元データにメタ情報がつくのなら文字列のバイナリの区別がつく。
だが事実として文字列とバイナリの区別はつかないんだから
元データに情報はついていないという意味だ。
287デフォルトの名無しさん:2011/09/10(土) 23:05:28.59
> メタ情報が付いていたとしても、そのメタ情報が正しいことをそのバイナリからどうやって保証するんだ?

これは意味がない問答だなw

メタ情報がついていて、そのメタ情報に従っていないなら
そのデータ(もしくはメタ情報)は壊れていると判断されるだけ。
288デフォルトの名無しさん:2011/09/10(土) 23:19:22.80
>>287
> > メタ情報が付いていたとしても、そのメタ情報が正しいことをそのバイナリからどうやって保証するんだ?
>
> これは意味がない問答だなw
>
> メタ情報がついていて、そのメタ情報に従っていないなら
> そのデータ(もしくはメタ情報)は壊れていると判断されるだけ。

俺が言っていることはお前の考えていることとは違う。
289デフォルトの名無しさん:2011/09/10(土) 23:37:52.98
で、これって何の議論なんだっけ?
290デフォルトの名無しさん:2011/09/10(土) 23:39:03.81
250 デフォルトの名無しさん [sage] 2011/09/10(土) 10:47:39.10
>>247
テキストデータとバイナリデータの区別はつくのかという一般的な命題?
291デフォルトの名無しさん:2011/09/10(土) 23:39:45.59
247 名前:デフォルトの名無しさん[sage] 投稿日:2011/09/10(土) 09:29:42.31
すべてが文字列というければ、
バイナリデータと文字列って区別つくの?
292デフォルトの名無しさん:2011/09/10(土) 23:42:10.54
まあ、すべてが文字列なんて世界はありえないってことだよ。
すべてがバイナリって世界なら、あるだろうけどね。

バイナリと文字列の区別はつかない。

型ないとバイナリと文字列の区別はどうするかという
問題が常に付きまとう。
293デフォルトの名無しさん:2011/09/10(土) 23:47:12.63
>>292
だから型うんぬんはおかしいって散々言われてんだろ
ちょっと黙ってろ低能
294デフォルトの名無しさん:2011/09/10(土) 23:49:48.92
>>293
おかしいという根拠は?
295デフォルトの名無しさん:2011/09/10(土) 23:57:15.96
誰か整理してくれw
296デフォルトの名無しさん:2011/09/11(日) 00:06:48.26
Perlの内部データ保持形式についてわかっている人間同士で喧嘩をしているなら、
あとは思想信条の問題だな>バイナリデータと文字列
297デフォルトの名無しさん:2011/09/11(日) 00:09:45.79
>>286
> 元データにメタ情報がつくのなら文字列のバイナリの区別がつく。

落ち着け。自分が“日本語が不自由”になってるぞ。
298デフォルトの名無しさん:2011/09/11(日) 00:13:05.98
>>297
そのレスは揚げ足取り以外の意味があるのか?
299デフォルトの名無しさん:2011/09/11(日) 00:22:12.69
>>298
ううん。
300デフォルトの名無しさん:2011/09/11(日) 00:32:48.70
>>294
お前は話題をしっかりと認識していないから、あるいは認識するだけの能力がない低能だから、
>>251のここの発言がズレてる。
>文字列はバイナリデータと違ってメタ情報を含んでいる。

お前以外の全員はプログラムの外部にあるだろうとあるファイルについて話しているのに、
お前だけがプログラム内部の文字列について語っている。

だからお前の言うことはおかしい。
ズレてる。
301デフォルトの名無しさん:2011/09/11(日) 00:48:28.61
補足すれば、「UTFのメタ情報は何か?」と聞けば、
お前は「JavaならString型自体がメタ情報」「perlにはUTFフラグがあるからそれがメタ情報」、
他は「BOMがメタ情報」、
と答えるはず。
それだけ認識がズレてる。
302デフォルトの名無しさん:2011/09/11(日) 02:05:27.81
>>300
いや >>251
> プログラム内部の文字列について語っている
つもりで読んでみてもちょっとなにいってんのかわかんないレベルだ。
303デフォルトの名無しさん:2011/09/11(日) 02:14:57.86
ばかばっか
304デフォルトの名無しさん:2011/09/11(日) 02:16:34.83
おまえらそこまで気にしてスクリプト組んでませんやんw
305デフォルトの名無しさん:2011/09/11(日) 02:38:23.95
「テキストデータとバイナリデータの区別はつくのかという一般的な命題」
の思考実験に近い話を、意識しながら組むやつはいねーよ

組むだけだったら、日本語を扱うストラテジーは
大なり小なり出来あがってんだから、それに従うだけだ。
306デフォルトの名無しさん:2011/09/11(日) 02:55:24.02
最近じゃEncodeモジュールに移行してしまっtから
全部Unicode扱いで、日本語であるかどうかも意識してないけどねw
307デフォルトの名無しさん:2011/09/11(日) 09:34:10.38
"メタ情報" という言葉を "メタ(な)"+"情報" と考えるのか
「メタ情報」という分解できないひとつの言葉と考えるかで、
話がすれ違ってしまうよ。

分解できない「メタ情報」は情報になっていないからこそ
「メタ情報」なんであって、例えばコンピュータのメモリ
の中に入り、情報になってしまうと「メタ情報」ではなく
なる。

それはメタな「情報」ということだろう。
308デフォルトの名無しさん:2011/09/11(日) 09:42:58.51
それ言うと発端の「文字列」なんて、
>>233は、明らかにstringsとして表記してるのに、
>>251は、明らかに文字コード付きの
309デフォルトの名無しさん:2011/09/11(日) 09:45:13.68
って途中で書き込んじまったから、萎えた。
310デフォルトの名無しさん:2011/09/11(日) 10:19:17.13
>>307 のあまりの頭の悪さにすげえウンザリな気分…。
311デフォルトの名無しさん:2011/09/11(日) 10:59:12.90
そんなめったなことを言うもんじゃないよ。
312デフォルトの名無しさん:2011/09/11(日) 11:14:46.03
メタだけに、めったな事
313デフォルトの名無しさん:2011/09/11(日) 11:26:23.85
あーあ
314デフォルトの名無しさん:2011/09/11(日) 11:38:43.56
メタメタだな
315デフォルトの名無しさん:2011/09/11(日) 11:45:13.16
perlのTkモジュールってMinGWでインストールできますでしょうか?
316デフォルトの名無しさん:2011/09/11(日) 13:53:25.26
めっためたにしてやんよ
317uy:2011/09/11(日) 16:36:26.19
今の時代にPerl使ってる奴wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
お前らみたいな時代遅れのゴミクズゴミグラマーが、ITの進化を遅らせるんだろうな
使えもしない足引っ張るだけの老害だ
プログラム作っているw 気になっているだけで実際はゴミグラミングしかしていない
ゴミグラミングされてゴミ量産されてもそれはプラスにはならなくなり負の遺産でしかない

わかったらさっさと死ねば?

ゴミグラマは死ね  死ねゴミグラマ
318デフォルトの名無しさん:2011/09/11(日) 16:42:48.09
じゃあ真っ先に死ぬのはuy・・・
319デフォルトの名無しさん:2011/09/11(日) 17:49:52.93
言語に関わらず、糺されて論破されて発狂して負をまき散らすような人間が少なからず従事しているから、
IT業界の生産性とか技術力とかが一切向上しないんだろうな。
320デフォルトの名無しさん:2011/09/11(日) 18:36:51.63
外部コマンドを起動するさいに、標準入出力を
両方とも取りたいときはどうしたらよいでしょうか
321デフォルトの名無しさん:2011/09/11(日) 18:42:56.06
標準入力はお前様が書くんだから取り様が無い気が…
標準出力と標準エラー出力を取るなら、

IPC::Open3
322デフォルトの名無しさん:2011/09/11(日) 20:42:47.49
323デフォルトの名無しさん:2011/09/11(日) 20:54:36.45
perldoc 貼り付けて答えた気になってる人は、
perldoc が更新されてなくて古い情報になってる事にも
気をかけて欲しい。今回がまさに該当するが。


324デフォルトの名無しさん:2011/09/11(日) 21:24:23.14
perltrapなんか、未だに"Perl4 to Perl5 Traps"載っけたままだしねぇ
誰が必要とすんだ?
325uy:2011/09/11(日) 21:39:50.76
>>319
へええええ

この「停滞」しているITに気づいているのか?

だったらお前もゴミ掃除を手伝ってみませんか?
326デフォルトの名無しさん:2011/09/11(日) 23:46:57.99
>>323
古くなってる?
分からないから、教えて欲しい。
327デフォルトの名無しさん:2011/09/12(月) 05:56:48.75
10年前に書かれたまま、更新してないとかじゃねーの。

例えば、
>local *CATCHOUT = IO::File->new_tmpfile;
>local *CATCHERR = IO::File->new_tmpfile;
>my $pid = open3(gensym, ">&CATCHOUT", ">&CATCHERR", "cmd");

IO::File->new_tmpfile が「ファイルハンドルを返すもの」と理解してれば、
今の時代にこんな書き方はしない。

se IPC::Open3;
use IO::File ;
use Symbol qw(gensym) ;
my @cmd = qw( ls ) ;
my $tmpout = IO::File->new_tmpfile;
my $tmperr = IO::File->new_tmpfile;
my $pid = open3 gensym, $tmpout, $tmperr, @cmd ;
waitpid $pid, 0 ;
print while <$tmpout>;

328デフォルトの名無しさん:2011/09/12(月) 12:55:44.21
>>327
それだと">&"の処理に困らない?
329デフォルトの名無しさん:2011/09/12(月) 17:36:39.36
配列にある要素があれば1、なければ0を返すコードはどのように書けばよいでしょうか?
330デフォルトの名無しさん:2011/09/12(月) 17:38:41.94
grep {$foo == $_} @ARRAY
331デフォルトの名無しさん:2011/09/12(月) 18:43:59.98
332デフォルトの名無しさん:2011/09/12(月) 23:43:15.08
>>330
{$foo == $_} より {$foo eq $_} の方がいいかも
ケースバイケースだろうけど

List::MoreUtils の any も試してみたら
grepの10倍遅かったw
333デフォルトの名無しさん:2011/09/13(火) 23:44:12.38
>>327
> 今の時代にこんな書き方はしない。

今の時代に合わない、ネットの書き込みを
全部排除してくれ。

世の中モダンPerlだけでいい。
334デフォルトの名無しさん:2011/09/14(水) 00:32:46.98
そういうかきかたはイカーン
335デフォルトの名無しさん:2011/09/14(水) 01:25:13.82
科学技術はこれまでの積み重ねで成り立って
いるわけだから、過去のノウハウが活かせない
ものは先行きが怪しいと考える。
336デフォルトの名無しさん:2011/09/14(水) 01:50:13.21
>>335
もっともらしく見えないこともないが意味不明。
Perlとは関係なし。
337デフォルトの名無しさん:2011/09/14(水) 02:10:04.36
過去のノウハウを削除しようとして無きものに
しようとしているけど、それは得策ではない
ってこと。

無理に削除するんじゃなくて、だんだんと廃れて
使われなくなるのを待てばいいってこと。

Perl4 が使われている間は"Perl4 to Perl5 Traps"
は必要ってこと。

慌てて過去を取り消す類の技術は、今後も慌てて
取り消される恐れありってこと。
338デフォルトの名無しさん:2011/09/14(水) 02:34:02.95
>>337
perldocを「むやみに」削除はしない方がいいってのは同意だけど
> 科学技術はこれまでの積み重ねで成り立って
> いるわけだから、過去のノウハウが活かせない
> ものは先行きが怪しいと考える。
そもそもプログラミング言語が「科学技術」か、ってのは置いとくとして
たとえば過去のノウハウが足枷なCOBOLとか先行き安泰でもなんでもないしね。
339デフォルトの名無しさん:2011/09/14(水) 02:52:53.32
いい加減他でやれ
340デフォルトの名無しさん:2011/09/14(水) 03:27:11.35
>>339
バカはおとなしく黙って見てろよ
341デフォルトの名無しさん:2011/09/14(水) 09:15:59.19
雑談でやれや
342デフォルトの名無しさん:2011/09/14(水) 09:21:07.79
343デフォルトの名無しさん:2011/09/14(水) 22:23:12.65
(341:雑談として)
>>338
でも切り捨てたらある意味、別物になってしまうのだから
切り捨てて「安泰」って考えるのもどうかと。
→ これから雑談に行きます
344デフォルトの名無しさん:2011/09/16(金) 00:51:42.85
Tkもここでいいんかな?
Win7 + ActivePerl v5.14.1 でTkがインスコされてないんだけど、なるべくお手軽なインスコ方法を教えてくれい
↓で試したけどムリポだった
ttp://hardsoft.at.webry.info/201005/article_4.html
ttp://dec12.doorblog.jp/archives/3816580.html
345デフォルトの名無しさん:2011/09/16(金) 00:57:41.53
WindowsXP Pro(32ビット) + ActivePerl v5.14.1 の場合、
ttp://hardsoft.at.webry.info/201005/article_4.html
でうまくいったけどな

Win7 がうまくいかないのか、64ビット版なのか
346デフォルトの名無しさん:2011/09/16(金) 16:17:16.25
下記2つの動作の違いは何でしょうか?
カンマの有り無しどちらも動くし違いがあんまりよくわかっていません。

map{},@hoge;
map{} @hoge;
347デフォルトの名無しさん:2011/09/16(金) 16:51:16.03
>>346
動かない
348デフォルトの名無しさん:2011/09/16(金) 17:10:11.37
>>346
「map {}, @hoge;」の方は式(EXPR)で、無名ハッシュへのリファレンス。
でもこの場合「map +{}, @hoge;」みたいに書かないとエラーになるよ。
「map {} @hoge;」の方はブロック(BLOCK)。

use Data::Dumper;
my @x = qw(a b c);
my @expr = map +{$_ => 1}, @x;
my @block = map {$_ => 1} @x;
print "Expr:\n", Dumper(@expr);
print "Block:\n", Dumper(@block);

Expr:
$VAR1 = {
'a' => 1
};
$VAR2 = {
'b' => 1
};
$VAR3 = {
'c' => 1
};
Block:
$VAR1 = 'a';
$VAR2 = 1;
$VAR3 = 'b';
$VAR4 = 1;
$VAR5 = 'c';
$VAR6 = 1;

詳しくは→ ttp://perldoc.jp/func/map
349344:2011/09/16(金) 23:04:56.72
>>345
dクスコ
x64なのでたぶんそれっす

まああまり大したことしてなかったし、この際Tkxに移行するお
350デフォルトの名無しさん:2011/09/18(日) 09:05:55.84
そういえば何故、
ループの制御文が他の言語では continue や break なのに、
Perl では next や last なんだろう?
351デフォルトの名無しさん:2011/09/18(日) 10:39:27.66
4文字だから
352デフォルトの名無しさん:2011/09/18(日) 10:57:37.45
>>350
last は分からんが、next は -n や -p のときに
AWKの next に近い目的(残りの処理を飛ばして次の行へ)
で使うことになるから、それが由来じゃね
353デフォルトの名無しさん:2011/09/18(日) 21:21:59.66
>>351
じゃあ何故elifにしなかったのか
…いや分かるような気もするw
354デフォルトの名無しさん:2011/09/19(月) 13:00:20.23
ウィンドウズのコマンドプロンプトのコマンドをperlで実行したいんだけどどうすればいいの?
355デフォルトの名無しさん:2011/09/19(月) 13:37:10.69
system
356デフォルトの名無しさん:2011/09/19(月) 15:18:46.31
>>354
>perl hoge.pl
357346:2011/09/20(火) 12:55:38.51
>>347,348
遅くなりました。
ご回答ありがとうございます。

動かないという話ですが、下記の回答でmap{}の後ろにカンマ付きで書いてあります。
こちらは動いているようなのですが、何か私が勘違いしているのでしょうか?
初心者で申し訳ありません。

>>226
my @fuga = map {NAME => $_}, @hoge;
358デフォルトの名無しさん:2011/09/20(火) 14:27:51.02
>>357
http://perldoc.jp/func/map
> map BLOCK LIST
> map EXPR,LIST
書式は二種類ある。

use Data::Dumper;
local $Data::Dumper::Indent;

my @hoge = qw(AAA BBB CCC);
my @fuga;

@fuga = map({NAME => $_}, @hoge); # EXPR
print Dumper(\@fuga), "\n";
@fuga = map{ {NAME => $_} } @hoge; # BLOCK
print Dumper(\@fuga), "\n";
359デフォルトの名無しさん:2011/09/20(火) 14:54:38.83
置換 tr について質問です。
改行を削除したいんですが、 tr/\r\n// とやっても削除されません
tr/\r\n/z/ などとすると改行コードがzに変換されました。
trでは削除は出来ないのでしょうか
360359:2011/09/20(火) 14:57:34.40
while(<>){
tr/\r\n/z/;
print "$_ is good\n";
}
こういうコードで試験しました
361デフォルトの名無しさん:2011/09/20(火) 15:17:21.89
>>360
http://perldoc.jp/docs/perl/5.14.1/perlop.pod#Quote32and32Quote-like32Operators32
tr/SEARCHLIST/REPLACEMENTLIST/cdsr
> オプションは以下の通りです:
...
> /d 修飾子が指定されると、SEARCHLIST に指定されて、
> REPLACEMENTLIST に対応するものがない文字が削除されます。
362デフォルトの名無しさん:2011/09/20(火) 15:18:11.63
tr/\r\n//d

tr/\r\n// は tr/\r\n/\r\n/ と等価
tr/\r\n/z/ は tr/\r\n/zz/ と等価
363346:2011/09/20(火) 16:00:57.00
>>358

map{}で対象になっている部分が違うんですね。
わかりやすい説明ありがとうございました。
省略しまくれるperlの弊害がこんなところで。。
364359:2011/09/20(火) 17:15:20.63
>>361
ありがとう!そして、ありがとう!
dってこういう意味あったのか
365デフォルトの名無しさん:2011/09/20(火) 18:42:37.82
文字削除だったらs///使わね?
366デフォルトの名無しさん:2011/09/20(火) 19:36:36.24
>>363
> map{}で対象になっている部分が違うんですね。

こんだけ説明されてもまだ理解できてないのか…。
367デフォルトの名無しさん:2011/09/20(火) 22:24:43.11
>>360
そのケースだったら、
while(<>){
chomp;
print "$_ is good\n";
}
が常套手段
368デフォルトの名無しさん:2011/09/20(火) 23:05:04.81
>>367は「末尾の \n を削除」する常套手段ではあるが、
>>359>>360を見る限りでは「改行を削除」したいとしか言っていない。

chomp で末尾の改行を削除するにしても、対象の改行コードが \r\n なら $/ を合わせて変更(通常、local を使う)する必要があるし、
\n と \r\n の両方を削除したいという場合は chomp は不適。

位置にかかわらず改行を削除する場合、
\n と \r\n は削除しつつ単独の \r は放置するのであれば s/\r?\n//g などとする。
\r\n という並びでない単独の \r も \n と同様に削除していいなら>>362(s/[\r\n]//g とほぼ等価)。
369デフォルトの名無しさん:2011/09/20(火) 23:15:17.86
単純な疑問だけど、
"\n", "\r\n" 混成のファイルなんてあんの?

370デフォルトの名無しさん:2011/09/20(火) 23:51:21.51
>>369
勿論ある。
テキストをなんだと思ってるのか。
371デフォルトの名無しさん:2011/09/21(水) 00:07:01.37
事例としてって意味なんだが…、
ま、いいや
372デフォルトの名無しさん:2011/09/21(水) 00:09:40.99
具体的なケースは挙げられないけど何回も見たことがある
たぶんWindows使ったことがない人のプログラム
373デフォルトの名無しさん:2011/09/21(水) 00:59:35.69
ある仕様で、\nで区切ってコマンドを送れってのがあって、
それをログに落とししてみたら、\n区切りのコマンドと本体プログラムが吐く\r\nが混在してて、どうしようか迷ったことがある。
374デフォルトの名無しさん:2011/09/21(水) 01:01:12.41
たとえば
MIFES 7というエディタは、
"\r\n"なら ┛のようにまがった矢印
"\n"なら↓
矢印のちがいだけで、ちゃんと改行してる。

シフトJISなのに"\n"で改行してる状態で、別のファイルにコピペすると、
"\r\n"と"\n"が混在する
375デフォルトの名無しさん:2011/09/21(水) 01:20:21.39
>>374
これは、ちょっとおかしい
376デフォルトの名無しさん:2011/09/21(水) 01:29:02.30
>>374であってます。

いまやってみたこと
JBuilder 7で新規に作成(JBrow.java)
保存
終了
エクスプローラで
JBrow.javaを右クリックしてそのメニューから
MIFES 7を選択して開く
改行マークが↓になっていて、ちゃんと改行してる(プリ/ポストプロセッサなしのモード)

範囲指定してクリップボードにコピー
┛で改行してるファイル(IP.txt)に貼り付けると
↓と┛が混在する。
ENTERをおすと┛になる。
保存。
MIFES 7を終了。
メモ帳でIP.txtを開くと、やっぱり↓と┛が混在している。
377デフォルトの名無しさん:2011/09/21(水) 01:45:23.36
DOSの頃に、アセンブラでテキスト生成するプログラム作った奴が
改行箇所を全部\n\rで吐き出していたことがあったっけ。
378デフォルトの名無しさん:2011/09/21(水) 01:46:38.20
シフトJIS関係ねえとだけ言っておく
379デフォルトの名無しさん:2011/09/21(水) 02:16:53.06
Mifes 7が、テキストの文字コードがSJISだと改行コードを\r\nにする仕様になっている、
という意味かもしれん。
もしそうだとするとMifes 7はMacで作成したテキストを全く考慮してないってことだな。

いずれにしても文字コードと改行コードは本来独立ってのは確かにそのとおりだ。
380デフォルトの名無しさん:2011/09/26(月) 15:25:55.84
Perlでファイルの内容を置換する時に

per -pi -e "正規表現" ファイル

としますが、ファイルを直接書き換えるのではなく
書き換えた内容を出力するのは
どうすればできますか?
381デフォルトの名無しさん:2011/09/26(月) 15:52:11.66
>>380
オプションから i を抜け
382デフォルトの名無しさん:2011/09/26(月) 15:55:29.49
あと、画面でなく別ファイルに出力したいなら

perl -p -e "処理" 入力ファイル名 > 出力ファイル名

と、最後に「> 出力ファイル名」を付けろ
383デフォルトの名無しさん:2011/09/26(月) 15:58:59.38
ただし >>382 は出力ファイルが既にあったとしても
何も聞かずに問答無用で上書きするから気をつけろよ
384デフォルトの名無しさん:2011/09/26(月) 16:25:00.72
元の入力ファイルのバックアップを
ファイル名の末尾に .bak を付けて取っておいてくれる

perl -i.bak -ple '置換処理' 入力ファイル

とかは良く使うかも?
385デフォルトの名無しさん:2011/09/26(月) 17:22:55.38
>>381-383
詳しくありがとうございます
>>384
これもいいですね
ありがとうございます
386デフォルトの名無しさん:2011/09/26(月) 20:43:43.84
perlの場合AとBが同時にページにアクセスした場合
プログラムが同時に実行されるんでしょうか?

Aのプログラムの実行行番号とBの実行行番号が同じかって意味です
387デフォルトの名無しさん:2011/09/26(月) 20:51:21.18
トランザクション!!!
388デフォルトの名無しさん:2011/09/26(月) 21:33:23.87
>>386
ページって何だよと言わざるを得ない。
CGIについて言ってるならそれはしapacheなどのWEBサーバの問題であってperlの問題ではない。
389デフォルトの名無しさん:2011/09/26(月) 22:19:27.82
perl内でコマンドを作ってそのまま実行させたいのですが、今はコマンドを作ってから``で囲んでます。
``で囲まないで実行させる方法はないですか?
`comamnd1 | perl -lne 'print xxxxxx'`
今はこんな感じです。
よろしくお願いします。
390デフォルトの名無しさん:2011/09/26(月) 22:24:15.30
system
391デフォルトの名無しさん:2011/09/26(月) 23:19:35.54
command1の出力をperlの正規表現で処理してコマンドを作るので、Perlに-execみたいな
オプションがあって、そのまま実行してくれたらいいのにと思ったんですが、そういうのはないんですよね?
392デフォルトの名無しさん:2011/09/26(月) 23:26:24.45
perl -h
393デフォルトの名無しさん:2011/09/26(月) 23:32:23.12
PHPのhtmlspecialchars()みたいなの無い?
394デフォルトの名無しさん:2011/09/26(月) 23:50:12.96
s/PHPのhtmlspecialchars()みたいなの無い?/ggrks/g;
s/PHPのhtmlspecialchars()/使えねぇー/g;
395デフォルトの名無しさん:2011/09/27(火) 00:12:34.63
>>391
状況が良く分からんが、xargs使えば?

>>393
http://search.cpan.org/~gaas/HTML-Parser-3.68/lib/HTML/Entities.pm
396デフォルトの名無しさん:2011/09/27(火) 04:51:33.03
>>395
> 状況が良く分からんが、xargs使えば?

普通にsystem()使えばいいと思うが
397デフォルトの名無しさん:2011/09/27(火) 06:53:08.65
シェルの質問と取るのが妥当じゃねーの
echo `ls | perl -lpe 's/\.txt//'` 的な。
(ちょっと上でワンライナーの質問も出てるし)

そうだとすると、
alias hoge="ls | perl -lpe 's/\.txt//'"
とかやってaliasするけど、ダブルコーテーションでくくるのが
作法的に良いのかは知らん

>-execみたいな
って言い分からだと、
perl -le '$_= `ls` ; s/\.txt//g ; print'
でもいいんじゃねーのと思うが、

やっぱperlの中の``中でperlを呼ぶ話?
398デフォルトの名無しさん:2011/09/27(火) 07:14:49.85
>>397
389==391だよね。
for (`command1`) {
chomp;
system 加工($_);
}
とかでいいんじゃないのかな。
399デフォルトの名無しさん:2011/09/27(火) 08:44:49.20
IPC::Cmd が便利なもんで、
最近は system を直接使わなくなったなあ。
400デフォルトの名無しさん:2011/09/27(火) 19:04:57.60
エスパー訓練用問題
ファイルに書こうとすると GLOB とか出て書けないのはなんで?
401デフォルトの名無しさん:2011/09/27(火) 19:08:18.60
スクリプトの文字コードがutf8なのに
windows用のファイル名(sjis)を付けようとしている
402デフォルトの名無しさん:2011/09/28(水) 13:04:50.35
IPC::Cmdってどこが便利なの?
403400:2011/09/28(水) 15:04:35.87
自己解決しました。

>>401
ハズレです
404デフォルトの名無しさん:2011/09/28(水) 18:08:27.87
ちなみにその答えは?
405デフォルトの名無しさん:2011/09/29(木) 00:33:01.39
匿名掲示板てどんな書き逃げしても後腐れがないからいいよね!
406デフォルトの名無しさん:2011/09/29(木) 01:49:31.35
>>404
カンマ
407デフォルトの名無しさん:2011/09/29(木) 13:33:47.13
謎は全て解けた
408デフォルトの名無しさん:2011/10/03(月) 22:21:04.14
CGI.pmを使ったときに、printで送信できるのはなぜですか?
どこかでprintの出力先を書き換えてるの?
409デフォルトの名無しさん:2011/10/03(月) 23:00:27.18
>>408
CGI.pm はリクエストを標準入力で受け取り
レスポンスを標準出力と標準入力で返す仕様だから
これが Plack だとリクエストをハッシュリファレンスで受け取り、
レスポンスを配列リファレンスで返す事になる。

それと Webアプリ関係は板違いだよ。
410409:2011/10/03(月) 23:01:29.25
コピペミス
レスポンスを標準出力と標準入力で返す仕様だから
          ↓
レスポンスを標準出力で返す仕様だから
411デフォルトの名無しさん:2011/10/03(月) 23:09:30.07
>>409
CGI.pm は、というよりCGIは、だな
412デフォルトの名無しさん:2011/10/03(月) 23:24:10.84
>>409
CGI.pm→CGI
Plack→PSGI

にした方が適切じゃね?
413デフォルトの名無しさん:2011/10/04(火) 00:04:36.86
そうか、webアプリじゃなくてもCGI.pmって使おうと思えば使えるのか。
414デフォルトの名無しさん:2011/10/04(火) 01:07:09.48
>>413
そこまでして使う別用途はちょっととっさには思いつかないけどな
415デフォルトの名無しさん:2011/10/04(火) 10:47:53.26
板チのつもりはなかったのですが、CGIの仕様だったんですね。
ありがとうございます。
416デフォルトの名無しさん:2011/10/04(火) 23:38:26.94
CGIとCGI.pmがごっちゃになってる奴たまにいるね
417デフォルトの名無しさん:2011/10/05(水) 01:14:53.90
たとえばPerlスクリプトが$ENV{HTTP_REFERER}を期待していた場合、そのPerlスクリプトは、
CGIに依存してる。

use CGI;はCGIに依存してる。
418デフォルトの名無しさん:2011/10/05(水) 01:36:36.57
test.datファイルの一番上に新しい行を追加してtmp.datに一行ずつ書き込むのは
このようなやり方で問題ないんでしょうか?
$new_line = "新規投稿\n";

open(IN,"test.dat");
open(OUT,">tmp.dat");
print OUT $new_line;

while($line = <IN>){
print OUT $line;
}

close(OUT);
close(IN);
419デフォルトの名無しさん:2011/10/05(水) 02:17:53.88
>>417
いや、普通に環境変数に値入れて渡せばいいだけだよw
420デフォルトの名無しさん:2011/10/05(水) 04:05:50.11
>>418
基本的にはそれでいいと思う。
実際に運用するには細かい部分でもっと気を使う必要があるが、状況による。

別の考え方としては、test.datファイルの末尾に新しい行を追加していって、
データを実際に使う時には逆順に使う、という方法もありうる。
ファイル末尾に追加する処理の方がずっと楽だからね。
421デフォルトの名無しさん:2011/10/05(水) 04:08:22.13
まあ、俺なら遅い<IN>なんてのは使わないが。
422デフォルトの名無しさん:2011/10/05(水) 04:09:03.52
>>417
CGIに依存してる、ってのは変な物の言い方だなあ。
例えば、Perlスクリプトの書き方はPerl処理系の仕様に依存してる、とは言わんだろ。ふつー。
423デフォルトの名無しさん:2011/10/05(水) 06:46:38.38
>>421
速いやり方教えて。わりとマジで。
424デフォルトの名無しさん:2011/10/05(水) 07:43:06.92
>>417は、CGIの意味を一から勉強し直した方がいいな。
425デフォルトの名無しさん:2011/10/05(水) 09:49:43.64
>>418
open()にエラートラップ付けてくれ。
スクリプトが正常に動いてるのに、ファイルに何も書き込まれません!という質問は飽きた。
426デフォルトの名無しさん:2011/10/05(水) 10:33:28.73
print OUT {local$/; <IN>};
427デフォルトの名無しさん:2011/10/05(水) 10:57:57.76
>>426
なんだそりゃ。
428デフォルトの名無しさん:2011/10/05(水) 12:17:49.37
どうはdoしたんだ
429デフォルトの名無しさん:2011/10/05(水) 13:21:47.21
これが、真の駄洒落か。
430デフォルトの名無しさん:2011/10/05(水) 13:30:16.67
どうはのひげき
431デフォルトの名無しさん:2011/10/05(水) 14:43:38.84
毎回、ファイルハンドルが裸ワードなのは、ググって出てくるサイトが悪いんだろなぁ。ローカル変数にしておけばいちいちclose書かなくていいし便利だよ。

>>418
一行ずつ読み込んで一行ずつ書き込むのが遅いっていわれてるんじゃない。
一行読み込むたびに、文字列結合していって、書き込みは1回にする。
>>426 がlocal $/;ってやってるのは、「一行」の定義を改行からundefにすることで、whileで一行ずつ回さなくても$text = <IN>;だけで全文読み取れるようにしてる。

こんなんでどうでしょ。
#!/usr/bin/env perl
use strict;
use warnings;

my $new_line = "新規投稿¥n";
my $in_file = 'test.dat';
my $out_file = 'tmp.dat';

my $read_text = do {
open my $in_fh, '<', $in_file or die "error $in_file";
local $/;
<$in_fh>;
};

open my $out_fh, '>', $out_file or die "error $out_file";
print {$out_fh} $new_line.$read_text;
432デフォルトの名無しさん:2011/10/05(水) 15:47:46.54
んーと、ファイルハンドルをローカル変数にしてもcloseは明示的にやらないとファイル閉じないんじゃなかったっけ?
433デフォルトの名無しさん:2011/10/05(水) 16:41:25.67
グローバルなファイルハンドル消滅しろってのは賛成だが、
レキシカルとローカルの区別も正確にしようぜ。

ファイルハンドルは REFCNT がゼロになった時点で自動で閉じられる。
が、それだと close 時のエラーをハンドルできないことに注意する必要がある。
自動クローズだと autodie (Fatal) も働かないので、
常に close $fh or die "can't close: $!"; (autodie 使うなら close $fh; だけでいい)などとするのがベターだと思う。
434431:2011/10/05(水) 16:45:02.73
slurp使えばいいか。
use File::Slurp qw/ slurp write_file /;

my $new_line = "新規投稿¥n";
my $in_file = 'test.dat';
my $out_file = 'tmp.dat';

write_file($out_file, $new_line.(slurp($in_file)) );
435デフォルトの名無しさん:2011/10/05(水) 16:52:54.80
クローズのエラー処理か、なるほど。

ローカルっていっちゃうと、
local 変数名;
のことを指してる風な発言になってしまうのかな?

if(...){ my $hoge;} はレキシカル変数って呼ばないといけないのか。
436デフォルトの名無しさん:2011/10/05(水) 18:32:00.04
>>434
わざわざCPANモジュール入れなくても、
この目的だったらcore moduleのTie::Fileでいいんじゃね?
use Tie::File;
tie my @array, 'Tie::File', 'hoge.txt' or die ;
unshift @array "新規投稿\n" ;
untie @array ;

2万行程度だったら苦痛にならない速度だし。
437デフォルトの名無しさん:2011/10/05(水) 20:25:41.05
それがモダンなやり方なんだな。
438デフォルトの名無しさん:2011/10/05(水) 20:44:34.54
core module 使うのがモダンな訳無いじゃん。
% perl -MModule::CoreList -le 'print Module::CoreList->first_release_by_date( q{Tie::File} )'
5.007003
% perldoc perlhist
>5.7.3 2002-Mar-05

モダンなやり方だったら、log取り専用のモジュールがあるだろ。
439デフォルトの名無しさん:2011/10/05(水) 20:47:17.69
>>436
あれ、標準モジュールでなかったけ
440デフォルトの名無しさん:2011/10/05(水) 20:51:52.19
>>438
モダンの意味わかってる?

今のやり方=モダンなんだよ。
441439:2011/10/05(水) 20:55:09.24
ちがうね。
442デフォルトの名無しさん:2011/10/05(水) 20:55:22.23
だから古いやり方だっつってんの。

>>439
perl5.10以降の人ならModule::CoreListで確認取れる。
% perl -MModule::CoreList -le 'print Module::CoreList->find_modules( qr/Slurp/ )'
443デフォルトの名無しさん:2011/10/05(水) 20:57:19.99
じゃあ最初から、古いやり方と断ってから書いてください。
でないと、いつまでたっても成長できないでしょ。
444デフォルトの名無しさん:2011/10/05(水) 21:00:07.72
成長w
445デフォルトの名無しさん:2011/10/05(水) 21:31:30.03
perlfaq5にそのままなのがあるのな。
ファイルの一行を変更する/ファイルのある行を削除する/ファイルの中程で一行挿入する/ファイルの先頭に追加するには?
http://perldoc.jp/docs/perl/5.10.1/perlfaq5.pod#How32do32I32change44delete44or32insert32a32line32in32a32file44or32append32to32the32beginning32of32a32file63
446デフォルトの名無しさん:2011/10/05(水) 21:41:44.02
ホワイトスミスとバナースタイルなんて、perlで使う人がいたんだ…
別の意味で感動した
447デフォルトの名無しさん:2011/10/05(水) 22:30:23.70
>>444
なぜ成長がおかしいの?
頑張るとか勉強するとか鼻で笑うタイプ?
448デフォルトの名無しさん:2011/10/05(水) 22:32:43.80
なんかモダンモダン言うてる奴は用もないのにモジュール使いたがるってことはわかった。
>>445のperldocのがいっちゃんわかりやすくてええな。
449デフォルトの名無しさん:2011/10/05(水) 22:44:35.22
>>447
自力で調べる事しない奴が成長って言うなよw

450デフォルトの名無しさん:2011/10/05(水) 23:34:26.68
417どっかで見たと思ったらWebProgにあったわ
http://hibari.2ch.net/test/read.cgi/php/1030548610/227-
CGIをPerlという意味で使っている人も昔は結構いたし誤解されやすいのかな。
451デフォルトの名無しさん:2011/10/05(水) 23:52:27.89
>>450
> CGIをPerlという意味で使っている人も昔は結構いたし
それとはまたちょっと違う気がするが。
452デフォルトの名無しさん:2011/10/06(木) 01:35:29.31
古いか古くないかはどうでもよくて、やりたいと思っている
ことができるのかどうかがまず大事。その上で、実装が分かり
やすいのかどうかが次の焦点になる。
一般的には古くからある機能はシンプルなので分かりやすい。

新しい実装は、必要もないのにごちゃごちゃしていて分かりに
くいし、遅かったりもする。実行するためのコンピュータも
高性能でないといけないのでいつでも使えるソリューション
とはいえない。
453デフォルトの名無しさん:2011/10/06(木) 07:05:39.85
>>452
…という傾向は確かにあるな。
454デフォルトの名無しさん:2011/10/06(木) 08:12:17.81
>>446
他のスタイルをつかうってこと?それともインデント自体がめずらしいって意味?w
455デフォルトの名無しさん:2011/10/06(木) 08:48:03.79
while(<OUT>)
    {
    print OUT;
    }


このスタイルは珍しいと思うけどな
珍しくなったのは使われないからで、なんで使われないかと言えば、
この方法を誰もがダメと思っているか、それとももっといい方法があるか、のどっちかか?
個人的にはなんとなくダサい気がする
456デフォルトの名無しさん:2011/10/06(木) 08:55:55.05
Haskellでそんな感じのスタイルで書いたことがある
閉じブレースが行頭に来ないのでオフサイドルールのある言語向けかも
457デフォルトの名無しさん:2011/10/07(金) 22:46:31.78
open(IN,$file);でファイルを開く場合
必ずしも開けなかった場合の例外処理をする必要はないですよね?

開けなかった場合はファイルを作るというようにしたいんですが
開けなかったらプログラム終了だと先に進まないから
458デフォルトの名無しさん:2011/10/07(金) 23:21:32.65
もしファイルが作れなかったらどうするのっと
459デフォルトの名無しさん:2011/10/07(金) 23:52:07.70
>>458
open(IN,$file);の方では例外処理はしなくて
open(OUT,$file);の方で例外処理をすればいいと思いますが
問題ありますか?
460デフォルトの名無しさん:2011/10/07(金) 23:53:30.07
open(OUT,">$file");です
461デフォルトの名無しさん:2011/10/07(金) 23:59:01.90
そもそもPerlには開けなかったらdieするモジュール無いの?
462デフォルトの名無しさん:2011/10/08(土) 00:15:00.78
463デフォルトの名無しさん:2011/10/08(土) 01:00:36.52
open (IN, $file) || die($!);

if (-e $file) { open (IN, $file); }
464デフォルトの名無しさん:2011/10/08(土) 01:11:48.46
>>463
下は間違い
465デフォルトの名無しさん:2011/10/08(土) 01:33:39.34
>>461
それしたらファイルがないときプログラム終了しちゃうじゃん
ファイルが存在しないときはファイルを作る
ファイルがあるときはそのファイルの最後の行に書き込みしたいんです
466デフォルトの名無しさん:2011/10/08(土) 01:36:50.50
>>465
エラーぐらいトラップしろよ。
467デフォルトの名無しさん:2011/10/08(土) 03:19:41.60
468デフォルトの名無しさん:2011/10/08(土) 04:44:52.68
>>464
あれ?間違ってる?
あれば開く。これで行けると思うけど
469デフォルトの名無しさん:2011/10/08(土) 05:02:48.92
横槍ですまんが
perl -e "print -e qq/./"
1
だそうで
470デフォルトの名無しさん:2011/10/08(土) 06:13:26.51
そういう事か〜
$fileの中がユーザーから貰う値なら危険だな

if (-e $file && -f $file) { open (IN, $file); }

これならどうだ
471デフォルトの名無しさん:2011/10/08(土) 08:26:13.99
>>470
ファイルが存在したら、必ずopenできるんかい?
472デフォルトの名無しさん:2011/10/08(土) 08:36:59.84
ああなんかもういろんな意味で高度すぎてついていけないw
473デフォルトの名無しさん:2011/10/08(土) 09:13:00.35
>>471
どういう事なの?
用意されてるファイルじゃないの?
読み込めないようなファイルを置いている環境なの?
シチュがわからんが・・・

if (-e $file && -f $file && -r $file) { open (IN, $file); }

何か、どんどん冗長的な感じになってきたけど・・・
474デフォルトの名無しさん:2011/10/08(土) 09:27:49.29
横からだけどファイルの存在確認と実際に開くまでの間に
ファイル消された場合なんかが典型的では
475デフォルトの名無しさん:2011/10/08(土) 09:35:45.54
>>474
正解。

エラーが出ることがあるから、先にチェックしてようという
アプローチは(無意味とは言わないが)完璧ではない。
476デフォルトの名無しさん:2011/10/08(土) 09:42:55.02
・・・・・。

until (mkdir("./lock")) { sleep(1); }
if (-e $file && -f $file && -r $file) { open (IN, $file); }
rmdir("./lock");
477デフォルトの名無しさん:2011/10/08(土) 09:43:31.50
flockと吐いた処理とトランザクションで頭がパーン
478デフォルトの名無しさん:2011/10/08(土) 09:46:44.57
いろいろ言われる前に対策しておこう
・・・ってか、どういうシチュかがわからん
もっと別で対策できそうだけど・・・

my $count = 0;
until (mkdir("./lock")) {
  if (++$count > 5) { exit; }
  sleep(1);
}
if (-e $file && -f $file && -r $file) { open (IN, $file); }
rmdir("./lock");
479デフォルトの名無しさん:2011/10/08(土) 09:59:27.03
>>478
これだけ言われても分からんのか?
なぜopenの戻り値をチェックしようとしない?
480デフォルトの名無しさん:2011/10/08(土) 10:03:42.27
>>479
言い訳じゃないけど、>>463の2番目の方法で、
ダメだと言われたから、その流れでこんな状態になったんだけどね

んじゃこれで。
open(IN, $file) || &error();
481デフォルトの名無しさん:2011/10/08(土) 10:09:58.18
いまさら>>457に回答すると、

> open(IN,$file);でファイルを開く場合
> 必ずしも開けなかった場合の例外処理をする必要はないですよね?

必要はある。
ファイルが開けない以外でも、予期せぬエラーが発生した場合に、そのまま後の処理を続けるべきではないから。

> 開けなかった場合はファイルを作るというようにしたいんですが
> 開けなかったらプログラム終了だと先に進まないから

ファイルの存在如何によって処理の内容を変える場合は、
open ではなくファイルテスト演算子(-e など)で条件分岐させる。
ファイルテストが通ったにもかかわらず実際に open した時にエラーが出るのなら、
仕様として想定していない事態が起こっているのだと考え、
やはりそこで実行を中止させて何が起こったのか($! の内容)を確認するべき。
482デフォルトの名無しさん:2011/10/08(土) 12:08:37.64
> 必ずしも開けなかった場合の例外処理をする必要はないですよね?
考え方が逆だと思うが
正常に開けた場合に限って処理を続行する、だろ
483デフォルトの名無しさん:2011/10/08(土) 13:32:11.40
if( !open(IN,"test.dat") ){
#test.datを開けなかった場合test.datを作ってプログラム終了
open(OUT,">test.dat");
close(OUT);
print "error";
exit(0);
}
#test.datを開けた場合は以下の処理
@lines = <IN>;
push(@lines,"新しい行\n");

open(OUT,">test.dat");
foreach(@lines){
print OUT $_;
}
close(OUT);

close(IN);

これでいいだろ
484デフォルトの名無しさん:2011/10/08(土) 13:37:32.28
さすがにそれでは良くねーわ
485デフォルトの名無しさん:2011/10/08(土) 13:37:39.82
>>483
だめ。

> }
> #test.datを開けた場合は以下の処理
> @lines = <IN>;
> push(@lines,"新しい行\n");
>
> open(OUT,">test.dat");         ← ここでopenできなかった場合の処理が抜けている。
> foreach(@lines){
486デフォルトの名無しさん:2011/10/08(土) 13:42:11.93
いや、まてお前ら、 よくわからんが、 >>467 に書いてある内容で何か足りないのか。
、、、、、ところで >>467 の切り詰めるってどういう意味ですか
487486:2011/10/08(土) 13:46:58.79
今の流れって、エラーハンドリングする正解は分かってるけど、自分で理解したいからこういう流れになってるだけ?それとも天邪鬼か。
488デフォルトの名無しさん:2011/10/08(土) 13:50:37.60
原文で「切り詰め」に対応する動詞は1段落目のが truncate で3段落目は clobber
この場合は一部じゃなく全部をすっかり消して上書きするってことだからこの訳は微妙だな
489デフォルトの名無しさん:2011/10/08(土) 13:51:52.18
とりあえず>>483が全体的に残念なコードだということは言える
490デフォルトの名無しさん:2011/10/08(土) 14:51:06.16
>>488 なるほど、ありがとう。

また質問なんだけど、
ファイルの1行に単語とその出現回数などが書かれているデータがあって、それを読み込んで木を作成してる。
んで、ファイル全行を読み込むのはメモリ食うからダメかなと思うんだけど、
1単語ごとにmake_tree($word)みたいな関数を呼ぶのもオーバーヘッド過ぎるのでは、と思う。
だから以下のように100行ずつ読み込むといったことがしたいのだけど、簡潔な書き方はないでしょうか。
whileの条件式の中にまとめて読む行数を指定できれば読み易そうなんですが。

my @line;
while (<$IN>) {
push @line, $_;
if ($. % 100 == 0) {
make_tree(\@line);
@line = ();
}
}

ただ問題解決の方向性自体が間違ってる感もあるので、合わせて募集。板チだろうか。
491デフォルトの名無しさん:2011/10/08(土) 15:18:11.56
そんな技巧に走って、
「ファイルの総行数が 115行だったら、15行make_tree走査しないじゃん。
しゃーないから eof 条件に追加。」

if ( $. % 100 == 0 or eof ){


とかするくらいだったら、普通にコード走らしたら?
後、実際にBenchmark取れ。

492デフォルトの名無しさん:2011/10/08(土) 15:36:41.44
493デフォルトの名無しさん:2011/10/08(土) 16:00:35.30
お前さん、
そのDevel::DProfなりDevel::NYTProfなり、常用してんのか?
494デフォルトの名無しさん:2011/10/08(土) 16:35:36.14
おぉ、ありがとう。NYTProfは1週間くらい前に初めて触ったってくらい。Tie::Fileは使ったことなかった。
ちょっと出直してきます。

perldocのFAQは全部読んでおいたほうがいいですね、すげぇ。
495デフォルトの名無しさん:2011/10/08(土) 18:08:08.71
>>485

if( !open(IN,"test.dat") ){
  #test.datを開けなかった場合test.datを作ってプログラム終了
  if( !open(OUT,">test.dat") ){
      print "書き込みerror";
      exit(0);    
  }
  close(OUT);
  print "error";
  exit(0);
}
#test.datを開けた場合は以下の処理
@lines = <IN>;
push(@lines,"新しい行\n");

if( !open(OUT,">test.dat") ){
   print "書き込みerroer";
   exit(0);
}
foreach(@lines){
   print OUT $_;
}
close(OUT);
close(IN);

書き込み部分のopenのエラー処理もしたぞ
ファイルロックとかは考えなければこれで完璧だろ?
496デフォルトの名無しさん:2011/10/08(土) 18:30:33.66
こんなのでどうだろう

open(OUT, ">>", "test.dat") or die "cannot open/create `test.dat': $!";
print OUT "NEW LINE\n";
close(OUT);
497デフォルトの名無しさん:2011/10/08(土) 19:10:34.46
>>496
それだとwindows環境で使えない
498デフォルトの名無しさん:2011/10/08(土) 19:29:01.42
排他処理(file lock)してないけどええのん?
499デフォルトの名無しさん:2011/10/08(土) 19:39:24.81
>>496
printのエラー処理が抜けてる
500デフォルトの名無しさん:2011/10/08(土) 19:44:56.13
>>499
をい。
501デフォルトの名無しさん:2011/10/08(土) 19:55:20.65
あれ、いつのまにかtmp.datがどこかに行っちゃってるぞ?
502デフォルトの名無しさん:2011/10/08(土) 20:24:59.80
>>465からじゃないか
503デフォルトの名無しさん:2011/10/08(土) 22:42:52.49
>>500
結構見落としがちだけど、出力先の空きがなくなったりすることもある
504デフォルトの名無しさん:2011/10/09(日) 00:39:52.91
>>503
へぇー、なるほど
505デフォルトの名無しさん:2011/10/09(日) 01:21:29.90
forとforeachって名前が違うだけってのは知ってるんだけど、どう使いわけてる?
プログラミングPerlには名前が短いから常にforを使うっていう記述がおそらくギャクで書いてあるんだけど。
506505:2011/10/09(日) 01:24:09.43
forはCループ形式で、foreachはforeach (@hoge)とかforeach (keys %hoge)
でも後置のときはforで書いてるな。見かけるサンプルがそうだったからだと思う。
507デフォルトの名無しさん:2011/10/09(日) 01:52:22.55
出力時は close のエラーチェックも print と同じかそれ以上に大事だよ。
というか原則的にはこう↓
> ・われわれが3回繰り返すことは真実である:
>    システムコールの戻り値は必ずチェックせよ。
>    システムコールの戻り値は必ずチェックせよ。
>    システムコールの戻り値は 必 ず チ ェ ッ ク せ よ!
(青ラクダ本第 3 版「24.3 プログラミングの書法」)

実際には die, <> のようにチェックできない・チェックすると
不自然なコードになるケースもあると思うけど。
508デフォルトの名無しさん:2011/10/09(日) 01:57:09.65
例外があれば、そのめんどくささから
解放されるのにね。
509デフォルトの名無しさん:2011/10/09(日) 02:00:14.19
>>505
常にfor。
自分が昔書いた古いスクリプトにforeachを見つけると全部forに直すくらいfor。
510デフォルトの名無しさん:2011/10/09(日) 06:32:36.33
>>505
常にfor
Cタイプのforを使う意味が無いから、使い分け自体が成立しない。

509氏の真似じゃないけど、
自分が昔書いた古いスクリプトにCタイプのforが書かれてると、全部書き直す。
もちろんforeachもforに。
511デフォルトの名無しさん:2011/10/09(日) 07:07:45.04
Cタイプforじゃないと困る場面はそれなりにあると思うが
512デフォルトの名無しさん:2011/10/09(日) 07:15:54.94
無い。
until EXPRと同じレベル。
513デフォルトの名無しさん:2011/10/09(日) 07:30:57.01
foreachの所を、for使うって、まさか、 for my $v (@ary) { ... } とかってしてるの?
だとしたら、俺的には信じられない・・・

for (my $i=0; $i<scaler @ary; $i++) { ... } とかなら良いけど。
514デフォルトの名無しさん:2011/10/09(日) 07:43:21.31
for my $i ( 0 .. $#ary ){ … }
515デフォルトの名無しさん:2011/10/09(日) 07:43:22.23
>>512
for (my $i = 1; $i <= $max; $i += 2) { ... }
こういうのもforeachか何かに書き換えるの?

for my $i (grep { $_ % 2 } 1..$max) { ... }
for my $i (1..($max+1)/2) { $i = $i*2-1; ... }
とか?

>>513
信じられなくても、perldoc等でもそれが普通に使われてるのが現実。
516デフォルトの名無しさん:2011/10/09(日) 07:48:45.92
・・・ぱ・ぱ・ぱぱっぱ・Perl Rice (゚д゚)
517デフォルトの名無しさん:2011/10/09(日) 08:01:50.51
>>515
my $i = 0 ;
while ( $i <= $max ){
 $i += 2;
}
518デフォルトの名無しさん:2011/10/09(日) 08:57:53.95
>>510
増分がマイナスの時とか制御変数が複数あると便利な時にはCタイプのforループは普通に使うよん。
Perl脳で見るとなんかPerlっぽくないな〜とつい思っちゃうけど、使うことは使う。
519デフォルトの名無しさん:2011/10/09(日) 09:03:21.54
>>517
そりゃforと同じことをwhileでも書けるのは当たり前、
というかwhileを実用に即して糖衣構文化したものがforなのに、
forが適任の場面でそれをあえて使わずにwhile使えというのは主客転倒だろ。
ネタで言ってるんだと信じたいものだが。

あと、それだと$iのスコープが限定されないから、
forと全く同じにするにはさらに全体をブロックで囲む必要がある。
520デフォルトの名無しさん:2011/10/09(日) 09:11:49.04
>というかwhileを実用に即して糖衣構文化したものがforなのに、
答え出てんじゃん。Cのforにしなくて良いじゃんw
#実用云々は違うだろ。Cに慣れた人の為のfor(;;){}なんだから。

>あと、それだと$iのスコープが限定されないから、
>forと全く同じにするにはさらに全体をブロックで囲む必要がある。
これは同意。

PBP信者が喜ぶけど、PBP読んでからレスした方がいらん恥は書かんで済むよ。
521デフォルトの名無しさん:2011/10/09(日) 09:14:30.49
for( my $i = 0 ; my $j = 0; $i < 10 and $j < 10 ; $i ++ ; $j ++ ){ }
狂気の沙汰だ
522デフォルトの名無しさん:2011/10/09(日) 09:15:07.14
違うわ、
for( my $i = 0 ; my $j = 0; $i < 10 and $j < 10 ; $i ++ and $j ++ ){ }
か?
523デフォルトの名無しさん:2011/10/09(日) 09:15:37.41
違った。もういい
524デフォルトの名無しさん:2011/10/09(日) 09:22:39.98
for (my ($i, $j) = (0, 0); $i<10 && $j<10; $i++,$j++)
525デフォルトの名無しさん:2011/10/09(日) 09:31:14.49
unless,until,do-while,Cスタイルforは使用禁止。
for,whileのポストフィクス禁止。

ねーよ > PBP
526デフォルトの名無しさん:2011/10/09(日) 09:38:23.48
>>520
すまん、糖衣構文の話はそもそも「Cの」while(>>517)とfor(>>515の上)について言ったつもりだ。

俺は場合によって最善手を選べばいいと考えているだけで、
for (LIST) で綺麗に書けるようならもちろんそれを使うよ。
ただし、>>515とか>>518のような場合なら for (;;) を使うこともある。
ちなみにPBPは一応持ってます。
527デフォルトの名無しさん:2011/10/09(日) 09:42:01.68
前にもこのスレで書いたけど、
ループで扱う数がデカ過ぎるときとかは
Cタイプ for 使う事あるよ

for ( my $i = 2; $i <= 600851475143; $i++ ) { ... }
528デフォルトの名無しさん:2011/10/09(日) 09:49:41.92
>>512
まだ経験が浅いようだねw
529デフォルトの名無しさん:2011/10/09(日) 09:54:19.81
その、Cタイプforってなんなの?
530デフォルトの名無しさん:2011/10/09(日) 10:08:46.08
perlのwhile,until,for(;;)はシンタックスシュガー(微妙に違うけど)
なんだから、for(;;)完全排除出来て当たり前
それをするかしないかは、個人の勝手

何でこんなに議論になる?
つーか極端な話、whileすら排除出来るけど(読み易さを犠牲にすれば)。
531デフォルトの名無しさん:2011/10/09(日) 10:23:49.20
>>530
まったく。goto文さえあればwhileもforもuntilも不要になっちゃうもんな。
532デフォルトの名無しさん:2011/10/09(日) 10:24:45.50
gotoも必要無いだろ、LOOPに限れば
533デフォルトの名無しさん:2011/10/09(日) 10:40:16.63
>>532
kwsk
534デフォルトの名無しさん:2011/10/09(日) 12:23:56.16
10ループ程度なら直接書けばいいのさ
535デフォルトの名無しさん:2011/10/09(日) 13:33:06.78
再帰…
536デフォルトの名無しさん:2011/10/09(日) 13:36:25.71
perl -le '{ print +$i++; redo if $i <= 9;}'
537デフォルトの名無しさん:2011/10/09(日) 13:51:04.96
俺はCスタイルfor、foreachスタイルの両方を使うなあ。
単純にn〜mまで繰り返すとかならforeach(n..m)でやるけど
Cスタイルは結構特殊な挙動を取らせたりできるからね。
まあwhileに書き直すことも勿論できるけどさ
538505:2011/10/09(日) 14:09:39.68
なるほどねー、まぁどっちでもいい感じですか。
ただCスタイルよりは for my $i (1..100) のほうが速かった。
539デフォルトの名無しさん:2011/10/09(日) 14:35:11.34
>>519
{
my $i
while (){
}
}
って書くのは面倒臭いね。ファイルを読み込むときはforじゃなくてwhile使うから、$iが必要なときはこう書かなきゃいけないけど。

>>520
PBPはかなり熟読したけど、whileとforの使い分けはできてないな。気にはしてるけど。
for
固定回数ループのとき
反復カウントや、条件式が1つのとき
反復カウントがインクリメントのとき
while
不規則にカウントされるもの
反復カウント変数や、条件式が2つ以上のとき
反復カウントがデクリメントされるとき

reverse 0 .. 100 でデクリメントするとか忘れてた。
540538:2011/10/09(日) 14:49:15.57
ぉぉ、聞いてくれ、
for (my $i=0; $i<@ary; $i++) { print $i };
for my $i (0 .. $#ary) { print $i };
Deparse,-x7で前者はwhileになるが、後者はforeachに変換された。
541デフォルトの名無しさん:2011/10/09(日) 14:58:43.84
>>540
変換もなにも、後者はforeachそのもののような
542デフォルトの名無しさん:2011/10/09(日) 15:18:15.36
配列を頭から走査して、条件に合わない要素を配列から削除したい。
どうしたら格好よく書けるの?
for文で普通に書いたら当たり前のようにバグった。
543デフォルトの名無しさん:2011/10/09(日) 15:21:53.64
>>542
バグがでたからって小手先のテクニックに頼ろうとするな。

単にお前が技術力が低いだけだ。コード書いて練習しろ
それぐらいfor文でもバグ無しで書けるようになれ。

例えば、配列の中の数字が7の倍数の時だけ削除する。などのような
簡単なものを実装してみ。
544デフォルトの名無しさん:2011/10/09(日) 15:23:39.30
>>542
@array = grep ! 条件に合致, @array;
545デフォルトの名無しさん:2011/10/09(日) 15:33:00.34
% perldoc perlsyn
>If any part of LIST is an array, "foreach" will get very confused if
>you add or remove elements within the loop body, for example with
>"splice". So don’t do that.

普通にgrep使え
普通に新規配列作れ
546デフォルトの名無しさん:2011/10/09(日) 15:58:33.79
>>541
そうなんだ、、、、

>>542
とりあえずソース。


先頭にスペース入れるのはどうやってるんだ。全角スペースとかか。
テスト
 for
for
547デフォルトの名無しさん:2011/10/09(日) 15:59:55.41
>>545
> 普通にgrep使え
> 普通に新規配列作れ

grepを使うか、またはforeachを使うなら新規配列を作れ、ってことですね。
548デフォルトの名無しさん:2011/10/09(日) 16:07:52.27
>>546
全角スペースでもいいし&nbsp;でもいい
549デフォルトの名無しさん:2011/10/09(日) 16:09:40.81
B::Deparseの出力特性で-x LEVELの指定が無くても、
foreach(huge;foo;bar)はforで、
for(@arr)はforeachで、
for(;;){}(無限ループ)はwhile(1){}で
表示される。
% perl -MO=Deparse -le 'foreach(;;){} for(1){} foreach($i;1;){}'
BEGIN { $/ = "\n"; $\ = "\n"; }
while (1) {
 ();
}
foreach $_ (1) {
 ();
}
for ($i; ;) {
 ();
}
-e syntax OK

>>547
そう。

尻から走査していいなら、perlsynに背いてsplice使う事も出来るけど。
小手先に走らんでも良かろ。
550デフォルトの名無しさん:2011/10/11(火) 20:25:25.99
重複しないIDの作成って

$time = time;
$ID = $time.$$;で問題ないんですか?
551デフォルトの名無しさん:2011/10/11(火) 21:33:52.02
ある1台のマシンのみで、1プロセスごとに1つだけのIDを生成するものだとして、
1秒以内にPIDが一巡する可能性がなくて、
運用中にマシンの時刻を修正する可能性もなくて、
"1234567890"."12345" と "12345678901"."2345" のような衝突が起こりうるほど長く運用する可能性もない、
という条件が確実に満たされるのであればなかなか重複しなさそうには見える。
552デフォルトの名無しさん:2011/10/11(火) 21:42:28.36
ttp://katsubemakito.net/cgiperl/cgi/id-perl-id-sha1md5.html

use Digest::SHA1 qw(sha1_hex);

print genUniqID();

#----------------------------------------------#
#■ユニークなIDを生成する
#----------------------------------------------#
sub genUniqID{
my $seed = shift || 'seed-string';
my $id = join(''
, $ENV{'REMOTE_ADDR'}
, $ENV{'HTTP_USER_AGENT'}
, time
, $$
, rand(9999)
, $seed
);

return(sha1_hex($id));
}

だってさ
553デフォルトの名無しさん:2011/10/11(火) 23:31:56.35
DBIからのSqlサーバへの接続方法をご教示下さい。
質問場所がここじゃなかったら誘導お願いします。

以下の環境を作成し、
コマンドプロンプトからtest.plをCALLしたのですが
SQLサーバがないとのエラーが表示され、接続出来ませんでした。
値を色々変えてみたりしたのですがどうやっても接続できず…
何が悪いのかお手上げ状態です。

接続文字列が悪いのでしょうか…?

ODBCでの接続は行えており、CSEからのDB参照や
コマンドプロンプトからのsqlcmdコマンドでなら正常にアクセスできます。
[sqlcmd /E /S PC-Name\SQLEXPRESS]

環境
・Windows7
・Microsoft SQL Server 2008
・Perl5.0


Server:PC-Name\SQLEXPRESS
DB:sampleDB
User:user
Password:pass

554デフォルトの名無しさん:2011/10/11(火) 23:33:22.15
-----------------------
test.pl
-----------------------
$dataSource = "dbi:ODBC:".
"driver={SQL Server};".
"Server=(local);" .
"database=sampleDB;".
"Trusted_Connection=yes;".
"AutoTranslate=No;";

#データベースに接続
$user="user"; #ユーザ名
$pwd="pass"; #パスワード

$dbh = DBI->connect($dataSource,$user,$pwd)
or die $DBI::errstr;
# データアクセス(今は処理無し)
$dbh->disconnect;
-----------------------
エラー内容
-----------------------
DBI connect('driver={SQL Server};Server=(local);database=sampleDB;Trusted_Connec
tion=yes;AutoTranslate=No;','user',...) failed: [Microsoft][ODBC SQL Server Driver
][Shared Memory]SQL Server が存在しないか、アクセスが拒否されました。 (SQL-08001
) [state was 08001 now 01000]
[Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S
QL-01000) at dbtst.pl line 28
[Microsoft][ODBC SQL Server Driver][Shared Memory]SQL Server が存在しないか、ア
クセスが拒否されました。 (SQL-08001) [state was 08001 now 01000]
[Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S
QL-01000) at dbtst.pl line 28.
555sage:2011/10/11(火) 23:35:01.98
↑す、すみません。ここじゃないですね。
初心者版に書くつもりで間違えてました(><;
上二件、見なかった事にして下さい;;
556デフォルトの名無しさん:2011/10/12(水) 17:18:33.94
>>550
サーバサイドで外からのアクセスに対してユニークID を与える場合だと
Data::UUID 使うと良いんじゃね?
557デフォルトの名無しさん:2011/10/12(水) 17:20:50.95
物販サイトでそんなID与えてたらソッコーでカネが抜かれる
558デフォルトの名無しさん:2011/10/12(水) 17:23:28.34
my $count = (() = $str =~ /はてな/g);

これで$strの中の「はてな」の数を数えられるらしいんだけど
何が起きてるのか分かりますでしょうか?頭がおかしくなりそうです
559デフォルトの名無しさん:2011/10/12(水) 17:25:57.26
$str =~ /はてな/g
の返り血はリスト、配列。
リストを明示的にスカラーにすれば言うことなしだな
リストをスカラーに=でつなげば文脈で判断してリストの要素の個数が戻り値になる
560デフォルトの名無しさん:2011/10/12(水) 17:31:21.08
>>559
はやいっ!ありがとうございました!

配列をスカラー変数に入れると、要素の個数がスカラー変数に入るとは恐るべし
561デフォルトの名無しさん:2011/10/12(水) 17:32:49.03
>>559
ズバッ!! ブビュッ!! って感じだね。
> 返り血
562デフォルトの名無しさん:2011/10/12(水) 18:16:57.59
スカラーコンテキストでは、真偽値を返し(スカラに対する直接の//gの効能は無し)、
リストコンテキストでは正規表現に当った値を返す。
返り値がリストに固定されているんだったら、()=なんて真似はせずに済む。

my $str = 223 ;
printf "%s\n", scalar $str =~ /2/g ; # => 1
printf "%s\n", pos $str ; # => 1
printf "%s\n", scalar $str =~ /2/g ; # => 1
printf "%s\n", pos $str; # => 2
printf "%s\n", scalar $str =~ /2/g ; # => ''
printf "%s\n", pos $str ; # => undef

当然知ってて省略してるんだと思うが一応。
563デフォルトの名無しさん:2011/10/12(水) 18:18:01.92
×リストコンテキストでは正規表現に当った値を返す。
◯リストコンテキストでは正規表現に当った値をリストにして返す。
564デフォルトの名無しさん:2011/10/12(水) 18:26:24.90
質問です
Parl忍者をアク禁にしてください
565デフォルトの名無しさん:2011/10/12(水) 18:27:04.20
質問です
Perl忍者をアク禁にしてください
566デフォルトの名無しさん:2011/10/12(水) 18:30:08.23
>>562
perlすげぇ!
567デフォルトの名無しさん:2011/10/13(木) 18:08:30.64
次のように書き込みファイルを先に開いて書き込むのと
open(OUT,">temp_test.dat");
print OUT "new_line\n";

open(IN,"test.dat");
while($line = <IN>){
print OUT $line;
}
close(IN);

close(OUT);

次のように読み込みファイルを先に開いて書き込むのではどちらがいいんですか?
open(IN,"test");
open(OUT,">tmp_test.dat");
print OUT "new_line\n";
while($line = <IN>){
print OUT $line;
}
close(OUT);
close(IN);
568デフォルトの名無しさん:2011/10/13(木) 18:20:12.32
569デフォルトの名無しさん:2011/10/13(木) 18:27:38.83
>>567
普通は読み込みファイルを開いてエラーがないときに
書き込みファイルを作るな。逆だとゴミファイルの
始末がめんどくさい。エラー処理を気にしない人は
どっちでもOK
570デフォルトの名無しさん:2011/10/13(木) 18:27:54.87
perldoc へのリンク*だけ*貼るの禁止ってテンプレに追加しとこうよ。なんかムカツク。
571デフォルトの名無しさん:2011/10/13(木) 18:56:37.37
なんかムカツクからと言われても全く同意も共感もできないんだが。
572デフォルトの名無しさん:2011/10/13(木) 19:28:22.31
570には同意できない…と書いた所でIDも出ない板だから意味ないか
573デフォルトの名無しさん:2011/10/13(木) 19:34:39.99
リンクだけ貼られても話が広げられんしなあ、
回答者の間違いやらに細かい突っ込みが入るところから
理解が広がる場合もあるのに、自ら放棄する行為だし

何より、他者の回答後に貼られて、
「はい、この質問はこれでしゅーりょー」
って言ってる、どや顔が浮んできもい
あのロシア人の超音波歌手みたいな、どや顔が。
574デフォルトの名無しさん:2011/10/13(木) 19:41:34.30
別に回答者は何人居ても構わないんだから、
好きな人が好きなスタイルで回答すればよかろ。

説明が足りないとおもったら、補足すればいいし。
575デフォルトの名無しさん:2011/10/13(木) 19:48:54.57
BOTまがいの行為の何が楽しいんだろ?とは思うけど
576デフォルトの名無しさん:2011/10/13(木) 20:03:27.48
Strawberry Perl 5.12.3 で Encode::Locale をインストールしようとしたんだけど、

C:\strawberry\perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0,
'blib\lib', 'blib\arch')" t/*.t
t/arg.t .. ok
t/env.t .. Subroutine Encode::Locale::GetACP redefined at (eval 5) line 2.
Dubious, test returned 253 (wstat 64768, 0xfd00)
Failed 6/13 subtests

とテストでコケるね、
Linux で書いたものを Windows で動作確認したかったんだけど困ったなあ。
577デフォルトの名無しさん:2011/10/13(木) 20:11:33.56
他の回答者への敬意がかんじられんし、
普段は質問側の人間だろ
578デフォルトの名無しさん:2011/10/13(木) 21:08:14.98
>>576
ActivePerl5.12.3でもCPAN経由では入らなかった。
たぶん、これかな。
https://rt.cpan.org/Public/Bug/Display.html?id=69256
579デフォルトの名無しさん:2011/10/13(木) 21:30:14.72
こんなのでムカツクのは「わからない5大理由」に当てはまっている奴だろうな
580デフォルトの名無しさん:2011/10/13(木) 21:37:22.60
空気読めない奴だな、おまけに読解力もねーし
581デフォルトの名無しさん:2011/10/13(木) 21:41:51.92
>>568
役に立つサイトなんだろうけど、横幅固定のデザインがうぜぇ
582デフォルトの名無しさん:2011/10/13(木) 23:17:42.23
すまん教えてくれ
MIME::Liteなんだが
Subjectに↓をセットしているのに(実際は、全角スペースは半角)
=?ISO-2022-JP?B?GyRCJCskTyQ/JE8kNSQrJCIkSiReJD8kSiRPJCskSiQ/JGQkSiRPGyhC?=
 =?ISO-2022-JP?B?GyRCJCskSiRPJEokKyQ/JEokTyRkGyhC?= - Google
 =?ISO-2022-JP?B?GyRCOCE6dxsoQg==?=

as_stringしてみると↓のように各行の頭にスペースが一個付けられてしまう
Subject: =?ISO-2022-JP?B?GyRCJCskTyQ/JE8kNSQrJCIkSiReJD8kSiRPJCskSiQ/JGQkSiRPGyhC?=
  =?ISO-2022-JP?B?GyRCJCskSiRPJEokKyQ/JEokTyRkGyhC?= - Google
  =?ISO-2022-JP?B?GyRCOCE6dxsoQg==?=

これのせいで受信側では余計なスペースが表示されてしまうんだがどうしたらいいんだ?
583デフォルトの名無しさん:2011/10/14(金) 01:49:57.68
openで開けない場合ってファイルが存在しない場合だけですか?

つまりif(!open(IN,"test.dat")){}と

unless(-e "test.dat"){}は同じことですか?
584デフォルトの名無しさん:2011/10/14(金) 01:55:22.73
>>583
ファイルロックがかかっている場合や、
パーミッションがなかった場合など
585デフォルトの名無しさん:2011/10/14(金) 05:08:46.68
>>582
Subjectに↓をセットしてみては。

=?ISO-2022-JP?B?GyRCJCskTyQ/JE8kNSQrJCIkSiReJD8kSiRPJCskSiQ/JGQkSiRPGyhC?=
=?ISO-2022-JP?B?GyRCJCskSiRPJEokKyQ/JEokTyRkGyhC?= - Google
=?ISO-2022-JP?B?GyRCOCE6dxsoQg==?=
586582:2011/10/14(金) 06:35:34.26
>>585
thx
まさかと思ったけどこれでうまくいった
でもなんか気持ちわるい
MIME::Liteはなぜスペース入れちゃうんだ?
587デフォルトの名無しさん:2011/10/14(金) 08:30:29.03
MIMEの仕様とかぜんぜん詳しくないけど、
そもそもメールのSubjectに改行が入ってる時点でなんか気持ち悪いんだが。
588デフォルトの名無しさん:2011/10/14(金) 08:37:44.23
メールはもともと、ただのテキストエディタでも
読めるように仕様が作られた。

日本語+MIMEメールじゃ読めたもんじゃないがw

だからメールは76文字ぐらいを超えると
読みやすさのために改行することを推奨している。

また140文字? かいくらか忘れたがを超えると
推奨じゃなくて改行しなさいという仕様。
589デフォルトの名無しさん:2011/10/14(金) 08:44:15.17
あと、英語だとスペース=単語の区切りで、改行入れるときは
単語の区切りにしとけよとか、複数のスペースは一つのスペースに
みなせるよね。英語だと。

じゃあ日本語はどうしろと?という問題もある。
590589:2011/10/14(金) 22:14:06.71
出社前にバタバタしてかいたからちょっと意味不明になったなw
レスもついていないし、修正するわ

英語だと本とか英作文とかでやってると思うけど、改行を入れるとき
this
is
a pen
というように、単語の切れ目で改行を入れる。

this i
s a p
en
なんて改行の入れ方はしない。

また、英文法的には、this is a penでも、this     is    a   penでも
スペース(タブ、改行含む)がいくつあろうが、”スペースで区切られた文章”という形で同じ意味になる。

HTMLとか2ちゃんねるとかそうだけど、複数のスペースをいれても1つになるのはそれが理由。

さて76文字ごとに改行の話だけど、日本語は単語をスペースで区切らないし、文字の途中で折り返したりする。
そうすると文字の途中で改行(スペース)が入ることになる。
これを英文法的に解釈すると、 「文章の初め」「スペース(改行)」「文章の終わり」 という風に
文章の途中に勝手にスペースが入ることになる。

一ついい忘れた。Subjectの二行目の頭にスペースが入るのはメールの仕様だから。

あとヘッダの仕様 http://adiary.blog.abk.nu/0213 76文字とか140文字とか適当だったねぇw 
> それぞれの行の文字はCRLFを除いて、決して998文字以下でなければならず(MUST)、
> 78文字以下であるべきである(SHOULD)。
591589:2011/10/14(金) 22:16:05.71
でメールの仕様的には

> まとめると「=?ISO-2022-JP?B?(略)?=」ブロックと「=?ISO-2022-JP?B?(略)?=」ブロックの間にある、
> "CR LF SPACE(又はTAB)"の1つ以上の繰り返しは削除すべしということになります。

ということらしいので、受信側のバグじゃね?w
592デフォルトの名無しさん:2011/10/14(金) 22:34:33.22
>>591
> > まとめると「=?ISO-2022-JP?B?(略)?=」ブロックと「=?ISO-2022-JP?B?(略)?=」ブロックの間にある、
> > "CR LF SPACE(又はTAB)"の1つ以上の繰り返しは削除すべしということになります。
ふむ。ここのところはHTMLの仕様と一緒だな。
593デフォルトの名無しさん:2011/10/14(金) 22:50:10.71
>>590
http://tools.ietf.org/html/rfc5322#section-2.2.3
> Unfolding is accomplished by simply removing any CRLF that is
> immediately followed by WSP.

アンフォールディングは単純にWSPが後に続くCRLFを削除することで完了する。
じゃないの?

> can be represented as:
> Subject: This
>  is a test
このCRLF+WSPを消すと、"Thisis a test"になるし。
594582:2011/10/14(金) 22:51:52.95
>>591
> まとめると「=?ISO-2022-JP?B?(略)?=」ブロックと「=?ISO-2022-JP?B?(略)?=」ブロックの間にある、
> "CR LF SPACE(又はTAB)"の1つ以上の繰り返しは削除すべしということになります。

これは問題ないよ。受信側のメーラーでもちゃんと処理できてる
今回問題が出てるパターンは
「ほげほげふーばー - Google 検索」のように半角文字列が途中に入ってる場合なんだよね
これをMIMEエンコードすると
=?ISO-2022-JP?B?GyRCJFskMiRbJDIkVSE8JFAhPBsoQg==?= - Google
 =?ISO-2022-JP?B?GyRCOCE6dxsoQg==?=
という風になって、MIME::Liteに渡すと
=?ISO-2022-JP?B?GyRCJFskMiRbJDIkVSE8JFAhPBsoQg==?= - Google
  =?ISO-2022-JP?B?GyRCOCE6dxsoQg==?=
となる。
これだと「=?ISO-2022-JP?B?(略)?=」ブロックと「=?ISO-2022-JP?B?(略)?=」ブロックの間に「 - GoogleCRLF  」があることになって、上のルールは適用されない
「this
 is
 a pen」と同じように改行だけを削除するのみ

MIME::LiteはまさかMIMEエンコードされた文字列だとは思わず、CRLFがあったら次にCPACEを入れるようにしているのかもしれない
595デフォルトの名無しさん:2011/10/15(土) 01:41:35.19
片手間に質問に答えても正確性にかけるしperldocがいいだろ。
お前のせいでリンクはってくれてた人がいなくなったら、すげー迷惑。
596デフォルトの名無しさん:2011/10/15(土) 02:16:06.50
perlではtry-catchのかわりにevalを使うそうですが、
例外クラスを使い分けるにはどうしたらいいですか。
つまり
try { ... }
catch(FooException $ex) { ... }
catch(BarException $ex) { ... }
に相当するコードは、Perlではどうかきますか。
597デフォルトの名無しさん:2011/10/15(土) 02:32:37.68
>>595
お前は何を言っているんだ?
598デフォルトの名無しさん:2011/10/15(土) 07:18:55.44
質問1
ファイルハンドル(?)をコピーしたい。
Rubyだと
 handle = $stdout
で済むことなんだけど、Perlでは
 my $SOUT = STDOUT;
 print $SOUt "hello"
ってできる?

質問2
print した内容を横取りしたい。
Rubyだとこんなかんじ:
begin
 backup = $stdout
 $stdout = StringIO.new
 # ... print 文を使ったコード ...
 output = $stdout.value
ensure
 $stdout = backup
end
599デフォルトの名無しさん:2011/10/15(土) 07:34:04.78
>>595

"perl try catch 例外クラス +site:perldoc.jp"でググれば、Error.pmの日本語perldoc が出るし、
600デフォルトの名無しさん:2011/10/15(土) 07:57:59.79
>>598
前者
% perl -le 'my $fh = \*STDERR ; print $fh q{hoge}' 2> /dev/null
後者
File::Tee, IO::Tee "tee +site:search.cpan.org"

本当はrubyの人にレスるつもりは毛頭なかったけど、
599を書いてる途中で書き込んじまってどうでも良くなった。
601デフォルトの名無しさん:2011/10/15(土) 08:37:18.68
>>600
ありがとうございます。参考にします。
602デフォルトの名無しさん:2011/10/15(土) 08:46:35.05
>>596
どうしても try-catch形式で書きたければ Try::Tiny 使ってみたら
603602:2011/10/15(土) 09:04:36.50
こんな感じ

use Try::Tiny;

try {
    ...;
} catch {
    if ( ... ) {
          ...;
    elsif ( ... ) {
          ...;
    else {<br />
          ...;
}
604602:2011/10/15(土) 09:09:11.30
>>603 は間違い、こっちの方が正しい。

use Try::Tiny;

try {
    ...;
} catch {
    if ( ... ) {
          ...;
    elsif ( ... ) {
          ...;
    else {
          ...;
    }
};
605デフォルトの名無しさん:2011/10/15(土) 09:19:33.03
>>598
http://perldoc.jp/func/open

1.
open(my $stdout, ">&", \*STDOUT) or die $!;
print $stdout "hello\n";

2-a. プリミティブなやり方
open(my $backup, ">&", \*STDOUT) or die $!;
close(STDOUT) or die $!;
open(STDOUT, ">", \(my $output)) or die $!;
...
close(STDOUT) or die $!;
open(STDOUT, ">&", $backup) or die $!;
close($backup) or die $!;

2-b. 手抜き
open(my $stdout, ">", \(my $output)) or die $!;
select $stdout;
...
select STDOUT;
close($stdout) or die $!;

2-c. CPANモジュールを使う(お好きなモジュールをどうぞ)
use Capture::Tiny qw(capture);

my ($output, $error) = capture {
print "So many printing...\n";
};
606デフォルトの名無しさん:2011/10/15(土) 09:43:36.66
>>598
例示はファイルハンドルのコピーでなくエイリアスなので、>>600でいいのかな?

handle = $stdout.dup
handle = $stdout.clone

のように本当のコピーなら、>>605かな?
607デフォルトの名無しさん:2011/10/15(土) 09:48:23.78
608デフォルトの名無しさん:2011/10/15(土) 10:36:08.87
Perlで、オブジェクトIDみたいなのは取ってこれますか。
my $obj = new Foo();
print $obj->__id__; #=> 0x314159265358
$obj = new Foo();
print $obj->__id__; #=> 0x314159298940
みたいなの。
609デフォルトの名無しさん:2011/10/15(土) 11:07:47.79
>>608
http://perldoc.jp/docs/perl/5.10.0/perlobj.pod
> オブジェクトは単なるリファレンス

http://perldoc.jp/docs/perl/5.10.0/perlref.pod
> リファレンスを文字列として使うと、参照しているものの型 (perlobj で記述しているように、
> bless しているパッケージを含みます)と、16進数で表現された数値アドレスの両方を生成します。

> perl -e "print map bless({}, 'Foo') . qq/\n/, 0..2"
Foo=HASH(0x298e54)
Foo=HASH(0x187a484)
Foo=HASH(0x187aa84)
610デフォルトの名無しさん:2011/10/15(土) 11:08:00.61
>>608
うーん?
そのまま、print $obj で表示される物じゃダメ?
611デフォルトの名無しさん:2011/10/15(土) 11:18:37.22
>>608
ほうっておこうと思ったけど、へんな回答があるのでw

$object + 0 とやればいい。
http://blog.livedoor.jp/dankogai/archives/50484421.html
612デフォルトの名無しさん:2011/10/15(土) 11:29:11.97
+0 も実際には邪道だろ。danは使うけど、
use Scalar::Utils qw( refaddr );
my $addr = refaddr $objct;

613デフォルトの名無しさん:2011/10/15(土) 11:30:39.10
ゴメン
s/Utils/Util/;
614デフォルトの名無しさん:2011/10/15(土) 12:12:06.28
overloadが設定されてるオブジェクトに対してはrefaddr使うしかない
URIとかTime::PieceとかDateTimeとか
そうでなければ+0とかでもいいと思う
615576:2011/10/15(土) 13:04:12.72
>>578
cpan や cpanm ではテストにパスしないとインストール出来ないけど、
ppm にはしっかり Encode-Locale-1.02 があって
問題無く使われているみたいだったので、
テストでコケたのを無視して、
展開された作業用ディレクトリからインストールしたら無事期待通りに使えた。

Encode::Locale自体じゃなくて t/env.t の方に問題があったみたいだね。
しかし、いくら普通に使えるからといってテストでコケるのを放置してるのは何だかなあ。
616デフォルトの名無しさん:2011/10/15(土) 13:13:18.67
cpan の force install やら、cpanm -f やら試した?
テスト無視するだろ?
元のレスもその程度の問題だと認識して「なんだかなー」と思ってたんだが。
617デフォルトの名無しさん:2011/10/15(土) 13:50:32.42
あるぇ?
>>610で、=でsplitして、[0]はクラスの型で[1]で参照先のチェックじゃダメなの?
618デフォルトの名無しさん:2011/10/15(土) 13:52:18.54
>>617
だめ
619デフォルトの名無しさん:2011/10/15(土) 14:14:34.74
必ずしもだめではないが、無駄手間。
あと>>614の言うような場合には当然使えない。
620デフォルトの名無しさん:2011/10/15(土) 15:42:23.41
ダメだろ
$ perl -Mstrict -Mwarnings -le ' print bless({}, q{Foo=Q(})'
Foo=Q(=HASH(0x7fec4a802eb8)

なんで態々数値に変換してるかって、数値である事が保証されてるからだよ。
621デフォルトの名無しさん:2011/10/15(土) 15:56:51.26
ソフトウェアなんて数値どころか
0と1で出来てるんですが。
コードも0と1だよ。
622デフォルトの名無しさん:2011/10/15(土) 16:02:44.80
生理中の三十路女かよ
623デフォルトの名無しさん:2011/10/15(土) 16:03:34.01
そうなんだすごいね!
624デフォルトの名無しさん:2011/10/15(土) 16:04:17.05
>>617
ユニークなIDが欲しいだけなら数値コンテキストに置こうが文字列コンテキストに置こうが
同じ事 (一意な文字列である事は保証されている) だが、>>614 のような問題があるので
Scalar::Util::refaddr() が最善。
625608:2011/10/15(土) 16:57:02.83
>>610-614
ありがとうございます。Scalar::Util::refattr() 使うことにします。
626578:2011/10/15(土) 17:32:16.08
>>615
調べたらこんな感じだった。
env.t
> Encode::Locale::reinit("cp1252");
・Windowsではコードページの変更が出来ない

> $ENV{"m\xf6ney"} = "\x80uro";
・コードページ"cp932"(日本標準)ではこの設定ができない
・なぜかPerlが落ちる
・コードページが元から"cp1252"(西欧標準)の場合は上手く行く

英語版のWindowsだと問題を把握できないかも。
627デフォルトの名無しさん:2011/10/15(土) 17:37:51.13
関数定義におけるプロトタイプ宣言について質問です。

sub f(&) {
 my ($closure) = @_;
}
と定義すると、
f { print 123 };
のように使えます。

同じように、メソッド定義で
package Foo;
sub f($&) {
 my ($this, $closure) = @_;
}
のようにしたいですが、$thisのせいで$closureが第1引数にできないようです。
プロトタイプ宣言はメソッド定義では使えないのでしょうか。
628デフォルトの名無しさん:2011/10/15(土) 17:52:04.08
629デフォルトの名無しさん:2011/10/15(土) 17:59:22.71
BOT
630615:2011/10/15(土) 18:56:38.68
>>626
なるほど、英語版の Windows じゃ再現性が無いから、
Encode::Locale のメンテナも何が問題になっているのか把握出来て無いのか。
教えてくれてありがとう。
631デフォルトの名無しさん:2011/10/15(土) 20:09:10.23
>>628
そのURL先にこう書いてありました。

> メソッド呼び出しはプロトタイプを行う/行わないによる影響を受けません。
> なぜなら正確な呼び出しコードは、継承に依存しているために コンパイル時には
> 不確定だからです。

やっぱりメソッドでは使えないのですね。分かりました。

632デフォルトの名無しさん:2011/10/15(土) 20:12:39.09
動的型付け言語の欠点だよな。
633デフォルトの名無しさん:2011/10/15(土) 20:37:18.47
Perlで演算子のオーバーロードに挑戦してるんですが、「=~」はオーバーロードできないんでしょうか。
ttp://perldoc.jp/docs/perl/5.6.1/overload.pod#Overloadable32Operations
この中には「=~」が載ってないです。どうしてでしょうか。
634デフォルトの名無しさん:2011/10/15(土) 20:57:10.99
どーしてって言われても実装がそうだからとしか、、、
正規表現周りで、実装が他の算術計算やらと別枠になってんじゃねーの?
新しいバージョンでも ~~ がオーバーロード可能になってるだけだし。
(~~ はどっちかっつーと他の正規表現のラッパー的挙動だし)
635デフォルトの名無しさん:2011/10/15(土) 21:15:24.77
use 5.12.0; # qrのオーバーロードは5.12.0以降が必要

package Hoge;
use overload 'qr' => sub { return qr/foo/; };

sub new {
return bless {};
}

package main;

my $h = Hoge->new;

say "foo" =~ $h;

こういうのならできないこともない
636デフォルトの名無しさん:2011/10/16(日) 02:24:45.58
「perl 予約語 一覧」でぐぐったけど、ヒットしない。
perlの予約語って、どこかにリストアップされてませんか?
637デフォルトの名無しさん:2011/10/16(日) 02:41:42.16
>>636
「perl 予約語 一覧」でググって7番目にこんなページがあったが。
http://d.hatena.ne.jp/syohex/20110914/1316010018

実際、変数名に関してはシジルが付くから気にする必要はないし、
組込関数名は perlfunc か http://perldoc.jp/index/function に揃ってるし、
あとは制御構造の if unless elsif else while until for foreach ぐらいだ。
http://perldoc.jp/docs/perl/5.10.0/perlsyn.pod
638デフォルトの名無しさん:2011/10/16(日) 05:46:42.29
制御構造なら next last redo continue do とかもかな?
and or not xor eq ge le ne gt lt cmp は演算子か…
639デフォルトの名無しさん:2011/10/16(日) 09:47:14.58
windows2000 で使える旧バージョンのActivePerlのダウンロード先探してます。
だれかご存知の方いらしゃいますか?
640デフォルトの名無しさん:2011/10/16(日) 14:58:43.12
予約語といえばyでつまづいたことがあったな
641デフォルトの名無しさん:2011/10/16(日) 15:18:00.68
y?
642デフォルトの名無しさん:2011/10/16(日) 15:20:55.44
y///
643デフォルトの名無しさん:2011/10/16(日) 17:51:02.66
同様のパターンで s があった。ありふれてるけど。
あと tr とかも場合によってはやっちゃいそう。
644デフォルトの名無しさん:2011/10/16(日) 17:56:28.34
最新版のActivePerlでも使えますよ
645デフォルトの名無しさん:2011/10/16(日) 18:14:59.36
Perlで、
use Something qw(aaa bbb ccc ddd eee fff ggg hhh);
のように使いたい名前がたくさんある場合、
use Something qw(*);
のようにまとめて書くことはできませんか。
Pythonだと
from something import aaa, bbb, ccc, ddd, eee, fff, ggg, hhh
をまとめて
from something import *
と書けるので、Perlでも同じように書きたいです。
646デフォルトの名無しさん:2011/10/16(日) 18:32:59.24
ほぼ全てのモジュールはExporterの仕様に準じてる。

この前提の元に話しをすすめると、
use Something qw( /^…$/ );
でこのケースには対応出来る(ハズ)

EXPORT_TAGやら、そこらへんで挙動が変更されるのかも知らんが
詳しくは、 perldoc Exporter して
Advanced features
Specialised Import Lists
を。

TAGとかに関しては使ってるモジュールのpod読めとしか
647デフォルトの名無しさん:2011/10/16(日) 19:41:04.77
>>646
ありがとうございます。調べてみます。
でもPythonと比べるとやはりPerlは複雑ですね。
648デフォルトの名無しさん:2011/10/16(日) 21:52:56.88
http://codepad.org/gLiZI3zZ

catalyst.pl perlとしたのですが
perlというのが作れません
どうすればいいのでしょうか?エラーが出ます
649Perl忍者:2011/10/16(日) 22:02:34.40
>>648
cpan -r Task::Catalyst
650デフォルトの名無しさん:2011/10/16(日) 22:06:16.85
>>644
ありがとうございます。
窓の杜を見ると、最新版がXP以降になってたので‥。
とりあえずダウンロードして試してみます。
651デフォルトの名無しさん:2011/10/16(日) 22:08:02.50
>>649
エラーが出なくなりました。
バージョンの違いだったのかな・・・
ありがとうございます。
652デフォルトの名無しさん:2011/10/16(日) 22:19:40.86
>>649
オ プ シ ョ ン っ て わ か る?
653デフォルトの名無しさん:2011/10/16(日) 22:22:04.99
自機の分身でレーザーの次にあるやつだろ?
654651:2011/10/16(日) 22:25:03.15
すみません
できませんでした
http://codepad.org/gLiZI3zZ
catalyst perlでperlが作成できません
エラーがでます教えてください
655デフォルトの名無しさん:2011/10/16(日) 22:25:40.34
Perl忍者さん、自作自演ですか?w
656デフォルトの名無しさん:2011/10/16(日) 23:30:41.33
Pythonの -m オプションみたいなのはありますか。
Pythonの -m オプションは、たとえば
python -m hello arg1 arg2
とすると、まず hello.py を探してきて、これが例えば /usr/local/python/site-packages/hello.py にあったとすると、あたかも
python /usr/local/python/site-packages/hello.py arg1 arg2
のように見なして実行してくれる機能です。
ライブラリをインストールすれば、コマンドライン用のスクリプトを別途用意しなくて済むのが便利です。
657デフォルトの名無しさん:2011/10/16(日) 23:34:51.93
手動でインストールしてみたんですがダメでした
http://codepad.org/gLiZI3zZ
同じエラーです

658Perl忍者:2011/10/16(日) 23:40:51.16
>>657
perldoc -l Plack
659デフォルトの名無しさん:2011/10/16(日) 23:50:28.90
>>656
無いです。
モジュール自体に実行スクリプトとしての機能を組む方法はありますが、
それをしたとしても、
perl `perldoc -l Hoge` arg1 arg2
と二段階の手順を踏む必要が出ます。

そもそも、perl では、モジュール兼実行スクリプトは(ほぼ)
自分で書いたコードでしょうから、置き場所くらいは分るんでは?
ちなみにCPAN moduleで実行スクリプト機能を組み込んだコードは
あまり見たことはありません。
cpan, cpanm, perlbrew, perltidy, perlcritic
とかは別途コードを用意してるし。
660Perl忍者:2011/10/16(日) 23:50:36.42
661Perl忍者:2011/10/16(日) 23:53:56.61
Task::Plackではなくて、そっちから入れてくれ
http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Plack-0.9984.tar.gz

tar xvf Plack-0.9984.tar.gz
perl Makefile.PL
make
make test
make install

cpan -i Catalyst::Devel

catalyst.pl Test
662651:2011/10/16(日) 23:55:18.84
ありがとうございます。
動作致しました。

root@tb:/home/aa# catalyst.pl hello
created "hello"
created "hello/script"
created "hello/lib"
created "hello/root"
created "hello/root/static"
663デフォルトの名無しさん:2011/10/16(日) 23:56:03.68
やるな忍者
664デフォルトの名無しさん:2011/10/16(日) 23:56:11.32
tar.gzの直リンはよせよ
665デフォルトの名無しさん:2011/10/16(日) 23:59:25.53
何で、忍者のレスから2分でインストールして確認して
返答レスが付けられるんだよw
666デフォルトの名無しさん:2011/10/17(月) 00:36:19.71
>>645
必要なのがそんないっぱいあるのは、何か間違ってないか
あと全部指定にすると、後々整理するとき不要なのかどうか判断しずらい。
一人で開発してるならいいけど。
667デフォルトの名無しさん:2011/10/17(月) 00:46:58.41
use List::Util qw(first min max minstr maxstr reduce sum shuffle);
use Scalar::Util qw(blessed dualvar reftype weaken isweak tainted readonly openhandle refaddr isvstring looks_like_number set_prototype);
全部 @EXPORT_OK

前半は、大袈裟な数じゃないと思うが?
必要なモジュールが@EXPORTしてくれてなくて
%EXPORT_TAGも設定してなかったら、結構な数が並ぶ事もある。

後半は同意。
668デフォルトの名無しさん:2011/10/17(月) 06:57:33.29
名前の衝突が怖いから、最小限インポートするか、
完全修飾名で呼び出すのがPerl流。
669639:2011/10/17(月) 08:18:12.46
Windows2000 に現行バージョンのActive Perlインストールしてみましたが、最後に弾かれてしまいました。p(´⌒`q)

2000じゃ無理ですかね。やっぱり。
670デフォルトの名無しさん:2011/10/17(月) 10:01:09.75
>>669
つ[Linux]
671デフォルトの名無しさん:2011/10/17(月) 10:03:42.22
>>669
今となっては 2K じゃネットに繋いで使うには危な過ぎるから
完全にスタンドアローンで使っているのでなければ
Linux を入れて Perl を使ってみては如何?
672デフォルトの名無しさん:2011/10/17(月) 10:21:33.13
Perlで、指定したファイルをPerlスクリプトとして読み込む関数は何でしょうか。
useではなくて、PHPのrequireやinclude、Rubyのload相当を探しています。
673デフォルトの名無しさん:2011/10/17(月) 10:48:55.71
require じゃないの?
674デフォルトの名無しさん:2011/10/17(月) 11:07:25.57
>>673
その通りでしたorz
675デフォルトの名無しさん:2011/10/17(月) 11:23:24.32
use warningsすると、
ttp://perldoc.jp/docs/perl/5.10.0/perldiag.pod
にあるような警告がだされますが、このうち、一部の警告だけを無視することはできますか。
Pythonにこのような機能があって、たとえば古いプログラムを動かす時には、obsoleteなモジュールを読み込んだときに出る警告だけを抑制する、といったことができます。
こんな感じで、特定の警告だけを抑制する方法がPerlにあれば教えて下さい。
676デフォルトの名無しさん:2011/10/17(月) 11:28:59.24
warnings
677デフォルトの名無しさん:2011/10/17(月) 11:32:49.38
perllexwarn嫁
678デフォルトの名無しさん:2011/10/17(月) 12:09:23.38
>>677
no warnings '...' でいけました。ありがとうございます。
ただ、perllexwarn に書かれてあるカテゴリ名が、perldiagに書かれてある警告メッセージのどれに対応するのか分からず、全部試してみるはめになりました。
どっかに、警告メッセージとカテゴリ名の対応があるといいですね。
679デフォルトの名無しさん:2011/10/17(月) 16:38:25.11
>>678
perldiagに書いてあるだろ?

> 上記のうち、最初の三つ (W, D, S) に分類されるメッセージの大部分は warings プラグマで制御できます。

> メッセージが warnings プラグマで制御できる場合、 警告カテゴリは以下の説明で分類文字と共に記されています。

で、例えば

> accept() on closed socket %s
> (W closed) クローズされたソケットに accept を行なおうとしました。 socket() の呼び出し時に、返却値のチェックを忘れたのではありませんか。 "accept" in perlfunc を参照してください。

でclosedカテゴリだってわかるようになってる訳だが。
680Perl忍者:2011/10/17(月) 19:12:42.70
くだらねーことやってんだな情弱
681Perl忍者:2011/10/17(月) 22:10:26.36
>>680
僕のフリしないでくれませんか?
情弱はPerl忍者本人だ
682デフォルトの名無しさん:2011/10/18(火) 02:42:05.72
Perlで、hashやarrayの同値性と同一性はどうやって判定しますか。
Pythonだとこんな感じのことを、perlでやる方法です。
a1 = [1, 2, 3]
a2 = [1, 2, 3]
a1 == a2 # 同値なのでTrue
a1 is a2 # 同一ではないのでFalse
683デフォルトの名無しさん:2011/10/18(火) 03:19:28.96
684デフォルトの名無しさん:2011/10/18(火) 03:36:42.05
文字数のカウントについて質問です。

某スレ用に2chのスレタイを生成するジェネレータみたいなものを作っているのですが、
2chのスレタイのルールは
 64バイト以内
 全角文字は2バイト、半角文字は1バイト
 ただし半角カナは1バイトとして数える
という感じらしいのですが

半角カナ混じりの文字列の長さを2chルールでカウントするためにはどういう方法が考えられますでしょうか…。
半角カナ⇔全角カナ変換などは見かけるのですが、これですと2バイトが2バイトに変換されるだけなので結果変わらず、悩んでます。
685デフォルトの名無しさん:2011/10/18(火) 03:42:24.48
ルールも何もshiftjisでのバイト数ってことだろ。cp932に変換してlength取ればいい。
ついでに言えばスレタイの文字数とかは板ごとのSETTING.TXTで決められてる。
686デフォルトの名無しさん:2011/10/18(火) 03:48:07.30
ああああそうか…orz
eucで必死にやってました。
変換したらとれました。ありがとうございました。
687Perl忍者:2011/10/18(火) 14:04:55.38
偽が沸いてるwww
688デフォルトの名無しさん:2011/10/18(火) 14:53:53.03
package Hogehoge;
sub foo { };
で定義されたパッケージや関数を、いったん未定義にできますか。
undef Hogehoge;
とかしてみたけど、同然のようにエラーになりました。
689デフォルトの名無しさん:2011/10/18(火) 15:21:38.37
サブルーチンは
undef *foo; (Hogehoge の中からの場合)
undef *Hogehoge::foo; (同、外)
でいけると思うが、パッケージそのものを定義とか未定義にするって言い方は普通しないな。
package Hogehoge; は、これがあるブロックで定義するグローバル変数やサブルーチンは
基本的に Hogehoge:: に属させることにしますよ、という宣言にすぎないのであって、
package 宣言なしで main から
sub Hogehoge::foo { }
としてもほぼ等価なわけだし。
690デフォルトの名無しさん:2011/10/18(火) 15:47:31.10
>>688
#!/usr/bin/perl -w
use strict;
package Foo;
our $foo = 'foo';
sub foo { print "foo(@_)\n" }

package main;

Foo::foo(1);
undef &Foo::foo; # http://perldoc.jp/func/undef
print '&Foo::foo - ', (defined &Foo::foo ? 'defined' : 'undef'), "\n";

# http://perldoc.jp/docs/perl/5.10.0/perlmod.pod#Symbol32Tables
$Foo::{'foo'} = sub { print "bar(@_) [$Foo::foo]\n" };
# *Foo::foo = sub { print "bar(@_) [$Foo::foo]\n" };
Foo::foo(2);

# delete $Foo::{'foo'}; # は効かない?
undef $Foo::{'foo'};
print '&Foo::foo - ', (defined &Foo::foo ? 'defined' : 'undef'), "\n";
print '$Foo::foo - ', (defined $Foo::foo ? $Foo::foo : 'undef'), "\n";
691デフォルトの名無しさん:2011/10/18(火) 15:57:40.62
>>688
> とかしてみたけど、同然のようにエラーになりました。

×同然 → ○当然
692デフォルトの名無しさん:2011/10/18(火) 16:30:26.22
>>689-690
ありがとうございます。
よく考えたら、自分の使う範囲では、関数の削除ができれば当面は困らないことが分かりましたので、この方法でやってみます。
693Perl忍者:2011/10/18(火) 17:42:43.62
てす。
694デフォルトの名無しさん:2011/10/18(火) 21:56:45.67
split(/。/,"あいう、えお。かきく、けこ。なにぬ\n")
したときの返り値が↓
(あいう、えお。, かきく、けこ。,なにぬ\n)
みたいにデリミタが残るような自作splitを作りたいんですが、いい方法はないですか?
あとからmapでデリミタを付与するみたいなのは無しで。
695デフォルトの名無しさん:2011/10/18(火) 22:00:48.18
>>694
split /(?<=。)/
696デフォルトの名無しさん:2011/10/18(火) 22:02:03.37
>>695
ありがとうございます。試してみます。
697デフォルトの名無しさん:2011/10/18(火) 22:24:03.72
>>696
試した結果はどうだったんだよ
698デフォルトの名無しさん:2011/10/18(火) 22:31:56.40
>>697
別に報告待つまでもないだろ。
699デフォルトの名無しさん:2011/10/18(火) 22:33:02.76
>>697
うまく行ってるよ。
700デフォルトの名無しさん:2011/10/19(水) 09:18:55.57
700GET
701デフォルトの名無しさん:2011/10/19(水) 10:52:30.28
正規表現で、否定を表す書き方はありますか。
たとえば、/¥.html$/ は拡張子が .html である文字列にマッチしますが、
「拡張子が .html ではない文字列」を表すような正規表現が知りたいです。

もちろん、
if ($str =~ /¥.html$/)

if ($str !~ /¥.html$/)
と書けばいいのですが、(設定ファイルを使って)自分が指定できるのは正規表現だけで、
該当のif文は(フレームワークのコードなので)自分では変更できません。
なので、全体を否定するような正規表現が欲しいです。

/(?!¥.html$)/ みたいに書けたりしないですかね?
702デフォルトの名無しさん:2011/10/19(水) 11:09:03.42
if ($str =~ /[^html]/)
703デフォルトの名無しさん:2011/10/19(水) 11:34:40.23
このようにファイルを読み込むときは、ファイルが存在する場合としない場合に分けた方がいいんですか?

#test.datが存在しなければtest.datを作る
unless(-e "test.dat"){
open(OUT,">test.dat");
close(OUT);
}
#test.datが存在する場合
else{
open(IN,"test.dat") || &error;
while($line = <IN>){
print "$line<BR>";
}
close(IN);
}
704デフォルトの名無しさん:2011/10/19(水) 11:46:09.02
>>701
否定を表す書き方はありません。

拡張子が.htmlでないというだけでいいなら固定文字列なので否定戻り読み
が使えるから

/¥z(?<!¥.html)/

と書けるけど、これはどっちかというと例外だね。

ある正規表現にマッチしない文字列にのみマッチするような正規表現は
存在するから自分で書けば原理的にはできるけど場合によっては長く
なったりして大変なんだな。正規表現を有限オートマトンに変換するのは
簡単だし、その有限オートマトンから補集合を受理する有限オートマトン
をつくるのは受理状態をひっくり返すだけだから簡単なんだけど、できあ
がった有限オートマトンを正規表現に変換するのはけっこうめんどくさい
のでした。

705デフォルトの名無しさん:2011/10/19(水) 12:02:42.60
706デフォルトの名無しさん:2011/10/19(水) 12:25:42.62
>>701
http://www.din.or.jp/~ohzaki/regex.htm#Without

print "$_ => ", /^(?:(?!\.html\z).)*\z/ ? 'match' : 'unmatch', "\n" for qw(
foo.txt
bar.html
baz.html.txt
);
707デフォルトの名無しさん:2011/10/19(水) 13:12:48.38
708デフォルトの名無しさん:2011/10/19(水) 13:13:49.61
カブったorz
709デフォルトの名無しさん:2011/10/19(水) 13:20:35.27
>>704
ないですか。

>>705
理論的には可能だけど、標準機能としては用意していない、ということですね。

>>706
リンク先に
> ある文字列を含まないものにマッチする正規表現
> (?:(?!foo).)*
とあるんですが、仕組みがわかりません。
(?!foo) は否定の先読みで、(?: ) は後方参照を行わないグループ化で、それを組み合わせるとなぜ否定の正規表現になるのでしょうか。
^(?:.(?!foo))*$ ならなんとなくわかるのですが。
710デフォルトの名無しさん:2011/10/19(水) 13:42:29.33
711デフォルトの名無しさん:2011/10/19(水) 21:25:47.82
正直ね、正規表現を指定できるツールは
全て「否定」のチェックボックスを用意するべきだと思うのw
712デフォルトの名無しさん:2011/10/19(水) 22:21:21.57
Perlのグローバル変数、具体的には「$@」と「$!」なんですが、
これらはマルチスレッドに対応していますか?
つまりあるスレッドで「$@」を書き換えても、それが別のスレッドに
影響を与えないかどうかを知りたいです。
713デフォルトの名無しさん:2011/10/20(木) 05:06:21.65
>>712
試してみればいいんじゃない?
714デフォルトの名無しさん:2011/10/20(木) 08:31:06.15
>>683
すみませんが、そこを読んでもわかりませんでした。
そこを読むと、Pythonの「a1 == a2」(同値判定)に相当するのが、Perlの「~~」のように見えますが、
スマートマッチング演算子はそもそも同値判定のための演算子ではないようです。
またPythonの「a1 is a2」(同一判定)については触れられてもいませんでした。
715デフォルトの名無しさん:2011/10/20(木) 09:10:47.85
>>714
同値判定には ~~ が大概有効だが、「1つの決まった書き方」はないってことさ

同一判定についてはそれぞれのリファレンスが等しいかどうかを比較すればいい
…というか、同一判定をする予定があるのなら
リストとして生成するよりも、始めからリファレンスとして生成しておくことも考えてみて
716デフォルトの名無しさん:2011/10/20(木) 12:22:35.12
そういえばPythonは誰が書いても同じようなコードになる言語だって
どこかで見た覚えがあるな
Perlのモットーは「やり方は何通りもある」だからな
717Perl忍者:2011/10/20(木) 12:52:25.67
「やり方は何通りもある」
っていう
かっこいい言葉の裏には物凄い悲惨さが込められてるのは、お前は知らない

どれだけの人間がそれで苦労してるかしらないようだな
718デフォルトの名無しさん:2011/10/20(木) 13:07:24.29
>>714
同一ならScalar::Util::refaddr()で判定だろうね。

同値はテスト以外でやったこと無いから分からんちん。
テストではもっぱらTest::More::is_deeplyを使ってる。
Test::DeepやTest::Differenceとかあるらしい。

何にしても、単純に比較できないオブジェクトが紛れると厄介だったり。
719デフォルトの名無しさん:2011/10/20(木) 13:14:09.02
やり方をガチガチに固める所では使うなってことなんじゃないの
720デフォルトの名無しさん:2011/10/20(木) 13:32:03.74
無能な石頭にとっては「やり方は何通りもある」のは悲惨だろうさw
721デフォルトの名無しさん:2011/10/20(木) 13:43:24.67
Perl敗者(>>717)にとっては過酷な言語だよな
722デフォルトの名無しさん:2011/10/20(木) 13:53:38.76
これだからPerlは嫌いだ。好きだけど。
723デフォルトの名無しさん:2011/10/20(木) 17:43:16.85
>>717
(笑)
724デフォルトの名無しさん:2011/10/20(木) 17:59:46.56
"/foo/" を qr/foo/ に変換する必要があり、
my $str = "/foo/";
my $re = eval "qr$str" if $str =~ /^¥/.*¥/$/;
とやっているのですが、これでいいでしょうか。
もっといいやり方があれば教えて下さい。
725デフォルトの名無しさん:2011/10/20(木) 18:04:42.80
ここで「プロトタイプ宣言は使うな」と言われたのですが
http://perlcritic.com/pod/Perl/Critic/Policy/Subroutines/ProhibitSubroutinePrototypes.html
プロトタイプ宣言がないと、
sub grep (&@) {
 my ($sub, @args) = @_;
 my @arr = ();
 for (@args) { push(@arr, $_) if $sub->($_) }
 return @arr;
}
みたいなことができなくないですか?
なぜダメっていわれるのでしょうか。
726デフォルトの名無しさん:2011/10/20(木) 19:48:35.11
>>725
プロトタイプの$に配列を与えると、配列長が渡されたりして厄介だし、
自己再帰にも使えないし、今ひとつ使いづらい。
理解して使う分には問題ないと思う。

sub f($;$) {
my ($m, $n) = @_;
print "m: $m n: ", ($n // "(undef)"), "\n";
}

f(3, 4);
f(@{[3, 4]});
my @list = (3, 4);
f(@list);
727デフォルトの名無しさん:2011/10/20(木) 20:28:23.47
>>726
>理解して使う分には問題ないと思う。
ありがとうございます!

もうひとつ質問なんですが、
sub f(&) {
 my ($sub) = @_;
 # $subを使ったコード
}
とあって、
my $sub2 = sub { ... };
があったときに、$sub2 を使って f() を呼び出すやり方がわかりません。
f($sub2);
f(&$sub2);
f(¥$sub2);
どれもだめでした。

rubyだと
def f(&block) { ... }
block2 = proc { ... }
f(&block2)
ということができるので、同じことをPerlでもやりたいです。

728デフォルトの名無しさん:2011/10/20(木) 20:37:36.91
&f($sub2); でプロトタイプ無視させる
729デフォルトの名無しさん:2011/10/20(木) 21:08:32.76
>>728
すごい!うまくいきました。ありがとうございます。
730デフォルトの名無しさん:2011/10/20(木) 21:35:00.42
>>719
> やり方をガチガチに固める所では使うなってことなんじゃないの

普通はやり方を固めるもんだよ。
もしそれが、自分一人のプロジェクトだとしても、
自分のルールに固めるだろう?

一つのプロジェクトで、日付処理用のモジュールとして
Date::Handler と Date::ICal と Class::Date と Date::Simple と
DateTime と Time::Piece を全部使おう。やり方はいくつもあるんだから!

なんていう人はいないでしょ。

731デフォルトの名無しさん:2011/10/20(木) 22:18:11.96
>>730
そういうことを言ってるんじゃないのよねw
732デフォルトの名無しさん:2011/10/20(木) 22:35:38.99
言ってるんじゃないというのなら、
どう言っているかを答えれば良い。

反論を待つ。
733デフォルトの名無しさん:2011/10/20(木) 23:23:22.52
忍者の言う通り
734デフォルトの名無しさん:2011/10/20(木) 23:30:48.77
730の言う通り
735デフォルトの名無しさん:2011/10/20(木) 23:31:10.61
>>724
普通に、
my $re = qr/$1/ if $str =~ m{^/(.*?)/$};
eval なんてよっぽどの事が無い限り使わない。

>>726
きちんと先行宣言かませば、再帰にも使えるぞ
sub h ($);
sub h ($){ my $i = shift or return ; printf "%d\n", $i ; h -- $i ; }
h 10 ;
h (10,11) ;

736デフォルトの名無しさん:2011/10/20(木) 23:35:10.73
1.「やり方は何通りもある」は、仕事が終わるならどう書いてもいい、
っていう意味で、
2.「物凄い悲惨さが込められてる」は、それを別の人がメンテナンス
するときの話。

この2つはそれぞれ事実なんだろうけど、おれはそれでもPerlが
好きだし、Perlのこのアプローチが間違っているとは思っていない。

2.メンテできないものは無理してメンテせず、1.自分がメンテ
できるように書き直すのが吉。なんか無駄っぽく感じるけど、そう
いう事態を招いた組織側の責任なので、担当者として責任を感じる
必要はない。
737デフォルトの名無しさん:2011/10/20(木) 23:56:44.57
perl忍者は、2chの過去レスの(中二病的に)かっこいい部分だけで、
レス作るから、まじめに相手しても無駄だよ。
実際の悲惨さ知ってるわけないもん。

>>736
>自分がメンテできるように書き直すのが吉。
VBAの変数名が「あ」「い」「う」「え」…てーのの
凄まじいスパゲティーコードを書き直した事があるが、地獄だぞ。
(ちなみに顧客のコード)
2.の業務を押し付けられたらどっちに転んでも悲惨だよ、
前任者がコードの内規守ってる事を祈るのみ。
738デフォルトの名無しさん:2011/10/21(金) 00:11:14.32
>>735
>my $re = qr/$1/ if $str =~ m{^/(.*?)/$};

さんくす!
739デフォルトの名無しさん:2011/10/21(金) 01:40:30.80
これからPerlの勉強を始めようと思ってるんだが
StrawberryとActiveとかいうのどちらをDLしたほうがいいのか
教えろください
740デフォルトの名無しさん:2011/10/21(金) 01:52:05.25
>>739
ActivePerl に不満が出たら Strawberry Perl その他
741デフォルトの名無しさん:2011/10/21(金) 02:28:35.56
>>739
少し前までは Strawberry Perl を薦めてたけど、
今はどっちでも大差ないかもね。

ppm で楽をしたいなら ActivePerl、
最初から CPAN経由でいろいろ突っ込みたいなら ActivePerl か?
742741:2011/10/21(金) 02:29:34.61
おっと最後の行は、

最初から CPAN経由でいろいろ突っ込みたいなら Strawberry Perl か?

だね。
743デフォルトの名無しさん:2011/10/21(金) 02:33:59.60
>>740-742
ありがとうございました。
まだ使ってないから不満もないし、楽をしたいので
とりあえずActive Perlを
インストールすることにします。
本当にありがとうございました。
744デフォルトの名無しさん:2011/10/21(金) 05:07:54.49
1: my $found = 0;
2: for (@array) {
3:  if ($_ == $value) {
4:   $found = 1;
5:   break;
6:  }
7: }

というコードがあるんですが、これの3行目から6行目にかけてを、もっと簡潔に書きたいです。
Rubyだと break に引数を指定できるので、
found = for x in array do
 break true if x == value
end
みたいに書けるんですが、Perlでもこんなかんじで簡潔に書く定石みたいなのはありますか。
745デフォルトの名無しさん:2011/10/21(金) 05:34:57.35
>>744
$_ == $value and $found = 1, last;
746デフォルトの名無しさん:2011/10/21(金) 06:53:12.37
>>744
my $found = grep{ $_ == $value }@array;

ってのはどうかな、Rubyに直訳すると

found = array.select{|v| v == value }.length

って感じなんだけど、PerlはRubyと違ってゼロは偽だから
返された「見つかった個数」をそのまま if に通せば有無の判定になるし
747デフォルトの名無しさん:2011/10/21(金) 07:00:08.76
#全行対象の定石てんなら、
#my $found = grep { $_ == $value } @array ;
かぶった

5.10以降なら
my $found = $value ~~ @array ;

お遊び
my $found = sub { for ( @array ){ return 1 if $_ == $value } }->() ;
748デフォルトの名無しさん:2011/10/21(金) 07:00:50.24
>>744
> 5: break;
break???
749デフォルトの名無しさん:2011/10/21(金) 08:59:52.33
>>735
先行宣言忘れてた。

>>744
use List::MoreUtils qw(any);
...
my $found = any{ $_ == $value } @array;

rubyだと
found = array.any? {|x| x == value }
750デフォルトの名無しさん:2011/10/21(金) 10:57:29.61
今で perl のオブジェクト指向プログラミングを勉強するにはどの本がおすすめでしょうか。
perl は6年ぐらい前にリャマ本読んで、システム管理用のツールをたまに作るぐらいのレベルです。
オブジェクト指向については全くの初心者です。

よろしくおねがいします。
751デフォルトの名無しさん:2011/10/21(金) 10:59:10.27
あるインスタンスだけメソッド定義を上書きすることはできますか。

package Foo;
sub hello {
 print "Hello!¥n";
}
## 通常のメソッド呼び出し
package main;
my $obj = bless({}, 'Foo');
$obj->hello(); #=> Hello!
## あるオブジェクトでだけメソッドを上書き
my $obj2 = bless({}, 'Foo');
$obj2->hello = sub { print "Konnichiwa!¥n" }; ## なんかこんな感じで。
$obj->hello(); #=> Konnichiwa!

みたいな感じで。
PerlでAOPチックなことをしたくて、それでインスタンス別に挙動を変える方法を知りたいです。
752デフォルトの名無しさん:2011/10/21(金) 11:15:46.65
>>750
本を買う前にまず perldoc で perlboot, perltoot, perltooc, perlbot を読んでみては?
753デフォルトの名無しさん:2011/10/21(金) 11:16:40.18
744です。いろいろアドバイスありがとうございます。
教えられたコードが理解できなくて、調べるのに時間がかかりました。

>>745
>$_ == $value and $found = 1, last;
これって
($_ == $value) and ($found = 1, last);
ってことでしょうか。なるほど。

>>746
> my $found = grep{ $_ == $value }@array;
これって、
my @found = grep{ $_ == $value }@array;
my $cound = @found;
ってことでしょうか。grepが返すのは配列なんだけど、それをスカラー変数に代入すると個数になる、という理解でいいでしょうか。

>>747
> my $found = $value ~~ @array ;
こんな演算子があるのですか。初めて知りました。
データ型によって挙動が違うというのは、Rubyの===演算子に似てますね。

> my $found = sub { for ( @array ){ return 1 if $_ == $value } }->() ;
その場でクロージャを作って呼び出しているんですか。これはすごい。
JSの (function() { ... })() みたいなもの?




754デフォルトの名無しさん:2011/10/21(金) 11:26:45.80
>>753
grepについての疑問のとこは細かい話に見えるかもですが
スカラーコンテキストでは個数が返る、です。

perldoc -f grep
> In scalar context, returns the number of times the expression was true.
755デフォルトの名無しさん:2011/10/21(金) 13:27:53.49
用語の質問です。
Perlのオブジェクト指向では、「attribute」と「property」の両方が使われているようなんですが、
これらはどのように使い分けられていますか。
ググってみたけど、いまいちわかりません。

package Hogehoge;
sub new {
 my $class = shift;
 return bless {@_}, $class;
}
sub x { return $_[0]->{x} };
sub y { return $_[0]->{y} };

my $hoge = Hogehoge->new(x=>1, y=>2);
print $hoge->{x}; # これはattribute? property?
print $hoge->x; # これはattribute? property?

756デフォルトの名無しさん:2011/10/21(金) 13:53:10.03
>>754
>スカラーコンテキストでは個数が返る、です。
ということは、grep がいつも配列を返すのではなく、
grep自体がコンテキストを認識して、配列が要求されている場面なら配列を、
スカラー値が要求されている場面なら数を返すということなんですね。
興味深い挙動だけど、複雑すぎ!
757デフォルトの名無しさん:2011/10/21(金) 14:12:31.48
>>756
> grep自体がコンテキストを認識して
grep自体がじゃなくてPerl処理系がじゃないかな
grepは処理結果としてスカラ値(個数)と処理済の配列の両方を持ってる
758デフォルトの名無しさん:2011/10/21(金) 14:43:43.08
>>755
こういう認識しか無いんだけど、こういうのとは違うん?
http://perldoc.perl.org/perlglossary.html

インスタンス変数
> instance variable
> An attribute of an object; data stored with the particular
> object rather than with the class as a whole.

アクセサ
> accessor methods
> A method used to indirectly inspect or update an object's state
> (its instance variables).
759デフォルトの名無しさん:2011/10/21(金) 15:53:56.50
sub x : lvalue { $_[0]->{x} };
sub y : lvalue { $_[0]->{y} };

こういうのかな。
メソッドでもLvalue subroutineと呼ばれてる希ガス。
760デフォルトの名無しさん:2011/10/21(金) 16:53:02.26
755です。
もいっかい調べ直したところ、Perlでの「attribute」というのは、オブジェクト指向とは関係なく、
関数定義において付属的に追加できるデータのことのようです。
ttp://gihyo.jp/dev/feature/01/perl-pluggable/0002
でもオブジェクト指向の説明でもよく見かけるように思うし、どうなんでしょ。
761デフォルトの名無しさん:2011/10/21(金) 17:06:03.59
perlの言語仕様でいうところのattributeはサブルーチンやレキシカル変数に
つけられるやつの方だけど、オブジェクト指向でもattributeという言葉は
よく使われるのでperlのオブジェクト指向ライブラリの一つのMooseみたいに
その意味でattributeを使っちゃってることもある。どれを指しているかは
よく考えながら読むしかないね。
762755:2011/10/21(金) 17:20:01.32
こっちはインスタンス変数をプロパティといっている。
ttp://d.hatena.ne.jp/chaichanPaPa/20100206/1265436393
> 結果的にリファレンスが、ハッシュ変数(プロパティ)とサブルーチン(メソッド)を持つことになるのです。
> プロパティとメソッドと言えば、そう、オブジェクトになるのですね…これが!!

こっちはインスタンス変数とアクセッサの両方をプロパティと呼んでいるっぽい。
http://idocsq.net/page/350

うーん。用語が統一されてない。
763デフォルトの名無しさん:2011/10/21(金) 18:27:07.76
>>756
grepの部分に配列を書いても同じことだよ
スカラを要求する文脈で配列が書かれれば配列の長さが返る
例えば「配列@aryの長さより$nが小さい」は $n < @ary と書ける

これがPerlの「コンテキスト」って概念ね
764デフォルトの名無しさん:2011/10/21(金) 21:46:35.41
ファイルをopenしてcloseする前にrenameしたら
そのファイルが入っているフォルダがエクスプローラで見れなくなりました
mkdirでフォルダ作成してもこそのフォルダだけエクスプローラで表示されません
どうすれば元に戻りますか?
環境はwindowsでactiveperlです
765デフォルトの名無しさん:2011/10/21(金) 21:47:02.27
だれか >>751 助けて!
766デフォルトの名無しさん:2011/10/21(金) 22:11:32.39
>>751
できるよ。

まずすべてのインスタンスに何も挙動が変わらない
メソッド定義を付け加えましょう。
767デフォルトの名無しさん:2011/10/21(金) 22:24:57.63
つーか>>751はperlのオブジェクト指向の書き方じゃないから、
そちらから勉強した方が良くね?
それと真面目に書くんだったら継承するわな、普通は。
package Foo ;
sub new { bless {}, shift }
sub hello { shift ; print qq{hello\n} }
1;

package main ;
use strict ;
use warnings ;

{
no warnings ;
sub Foo::hello { shift ; print qq{bye\n} ; }
}
Foo->new->hello ;
768デフォルトの名無しさん:2011/10/21(金) 22:39:30.94
>>767
AOPの知識をつけてからまたおいで。
769デフォルトの名無しさん:2011/10/21(金) 22:48:57.46
それいったら、「use Aspectしろ」で終る話だろ。
770デフォルトの名無しさん:2011/10/21(金) 22:53:22.53
Aspectは特定のインスタンスだけ
置き換える機能は持っていません。
冷静になったら?
771デフォルトの名無しさん:2011/10/21(金) 23:07:22.58
>>767
ありがとうございます。
でもこの方法だと、単にメソッド定義を上書きしているため、全部のオブジェクトに影響するんですよね。
そうではなくて、インスタンスオブジェクトごとに、個別に設定したいのですが、perlだと無理そうですか。

やりたいのは、AOPのように、指定したメソッドの前後に処理を挟み込んで、
たとえばロギングを追加したりとか、実行時間を計測したりとかしたいんですが、
それをある特定のインスタンスにだけ適用させたいと考えてます。
クラス定義自体を上書きすると、ほかのインスタンスにも影響を与えるので、
それは希望する動作ではないです。

JavaScriptとかだと簡単なんですけど、それをぜひperlでやりたい。
772デフォルトの名無しさん:2011/10/21(金) 23:07:42.47
どっちでも良いけど、用語は厳密に使い分けてくんない?
インスタンスは完全にオブジェクト指向の用語で、
AOPに使われると混乱するんだが。
773デフォルトの名無しさん:2011/10/21(金) 23:26:10.64
は? AOPはオブジェクト指向を補完するもので
普通はオブジェクト指向と一緒に使うんだが。
774デフォルトの名無しさん:2011/10/21(金) 23:39:28.14
単に local すればいいだけの話?
これで望んだ挙動?
package Foo ;
sub new { bless {}, shift }
sub hello { shift ; print qq{hello\n} }
1;
package main ;
use strict ;
use warnings ;

sub hello { shift ; print qq{bye\n}}
my $obj = Foo->new ;
$obj->hello ;
{
no warnings ;
local *{Foo::hello} = sub { main::hello(@_) ; } ;
$obj->hello ;
}

my $obj2 = Foo->new ;
$obj2->hello ;
775デフォルトの名無しさん:2011/10/21(金) 23:45:33.39
コピペまちがえ。
×sub hello { shift ; print qq{bye\n}} の行いらない。
×local *{Foo::hello} = sub { main::hello(@_) ; } ;
◯local *{Foo::hello} = sub { shift ; print qq{bye\n} } ;
776デフォルトの名無しさん:2011/10/22(土) 07:22:38.70
>>774-775
それはクラス定義を書き換えている。
もしFoo::helloのなかで新しくFooオブジェクトを作る処理が入っている場合、問題になる。
777デフォルトの名無しさん:2011/10/22(土) 08:02:23.89
CPANモジュールを作るのに、参考にすべきページはどこでしょうか。
「CPAN モジュール 作り方」でぐぐるといろいろでできますが、ページごとにやり方が違ったりするので、
ここだけ読めばおK!というのを教えて下さい。
778デフォルトの名無しさん:2011/10/22(土) 08:11:28.18
package Foo ;
sub new {
my $this = shift ;
my $class = ref($this) || $this;
my $self = { data => pop } ;
bless $self, $class;
$self ;
}
sub echo { printf "%s\n", shift->{data}}
1;
package main ;
use strict ;
use warnings ;
my $obj = Foo->new(10) ;
$obj->echo ;
{
no warnings ;
local *{Foo::new} = sub {
my $this = shift ;
my $class = ref($this) || $this;
my $self = { data => 42 + pop } ;
bless $self, $class;
$self ;
} ;
my $obj2 = $obj->new(10) ;
$obj->echo ;
$obj2->echo ;
}
my $obj3 = $obj->new(10) ;
$obj->echo ;
$obj3->echo ;
779デフォルトの名無しさん:2011/10/22(土) 08:55:52.18
use strict や use warnings の有効範囲って、どこまでですか?

use strict;
use warnings;

package Hogehoge;

としたら、use strict や use warnings は package Hogehoge の中でも有効ですか?
やってるうちにわかんなくなってきたので教えて下さい。
780デフォルトの名無しさん:2011/10/22(土) 09:32:35.27
>>751
こんなんはどう?

package Foo;
sub hello {
print "Hello!\n";
}

## 通常のメソッド呼び出し
package main;
my $obj = bless({}, 'Foo');
$obj->hello(); #=> Hello!

## あるオブジェクトでだけメソッドを上書き
my $obj2 = bless({}, 'Foo');
{
use Scalar::Util qw(blessed);
no strict "refs";
@{$obj2 . "::ISA"} = blessed $obj2;
*{$obj2 . "::hello"} = sub { print "Konnichiwa!\n" }; ## なんかこんな感じで。
$obj2 = bless $obj2, "$obj2";
}

$obj2->hello(); #=> Konnichiwa!
781デフォルトの名無しさん:2011/10/22(土) 10:15:59.30
>>751
package Foo;
sub new { bless {}, shift }
sub hello { print "Hello!\n" }

package main;
use Class::Monadic qw(monadic);

my $obj = Foo->new;
my $obj2 = Foo->new;
monadic($obj2)->add_methods(hello => sub { print "Konnichiwa!\n" });
monadic($obj2)->add_modifier(before => hello => sub{ print "Nice to meet you!\n" });
monadic($obj2)->add_modifier(after => hello => sub{ print "Good bye!\n" });
$obj->hello();
$obj2->hello();
782デフォルトの名無しさん:2011/10/22(土) 10:19:39.18
>>780
ありがとうございます。自分なりに、以下のように解釈しました。
package Foo;
sub hello {
print "Hello!¥n";
}

## 通常のメソッド呼び出し
package main;
my $obj = bless({}, 'Foo');
$obj->hello(); #=> Hello!

## あるオブジェクトでだけメソッドを上書き
my $obj2 = bless({}, 'Foo');
{
use Scalar::Util qw(blessed);
no strict "refs";
my $oldclass = blessed $obj2; #=> 'Foo'
my $newclass = "$obj2"; #=> 'Foo=HASH(0x100804110)'
@{$newclass . "::ISA"} = $oldclass; # 継承関係を設定
*{$newclass . "::hello"} = sub { print "Konnichiwa!¥n" }; # メソッドを上書き
$obj2 = bless $obj2, $newclass; # blessし直す
}

$obj2->hello(); #=> Konnichiwa! (上書きされている)
$obj->hello(); #=> Hello! (上書きされてない)
print $obj2->isa('Foo'); #=> true (元クラスを継承しているのでisa関係も成り立つ)

ポイントは、動的に新しいクラスをつくって、それを使ってblessしなおすことですね、きっと。
すばらしいです。感謝にたえません。
783デフォルトの名無しさん:2011/10/22(土) 10:36:11.68
動的に新しいクラスなんか作ったら
元のオブジェクトと動きが代わるってことだろ。
784749,781:2011/10/22(土) 10:43:55.59
最近回答がヌルーされるので、しばらく旅に出ることにします。
785749,781:2011/10/22(土) 10:47:54.46
>>779
プラグマの範囲はレキシカルスコープだから、レキシカルスコープでググレ。
前に出てる質問だから、過去ログ漁っても出てくる。

まあ、直接 foo; とか書いてテストした方が早いけどな。
じゃ、また。
786デフォルトの名無しさん:2011/10/22(土) 10:56:50.03
>>785
元気でな。
787デフォルトの名無しさん:2011/10/22(土) 12:53:35.88
http://search.cpan.org/
に、モジュールを分類した一覧が表示されますが、これってどうやって登録するんでしょうか。
たぶんモジュールのなかのメタ情報に書くんだと思いますが、どう書くのかわかりません。
だれかおしえて。
788デフォルトの名無しさん:2011/10/22(土) 13:08:38.25
>>787
もしかして>>777か?
そんなことを2chで聞かないとわからないレベルのくせにcpanに何か登録するつもりなのか?
789デフォルトの名無しさん:2011/10/22(土) 13:19:08.56
Perlで外部プログラムを同時起動させて
あるプログラムの戻り値が帰ってきたら全部終了させるってことは
どうすればいいですかね?具体的に教えてもらえるとありがたいです
790デフォルトの名無しさん:2011/10/22(土) 13:20:05.40
>>789
訂正します

あるプログラムの戻り値「で特定の値が帰ってきたとき」全部終了させるってことは
791デフォルトの名無しさん:2011/10/22(土) 17:58:49.25
>>788
カテゴリ登録の仕方って、どっかに載ってます?
CPANモジュールてきとうに漁ってみたけど、カテゴリを登録してるような記述はどこにもなかったです。
これって、もしかしてパッケージをつくる側が指定するんじゃなくて、運営側が分類してたりするんでしょうか。
792デフォルトの名無しさん:2011/10/22(土) 18:49:06.78
モジュールなんてPerl忍者ですらできたことだが・・・
793デフォルトの名無しさん:2011/10/22(土) 21:14:59.91
index()で日本語を検出できません
<h3>あ</h3>というタグの位置が欲しいのに、-1が帰ってきます。
index()は日本語は使えないのですか?

文字コードはutf-8です。
794793:2011/10/22(土) 21:34:17.91
use utf-8;を外したら正常に動きました。

文字列に漢字2文字以上の場合または、
カタカナ3文字以上の場合は記録したいのですが、
addWord($c, 2, $word) if($word =~ m/^\p{InCJKUnifiedIdeographs}{2,}$/g);
addWord($c, 2, $word) if($word =~ m/^\p{InKatakana}{3,}$/g);

この正規表現では取得できません。
どのようにすればよいですか?
795デフォルトの名無しさん:2011/10/22(土) 21:50:53.08
use utf-8をつける
796デフォルトの名無しさん:2011/10/22(土) 22:13:14.02
use utf-8;をつけると
<h3>あ</h3>というタグの位置が欲しいのに、-1が帰ってきます。
index()では、どのようにすればよいですか?
797デフォルトの名無しさん:2011/10/22(土) 22:13:35.11
use utf-8をはずす
798デフォルトの名無しさん:2011/10/22(土) 22:13:53.56
use utf-8;を外したら正常に動きました。

文字列に漢字2文字以上の場合または、
カタカナ3文字以上の場合は記録したいのですが、
addWord($c, 2, $word) if($word =~ m/^\p{InCJKUnifiedIdeographs}{2,}$/g);
addWord($c, 2, $word) if($word =~ m/^\p{InKatakana}{3,}$/g);

この正規表現では取得でき
799デフォルトの名無しさん:2011/10/22(土) 22:16:09.16
なんかのhtmlをDLしてそれスクレイプしてんだろ?
そのHTMLの文字コードは何?
800デフォルトの名無しさん:2011/10/22(土) 22:30:43.85
>>798
その $word はちゃんと decode('utf8', $source); してあるんだろうな。
801デフォルトの名無しさん:2011/10/22(土) 23:11:23.15
use utf-8をはずす +1 票。
802デフォルトの名無しさん:2011/10/22(土) 23:27:52.76
そしてまたつける
803デフォルトの名無しさん:2011/10/22(土) 23:32:11.85
use utf8; は使うひとを選ぶから、道具としてちょっとね
804デフォルトの名無しさん:2011/10/22(土) 23:52:40.19
use tf8はソースコードに(コメント以外)日本語を
書かない人には関係ない話。
805デフォルトの名無しさん:2011/10/23(日) 00:21:06.95
# ファイル名を tf8.pm にして保存
package tf8;
($package, $script, $line) = caller;
open SCRIPT, $script;
@_ = <SCRIPT>;
close SCRIPT;
$_[$line - 1] =~ s/^/#/;
open SCRIPT, ">$script.tmp";
print SCRIPT @_;
close SCRIPT;
exit system "jperl $script.tmp";
1;
__END__
806793:2011/10/23(日) 02:39:10.98
>>799
utf-8です。

>>800
utf-8で読みこんでますので、特にしてません。
試してみます。
807デフォルトの名無しさん:2011/10/23(日) 02:48:46.19
明らかに use utf8 や encode/decode の効果を理解できてないね
あれは初心者や他言語からの人にはなかなか馴染みづらいだろうし仕方ないけど
808793:2011/10/23(日) 02:55:22.83
>>807
ええ、調べて書いたんですけどね。
学生の頃、シェルスクリプト代わりに使ってたけど、
日本語を扱うのがこんなに大変とは思わなかった。
809デフォルトの名無しさん:2011/10/23(日) 02:56:29.92
utf8フラグとい名前がまずかったね。
文字列フラグなどという名前だったらよかった。

文字列フラグはPerl固有のものだから
Perlコード外部から渡されるのは文字列ではない。
文字列でなかったらなにか?それはバイナリ。

バイナリを文字として扱いたければ、文字に変換しないといけない。
それがdecode。

ではソースコードに書いてあるのは、文字かバイナリか。
それはuse utf8を使えば文字で、そうでない場合はバイナリ。

話はこれだけ。
810793:2011/10/23(日) 03:02:29.22
>>809
なるほど。
ありがとうございます。
811デフォルトの名無しさん:2011/10/23(日) 07:15:20.77
ファイルを開いて、全レコードの一番最初に出現する”,”(カンマ)をスペースに
置換するスクリプトを教えてもらえませんか
例:
変換前:2001-01-02,18:01:00,64.30,64.30,64.30,64.30
変換後:2001-01-02 18:01:00,64.30,64.30,64.30,64.30
秀丸の置換だと
検索:([0-9])([0-9])([0-9])([0-9])-([0-9])([0-9])-([0-9])([0-9])\,
置換:\1\2\3\4-\5\6-\7\8 ←スペース
このようなかんじです。
環境
Windows 7 64
perl 5, version 14, subversion 2 (v5.14.2) built for MSWin32-x64-multi-thread
812デフォルトの名無しさん:2011/10/23(日) 08:52:31.43
>>811
perl -lpe "s/,/ /" hoge.txt

% perl -MO=Deparse -lpe "s/,/ /" hoge.txt
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
s/,/ /;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-e syntax OK
813デフォルトの名無しさん:2011/10/23(日) 09:02:52.24
>>811
>ファイルを開いて、全レコードの一番最初に出現する”,”(カンマ)をスペースに
>置換するスクリプトを教えてもらえませんか

だけなら、

while(<>) {
$_ =~ s/,/ /;
print $_;
}

見たいな感じでいいと思うけど、

>検索:([0-9])([0-9])([0-9])([0-9])-([0-9])([0-9])-([0-9])([0-9])\,
>置換:\1\2\3\4-\5\6-\7\8 ←スペース
秀丸知らないからよくわからんけど、この処理の仕様を
「一番最初に出現する”,”(カンマ)をスペースに置換する」
としちゃうのは丸めすぎのような気がする。

元の仕様に忠実(?)に書くなら(多分 ・・・ 秀丸の置換の仕様を知らないの憶測です)、
$_ =~ s/([0-9])([0-9])([0-9])([0-9])-([0-9])([0-9])-([0-9])([0-9]),/\1\2\3\4-\5\6-\7\8 /;
としたほうが、トラブルが少なそう。
814デフォルトの名無しさん:2011/10/23(日) 10:00:03.83
>>811です
皆さんありがとう
>>812さん
perl -lpe "s/,/ /" hoge.txt
これはうまく実行できるのですが

% perl -MO=Deparse -lpe "s/,/ /" hoge.txt
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
s/,/ /;
}
continue {
die "-p destination: $!\n" unless print $_;
}
これは、先頭行に#!/bin/perlを加え、replace.plとでも保存して、実行すればいいのでしょうか?
>>813さん
perl のことが余りわからなくて、すみません、sed のように、置換したあとファイルに保存する場合のスクリプトですが
openモードは書き込み・読み込みどちらで開いたらいいのでしょうか?
815793:2011/10/23(日) 10:34:25.92
>>800
decodeしたら上手く動きました。
ありがとうございます。
816デフォルトの名無しさん:2011/10/23(日) 11:03:46.94
>>789>>790
を知っていたら
誰かお願いします
817デフォルトの名無しさん:2011/10/23(日) 11:08:30.74
fork
818デフォルトの名無しさん:2011/10/23(日) 11:50:56.50
文字列フラグなどという名前だったらよかった。
と考える実装初心者・命名中級者。
819デフォルトの名無しさん:2011/10/23(日) 12:02:58.18
Win7/x64使っています。
ファイルのタイムスタンプを変更する utime が失敗します。
管理者権限を perl.exe やコマンドプロンプトにつけてみましたが、変わりませんでした orz

なにかヒントがあればお願いします m(__)m 
820デフォルトの名無しさん:2011/10/23(日) 12:07:00.24
>>818
あれ? まだムキになってるの?w
821デフォルトの名無しさん:2011/10/23(日) 12:39:35.75
「内部文字列フラグ」がよりマッチしていそう
そうするとだんだん核心にちかづくw
822デフォルトの名無しさん:2011/10/23(日) 12:50:56.16
>>814
ワンライナの挙動の説明、書くのが面倒だったからDeparseしただけ。
保存して使いたければ、どうぞ

>openモードは書き込み・読み込みどちらで開いたらいいのでしょうか?
813氏では無いが、貴方は取り敢えず今回は
perl -i.bak -lpe "s/,/ /" hoge.txt
で満足して、多少は自力で勉強をしてきたら如何か?
823デフォルトの名無しさん:2011/10/23(日) 12:51:31.02
やなこったw
824デフォルトの名無しさん:2011/10/23(日) 12:52:21.34
ワンライナー、windowsで動かないのはどうしてだよ
825デフォルトの名無しさん:2011/10/23(日) 12:52:59.23
お前の書き方が悪い
826デフォルトの名無しさん:2011/10/23(日) 12:57:43.86
>>818
言い出しっぺの一人だけだろ、言ってんの。
827デフォルトの名無しさん:2011/10/23(日) 13:01:55.33
>>826
過去にutf8フラグを理解してないって
こてんぱんにやられたやつでしょw
828デフォルトの名無しさん:2011/10/23(日) 13:04:26.62
perl -lpe "s/^(\d\d\d\d-\d\d-\d\d),/$1 /" hoge.txt > hoge2.txt

でいけるだろうけど、そのファイルを出力するプログラム
を変更できるならその方がはやい
829デフォルトの名無しさん:2011/10/23(日) 13:13:08.89
>>824
perl -e "print qq/Windows Oneliner\n/"
830デフォルトの名無しさん:2011/10/23(日) 13:37:40.26
>>809
>utf8フラグとい名前がまずかったね。

なんでまずいの?utf8だからutf8フラグなんじゃないの?

>>821
>そうするとだんだん核心にちかづくw

核心に近づくとどうなるの?おいしくなるの?それならいいけど
831デフォルトの名無しさん:2011/10/23(日) 15:10:06.81
http://perldoc.perlassociation.org/pod/Moose-Doc-JA/Moose/Manual/Attributes.html
に書いてある、
「Mooseはデフォルト値にサブルーチンリファレンス以外の裸のリファレンスを渡した場合はエラーが発生します。
これは、裸のリファレンスを渡せるようにしてしまうと、デフォルトでマッピングされるアトリビュートが多くのオブジェクトで共有されてしまうことになりがちだからです」
はどういう意味でしょうか。
複数のインスタンスが同じメモリ上のものを指してしまうのでしょうか。
832デフォルトの名無しさん:2011/10/23(日) 15:47:26.66
そのとおり。
そしてそれは多くの場合ユーザーの意図するところではないと考えられるので、
素通しせずエラーで死ぬ仕様にしておくことで、すぐ間違いに気づけるようにしている。
833デフォルトの名無しさん:2011/10/23(日) 15:50:05.28
>>830
UTF-8バイナリ文字列と内部表現がUTF8の文字列を混同する人(同一と思ってる人)が多発してるからとか?
834デフォルトの名無しさん:2011/10/23(日) 16:05:34.63
知っている人がいないかやっぱり
835デフォルトの名無しさん:2011/10/23(日) 16:35:39.87
>>832
ありがとうございます。ここはsubで新しくスコープ作らないといけないんですね。
836デフォルトの名無しさん:2011/10/23(日) 17:10:27.81
空気読んでたが、1レスだけ我慢してください。

>>809
この人の文章は毎回頭が痛くなる。文字列を strings と置き換えたら意味不明。
>utf8フラグとい名前がまずかったね。
>strings フラグなどという名前だったらよかった。
>strings フラグはPerl固有のものだから
>Perlコード外部から渡されるのは strings ではない。
>strings でなかったらなにか?それは binary strings。
>binary strings を string として扱いたければ、string に変換しないといけない。
>それが decode。
本人は、文字列が狭義な意味しかないとでも思ってるらしいが、読んでる方は
まず広義にとらえる。例えば文字列フラグ以外に、 # の部分でも
「は? 文字列はバイナリも含むだろ」っつー初歩のつっこみが入って混乱する。

ちょっと文章に気を使えば、いらぬ突っ込みは減るだろうし、突っ込みにしても
核心の部分の論争に留めることが出来るだろう。
おまけに perlunifaq の言う通りutf8 フラグに触れる必要すらない。
>(前半完全削除)
>Perlコード外部から渡されるのは utf8 で書かれていようと内部で利用出来る decoded strings ではない。
>decoded strings でなかったらなにか?それは binary strings。
>binary strings を decoded string として扱いたければ、decoded string に変換しないといけない。
>それが decode。

ttp://hibari.2ch.net/test/read.cgi/php/1024741312/
>>503から
ttp://perldoc.jp/docs/perl/5.10.0/perlunifaq.pod#What32is32the32UTF832flag63
837デフォルトの名無しさん:2011/10/23(日) 18:19:10.07
UTF8フラグに関する反論・議論は以降下記スレでどうぞ

Perlについて
http://hibari.2ch.net/test/read.cgi/tech/1217851121/
838デフォルトの名無しさん:2011/10/23(日) 18:51:03.36
>>830
> なんでまずいの?utf8だからutf8フラグなんじゃないの?

perldocに内部形式がutf8だと意識してはいけないと書いてあるからさ。


http://perldoc.jp/docs/perl/5.10.0/perlunifaq.pod#I32lost32track59what32encoding32is32the32internal32format32really63

> UTF8 フラグ」って何?
>
> 内部をハックしようとしているか、変なものをデバッグしようとしているのでない 限り、
> どうか UTF8 フラグのことは一切考えないでください。

> Perl の内部表現の一つは ” たまたま UTF-8 ” です。
> 残念ながら、Perl は秘密を守れないので、このことはみんな知っています。 ” これが多くの混乱の源です。 ”
> ” 内部表現は何か分からないエンコーディング” で、
> 常に明示的にエンコードと デコードが必要ということにしておいた方がよいです。

> わかりました、どうしてもと言うのなら:
> ”「内部形式」は utf8 であって、 UTF-8 ではありません。 ”
> (もしその他のエンコーディングでないのなら。)

> 迷子になりました; 実際のところ内部形式のエンコーディングは何?¶
>
> 迷子になったのはよいことです; なぜなら内部形式が特定のエンコーディングで あることに依存するべきではないからです。
> しかし聞かれたので答えましょう: デフォルトでは、内部形式は ISO-8859-1 (latin-1) か utf8 で、
> どちらになるかは文字列の歴史に 依存します。 EBCDIC プラットフォームでは、これは異なっているかもしれません。
>
> Perl は文字列が内部でどのように保管されているかを知っていて、この知識を エンコードする ときに使います。
> 言い換えると: ”特定の文字列の内部エンコーディングが何かを 調べようとしてはいけません;”
> 代わりに、単に望みのエンコーディングに エンコードしてください。
839デフォルトの名無しさん:2011/10/23(日) 18:57:49.30
836,837に誘導レスが二つも付いてて、更にレスすんのか?
しかも836にURLが張ってあるのの引用だけで
840デフォルトの名無しさん:2011/10/23(日) 18:59:08.44
>>836
>「は? 文字列はバイナリも含むだろ」っつー初歩のつっこみが入って混乱する。

そんな突っ込み入ってないじゃんw

文字とバイナリの区別ぐらい普通の人はつくと思うけどねぇ。
バイナリは、その名の通りビットの集まり。

数値型にバイナリが含まれないように文字列型にバイナリは含まれない。
たとえ数値の内部表現がバイナリであったとしてもだ。

たとえばMySQLでデータ型がバイナリなら任意のビット(バイト)列を格納できるが、
文字列型ならそこに指定されたエンコーディング以外の文字が正しく格納される保証はないとわかるはず。

明らかに違うものと認識しているはずだがね。
841デフォルトの名無しさん:2011/10/23(日) 18:59:56.07
>>839
ん?俺が命令したらお前
絶対従うの?
842デフォルトの名無しさん:2011/10/23(日) 19:03:37.70
ここはあまり詳しい人いないね
843デフォルトの名無しさん:2011/10/23(日) 19:12:41.36
そういえばファイルを開く時にも
テキストモードとバイナリモードがありますね。
844デフォルトの名無しさん:2011/10/23(日) 19:33:02.05
本来はバイナリモードしかないんだが、Windows(MS-DOS)がうんこだから
仕方なくテキストモードを作った。
845デフォルトの名無しさん:2011/10/23(日) 19:53:26.54
>>844
> Windows(MS-DOS)がうんこだから
ちがうよ。単に環境によって改行の仕様が違ってるからそれに対処するためだだよ。
それは歴史的事情により仕方ないんだよ。
ftpにもasciiモードとbinaryモードっつーのがあるよ。
846デフォルトの名無しさん:2011/10/23(日) 20:05:11.03
Macの改行も忘れるな
847デフォルトの名無しさん:2011/10/23(日) 20:57:48.14
>>845
>ちがうよ。単に環境によって改行の仕様が違ってるからそれに対処するためだだよ。
Macは、MacJPerl(OS9)の昔からperlのバイナリモードは無関係だぞ

そもそもDOSとWinの為って公式に書いてある。
>On some systems (in general, DOS− and Windows‐based systems)
>binmode() is necessary when you’re not working with a text
>file.
848デフォルトの名無しさん:2011/10/23(日) 21:18:59.19
>>847
だからね、UNIXの改行コードがLFなのもDOS(Windows)の改行コードがCR+LFなのも
それぞれの歴史的事情によるのよ。別にDOSが“タコ”だからとかじゃないのよ。
例えばメールの改行コードは昔からCR+LFだったりするのよ。

> Macは、MacJPerl(OS9)の昔からperlのバイナリモードは無関係だぞ
Macはみそっかすだから考慮外なだけなのよ。きっと。
MacJPerl(OS 9)の改行コード周りの仕様がどうなってたんだかは知らないけど。
849デフォルトの名無しさん:2011/10/23(日) 21:24:42.65
いや、DOS/Winがうんこなのは、改行がCR+LF であることじゃなくて、
それをファイルの区切りとして処理しちゃうテキストモードというモードを、
システムコールのレベルで作っちゃったことじゃね。
850デフォルトの名無しさん:2011/10/23(日) 21:37:30.71
>>849

ちょっと何言ってるかわからない

851デフォルトの名無しさん:2011/10/23(日) 21:40:29.26
>>848
だから「DOSとWin」の為だろ。おれはDOSがタコだウンコだ
なんて一言も言ってないし、どーでもいい。

一般化して、「環境依存の改行仕様が原因」と書いてるから
そんなんじゃなくて、特定の環境(DosとWin)に対応する為だと
レスしただけだ。
852デフォルトの名無しさん:2011/10/23(日) 21:43:42.09
> 844 名前:デフォルトの名無しさん[sage] 投稿日:2011/10/23(日) 19:33:02.05
> 本来はバイナリモードしかないんだが、Windows(MS-DOS)がうんこだから
> Windows(MS-DOS)がうんこだから
> Windows(MS-DOS)がうんこだから

あれ? 言ってない? あれ?
853デフォルトの名無しさん:2011/10/23(日) 21:51:25.89
>>849
> いや、DOS/Winがうんこなのは、改行がCR+LF であることじゃなくて、
> それをファイルの区切りとして処理しちゃうテキストモードというモードを、
> システムコールのレベルで作っちゃったことじゃね。

DOSが改行CR+LFを「ファイルの区切りとして」処理しちゃう?
どゆこと?
システムコールのレベルで? って何?
それとPerlのbinmodeとどう関係するの?
854845:2011/10/23(日) 21:55:52.76
>>852
俺は844じゃない
855847:2011/10/23(日) 21:57:06.99
違った、>>845氏すまん。
俺は、>>847で、>>844じゃない。
856847:2011/10/23(日) 22:00:23.63
いやいや俺は>>845であって
>>844ではあるが>>847ではない
むしろ>>846
857デフォルトの名無しさん:2011/10/23(日) 22:08:41.47
> > なんでまずいの?utf8だからutf8フラグなんじゃないの?
> perldocに内部形式がutf8だと意識してはいけないと書いてあるからさ。

もともとPerlはUNIXユーザが、こうだったらいいのになあって思った
言語仕様が体現されていてブレークしたわけで、言い訳がましい
ドキュメントでは、勘弁してあげない。

> UTF-8バイナリ文字列と内部表現がUTF8の文字列を混同する人
>(同一と思ってる人)が多発してるからとか?

その意味で、UTF-8バイナリ文字列はUTF8の文字列であるのは当然で
内部表現が異なっていることをプログラマにむき出しにしているの
は、Perl的ではない。

言い訳ドキュメントの有無、既読・未読に依存しないインタフェース
のほうがおいしい。
858デフォルトの名無しさん:2011/10/23(日) 22:15:10.55
>>857
お前のひとりよがりの意見を押し付けるな。
859デフォルトの名無しさん:2011/10/23(日) 22:27:17.89
複数のファイルハンドルをひとつのオブジェクトにtieするのってどうやるんですか。
いまは
my $out = tie(local *STDOUT, 'Foo1');
my $err = tie(local *STDERR, 'Foo1');
とやってるんですけど、この方法だとstdoutとstderrが別々になっちゃうんで、
できれば両方を同じオブジェクトにひもづけたいです。
shellでいうところの 2>&1 みたいなの。
860デフォルトの名無しさん:2011/10/23(日) 22:29:03.65
$ret = `echo $text | /usr/bin/mail $address -s "Title"`;
とすると
sh: Sytax error: "|" unexpected
のエラーになってしまいます。
パイプは使えないんでしょうか?
861デフォルトの名無しさん:2011/10/23(日) 22:29:59.86
ドキュメントを書くのは大変なことだと思うし、それを
翻訳するのも決して楽だとは思えない。
一人のひとが読む労力はたいしたことないかもしれないけ
ど、読者総人数の総時間ともなれば、これまた大変な時間
になる。

これってひとりよがりの意見なの?
862デフォルトの名無しさん:2011/10/23(日) 22:30:30.52
>>853
俺はDOS/WINをうんこだとは思わないが、一応説明しておこう

Unix系の改行はLFだが、Unix系システムはそれを全く特別扱いしない
あくまで、ただの0Dの値を持つデータでありそれ以上でもそれ以下でもないんだ
だから例えば画像データをそのまま標準入出力に流したとしても
そのまま画像データとしてリダイレクト出来る

一方、Windowsにはテキストモードとバイナリモードという区分がある
バイナリモードはUnix系と同様、データはそのまま流れる
ではテキストモードってのは何かっつーと
簡単に言えば改行コードを特別扱いするモードだ
例えばLFを出力しようとするとCR+LFへ変換される
当然ながらこのモードのまま画像データなど出力してはデータを壊してしまう

んでWindowsのデフォルトはテキストモードであり
コマンドプロンプトも基本それで動く
この差がUnix系とWindows両方で使うようなコードを書いたときに
しばしば問題を引き起こす

特にUnix系で書かれたコードが問題で、開発環境では上手く行くのに
Windowsに持っていくとデータ破壊を引き起こしてしまう
元々PerlはUnix系の文化なんで、そういうコードもあったりするし
WindowsでPerl書いたことない人もたまに居たりして
そういう人は頭では理解しててもバイナリモードの適切な運用が出来ない
863デフォルトの名無しさん:2011/10/23(日) 22:30:45.36
ひとりよがりの意見というのは、>>857の内容のことだろw
864デフォルトの名無しさん:2011/10/23(日) 22:31:43.17
>>853
システムコールの概念も知らないなら、
OSの議論になんか首突っ込まなきゃいいのに。
865デフォルトの名無しさん:2011/10/23(日) 22:39:26.37
Perlって一行を読み取るコードあるけど、
UTF16で書かれたファイルの場合に、
ちゃんと一行読み取れるの?
866デフォルトの名無しさん:2011/10/23(日) 22:39:42.04
utf8フラグもWindowsのためにできたのか
まったくしょうがないOSだな、Windowsっていうのは
867デフォルトの名無しさん:2011/10/23(日) 22:40:59.03
>>866は馬鹿だから誰も相手しなくていいよ。
868デフォルトの名無しさん:2011/10/23(日) 23:14:06.58
>>859
オブジェクトじゃなくファイルハンドルにリダイレクトするのなら、
$ perl -le 'close STDERR; open STDERR, q{>&}, \*STDOUT or die ; print STDERR q{STDERR}; print STDOUT q{STDOUT} ;'
STDERR
STDOUT
それでも必要なら、上のコード加えた上で貴方のコードの$outの方だけ使うとかすれば?


>>860
$ perl -Mstrict -Mwarnings -le 'my $s = q{hoge} ; print `echo $s | wc`'
1 1 5
\"Title\"してみれば?
869デフォルトの名無しさん:2011/10/24(月) 00:56:09.12
Windows上で無理してUTF-8を使わなくてもいいと思う
870デフォルトの名無しさん:2011/10/24(月) 00:57:52.11
別にいいんじゃね? UTF-8はメモ帳でさえ対応しているんだから。
871デフォルトの名無しさん:2011/10/24(月) 01:27:50.45
その点でメモ帳は優秀らしい
872デフォルトの名無しさん:2011/10/24(月) 01:41:42.83
427 名前:名無しさん@お腹いっぱい。 投稿日:2011/10/21(金) 01:44:26.74 ID:uBBtnDdt0
>>407
一部変だったので再調査した。
あと、WZ EDITORを追加して、ランクFはキリがないのでTeraPad以外削除。

S: Alpha, FooEditor, NewQX, Notepad, RJ TextEd
A: Editra, EmEditor, Notepad2, otbedit, SciTE, WZ EDITOR, 秀丸エディタ
B: Geany, gedit, JuffEd
C: jEdit
D: AkelPad, MIFES, サクラエディタ
E: Ginnie, Mery, Notepad++
F: TeraPad, etc



428 名前:名無しさん@お腹いっぱい。 投稿日:2011/10/21(金) 01:44:49.43 ID:uBBtnDdt0
S: 完璧に対応。調査した限りでおかしいところは一切なかった。
A: ほぼ完璧だが、RtLのキャレットがおかしい。おしい。
B: 一通りokだが、結合できない文字や扱えない文字がある。
C: RtLに未対応。サロゲートペアと結合文字はok。
D: サロゲートペアまでok。結合は不可。
E: 一応対応したレベル。サロゲートペアすら扱えない。
F: Unicodeは一切扱えない。SJISの文字列をUnicode形式で保存できるだけ。
http://hibari.2ch.net/test/read.cgi/software/1303249708/427-428 テキストエディタをまた〜り語ろう ver.31
873デフォルトの名無しさん:2011/10/24(月) 01:49:52.56
xyzzyなんかはなんで抜けてるの?まさかetc.あつかい?
874デフォルトの名無しさん:2011/10/24(月) 02:01:47.71
テキストエディタスレで簡単に調査とかいうけど、
アラビア語とかタイ語とかそういうのはどうやって打ち込んだんだろna
記号を配置するだけでもクソの処理だし、
打ち込んだ記号が正しく配置されてるかなんて、アラビア語かじっただけじゃ分からんだろ
意味の無い記号の並び、実際にはありえない記号のならびとかも機械的に処理しちゃってるんじゃね?
あとxyzzyが無いのは高度すぎて使いこなせなかった……とかか?
emacsもないし。
875デフォルトの名無しさん:2011/10/24(月) 02:42:35.59
emacsはちゃんと表示できるのかもしれんが
デフォルトではそうなってなくて、
設定が必要だが、正解はどれだ!?みたいな感じだからなぁ。
876デフォルトの名無しさん:2011/10/24(月) 09:07:48.31
>>865
openするときにデフォルトのLatin-1のままでなく、UTF-16を指定すればできるんじゃないのかな?
ただ読み込まれた文字は現在議論の的であるテキスト文字列になるけど。

open my $fh, "<:encoding(UTF-16)", "somedata.txt" or die $!;
877デフォルトの名無しさん:2011/10/24(月) 11:14:27.02
>>868
ファイルハンドルにリダイレクトする方法ですが、tieと組み合わせるとうまくいきませんでした。

package Foo1;
sub TIEHANDLE {
  return bless { output => "" }, shift;
}
sub PRINT {
  my $self = shift;
  $self->{output} .= $_ for (@_);
}

package main;
my $out;
{
  $out = tie(local *STDOUT, 'Foo1');
  open(local *STDERR, '>&', ¥*STDOUT) or die $!;
  print "into STDOUT¥n"; # 表示される
  print STDERR "into STDERR¥n"; # 表示されない
  close STDERR;
}
print "--- output ---¥n", $out->{output};

引き続き、アドバイスお願いします。
878デフォルトの名無しさん:2011/10/24(月) 15:07:29.62
>>877
blessするオブジェクトを同じにすれば、同じオブジェクトを操作することになるけど、
目的に合ってるでしょうか?

package Foo1;
my $output = { output => "" };

sub TIEHANDLE {
return bless $output, shift;
}
sub PRINT {
my $self = shift;
$self->{output} .= $_ for (@_);
}

package main;
my $out;
{
$out = tie(local *STDOUT, 'Foo1');
tie(local *STDERR, 'Foo1');
print "into STDOUT\n"; # 表示される
print STDERR "into STDERR\n"; # 表示されない
}
print "--- output ---\n", $out->{output};
879デフォルトの名無しさん:2011/10/24(月) 16:54:00.81
>>878
それ、STDOUTとSTDERRが別のインスタンスオブジェクトにtieされませんか?
実行したらわかりますが、最後の print "--- output ---¥n", $out->{output}; で
"into STDOUT¥n" は表示されますが "into STDERR¥n" は表示されません。
最初の質問>>859に書いたように、shellの 2>&1 をしたうえで、printの出力先をオブジェクトにtieしたいので、878のコードだとちょっと違います。
880デフォルトの名無しさん:2011/10/24(月) 17:28:05.09
Perlのバージョンは $^V だと思ったのですが
perl -e 'print $^V,"¥n"'
としたら、5.8では出てこなくて、5.10だと出てきました。
もしかして、5.8では $^V って使えないんでしょうか。

あと、ぐぐるときに「Perl "$^V"」ってやってもうまくヒットしません。
Perlの特殊変数をぐぐるコツを教えて下さい。
881デフォルトの名無しさん:2011/10/24(月) 17:30:35.07
>>880
ぐぐらない。
ぐぐるなら、そのまま「特殊変数」だとか、目的である「バージョン」とかで良いんじゃないか。
882デフォルトの名無しさん:2011/10/24(月) 17:36:43.28
883デフォルトの名無しさん:2011/10/24(月) 20:25:35.69
print $_ for (1..100) ;
map {print $_ } (1..100) ;

1から100まで出力する方法、他にありますか?
884デフォルトの名無しさん:2011/10/24(月) 20:40:14.82
>>883
print join(' ',(1..100));
885デフォルトの名無しさん:2011/10/24(月) 20:55:29.35
print 1..100
886デフォルトの名無しさん:2011/10/24(月) 21:50:41.39
>>883
perl -E "do say ++$_ until chr eq 'd'"
887デフォルトの名無しさん:2011/10/24(月) 21:58:42.40
>>881,882
ありがとうございます。
できればその、$^V がPerl 5.8で使用可能かどうかもお願いします。
888デフォルトの名無しさん:2011/10/24(月) 22:32:24.79
>>887
>>882を読んだんじゃないのか?
889デフォルトの名無しさん:2011/10/25(火) 03:22:46.79
webページのpreタグで囲まれた部分を普通のテキストとしてダウンロードしたいのです。どんなスクリプトでダウンロードすればいいのでしょうか

単純にダウンロードすると < が > になってたりして困っています
890860:2011/10/25(火) 07:23:49.72
#!/usr/bin/perl
$ret = `ls | wc`;
は、ちゃんと動くんですが
$ret = `echo $text | mail $address`
だと、|がシンタックスエラーになってしまう
どうして?
891デフォルトの名無しさん:2011/10/25(火) 08:54:34.73
> Perlコード外部から渡されるのは文字列ではない。
> 文字列でなかったらなにか?それはバイナリ。
> バイナリを文字として扱いたければ、文字に変換しないといけない。

これこそひとりよがりだと思うけどな。
入力するファイルに"ABC"って書いてあったら、バイナリであると同時
に文字列でもある。文字列フラグと言いかえても、ASCII文字列はフラ
グが立たないから問題のすり替えでしかない。
892デフォルトの名無しさん:2011/10/25(火) 08:57:04.89
>>889
HTMLの仕様についてまず勉強しなさい。
893デフォルトの名無しさん:2011/10/25(火) 09:00:01.58
>>890
$text の中身は?
894860:2011/10/25(火) 10:27:07.39
>>893
緯度経度の数字が,でつながってます
34.00000,135.00000
みたいな
895デフォルトの名無しさん:2011/10/25(火) 10:32:37.19
>>894
末尾に改行コード入ってないかい?
chomp $text; してからやってみたら?
896デフォルトの名無しさん:2011/10/25(火) 10:38:13.82
バッククオート使う前にまず普通のダブルクオートで囲ってprintしてみろよって話だよな
897デフォルトの名無しさん:2011/10/25(火) 11:17:06.19
まあ用心で echo "$text" にしておいた方がいいかな
898デフォルトの名無しさん:2011/10/25(火) 11:25:50.17
>>879
私の環境(ActivePerl5.8.9 build 826 for MSWin32-x64-multi-thread)では以下のように出力
されますが、>>879さんの環境は何でしょうか?

--- output ---
into STDOUT
into STDERR

それとも上記出力が意図と違うということでしょうか?
899860:2011/10/25(火) 21:22:57.71
>>895
ありがとうございます。できました。
chomp $test;
$ret = `echo $text | /usr/bin/mail mail\@domein.jp -s Title`;
にすると送れました。
ただ、@をエスケープしないとダメなんですね。
アドレスを変数で渡したいんですが、変数に入れる前にエスケープで整形するしか
方法はないんでしょうか?

900デフォルトの名無しさん:2011/10/25(火) 22:01:58.94
>>899
やってみれば早いと思うが、
my $address = '[email protected]';
$ret = `echo $text | /usr/bin/mail $address -s Title`;
みたいな感じでいけるよ。
901899:2011/10/25(火) 22:25:52.49
>>900
sh: Syntax error: newline unexpected
になってしまうんです。

また、改行コード?と思いchomp $address;
を入れてみたら
sh: cannot open [email protected]: No such file
となります。
902デフォルトの名無しさん:2011/10/25(火) 22:53:59.42
>>901
まさか
$ret = `echo $text | /usr/bin/mail "$address" -s Title`;
みたいに $address を " " で囲ったりしてないよね?

$address にメールアドレスを入れるのにちゃんと ' ' (シングルクォート)使ってる?
もしくはシングルクォートを使いながら @ をエスケープしようとしたりしてないよね?

$address = '[email protected]'; …これはOK
$address = "[email protected]"; …これはだめ
$address = 'mail\@domain.jp'; …これもだめ

> また、改行コード?と思いchomp $address;
> を入れてみたら

わざわざ改行コードも入れたの? $address に?
chomp $address; の有無でエラー内容が変わるってことはそうなんだろうけど…。
なんでわざわざ改行コードを入れるの? 何やってるの?
903デフォルトの名無しさん:2011/10/25(火) 23:06:33.36
なんか興奮して変な書き込みをしてしまった。すまん。
たぶんすごく基本的なところをミスってるんだと思うぞ。
904デフォルトの名無しさん:2011/10/26(水) 01:48:24.15
少なくとも>>900の書き方に従ってるわけじゃないよね。
本題と関係ないけど、
>>901
> sh: cannot open [email protected]: No such file
これが謎だったんだけど、「<[email protected]>」みたいな
アドレスを渡すと「<」のリダイレクトに失敗して
そういうエラーになりそう。
905デフォルトの名無しさん:2011/10/26(水) 02:17:59.15
>>904
> これが謎だったんだけど、「<[email protected]>」みたいな
あー。ありがちかも。

想像だが>>899はメールアドレスが1行に1つ記述されたテキストファイルを読み込んで
それを順ぐりに$address変数に(そのまま)放り込んで次々処理しようとしているのではないか。
だから改行コードがくっついていたり、>>904みたいな <[email protected]> みたいな
文字列が渡ってエラーになったりするのではないだろうか。
違ってたらすまんな。
906899:2011/10/26(水) 09:05:20.60
>>902-905
すいません、まさにご想像の通りでした
おはずかしい
解決です、どうも、ありがとうございました。
907デフォルトの名無しさん:2011/10/26(水) 09:14:28.80
>>906
解決してなにより。
908デフォルトの名無しさん:2011/10/26(水) 13:07:02.93
状況によるだろうけど、スクリプトからのメール送信は
mail よりも sendmail コマンドを使ったほうがいいんじゃないかな。
基本的には、
 mail : 対話的な利用向けのコマンド
 sendmail : プログラム内部から呼び出すためのコマンド
だよね。
でも最近の mail コマンドは高機能でその機能を利用したい、
というケースもあるかな。
909デフォルトの名無しさん:2011/10/26(水) 13:51:26.27
外部コマンドを呼び出さずにモジュール使った方がオーバーヘッドが少なかったりしないかな。
まあオレは面倒だから大抵外部コマンドを使っちゃうけど。
910デフォルトの名無しさん:2011/10/26(水) 13:57:13.59
form.datのロック
form.datへフォームデータを書き込む
form.datのロック解除

toukousuu.datロック
toukousuu.datへの書き込み(書き込み数保存ファイル)
toukousuu.datのロック解除

ファイル単位のロックだとform.datの書き込みが成功して
toukousuu.datがロックで書き込めなかった場合
投稿数が合わないことになりますが
こういう場合の対処方法はないんですか?
911デフォルトの名無しさん:2011/10/26(水) 14:11:27.04
なんでwihle文が実行しないんですか><


誰か教えて


$name="yahoo.co.jp";

print "$name\n";



while($name!='jp'){

$name=~s/[^\.]+\.//;

print "$name\n";


}

print "tes";
912デフォルトの名無しさん:2011/10/26(水) 14:13:55.55
>>910
ロックファイルを一つにして
ロックの有無で書き込み実行を制御する。
913デフォルトの名無しさん:2011/10/26(水) 14:18:17.91
>>911
$name!='jp' → $name !~ 'jp'
914デフォルトの名無しさん:2011/10/26(水) 14:23:30.38
>>911
いやまて、ダブルでおかしいから解答間違えた。
文字列の比較はneとeqだ。
その行間なんとかしろ、見にくい。
915デフォルトの名無しさん:2011/10/26(水) 14:44:36.04
>>910
これCGI?
だったらスレ違いだけど
916デフォルトの名無しさん:2011/10/26(水) 15:28:25.83
>>914
ありがとw
文字だからne eqかwww


超わかんなっかたw とんくす
917デフォルトの名無しさん:2011/10/26(水) 15:42:46.79
>>910
form.datのロック
toukousuu.datロック

form.datへフォームデータを書き込む
toukousuu.datへの書き込み(書き込み数保存ファイル)

form.datのロック解除
toukousuu.datのロック解除
918デフォルトの名無しさん:2011/10/26(水) 16:43:44.13
>>917
時間差がある限りそれでも回答としては不完全だな。
919デフォルトの名無しさん:2011/10/26(水) 17:03:32.23
920デフォルトの名無しさん:2011/10/26(水) 19:10:53.96
>>918
いや、これで行けるだろ・・・
どんなパターンで行けないのさ
921デフォルトの名無しさん:2011/10/26(水) 19:17:07.15
>>919
この記事の内容では、
open(LOCK, "$file");
flock(LOCK, 2);
$data = <LOCK>;
close(LOCK)

だと、少し隙間があるとかってなってるけど・・・
これについて、俺も独自で検証した事はあるよ
10万回ループして、ひとつのファイルから読み込んで、
+1して書きこむ。簡単なカウンターを作ってね。
それを、5個同時に走らせたけどカウントは壊れず最終カウント50万になったよ。
どうすれば、その「ロックの隙間」が再現できるのか教えてもらいたい。
922デフォルトの名無しさん:2011/10/26(水) 19:28:37.90
>>920
910と五十歩百歩。
923デフォルトの名無しさん:2011/10/26(水) 19:30:28.45
>>921
実は自分はその点についてはあんまり重要視してないんだが・・・。
専用のロックファイルを1つ作ったほうが、
複数の書き換えファイルをいちいちロックするよりも処理が簡単になるというのが肝だと思ってる。
その(実用上はめったに起きないであろう)問題へも対処できる、ってのはおまけのようなもんだと思う。
924デフォルトの名無しさん:2011/10/26(水) 19:34:16.61
直接ファイルに書き込むのはやめて、行ロックやロールバック機能のあるDBMSを使いましょう
925デフォルトの名無しさん:2011/10/26(水) 19:42:04.70
>>922
だから、どういう事なのか言ってみろってば。
どういう時間差が出るんだよ、マジで。
926デフォルトの名無しさん:2011/10/26(水) 19:49:03.52
>>925
>どういう時間差
そのまんまの時間差。
ってか時間差が出ないほうの説明が聞きたい。
927デフォルトの名無しさん:2011/10/26(水) 19:50:49.21
>>926
いや、待てよ。
答えになって無いだろ
時間差が出るのはわかる
が、どういう時間差が原因で不具合が出るって言ってるんだよ
928デフォルトの名無しさん:2011/10/26(水) 19:53:00.66
1000万回ループ回してみたけどカウンターは壊れなかった
>>919のサイトの言ってる事は信用してはいけない
929デフォルトの名無しさん:2011/10/26(水) 19:55:39.55
まあ、こういう例も無いとは言えないけどな

Kazuho Oku - perl-casual特別企画 Unix Programming with Perl 1/2
http://www.youtube.com/watch?v=mP699JMwuZE
930デフォルトの名無しさん:2011/10/26(水) 20:02:13.32
>>927
そのファイルはそのプログラムからしか使われないのか?
万が一でも可能性があるなら排除する。
プログラマの鉄則だろ。
931デフォルトの名無しさん:2011/10/26(水) 20:05:01.82
>>927
自分が正しい前提でえらっそうですね。
910がダメで920がダメじゃない理由がしりたいw
932デフォルトの名無しさん:2011/10/26(水) 20:08:37.12
>>931
だから、何がダメなのか俺にはわからないから言ってみてくれって言ってんだろ・・・
933デフォルトの名無しさん:2011/10/26(水) 20:10:41.33
>>932
おい、まだわからんと?
934デフォルトの名無しさん:2011/10/26(水) 20:12:01.88
>>932
910がダメで920が大丈夫な理由は?
まずそれを聞かないともう答えられない。
935デフォルトの名無しさん:2011/10/26(水) 20:13:30.25
なんだこりゃ・・・もう結構です。
936デフォルトの名無しさん:2011/10/26(水) 20:20:49.18
あれ、openの時点で読み書きモードにしなくても大丈夫?
937デフォルトの名無しさん:2011/10/26(水) 20:35:06.83
逃げずに説明せよせよせよ(残響)
938デフォルトの名無しさん:2011/10/26(水) 20:55:50.31
とりあえず>919のリンク先がおかしいのは確実だと思う。

「flockの隙間」の項目を読んでいるのだが、openとflockの間に隙間があっても問題ないと思う。
flockから先に行かせない(実際にデータを読ませない)のがflockの役割だろう。

また、同じ項目に、
>全てのスクリプトからファイルの中身が読み取れてしまいます。
とあるが、flockで順番待ちしているのだから、終わったら読み込めるのは当然だ。

939デフォルトの名無しさん:2011/10/26(水) 21:12:55.49
>919のはopen()がsnapshotをしてると思ってる、と読んだ
940デフォルトの名無しさん:2011/10/26(水) 21:14:21.12
>>457 からのクソながい議論
941デフォルトの名無しさん:2011/10/26(水) 21:41:05.87
>>939
Perlのopenがstdio使ってたら
openとflockの間にstdioがbufferingする可能性はないのかな
942デフォルトの名無しさん:2011/10/26(水) 21:51:49.13
>>921
open(LOCK, "$file");
flock(LOCK, 2);
$data = <LOCK>;
close(LOCK)

これだとopenしてからロックしてるじゃん
逆だろ
flock(LOCK, 2);
open(LOCK, "$file");
が正しいはず
943デフォルトの名無しさん:2011/10/26(水) 22:03:59.31
こ れ は 新 機 軸
944デフォルトの名無しさん:2011/10/26(水) 22:04:53.23
こ れ は 新 喜 劇
945デフォルトの名無しさん:2011/10/26(水) 22:07:56.16
strace perl -e 'open(FILE, "/dev/null"); flock(FILE, 2);'
してもbufferingしてるようには見えなかった。そりゃそうか
946デフォルトの名無しさん:2011/10/27(木) 01:50:27.31
> flock(LOCK, 2);
> open(LOCK, "$file");

さすがに open もしてないファイルハンドルをロックすることは
できないだろ。
947デフォルトの名無しさん:2011/10/27(木) 01:55:16.18
つーか or die してくだしあ
948デフォルトの名無しさん:2011/10/27(木) 13:12:31.23
【訃報】LISP言語とA.I.の父 ジョン・マッカーシー(John McCarthy)博士
http://toki.2ch.net/test/read.cgi/scienceplus/1319679294/

C、Lispと来たら次は……
949デフォルトの名無しさん:2011/10/27(木) 13:40:44.62
次はRubyか。楽しみだな。
950デフォルトの名無しさん:2011/10/27(木) 17:33:50.15
次はRubyか
それは本当に楽しみだな
951デフォルトの名無しさん:2011/10/27(木) 17:35:07.27
穴二つっていうぞ、くわばらくわばら・・・。
952デフォルトの名無しさん:2011/10/27(木) 17:37:37.89
つまり俺?
953デフォルトの名無しさん:2011/10/27(木) 18:11:46.33
アッー?
954デフォルトの名無しさん:2011/10/27(木) 18:24:51.25
人を呪わばなんと奇遇な
955デフォルトの名無しさん:2011/10/27(木) 22:41:38.01
次はVisual Basicか、くわばらおばら・・・。
956デフォルトの名無しさん:2011/10/27(木) 23:43:02.27
strftimeとstrptimeがどっちがどっちか覚えられないんだけど、
formatとparseの略なのかな?
$time = Time::Piece->strptime('2007-01-01', "%Y-%m-%d") は与えた時間をパースして、timepieceのインスタンスにする。
$time->strftime(%Y%m%d) はインスタンスが持ってる時間をフォーマットに整形して返す。


957デフォルトの名無しさん:2011/10/27(木) 23:50:58.32
strptime - convert a string representation of time to a time tm structure
strftime - format date and time

manコ
958デフォルトの名無しさん:2011/10/28(金) 01:58:05.98
>>954
プロペラ先輩だっけか
959デフォルトの名無しさん:2011/10/28(金) 08:25:43.19
くりすぴーか
960デフォルトの名無しさん:2011/10/28(金) 21:41:59.31
ファイルロックについては意見が分かれて議論になる場合が多いから
明確な答えはないということは分かった
961デフォルトの名無しさん:2011/10/28(金) 22:35:37.40
ここって意外と分かっている人が少ないね
962デフォルトの名無しさん:2011/10/28(金) 22:53:38.81
便所の落書きですがなにか
963デフォルトの名無しさん:2011/10/28(金) 22:59:02.51
ンコしながら書き込んでるからな。
あまり詳しくは説明できんのだよ。
964デフォルトの名無しさん:2011/10/29(土) 00:16:07.48
そうだな。カキコに気を散らしてるとせっかく出かかったやつが引っこんじゃうしな。
965デフォルトの名無しさん:2011/10/29(土) 10:52:47.36
#!/usr/bin/perl

use utf8;

binmode(STDIN, ':encoding(euc-jp)');
binmode(STDOUT, ':encoding(euc-jp)');
binmode(STDERR, ':encoding(euc-jp)');

$a="てすと";

$file4="esujisu25.txt";
open(TO2,">:encoding(euc-jp)", "$file4");
print TO2 "てすと\n";
#print TO2 "難しいてすと\n";
close(TO2);

「難しいてすと」だと文字化けせずに「てすと」文字化けします。
なぜですか?教えてください。
966デフォルトの名無しさん:2011/10/29(土) 11:05:59.23
>>965
すれ違いです。テキストエディタスレに行ってください。
967デフォルトの名無しさん:2011/10/29(土) 11:55:02.42
あ、文字化けするのは出力後のテキストファイルの話です
968957:2011/10/29(土) 12:47:23.26
ありがとです
969デフォルトの名無しさん:2011/10/29(土) 12:49:57.15
↑まちがえた、、、 名前じゃなくて、>>957
970デフォルトの名無しさん:2011/10/29(土) 14:41:39.55
>>965 >>967
コードからは文字化けを起こす要素が無い気がするけども。
Perl のコード以外の問題じゃないのかな?
971デフォルトの名無しさん:2011/10/29(土) 14:49:00.64
あれほど$aを使うなと言っているのに……
てすとが文字化けした時ってのは$aにてすとを突っ込んだ時の話じゃねーの?
状況は最初から全部明確に書けアホ
972デフォルトの名無しさん:2011/10/29(土) 14:59:40.51
>>966が言っているのは、エディタが、「難しいてすと」だと文字コードを適切に判断できてるけど、
「てすと」だけだと短かすぎて判別を誤ってるってことでは?
973デフォルトの名無しさん:2011/10/29(土) 15:17:45.90
>>971
perldoc perlvar すると

> $a
> $b
>
> Special package variables when using "sort()", see "sort" in perlfunc. Because
> of this specialness $a and $b don't need to be declared (using "use vars", or
> "our()") even when using the "strict 'vars'" pragma. Don't lexicalize them
> with "my $a" or "my $b" if you want to be able to use them in the "sort()"
> comparison block or function.

とあるので sort を使わない限りは関係無いんじゃね?
とはいえ、普通は事故防止の為に $a $b なんて変数は使わないよね。
974デフォルトの名無しさん:2011/10/29(土) 15:33:04.32
>>971
確かめもしないでいい加減なことを書いてるんじゃねえよ。
オマエと>>965のレベルはどっこいどっこいだな。
975デフォルトの名無しさん:2011/10/29(土) 15:40:00.15
いいから出力をhexdumpしろよ早くしろよ
976デフォルトの名無しさん:2011/10/29(土) 15:44:57.85
>>972が正解だろ
977デフォルトの名無しさん:2011/10/29(土) 18:45:38.10
$s='<hoge>piyo<foo>bar';
$s=~/<([^>]+)>/g;
↑のグローバルマッチングでhogeとfooを後方参照で取り出すにはどーしたらいい?
978デフォルトの名無しさん:2011/10/29(土) 19:25:59.13
ああそうか、$2 とか @- に入ってくれないんだっけ。
pos関数で地道にやるのは全然スマートじゃないしなあ。
979デフォルトの名無しさん:2011/10/29(土) 19:29:57.67
素直に、@arr = $s=~/<([^>]+)>/g; すれば?
980デフォルトの名無しさん:2011/10/29(土) 20:21:46.89
/(.)\1/ の \1 は後方参照 (backreference) だが、
/(.)/ の後に $1 を使うのは違う。
981デフォルトの名無しさん:2011/10/29(土) 23:27:47.47
PerlやったあとC言語やるとダルいな
特に日本語文字列あたり
982デフォルトの名無しさん:2011/10/29(土) 23:35:02.13
Cはコンピュータ、perlは自然言語向きだからな。
やることが大幅重なってる言語なんて必要ない
特化が全て
983デフォルトの名無しさん:2011/10/29(土) 23:36:38.87
シジルってばオカルト用語だったのかよwww
ttp://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B8%E3%83%AB_%28%E3%82%AA%E3%82%AB%E3%83%AB%E3%83%88%29
984デフォルトの名無しさん:2011/10/29(土) 23:51:49.05
ブレスなんてのも宗教用語っちゃ宗教用語だしな
985デフォルトの名無しさん:2011/10/30(日) 00:36:56.80
以下のコードが動きましたが、文字コード周りが混乱しているので教えてください。
use utf8;
use Text::CSV;
use Data::Dumper;
use Encode;

binmode STDOUT ':encoding(utf8)';
my $csv_path = shift;
open my $fh, '<:encodeing(sjis)', $csv_path;

my $csv = Text::CSV->new;
$csv->column_names($csv->getline($fh)) {
 print $_ for @$row;
}

これをprint Dumper($row)にすると、\{ff84}のような出力になるのはなぜでしょうか。
また、openで使用している<:encodeingは、PerlIOの機能のようですが、これはPerlIOがuse Encodeを呼び出して使用しているのでしょうか。
986デフォルトの名無しさん:2011/10/30(日) 00:52:46.20
> encodeing
ホントにこのスクリプト動くの?

987デフォルトの名無しさん:2011/10/30(日) 01:24:45.14
すみません、コピペじゃなくて打ち直したのでtypoしてます
988デフォルトの名無しさん:2011/10/30(日) 03:21:25.00
typoどころじゃなく動かねえよこれ。
打ち直してないでコピペしろ。
989デフォルトの名無しさん:2011/10/30(日) 03:25:09.07
$csv->column_names($csv->getline($fh)) {
 print $_ for @$row;
}

謎すぎる構文
990デフォルトの名無しさん:2011/10/30(日) 03:51:09.96
>>989
たぶんperldoc text::csvから引っぱってきてるんだろうけど。
当人じゃないとどことどこをどう改変したんだかわかんねえや。
$rowはどこから持ってきてるんだよって。

ところで次スレって>>950が立てるんだっけ?
991デフォルトの名無しさん:2011/10/30(日) 05:07:55.26
use utf8;
use Text::CSV;
use Data::Dumper;
use Encode;

binmode STDOUT, ':encoding(utf8)';

my $csv_path = shift;
open my $fh, '<:encoding(sjis)', $csv_path;

my $csv = Text::CSV->new;
$csv->column_names($csv->getline($fh));
while( my $row = $csv->getline($fh)) {
print $_ for @$row;
}
992991:2011/10/30(日) 05:09:21.62
すみません、最近VertualBoxからコピペできなくなってしまってずさんなことしました。
993デフォルトの名無しさん:2011/10/30(日) 10:53:26.78
>>991
マニュアルには、{ binary => 1 }とすべきと書いてありますが、これをするとどうなりますか?

my $csv = Text::CSV->new ( { binary => 1 } ) # should set binary attribute.

Text::CSV
http://search.cpan.org/~makamaka/Text-CSV-1.21/lib/Text/CSV.pm#SYNOPSIS


PerlIOがEncodeを呼んでるようです。

Encode::PerlIO
http://search.cpan.org/~jhi/perl-5.8.1/ext/Encode/lib/Encode/PerlIO.pod#How_does_it_work?
994デフォルトの名無しさん:2011/10/30(日) 10:59:45.12
VirtualBoxも打てないんじゃ無理じゃないの?
995デフォルトの名無しさん:2011/10/30(日) 11:05:10.92
>>992
> 最近VertualBoxからコピペできなくなってしまって
バージョンアップの後にExtension Packもアップデートした?
996デフォルトの名無しさん:2011/10/30(日) 11:10:20.41
そしてJcodeを使い始める。
997デフォルトの名無しさん:2011/10/30(日) 11:27:07.25
require 'jacode.pl';
while(<>){
  chomp;
  my @row = split(/,/, $_);
  for my $row (@row){
    jcode::convert(\$row,'utf8','sjis');
    print $row;
  }
}
998デフォルトの名無しさん:2011/10/30(日) 11:52:30.05
ネタでもjcodeとかjacodeとか見たくもない
百歩譲ってもJcodeまでだ
999デフォルトの名無しさん:2011/10/30(日) 11:57:03.04
じゃあこうで
1000デフォルトの名無しさん:2011/10/30(日) 12:06:17.06
>>991
>>993ですが、最初の質問の意味を取り間違えてました。
その文字列は、テキスト文字列といい、 Data::Dumperではその文字のUnicodeのコードポイント
を返してますね。

\{ff84}:Unicode U+FF84
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。