# [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 でエンコードする必要があります。
_ノ乙(、ン、)
7 :
デフォルトの名無しさん :2011/08/21(日) 12:47:37.75
初めてのPerlって本に my @lunch_choices = grep &is_edible($_), @gilligans_posessions; って書いてあったんだけど、$_は自分が展開されるタイミングを自分で 決められるように見えるんだけど、どう理解すればいいですか? あとこういう事ができる変数を自分で作れるの? $_だけ特別なの?
$_だけ特別です $_は手抜きや省力化のための大変素晴らしい特殊な変数です $_をマスターすることがperlへの理解の第一歩でありかつ終着地点です $_を制する者がperlを制します
>>7 確かに言われてみればだけど、 grep 式, @array の形だと何か不思議に見えるかもねえ。
この場合同じ意味の grep { 式 } @array に書き換えたほうがわかりやすい。
つまり foreach (@array) { 式 } と同じように、 @array の要素を順に $_ に代入して式を実行してるだけってこと。
my @lunch_choices = grep { &is_edible($_) } @gilligans_posessions;
my @lunch_choices = grep(@gilligans_posessions) {&is_edible($_)}
>>10 >>11 その記法だと今度はブロック内の普通の関数呼び出しでは
&つけなくていいのになんでgrepのときはつけなきゃいけないのーふえぇぇんってなっちゃう
意味不明だ。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 ;
&とかPerl4記法ってだけだろw 古い古い。 今じゃ特殊な例でない限り使わん。
grepだけじゃなく他にもあるから厨カッコのほうがなんとなく統一感がでて上級者として見てもらえる mapとかsortとか。
>>15 ケント脳って煽り。
「ケント否定派乙」って煽りなの?それとも「ケント信者乙」って煽りなの?
後者だと思ってたんだけど、ここ最近、ケントの名前を使って
煽ってる人がどうやら前者で煽ってるみたいで、非常に不思議だ。
>>17 ケントとレベルが変わらんコードしか書けない連中のことだよ。
その連中の主観では、「ぼくちんはケントみたいな化石とは違う」と思ってるんだろうが。
これから新しいあおり考えたよ ケント脳 はい 決定 これ使お
KENT 汚染者も同じ意味なのかな? つーか煽りのタイミングも意図も全く不明で 忍者のレスを見てる気分だったわw
TPO合ってないよ? TPO考えたら?
>>16 中括弧は速度が落ちるので、中括弧でないバージョンは速度が欲しい時かな
自分で考えた煽りを、自分で解説するってすげえ惨めじゃね? 今のは、ここが面白い所。って、自分のコントの説明をするお笑いみたいだ。
中のひとは自分が思いっきり外していることになかなか 気がつかない。 外から見てる人は冷静なんで、またこの人...と思っては いるが、いちいち教えてあげない。 それがここ数年の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; は同じ意味なんでしょうか?
>>25 前者:
同じ意味ではない。
後者:
同じ結果にはなるが同じ意味ではない。
27 :
デフォルトの名無しさん :2011/08/22(月) 20:04:53.24
29 :
デフォルトの名無しさん :2011/08/22(月) 21:24:24.53
>>29 Perlを勉強する気があるなら…自分で考えてみよう。正規表現の基礎です。
Perlを勉強する気がないなら…サヨウナラ。
packのcとCで、符号の有無が変わるんじゃなかったっけ
>>26 後者も同じ結果にはならない。unpack 'H2' は A-F が小文字として、
sprintf '%%%02X' は A-F が大文字として出力される。
そうか。すまん。
迷ったら実験コードを書いてしまえばいい。 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の前に半角スペースが入っているんだが このスペースは必要なのか?削除してはだめなのか?
このところsageずに質問を連続でかましてる奴は 自分で確かめるって術を知らんのかな
use CGI; してる解説サイトを見たり URI::Escape のドキュメントを見たりすれば 悩み事も減っていいような気がする。
>>37 可読性向上のためのスペースでなくても処理に影響はない
演算子の両側、コンマの後だけ、は割と一般的なスタイル
>>36 keysが配列を返して、foreachの引数にした時点で別の配列になってるから大丈夫。
42 :
デフォルトの名無しさん :2011/08/23(火) 23:02:20.73
ファイルを読んでるだけなのですが、while (<FN>) のところでFNと<や>の間にスペースを入れると うまく動きません。 my $filename = $ARGV[0]; open (FN, $filename); while (<FN>) { print $_; } どうしてでしょうか。
<
スペース無しだとファイルハンドルと見做す スペース在りだとグロブと見做す perldoc perlop では<$fh >と例が書いてあるが、 実際の所は、< $fh>だろうとグロブする。
プログラムに関して勉強し始めたばかりの者です。質問があります。 メールフォームを作成し、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」というパスはどのように記述すればよいのでしょうか? 初歩的な質問ですみません。よろしくお願いします。
空白あり PATH にインストールすること自体が危険だと思ってくれれば。 あなたが思ってるよりも PATH に関してはシビアですよ。サーバーのソフトは。 c:\sendmail にインストールしませう。 再インストール出来ないのなら $SENDMAIL = '"C:\Program Files(x86)\sendmail\sendmail"'; とダブルクォーテーションで囲ってみませう。
前スレで複数配列の受け渡しの質問があったけど これが正しい @aaa1=("aaa1,"aaa2","aaa3""); @bbb=("bbb1","bbb2","bbb3"); &test(*aaa1,*bbb1); sub test{ (*aaa2,*bbb2)=@_; } (@aaa2,@bbb2)=@_;では@bbb2が受け取れない
訂正 @bbb=("bbb1","bbb2","bbb3"); ではなく @bbb1=("bbb1","bbb2","bbb3"); ね
だからー型グロブ使わないでリファレンス使えってーの
>>47 グローバルな変数に代入したら引数渡しをする意味が薄れるのでは?
今時、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のレスは無し。
sub func(\@\@){ my @aaa2 = @{$_[0]} ; my @bbb2 = @{$_[1]} ; } func @aaa1, @bbb1 ;
56 :
45 :2011/08/24(水) 21:49:05.73
>>46 お返事ありがとうございます。
空白ありのPATHが危険であるということは知りませんでした。今後は気を付けたい思います。
仰る通りにC:直下にsendmailを移し、パスを設定し直したところ正常に動作しました。ありがとうございました。
ただ、PATHに空白がある場合の設定なのですが、"C:\Program Files(x86)\sendmail\sendmail"
というように" "で括っても、やはり正常に動作しませんでした。やはり空白の部分で区切られてしまうようです。
また、" "で括るようにご指導いただきましたが、" "で括った場合はエスケープシーケンスが
動作してしまうと考えてPATHを' 'で括っていたのですが、これは間違った考え方なんでしょうか?
よく考えるとパイプを形成するところを" "で括っているから、PATHを記述するところだけ''で括っても意味ないのかな・・・?
もし今後、このような空白が存在したり、\sや\nのようなエスケープシーケンスと同じような記述の並びが存在する
ディレクトリを指定しなければならなくなった場合、どのようにすればよいのか知っておきたいのですが、どうすればよいでしょうか。
>>46 は空白まじりの文字列を二重引用符で囲った上で
さらに単一引用符で囲ってるように見えるよ
58 :
46 :2011/08/24(水) 22:36:37.52
>>57 やっぱりそうですよね。
" "という空白文字に対して"\ "というようにしてみたりしたんですが、上手くいかないです。
" "で括った範囲内の空白は、どのように記述すれば空白文字として認識されるようになるんでしょうか?
空白を含む PATH は "" で囲めばよいというのは分かりますよね? "PATH" ってゆう風になるわけですが、これをさらに1つの文字列として解釈するには ' か " で囲めばいいわけですが、" で囲む場合は " をエスケープする必要があります。 '"PATH"' または "\"PATH\"" です。
60 :
46 :2011/08/25(木) 06:40:31.92
>>59 お返事ありがとうございます。
あなたが仰られていることは、例えば「\n」という文字列は" "内ではエスケープシーケンスとして判別されてしまうので、
" "内で「\n」をエスケープシーケンスとして表現しないようにするときには「\\n」と記述すればよいというようなことですよね?
それは分かるのですが、それと同様に" "内における空白文字「 」に対してはどのような記述をすればよいかが分からないのです。
それとも空白文字は" "内では一切エスケープシーケンスや区切りの記号としての働きはしないということなのでしょうか?
>>45 の内容ですが、'"PATH"'で囲い、エスケープシーケンスが働かないように\で防いでもやはりダメでした。
私のレスは45であるのに、今まで46と間違って名乗っておりました。 申し訳ありません;;
open(IN, "cat -n \"$file_name\" |") ;
>>60 perlに対するエスケープとOSに対するエスケープが混ざってるよ。
OSに対して"PATH"を渡す必要がある。
別の方法としてはdir /Xとかで表示される短いファイル名を使う。
>>63 の例だと dir C:\PROGRA~1\COMMON~1
おれは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"
パイプだとcmd.exeのコマンドになるのかもな
mixiのPerlコミュの質問レベル低いわー ただ回答者はみんな紳士的だがな
↓改めてここからPerlの質問。
リャマ本をひと通り読んだけど、正直わからないことだらけで、覚えられなかったことも多々ある 主に正規表現とファイル、ディレクトリの扱い どう勉強したらいいんだろ
怖がらずに試す
正規表現は文章じゃ覚えられなかったな 細部まで理解しないで正規表現が必要になったときに書いてみて「この文字はこういうもの」って覚えてた
正規表現わからないならperlの1/3が分からないのと同じ 正規表現使わないならperlを使う意味がない
>>72 たくさんプログラム書いたほうがいいのはわかるけど
理解がいまいち浅いから中々難しいわ
>>73 しばらくはそ場面で参照しながら段々覚えていけばいいか
>>74 テキスト処理考えると当然重要になってくるもんな
その内詳説正規表現かクックブック買おうと思ってるんだが
>>75 正規表現なんてPerlに限らずエディタとかgrep/sedでも使えるから
そういうので正規表現検索や置換やって覚えりゃいいんじゃないかな
あとはPerlでその正規表現をどうやって利用するかだけ覚えりゃいい
10進数を16進数に変換するのはできたけど 0〜Zまでの36進数に変換するにはどうしたらいいんですか?
36の累乗で割っていく 商を置換する
81 :
デフォルトの名無しさん :2011/08/27(土) 20:55:42.09
>>51 昔のperlの組み方の方が使いやすいから使ってるよ
上司もそうだし
モジュールも全く使ってないし、使っているのはjcode.plだけ
サブルーチンは.plファイルをrequireして&呼び出しで使っている。
あと使っているはprint,foreach,open,push,popなどの基本的な関数だけ
それでもちゃんと動作するからいいんだよ
釣り針大きすぎ
>>81 みたいな使い方で用が足りているなら
それはそれで問題ない
この先もずっとそれで用が足りる保証はないけどね
どんな旧時代的な手法を使おうと勝手だけどそれを他人に勧めるなよ 釣りなんだろうけど
>>81 jcodeだめだわーw
だって中国語を扱えない。
86 :
デフォルトの名無しさん :2011/08/28(日) 00:38:55.96
>>85 データ保存ファイルがANSI形式で、ユニコード文字を送信して書き込んだ場合
ブラウザが勝手に〜;の形にしてくれるから、それを読み出せば
ブラウザにはユニコード文字が表示される
だから問題なかったよ
アプリ作ってる最中で、そのアプリ専用のモジュールが3個ほど出来たんだけど、 モジュールにする時点で、出来る限り汎用性を持たせた方が良いの?
>>86 データ保存ファイルがANSI形式じゃなかったら?
そりゃ、お前に都合のいい条件なら、
できるだろうさw
でもな。それはお前の限界の範囲までの話だ。
お前の上司も限界が低そうだな。
俺はPerlを本格的に始めてから、一年半ぐらいだが、
>>81 の上司よりもPerlに詳しい自信があるなw
まあ他の言語も多数やってきたからってのもあるんだろうが。
新しいことに手を出さない人間はダメだよ。
「これで今までやってこれた」は自慢じゃなくて
諦めた人間のセリフだから。
90 :
デフォルトの名無しさん :2011/08/28(日) 01:02:17.92
結局Perl6が出てもPerl5はそのまま残るんだろ? 7以降はどうなるの?
ちゅーかぶっちゃけ、社会人ですら無く
「時代に背を向け古いコードを書く俺って、なんかかっこ良くね?」
って中二病患者のガキだろ。
>>90 6がvaporwareなのに7の心配をして何の意味がある?
今でもモジュールが使えないサーバーとかあるからね そういうサーバーだと昔のperlで書くしかないね
>>93 アホか? 薦めてないだろ。
お前みたいな独りよがりは死ねよ。
>>92 スレの流れを読んだうえで、その擁護レスとも取れるレスを書いたのか?
>>47 ↓
>>51 ↓
>>81 この流れだと読み方によっては「昔のperl」=「perl4記法」だぞ。
×読み方によっては ◯普通に読めば
7は5と6の両方を継承して欲しい。 仮面ライダーV3みたいなもん。
98 :
デフォルトの名無しさん :2011/08/29(月) 00:01:06.01
それじゃ何のために互換性捨ててまで新しいのつくろうとしているのかの意味がなくなる
>>92 > 今でもモジュールが使えないサーバーとかあるからね
今はVPSでroot権限持てるサーバーが格安であるんだが?
開発したいのなら、開発向けのサーバー使えよ。
> そういうサーバーだと昔のperlで書くしかないね
”昔の”ってPerlのバージョンなんだ?言ってみろ。
知らないから昔のって言ってるんだろ?
俺にとっては昔のはオブジェクト指向はもとより
Encodeモジュールも搭載してないPerlだ。
それはPer.5.8よりも前のPerl。5.8は2002年登場。
10年近く前のPerlで書くしかない状況なんてまず無い。
10年以上前のPerlでそこから成長してない奴はプログラマ失格だ。
はい
改修案件でperl -vしたらPerl5.005だった・・・
改修案件の要件に、新しいバージョンへの 対応が含まれてないのならご愁傷さまだよなw ハードで言えば、ハードウェアが古くなったのでリプレイスしますが、 ハードウェアは全く同じものにリプレイスします。性能は変わりません。 みたいなw
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) { ## 祝日判定 } こんな感じでやりましたが、まだ祝日判定がうまく行ってません。
Calendar::Japanese::Holiday を元に1900年まで拡張するのがいいんじゃ ないかと。 1900年からならもう明治になってるし、どういう日が祝日かは調べりゃ わかると思う。
べつにどっちのやり方でもいいんじゃないか? プログラムなんてエラーが出なくて動作して使えればいいわけだから 好きな方の組み方で良いと思う。
もしかしてこれがガチの銀行業務に使われるんじゃあ……
えー銀行業務にPerl使うかね
111 :
デフォルトの名無しさん :2011/08/29(月) 18:59:22.76
銀行はLISP
ここ100年の祝日のリストが必要で 祝日と、そしてもしかして土日で何か分岐するような 大掛かりなことをやりそうなのは銀行かそれに携わる人かなぁと 祝日の他に、もう一つ、処理すべき巨大で長大な時系列のデータが背後に控えてる……ってのが直感
銀行業務のシステムに関わる人なんて、 大手IT会社とかの人間だぞ、三菱とか。 それが、平日の昼間に2chに書き込むか? logで直ぐバレるのに? って言う具合の想像力の事じゃね? 俺は単なる宿題に一票。
2ch耐性、無い奴だな、、、昨日の92氏か?
それもどうでもいい。
120 :
104 :2011/08/31(水) 00:34:05.18
ありがとうございます。119のリンクからPerlの関数をとりました。 ちなみに銀行関係ではありません。
ちなみになんのためにそんな処理をするのだけが気がかりになって このまま教えてくれないままだったら俺の夏が終わりそうにない ね、お願い
100年前と今の祝日は違うから、
>>119 のスクリプトじゃ不備だらけじゃない?
祝日が増えたり、定義が変わった段階でのパターンファイルを用意するとかすれば
色々対応できそうだが。。。
まあコードとしてはあまりおもしろみがないからどうでも良いんじゃね。
>>107 の Calendar::Japanese::Holiday ならソース見た感じ1900年くらいまで考慮されてるように見えるけど
1948年の祝日法以前にも対応したモジュールは見たことない。
126 :
124 :2011/08/31(水) 02:27:29.10
POSIXキューをperlから使う方法を教えて
128 :
104 :2011/08/31(水) 21:00:21.02
おそくなってすいません。あまり詳しくかけませんが、 ほかにも大量の雑多なデータがあって、、、 1948以前に対応しようとすると、大変なのですね。、
いや、対応しようとも何も1948年以前は法に定められた祝日ってものがなかったってことでしょ?
とりあえず江戸時代の祝日を教えてくれ。
株……かね? ここ100年間の祝日つまり休みの日のリストが欲しいってことは、 銀行じゃなきゃ何かしらの史学科の学生か、 それとも株か。 史学科や民俗学系統の文系の学生ならそういう祝日リストを研究室単位で持ってそうなモンで、 でもそれはない。 時系列で記録された大量のデータを喰わせて、そのレコードの祝日判定してく…… ってな案件はそうそう転がってない。
1948 以前は実際に祝日だったってのが分かってるんだから、決め打ちでいいじゃん
数行の文でこれだけのキモさと頭の悪さが伝わってくるのはすごいな
ちょっとなにをいってるのかわからない
135がぶっとびすぎててアレw
正規表現で、fugaで始まらないhogeにマッチさせたくて (?!fuga)hoge と書いたらうまくいきません。どうしたらいいの ちなみに条件判断とかじゃなくて、できれば正規表現だけでやりたいです
条件判断では出来たの?
>>139 いえ、やってないです
もっと厳密にいうと、ほんとは「fugaではじまらない」でなくても「fugaが含まれない」でもいいんです。なので条件判断と組み合わせれば可能だと思うのですが、できれば正規表現だけでやりたいのです
hogeの直前にfugaがないという意味ではないよね?
一般的にはそれでfugaで始まらないhogeにマッチするよ。 もし期待した結果が得られないなら正規表現が間違って いるんじゃないかなぁ。fugaとhogeを具体的に示して 駄目な例も出さないと一般論では難しいな。 たぶん正規表現は書いたとおりに動いてると思うw
>>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にもマッチしてしまうんです
勉強中の初心者なのでなにかとんでもない勘違いしてたらすみません
(?! ) はマッチした部分の“後続文字列”の指示、なので、 たとえば $str =~ / hoge(?!fuga) /x と指定すると hogehoge にはマッチするが hogefuga にはマッチしない。 ということのようだ。 条件式も併用してたとえば $str =~ / (.*)hoge /x and $1 !~ /fuga/ みたいにしないとだめっぽいが。 あとは識者待ち。
$strにfugaが含まれていないときにマッチしたいという意味でしょうか? 要するに以下のような条件を1つの正規表現にまとめたいと? if ( $str !~ /fuga/ and $str =~ /hoge/ )
>>144 そうなんです。hoge(?!fuga) だと前方には効かなくて
>>145 そうです。
やはり正規表現だけでは無理なものなんですかね
(?<!fuga)
>>147 すごい、できました!ありがとうございます
みなさんもありがとうございました
>>147 > (?<!fuga)
これってバージョンいくつ以降で有効?
直前以外にも対応させようと思えばこんな感じかな? 取出しは$&でなく$1になるけど。 /^(?:(?!fuga).)*(hoge)(?!.*fuga)/
文字列の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" ;
>>151 use utf8 してれば、各関数はそれぞれ下の1行で済む。
pops → substr($str, 0, 1);
pushs → $str .= 'TEST';
もっと付加価値を付けなきゃ作る意味が無いよ。
>>151 $_[0]が引数のエイリアスだからそれを操作すれば呼び出し元を操作したことになるよ
sub pops ($) {
my @t = split // , $_[0] ;
pop @t ;
$_[0] = join "", @t ;
}
>>152 > 1998年リリースの5.005から
おお。ありがとう。
手元の「新Perlの国へようこそ Perl5対応版」には (?<= ) と (?<! ) は載ってなかった。
かわりに ?PATTERN? なんてのを再発見。こんなの使ったことなかったなあ。
いい機会なんで正規表現の仕様を見直して覚え直しておきます。
詳説 正規表現
>>155 (?<= ) と同じような機能で量指定子も使える\Kというのも最近できたよ
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
すまん少し前のレスくらい読むべきだった。 5.14.1だと、m{\K(?:(?!fuga).{4}|^.{0,3})hoge} で行けるみたい。 へ〜
後読みは固定長限定だけど先読みは可変長でも使える
そうだった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属性の場合のやり方がわかりません。どなたかご助言していただけると幸いです _ _
そもそもそのimg要素のdata-src属性ってのはいったい何なんだ? 聞いたことないんだが。
その書き方は HTML5 だよ
>>163 $mech->content()を別のパーザに突っ込むしかない。
もしくはWWW::MechanizeがHTML5対応になるのを待つか。 しかしHTML5ってまだ勧告レベルでもないんだろ。(2014年仕様確定予定らしい) 世の中気の早い奴が多すぎるわな。
168 :
163 :2011/09/05(月) 09:10:35.64
>>164 自分も始めて見ました。なお、件のサイトはpixivです。
>>165 ありがとうございます。なるほど・・・
>>166 ありがとうございます!そうしますー
>>167 ですねー
ありがとうございました!
質問があります。 最近のメールフォーム用CGIは機能が多すぎてJqueryのバリデーションと機能が被ってしまいます。 そこでJqueryでバリデーションしてデータだけをpostさせたいのですが、ただデータを送るだけのメールフォームCGIはどういうふうに書けばいいのでしょうか。
>>169 既存のCGIからバリデーション部分を削除すれば目的は達せられる。
だがJavaScript(jQuery)の動作しない環境から送られたデータはどうするつもりだ。
あるいは悪意をもって偽装したデータを投げてくる奴がいないとも限らないぞ。
スレ違いでアレだが、送信されてきたデータは常に疑ってかかれ。検証しろ。
問題ないシロモノという前提で扱ってるといつか痛い目をみるぞ。
スレ違いってここでセキュリティネタ話してもぜんぜんOKだろ 171さんはmalaさんですか??? まじ頭がセキュオタになってますよ
それ以前に、CGIの話しで誘導済みだろ
174 :
171 :2011/09/05(月) 22:35:02.65
>>172 いや、セキュオタ(?)でなくてもこれくらいは普通に気を使うでしょ?JK
ユーザが自分だけなら多少のコーディングの手抜きは運用でカバーもできるけど。
受付フォーム(を受け取るCGI)なんて誰がどう使うかわかんないんだからさ。
175 :
デフォルトの名無しさん :2011/09/05(月) 22:36:28.72
言っている自分が一番知識ないというオチ
>>174 誘導されてるんだから煽りにかまってないで放置でおk
177 :
171 :2011/09/05(月) 22:48:41.24
>>175 > 言っている自分が一番知識ないというオチ
まあその可能性も十分ある。自戒自戒。
では名無しに戻ります。
171みたいなバカは なにを今更感でっぱなし
179 :
デフォルトの名無しさん :2011/09/05(月) 22:54:42.61
久し振りに見たなお前perl卒業するんじゃなかったのか?
当たり前のことを説明してるやつみるとむかついてくるな
そこでノーガード戦法ですよ
perl貧者まだ生きてたの?
Perl賢者とかいちいち絡まなくていいと思うよ 放置放置
デスクトップに出力させたい場合、うまくスペースが設定できません。 どのようにしたら良いのでしょうか? ためしに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);
186 :
185 :2011/09/06(火) 15:27:11.93
動作環境はeclipseを使っています。 今ググっていたらeclipseの問題のような気がしてきた。。
データをハッシュにまとめたいけどキーの順序も保存しておきたい場合は 1ハッシュとは別にキーの配列作る 2ハッシュの持つ要素に順序数を含める どっちがよさそうですか? 1は @key=(qw/aaa bbb ccc/); @hash{@key} = (9,8,7); 2は $hash{aaa}=[0, 9] のような感じです それとも単純に[0, 'aaa', 9]と全部配列にまとめてしまうのがいいでしょうか?
下記のような正規表現でカッコ()の値を配列に入れるにはどのようにすればよいでしょうか? 個数が変化するので$1などは使えないです。 m|value=([^ ]+)|gxms;
>>189 while等でループまわして$1を適当な配列にpush
>>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 ) ;
>>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;
>>185 my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', q{"/Documents and Settings/user/デスクトップ/*"} ) ) ];
my $outPath = "/Documents and Settings/user/デスクトップ/foo.txt";
194 :
185 :2011/09/07(水) 01:10:47.58
>>193 一つ目は出来ました。
二つ目はやはりできないようです。
eclipseでググッたらスペースうんたらとあるのでやはりeclipseの問題のようです。
ありがとうございました。
これからPerlに手をだそうとしているのですが、質問があります。 perlは、SJIS、EUC、UTF-8の3つの文字コードの中で何が一番適しているのですか? それぞれの良い点と悪い点も教えていただきたいです。 もし、ほとんど差がないとすれば、ホームページをつくる上でこれから主流になると 考えられる文字コードがどれか教えてください。よろしくお願いします。
UTF あとは内部表現でggr
>>195 今のPerlはUTF-8(かLatin-1かascii)で書くことが前提なのでUTF-8一択。
他のコードで書けなくもないけど実行前にフィルターかけるだけでいろいろ問題がでるので強く非推奨とされている。
ホームページ → 個人的な感触では既にUTF-8が主流
あるフォルダに ------------------- AAAA_A9999.jpg AAAA_B1111.jpg AAAA_C0000a.jpg ------------------- といった感じでファイルがあるんですが、 これを _[ABC]以降の文字列でソートした結果を得たいです。 AAAA_C0000a.jpg AAAA_B1111.jpg AAAA_A9999.jpg が期待する結果 dir /b | perl -ne "〜" とワンライナーで行いたいです、ご教授お願いします。
dir /b | sort
>>194 $outPathをencodeし忘れてない?
202 :
189 :2011/09/07(水) 10:43:18.03
>>190-192 うまく処理できました。
色んなやり方がありますね。
ありがとうございました。
204 :
194 :2011/09/07(水) 16:47:53.40
>>201 ,203
おおおーーー!!
出来ました。
冷静に考えればglob()の時encodeしてるんだからopen()の時もencodeしないとですね。
スコーンと抜けてました。
ありがとうございます。
ファイル名とかを並び替えする時に人間が見やすいsortはありませんか 大文字や小文字を同一視したり、 9の次に10が来たりするような感じの
Sort::Naturallyとかどう? 使ったことはないけど
Java,PHPとやってきてPerlも覚えろと会社から 何時間ぐらいで身につくの?
それだけやって来たなら トリッキーなやり方気にしないなら数時間〜数十時間? 当分の間はファニー文字付け忘れてコンパイラに怒られると思うがw
多分phpからで突っかかって爆死するのは配列の@だ
PHPも$付けるけど、Perlの付け方とは違うからね 最初のうちは???だろうなあ
「身に付く」レベルだったら…100時間くらい?
Cからならリファレンスとプロトタイプ…かな? 未だに混乱する。
作った関数の引数をハッシュで受け取ると楽だという事に気が付いた。 その流れからか、% や @ を使わずに、無駄に $data = [] とか、 $data = {} とかやるクセが付いたw
Hoge( foo=>1, bar=>2, baz=>3 ) ってやつ?
Hoge( {foo=>1, bar=>2, baz=>3} ) じゃなくて?
ハッシュではなくリファレンスだと予想
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にしています。
通りませんじゃなくてエラーメッセージ晒せよ。
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.
@hogeにある文字列を@fugaにハッシュリファレンスで入れたい場合、 下記よりシンプル&同等以上の速度で処理するにはどのように書けばよいでしょうか? my @hoge = ( "AAA","BBB" ) my @fuga = (); map{ push( @fuga, { NAME => $_ } ) } @hoge;
>>221 板違いだからwebprog板へどうぞ。
ブラウザの結果じゃなくて鯖側にエラーログのファイルがあるから探すように。
224 :
デフォルトの名無しさん :2011/09/09(金) 12:58:50.71
>>222 文面どおりに解釈すると
my @fuga = ( {NAME=>'AAA'}, {NAME=>'BBB'} );
とか?
でも速度の問題は実際に計ってみないとわからないし、そんな些細な部分の速度を気にしても費用対効果が悪すぎる。
>>222 の書き方でも十分シンプル&高速だと思うよ。
>>222 速度はほとんどかわらないが(ちょっとだけ速かった)、シンプルはシンプル。
my @fuga = map {NAME => $_}, @hoge;
push分だけ速くなるのか
>>216-217 うん。そゆこと。
2個ぐらいなら、普通に Hoge($opt1, $opt2, $opt3) とか渡してるんだけど、
3個以上になったり、その戻り値をそのまま他の関数に渡したいときはハッシュのリファレンスが
もの凄く楽ちん。
229 :
222 :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で飛んだらそれ以降は実行されないんじゃないんですか?
>>230 誘導も面倒だから答えてあげるけど
Content-typeの記述したらそうなるさ。
'location: URI'をprintすると以降の処理が打ち切られるとかこえーよ
>>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回出力)
>>233 全て文字列…ではないぞ
. + x といった演算子が文字列として解釈するだけだ
内部的には、文字列、整数、倍精度実数が自動的に変換されているんだけどな
1時、2時というリファレンスがあります。 これに5を足して下記のようにしたいのですが、シンプルに書くとどんな感じになりますか? mapあたりを活用するんでしょうか。 my $aaa = [ '01:00', '02:00', '04:00',〜,〜 ]; my $bbb = 〜 結果→ $bbb = '06:00;07:00;0900;〜;〜'
いいえ、for(each)あたりを活用します。
238 :
236 :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;
$bbb = join ';', @aaa; $bbb =~ s/([0-9]{2}):/sprintf '%02d:', $1 + 5/ge; こんな感じでどう? 19時以降だとありえない時間になるけどw
>>236 my $bbb = join(';',
map{
m/(\d\d):(\d\d)/ ? sprintf("%02d:%02d", ($1 + 5) % 24, $2) : $_
} @{$aaa}
);
>>238 その m// と s/// についてる xms ってオプション、すげー気持ち悪いんだけど…。
PBP推奨だよ strict, warnings と同様、空気同然に付ける人もいる
ベストプラクティスにかぶれるとつけちゃうんだよな〜
意味わかってて使うんならいいけど、 /x 使ってる割には空白も入れてないし、 /m 使うんなら ^ $ と \A \z の使い分けも普段から正確にしといたほうがいい
なるほどそういうことか。PBP読んだことないモグリなんで知らなかった。ありがとう。
すべてが文字列というければ、 バイナリデータと文字列って区別つくの?
いうければ、ってどこのコトバだよ
文字列はバイナリデータの部分集合と考えられる。 つまり一般的に 文字列 ⊆ バイナリデータ が成り立つ。 これを 文字列 = バイナリデータ とするのが、UNIX に古くから伝わるテクニック で、UNIX 版の Perl は binmode 関数を必要と していない。binmode 関数はDOS系のOS、あるいは DOS系OS用スクリプトと互換性を持たせたい場合 に用意されている。
>>247 テキストデータとバイナリデータの区別はつくのかという一般的な命題?
>>250 そうそう。文字列はバイナリデータと違ってメタ情報を含んでいる。
バイナリデータは単なるバイトの並びだが、文字列は、文字コードというメタ情報
1文字を構成する要素(1文字=何バイトか)とかそういう情報を含んでいる。
だから、数値はどの文字コードでも1バイトで同じコードであるように(文字コード側が譲歩して)
作られているから数値も文字列で扱うのは可能だけど、少なくともバイナリと文字を見分けるための
型情報が必要になるのではないかと。
数値は同じコードって書いたけどJIS系は同じコードで数値じゃない場合もあるか。
でも、JISは最初は(エスケープシーケンスがでるまでは)ASCIIモードであると定義されているよね。
ということで、バイナリデータを扱うなら全部文字列として扱うってのは不可能でしょ?
型情報が必要になる。
ばかだなぁ。 メタ情報はおれ達の頭の中にあるんじゃないか。
ここの変数は今Shift JISでそのままでは\が入っていて 関数呼び出しに使えないから、一旦EUCに変換して呼び出してまた戻して・・・ あれ? 今この変数の文字コードはどうなってるんだ? とかやりたいわけですね。 わかりますwww
>>251 > そうそう。文字列はバイナリデータと違ってメタ情報を含んでいる。
「含んで」はいないだろ。
同じバイト列を、バイナリとしてでも文字列としてでも、
扱う人間の側がそう扱いたいと思うように扱えばいいだけでしょ。
ただ、その構造が一般的なテキストデータとして破綻していた時に、
一般的なテキストデータとして扱おうとすると不都合が生じるってだけの話。
そのへんを必要に応じてチェックするのは扱う人間の側の仕事で、
データがその属性を「含んで」いる訳ではないと思うんだが。
そしてそれは別にPerlに限った話じゃないし。
どんな言語のどんな「文字列」データでも事情は同じことでしょ。
「文字コード」とか「1文字何バイト」とかの「メタ情報」を「含んで」いる
文字列のデータフォーマットなんて聞いたことない。
少なくともPerlで扱えるのはそんな特殊なフォーマットのデータじゃないんじゃ。
ってことを
>>252 が一言で言っちゃってるね。(今気づくな>俺)
\0が含まれる可能性があればバイナリ なければ文字列
>>222 map{ push( @fuga, { NAME => $_ } ) } @hoge;
mapの中で処理が多すぎると気持ち悪くないか
push( @fuga, { NAME => $_ } ) for @hoge;
のほうが見やすいなぁ
>>242 自動的に付加されるモジュールも紹介されてたけど、さすがにないわwと思った
linuxでしかperl使わないんだけど、 binmode必要ないとか知らなかった、、、、
>>255 バイナリでも \0 が含まれない可能性もあるわけだが
>>255 > \0が含まれる可能性があればバイナリ
> なければ文字列
UTF16やUTF32は?
16bit、32bit単位で見れば、\0は含まれていないが
8bit単位でみると\0を含んでいる。
>>254 > 「文字コード」とか「1文字何バイト」とかの「メタ情報」を「含んで」いる
> 文字列のデータフォーマットなんて聞いたことない。
そうか? たとえばJavaではUTF16というメタ情報を含んでいる。
正確に言えばString型はかならずUTF16でなければならないので、
String型がそのメタ情報のかわりになってる。
>>261 > そうか? たとえばJavaではUTF16というメタ情報を含んでいる。
> 正確に言えばString型はかならずUTF16でなければならないので、
> String型がそのメタ情報のかわりになってる。
それは「含んでいる」とは言わないんじゃないの普通。
データに「含んでいる」っていったら、普通は具体的な
フラグなり識別子なりの形で保持しているってことだろ。
とりあえずおまえの言葉の使い方がおかしいということはわかった。
UTFのBOMなんかはメタ情報だな でもBOMの並びから始まるバイナリだって広い世界には一つくらいはあるはずだ 結局やっぱりメタ情報は人間の頭の中にしかないよ
>>262 > データに「含んでいる」っていったら、普通は具体的な
> フラグなり識別子なりの形で保持しているってことだろ。
つまり、Perlで言えば、UTF8フラグのことですね?
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からも参照の事。
>つまり、Perlで言えば、UTF8フラグのことですね? ちがう
データの並びだけで、文字列とバイナリを見分けることはできないのだから、 型で見分けるか、データにフラグをもたせるかの どちらかしかや利用がないだろう。 あとは人間が自分で判断するという、ご苦労なやり方もあるがw
>>267 > データの並びだけで、文字列とバイナリを見分けることはできないのだから、
> 型で見分けるか、データにフラグをもたせるかの
> どちらかしかや利用がないだろう。
未知のデータを処理する時の話?
そりゃ中身で見分けるしかないだろ。
「どちらかしかや」がどういう意味かはわからんが。
> あとは人間が自分で判断するという、ご苦労なやり方もあるがw
必要に応じてそれをプログラムにやらせるんだろ。
> そりゃ中身で見分けるしかないだろ。 中身じゃ見分けられんぞ。 文字コードの自動判定なんてあてにならんし。
そういやHTMLやXMLは、データの中に文字コードが書かれているよね。
>>260 つまり文字列には\0が含まれてないってことですよ。
>>268 ちがう。
use utf8; するとバイト列に utf8フラグが付く。
データにutfのフラグそのものが含まれていれば、わざわざutf8フラグなんてものは要らないし、
それにデータにutfのフラグが含まれていても、そのフラグがUTFだ何だと分かることはない。
データに含まれる自己言及的なメタデータは、それを解釈する側が、まずはその自己言及的な部分があるかどうかを知っているとき、
そして言及する対象がどのくらい・何種類あるか、つまりはメタデータそのものの種類やそれらの表記方法を知っている時にだけ、有効。
> 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) を許すように伝えます。
>>275 バイト列の意味わかってないのか?
とりあえず上のURLでバイト列が関係する部分を抜き出しておいた
>no utf8 プラグマは Perl に、現在のレキシカルスコープのソーステキストを リテラルなバイトとして扱うように伝えます。
>ソースコード中の恣意的なバイト列を許していました。
>高ビットのセットのあるソーステキストにあるバイトは、
>バイト列は、ほとんどの場合、適切なUTF-8ではないからです。 そのようなバイト列がいるなら、
>たとえば、例で使われているように、ISO 8859-1 (Latin-1) のバイト列を
>または 文字列がバイトとして保持されている場合に真を
>>276 だから、あくまでソースコードにかいてある文字列の話だって。
ソーステキストってのが見えないの?
データにフラグを持ってるというのは
>>265 から明らかだろ。
もう一つ。画面に表示されるものだけがデータじゃないぞ。 見えないところに追加されているのも、データだ。
% 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
ソースコードに書いてある文字にUTF8フラグがつくのであって、 ファイルなどから読み込んだ文字にはuse utf8したからって 勝手にUTF8フラグはつかない。 こっちの値はUTF8フラグ付き。こっちはついてないと データごとにもっている情報。 もちろんすべてのバイナリにUTF8フラグがつくわけもない。
>>279 コメントが何もかかれてないんで、何を言いたいのかサッパリわからないけど
念の為にいっておくけど、-e の後に書いたものも、
ソースコードだからね。
>>278 >>> データに「含んでいる」っていったら、普通は具体的な
>>> フラグなり識別子なりの形で保持しているってことだろ。
>>つまり、Perlで言えば、UTF8フラグのことですね?
>見えないところに追加されているのも、データだ。
元データにはメタ情報が含まれてんの?
それとも、含まれていないからわざわざ追加してるの?
どっち?
>>274 >use utf8; するとバイト列に utf8フラグが付く。
これの先頭に「一例として、」って入れとけば良かったのに。
>>279 >念の為にいっておくけど、-e の後に書いたものも、
>ソースコードだからね。
もちろんw
>>282 元データにメタ情報が付いているのなら、
文字列とバイナリの区別つくだろw
元データにメタ情報がついてなくて
コーディングが面倒になるので、
ある言語では型に入れることでメタ情報を付加したり、
PerlではUTF8をつけることでメタ情報を付加するわけだ。
>>284 >元データにメタ情報が付いているのなら、
>文字列とバイナリの区別つくだろw
区別できない。
お前はプログラムの中だけで考え過ぎだ。そこがおかしい。
ソースコードの中だけで考えれば、JavaのStringは必ずUTF16になるだろうけど、
例えば、ネットの某所で拾った、とあるバイナリファイルがあるとき。
そのバイナリがテキストファイルなのか、
それ以外の意味(画像・音楽・動画など)を持つバイナリなのか、
はたまた、全く意味の無いランダムなバイナリなのか、
そのバイナリだけでそれらの判定ができるのか?
メタ情報が付いていたとしても、そのメタ情報が正しいことをそのバイナリからどうやって保証するんだ?
>>285 日本語が不自由なの?
元データにメタ情報がつくのなら文字列のバイナリの区別がつく。
だが事実として文字列とバイナリの区別はつかないんだから
元データに情報はついていないという意味だ。
> メタ情報が付いていたとしても、そのメタ情報が正しいことをそのバイナリからどうやって保証するんだ? これは意味がない問答だなw メタ情報がついていて、そのメタ情報に従っていないなら そのデータ(もしくはメタ情報)は壊れていると判断されるだけ。
>>287 > > メタ情報が付いていたとしても、そのメタ情報が正しいことをそのバイナリからどうやって保証するんだ?
>
> これは意味がない問答だなw
>
> メタ情報がついていて、そのメタ情報に従っていないなら
> そのデータ(もしくはメタ情報)は壊れていると判断されるだけ。
俺が言っていることはお前の考えていることとは違う。
で、これって何の議論なんだっけ?
250 デフォルトの名無しさん [sage] 2011/09/10(土) 10:47:39.10
>>247 テキストデータとバイナリデータの区別はつくのかという一般的な命題?
247 名前:デフォルトの名無しさん[sage] 投稿日:2011/09/10(土) 09:29:42.31 すべてが文字列というければ、 バイナリデータと文字列って区別つくの?
まあ、すべてが文字列なんて世界はありえないってことだよ。 すべてがバイナリって世界なら、あるだろうけどね。 バイナリと文字列の区別はつかない。 型ないとバイナリと文字列の区別はどうするかという 問題が常に付きまとう。
>>292 だから型うんぬんはおかしいって散々言われてんだろ
ちょっと黙ってろ低能
誰か整理してくれw
Perlの内部データ保持形式についてわかっている人間同士で喧嘩をしているなら、 あとは思想信条の問題だな>バイナリデータと文字列
>>286 > 元データにメタ情報がつくのなら文字列のバイナリの区別がつく。
落ち着け。自分が“日本語が不自由”になってるぞ。
>>297 そのレスは揚げ足取り以外の意味があるのか?
>>294 お前は話題をしっかりと認識していないから、あるいは認識するだけの能力がない低能だから、
>>251 のここの発言がズレてる。
>文字列はバイナリデータと違ってメタ情報を含んでいる。
お前以外の全員はプログラムの外部にあるだろうとあるファイルについて話しているのに、
お前だけがプログラム内部の文字列について語っている。
だからお前の言うことはおかしい。
ズレてる。
補足すれば、「UTFのメタ情報は何か?」と聞けば、 お前は「JavaならString型自体がメタ情報」「perlにはUTFフラグがあるからそれがメタ情報」、 他は「BOMがメタ情報」、 と答えるはず。 それだけ認識がズレてる。
>>300 いや
>>251 は
> プログラム内部の文字列について語っている
つもりで読んでみてもちょっとなにいってんのかわかんないレベルだ。
ばかばっか
おまえらそこまで気にしてスクリプト組んでませんやんw
「テキストデータとバイナリデータの区別はつくのかという一般的な命題」 の思考実験に近い話を、意識しながら組むやつはいねーよ 組むだけだったら、日本語を扱うストラテジーは 大なり小なり出来あがってんだから、それに従うだけだ。
最近じゃEncodeモジュールに移行してしまっtから 全部Unicode扱いで、日本語であるかどうかも意識してないけどねw
"メタ情報" という言葉を "メタ(な)"+"情報" と考えるのか 「メタ情報」という分解できないひとつの言葉と考えるかで、 話がすれ違ってしまうよ。 分解できない「メタ情報」は情報になっていないからこそ 「メタ情報」なんであって、例えばコンピュータのメモリ の中に入り、情報になってしまうと「メタ情報」ではなく なる。 それはメタな「情報」ということだろう。
それ言うと発端の「文字列」なんて、
>>233 は、明らかにstringsとして表記してるのに、
>>251 は、明らかに文字コード付きの
って途中で書き込んじまったから、萎えた。
>>307 のあまりの頭の悪さにすげえウンザリな気分…。
そんなめったなことを言うもんじゃないよ。
メタだけに、めったな事
313 :
デフォルトの名無しさん :2011/09/11(日) 11:26:23.85
あーあ
メタメタだな
perlのTkモジュールってMinGWでインストールできますでしょうか?
めっためたにしてやんよ
317 :
uy :2011/09/11(日) 16:36:26.19
今の時代にPerl使ってる奴wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww お前らみたいな時代遅れのゴミクズゴミグラマーが、ITの進化を遅らせるんだろうな 使えもしない足引っ張るだけの老害だ プログラム作っているw 気になっているだけで実際はゴミグラミングしかしていない ゴミグラミングされてゴミ量産されてもそれはプラスにはならなくなり負の遺産でしかない わかったらさっさと死ねば? ゴミグラマは死ね 死ねゴミグラマ
じゃあ真っ先に死ぬのはuy・・・
言語に関わらず、糺されて論破されて発狂して負をまき散らすような人間が少なからず従事しているから、 IT業界の生産性とか技術力とかが一切向上しないんだろうな。
外部コマンドを起動するさいに、標準入出力を 両方とも取りたいときはどうしたらよいでしょうか
標準入力はお前様が書くんだから取り様が無い気が… 標準出力と標準エラー出力を取るなら、 IPC::Open3
perldoc 貼り付けて答えた気になってる人は、 perldoc が更新されてなくて古い情報になってる事にも 気をかけて欲しい。今回がまさに該当するが。
perltrapなんか、未だに"Perl4 to Perl5 Traps"載っけたままだしねぇ 誰が必要とすんだ?
325 :
uy :2011/09/11(日) 21:39:50.76
>>319 へええええ
この「停滞」しているITに気づいているのか?
だったらお前もゴミ掃除を手伝ってみませんか?
>>323 古くなってる?
分からないから、教えて欲しい。
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>;
配列にある要素があれば1、なければ0を返すコードはどのように書けばよいでしょうか?
grep {$foo == $_} @ARRAY
>>330 {$foo == $_} より {$foo eq $_} の方がいいかも
ケースバイケースだろうけど
List::MoreUtils の any も試してみたら
grepの10倍遅かったw
>>327 > 今の時代にこんな書き方はしない。
今の時代に合わない、ネットの書き込みを
全部排除してくれ。
世の中モダンPerlだけでいい。
そういうかきかたはイカーン
科学技術はこれまでの積み重ねで成り立って いるわけだから、過去のノウハウが活かせない ものは先行きが怪しいと考える。
>>335 もっともらしく見えないこともないが意味不明。
Perlとは関係なし。
過去のノウハウを削除しようとして無きものに しようとしているけど、それは得策ではない ってこと。 無理に削除するんじゃなくて、だんだんと廃れて 使われなくなるのを待てばいいってこと。 Perl4 が使われている間は"Perl4 to Perl5 Traps" は必要ってこと。 慌てて過去を取り消す類の技術は、今後も慌てて 取り消される恐れありってこと。
>>337 perldocを「むやみに」削除はしない方がいいってのは同意だけど
> 科学技術はこれまでの積み重ねで成り立って
> いるわけだから、過去のノウハウが活かせない
> ものは先行きが怪しいと考える。
そもそもプログラミング言語が「科学技術」か、ってのは置いとくとして
たとえば過去のノウハウが足枷なCOBOLとか先行き安泰でもなんでもないしね。
いい加減他でやれ
雑談でやれや
(341:雑談として)
>>338 でも切り捨てたらある意味、別物になってしまうのだから
切り捨てて「安泰」って考えるのもどうかと。
→ これから雑談に行きます
344 :
デフォルトの名無しさん :2011/09/16(金) 00:51:42.85
下記2つの動作の違いは何でしょうか? カンマの有り無しどちらも動くし違いがあんまりよくわかっていません。 map{},@hoge; map{} @hoge;
>>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
349 :
344 :2011/09/16(金) 23:04:56.72
>>345 dクスコ
x64なのでたぶんそれっす
まああまり大したことしてなかったし、この際Tkxに移行するお
そういえば何故、 ループの制御文が他の言語では continue や break なのに、 Perl では next や last なんだろう?
4文字だから
>>350 last は分からんが、next は -n や -p のときに
AWKの next に近い目的(残りの処理を飛ばして次の行へ)
で使うことになるから、それが由来じゃね
>>351 じゃあ何故elifにしなかったのか
…いや分かるような気もするw
354 :
デフォルトの名無しさん :2011/09/19(月) 13:00:20.23
ウィンドウズのコマンドプロンプトのコマンドをperlで実行したいんだけどどうすればいいの?
system
357 :
346 :2011/09/20(火) 12:55:38.51
>>347 ,348
遅くなりました。
ご回答ありがとうございます。
動かないという話ですが、下記の回答でmap{}の後ろにカンマ付きで書いてあります。
こちらは動いているようなのですが、何か私が勘違いしているのでしょうか?
初心者で申し訳ありません。
>>226 my @fuga = map {NAME => $_}, @hoge;
>>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";
置換 tr について質問です。 改行を削除したいんですが、 tr/\r\n// とやっても削除されません tr/\r\n/z/ などとすると改行コードがzに変換されました。 trでは削除は出来ないのでしょうか
360 :
359 :2011/09/20(火) 14:57:34.40
while(<>){ tr/\r\n/z/; print "$_ is good\n"; } こういうコードで試験しました
tr/\r\n//d tr/\r\n// は tr/\r\n/\r\n/ と等価 tr/\r\n/z/ は tr/\r\n/zz/ と等価
363 :
346 :2011/09/20(火) 16:00:57.00
>>358 map{}で対象になっている部分が違うんですね。
わかりやすい説明ありがとうございました。
省略しまくれるperlの弊害がこんなところで。。
364 :
359 :2011/09/20(火) 17:15:20.63
>>361 ありがとう!そして、ありがとう!
dってこういう意味あったのか
文字削除だったらs///使わね?
>>363 > map{}で対象になっている部分が違うんですね。
こんだけ説明されてもまだ理解できてないのか…。
>>360 そのケースだったら、
while(<>){
chomp;
print "$_ is good\n";
}
が常套手段
>>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 とほぼ等価)。
単純な疑問だけど、 "\n", "\r\n" 混成のファイルなんてあんの?
>>369 勿論ある。
テキストをなんだと思ってるのか。
事例としてって意味なんだが…、 ま、いいや
具体的なケースは挙げられないけど何回も見たことがある たぶんWindows使ったことがない人のプログラム
ある仕様で、\nで区切ってコマンドを送れってのがあって、 それをログに落とししてみたら、\n区切りのコマンドと本体プログラムが吐く\r\nが混在してて、どうしようか迷ったことがある。
たとえば MIFES 7というエディタは、 "\r\n"なら ┛のようにまがった矢印 "\n"なら↓ 矢印のちがいだけで、ちゃんと改行してる。 シフトJISなのに"\n"で改行してる状態で、別のファイルにコピペすると、 "\r\n"と"\n"が混在する
>>374 であってます。
いまやってみたこと
JBuilder 7で新規に作成(JBrow.java)
保存
終了
エクスプローラで
JBrow.javaを右クリックしてそのメニューから
MIFES 7を選択して開く
改行マークが↓になっていて、ちゃんと改行してる(プリ/ポストプロセッサなしのモード)
範囲指定してクリップボードにコピー
┛で改行してるファイル(IP.txt)に貼り付けると
↓と┛が混在する。
ENTERをおすと┛になる。
保存。
MIFES 7を終了。
メモ帳でIP.txtを開くと、やっぱり↓と┛が混在している。
DOSの頃に、アセンブラでテキスト生成するプログラム作った奴が 改行箇所を全部\n\rで吐き出していたことがあったっけ。
シフトJIS関係ねえとだけ言っておく
Mifes 7が、テキストの文字コードがSJISだと改行コードを\r\nにする仕様になっている、 という意味かもしれん。 もしそうだとするとMifes 7はMacで作成したテキストを全く考慮してないってことだな。 いずれにしても文字コードと改行コードは本来独立ってのは確かにそのとおりだ。
380 :
デフォルトの名無しさん :2011/09/26(月) 15:25:55.84
Perlでファイルの内容を置換する時に per -pi -e "正規表現" ファイル としますが、ファイルを直接書き換えるのではなく 書き換えた内容を出力するのは どうすればできますか?
あと、画面でなく別ファイルに出力したいなら perl -p -e "処理" 入力ファイル名 > 出力ファイル名 と、最後に「> 出力ファイル名」を付けろ
ただし
>>382 は出力ファイルが既にあったとしても
何も聞かずに問答無用で上書きするから気をつけろよ
元の入力ファイルのバックアップを ファイル名の末尾に .bak を付けて取っておいてくれる perl -i.bak -ple '置換処理' 入力ファイル とかは良く使うかも?
perlの場合AとBが同時にページにアクセスした場合 プログラムが同時に実行されるんでしょうか? Aのプログラムの実行行番号とBの実行行番号が同じかって意味です
トランザクション!!!
>>386 ページって何だよと言わざるを得ない。
CGIについて言ってるならそれはしapacheなどのWEBサーバの問題であってperlの問題ではない。
389 :
デフォルトの名無しさん :2011/09/26(月) 22:19:27.82
perl内でコマンドを作ってそのまま実行させたいのですが、今はコマンドを作ってから``で囲んでます。 ``で囲まないで実行させる方法はないですか? `comamnd1 | perl -lne 'print xxxxxx'` 今はこんな感じです。 よろしくお願いします。
system
391 :
デフォルトの名無しさん :2011/09/26(月) 23:19:35.54
command1の出力をperlの正規表現で処理してコマンドを作るので、Perlに-execみたいな オプションがあって、そのまま実行してくれたらいいのにと思ったんですが、そういうのはないんですよね?
perl -h
PHPのhtmlspecialchars()みたいなの無い?
394 :
デフォルトの名無しさん :2011/09/26(月) 23:50:12.96
s/PHPのhtmlspecialchars()みたいなの無い?/ggrks/g; s/PHPのhtmlspecialchars()/使えねぇー/g;
>>395 > 状況が良く分からんが、xargs使えば?
普通にsystem()使えばいいと思うが
シェルの質問と取るのが妥当じゃねーの echo `ls | perl -lpe 's/\.txt//'` 的な。 (ちょっと上でワンライナーの質問も出てるし) そうだとすると、 alias hoge="ls | perl -lpe 's/\.txt//'" とかやってaliasするけど、ダブルコーテーションでくくるのが 作法的に良いのかは知らん >-execみたいな って言い分からだと、 perl -le '$_= `ls` ; s/\.txt//g ; print' でもいいんじゃねーのと思うが、 やっぱperlの中の``中でperlを呼ぶ話?
>>397 389==391だよね。
for (`command1`) {
chomp;
system 加工($_);
}
とかでいいんじゃないのかな。
IPC::Cmd が便利なもんで、 最近は system を直接使わなくなったなあ。
エスパー訓練用問題 ファイルに書こうとすると GLOB とか出て書けないのはなんで?
スクリプトの文字コードがutf8なのに windows用のファイル名(sjis)を付けようとしている
IPC::Cmdってどこが便利なの?
403 :
400 :2011/09/28(水) 15:04:35.87
ちなみにその答えは?
匿名掲示板てどんな書き逃げしても後腐れがないからいいよね!
謎は全て解けた
CGI.pmを使ったときに、printで送信できるのはなぜですか? どこかでprintの出力先を書き換えてるの?
>>408 CGI.pm はリクエストを標準入力で受け取り
レスポンスを標準出力と標準入力で返す仕様だから
これが Plack だとリクエストをハッシュリファレンスで受け取り、
レスポンスを配列リファレンスで返す事になる。
それと Webアプリ関係は板違いだよ。
410 :
409 :2011/10/03(月) 23:01:29.25
コピペミス レスポンスを標準出力と標準入力で返す仕様だから ↓ レスポンスを標準出力で返す仕様だから
>>409 CGI.pm は、というよりCGIは、だな
>>409 CGI.pm→CGI
Plack→PSGI
にした方が適切じゃね?
そうか、webアプリじゃなくてもCGI.pmって使おうと思えば使えるのか。
>>413 そこまでして使う別用途はちょっととっさには思いつかないけどな
板チのつもりはなかったのですが、CGIの仕様だったんですね。 ありがとうございます。
CGIとCGI.pmがごっちゃになってる奴たまにいるね
たとえば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);
>>417 いや、普通に環境変数に値入れて渡せばいいだけだよw
>>418 基本的にはそれでいいと思う。
実際に運用するには細かい部分でもっと気を使う必要があるが、状況による。
別の考え方としては、test.datファイルの末尾に新しい行を追加していって、
データを実際に使う時には逆順に使う、という方法もありうる。
ファイル末尾に追加する処理の方がずっと楽だからね。
まあ、俺なら遅い<IN>なんてのは使わないが。
>>417 CGIに依存してる、ってのは変な物の言い方だなあ。
例えば、Perlスクリプトの書き方はPerl処理系の仕様に依存してる、とは言わんだろ。ふつー。
>>417 は、CGIの意味を一から勉強し直した方がいいな。
>>418 open()にエラートラップ付けてくれ。
スクリプトが正常に動いてるのに、ファイルに何も書き込まれません!という質問は飽きた。
print OUT {local$/; <IN>};
どうはdoしたんだ
これが、真の駄洒落か。
430 :
デフォルトの名無しさん :2011/10/05(水) 13:30:16.67
どうはのひげき
毎回、ファイルハンドルが裸ワードなのは、ググって出てくるサイトが悪いんだろなぁ。ローカル変数にしておけばいちいち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;
んーと、ファイルハンドルをローカル変数にしてもcloseは明示的にやらないとファイル閉じないんじゃなかったっけ?
グローバルなファイルハンドル消滅しろってのは賛成だが、 レキシカルとローカルの区別も正確にしようぜ。 ファイルハンドルは REFCNT がゼロになった時点で自動で閉じられる。 が、それだと close 時のエラーをハンドルできないことに注意する必要がある。 自動クローズだと autodie (Fatal) も働かないので、 常に close $fh or die "can't close: $!"; (autodie 使うなら close $fh; だけでいい)などとするのがベターだと思う。
434 :
431 :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)) );
クローズのエラー処理か、なるほど。 ローカルっていっちゃうと、 local 変数名; のことを指してる風な発言になってしまうのかな? if(...){ my $hoge;} はレキシカル変数って呼ばないといけないのか。
>>434 わざわざCPANモジュール入れなくても、
この目的だったらcore moduleのTie::Fileでいいんじゃね?
use Tie::File;
tie my @array, 'Tie::File', 'hoge.txt' or die ;
unshift @array "新規投稿\n" ;
untie @array ;
2万行程度だったら苦痛にならない速度だし。
それがモダンなやり方なんだな。
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取り専用のモジュールがあるだろ。
>>438 モダンの意味わかってる?
今のやり方=モダンなんだよ。
441 :
439 :2011/10/05(水) 20:55:09.24
ちがうね。
だから古いやり方だっつってんの。
>>439 perl5.10以降の人ならModule::CoreListで確認取れる。
% perl -MModule::CoreList -le 'print Module::CoreList->find_modules( qr/Slurp/ )'
じゃあ最初から、古いやり方と断ってから書いてください。 でないと、いつまでたっても成長できないでしょ。
成長w
ホワイトスミスとバナースタイルなんて、perlで使う人がいたんだ… 別の意味で感動した
>>444 なぜ成長がおかしいの?
頑張るとか勉強するとか鼻で笑うタイプ?
なんかモダンモダン言うてる奴は用もないのにモジュール使いたがるってことはわかった。
>>445 のperldocのがいっちゃんわかりやすくてええな。
>>447 自力で調べる事しない奴が成長って言うなよw
>>450 > CGIをPerlという意味で使っている人も昔は結構いたし
それとはまたちょっと違う気がするが。
古いか古くないかはどうでもよくて、やりたいと思っている ことができるのかどうかがまず大事。その上で、実装が分かり やすいのかどうかが次の焦点になる。 一般的には古くからある機能はシンプルなので分かりやすい。 新しい実装は、必要もないのにごちゃごちゃしていて分かりに くいし、遅かったりもする。実行するためのコンピュータも 高性能でないといけないのでいつでも使えるソリューション とはいえない。
>>446 他のスタイルをつかうってこと?それともインデント自体がめずらしいって意味?w
while(<OUT>) { print OUT; } このスタイルは珍しいと思うけどな 珍しくなったのは使われないからで、なんで使われないかと言えば、 この方法を誰もがダメと思っているか、それとももっといい方法があるか、のどっちかか? 個人的にはなんとなくダサい気がする
Haskellでそんな感じのスタイルで書いたことがある 閉じブレースが行頭に来ないのでオフサイドルールのある言語向けかも
open(IN,$file);でファイルを開く場合 必ずしも開けなかった場合の例外処理をする必要はないですよね? 開けなかった場合はファイルを作るというようにしたいんですが 開けなかったらプログラム終了だと先に進まないから
もしファイルが作れなかったらどうするのっと
>>458 open(IN,$file);の方では例外処理はしなくて
open(OUT,$file);の方で例外処理をすればいいと思いますが
問題ありますか?
open(OUT,">$file");です
そもそもPerlには開けなかったらdieするモジュール無いの?
open (IN, $file) || die($!); if (-e $file) { open (IN, $file); }
>>461 それしたらファイルがないときプログラム終了しちゃうじゃん
ファイルが存在しないときはファイルを作る
ファイルがあるときはそのファイルの最後の行に書き込みしたいんです
>>464 あれ?間違ってる?
あれば開く。これで行けると思うけど
横槍ですまんが perl -e "print -e qq/./" 1 だそうで
そういう事か〜 $fileの中がユーザーから貰う値なら危険だな if (-e $file && -f $file) { open (IN, $file); } これならどうだ
>>470 ファイルが存在したら、必ずopenできるんかい?
ああなんかもういろんな意味で高度すぎてついていけないw
>>471 どういう事なの?
用意されてるファイルじゃないの?
読み込めないようなファイルを置いている環境なの?
シチュがわからんが・・・
if (-e $file && -f $file && -r $file) { open (IN, $file); }
何か、どんどん冗長的な感じになってきたけど・・・
横からだけどファイルの存在確認と実際に開くまでの間に ファイル消された場合なんかが典型的では
>>474 正解。
エラーが出ることがあるから、先にチェックしてようという
アプローチは(無意味とは言わないが)完璧ではない。
・・・・・。 until (mkdir("./lock")) { sleep(1); } if (-e $file && -f $file && -r $file) { open (IN, $file); } rmdir("./lock");
flockと吐いた処理とトランザクションで頭がパーン
いろいろ言われる前に対策しておこう ・・・ってか、どういうシチュかがわからん もっと別で対策できそうだけど・・・ my $count = 0; until (mkdir("./lock")) { if (++$count > 5) { exit; } sleep(1); } if (-e $file && -f $file && -r $file) { open (IN, $file); } rmdir("./lock");
>>478 これだけ言われても分からんのか?
なぜopenの戻り値をチェックしようとしない?
>>479 言い訳じゃないけど、
>>463 の2番目の方法で、
ダメだと言われたから、その流れでこんな状態になったんだけどね
んじゃこれで。
open(IN, $file) || &error();
いまさら
>>457 に回答すると、
> open(IN,$file);でファイルを開く場合
> 必ずしも開けなかった場合の例外処理をする必要はないですよね?
必要はある。
ファイルが開けない以外でも、予期せぬエラーが発生した場合に、そのまま後の処理を続けるべきではないから。
> 開けなかった場合はファイルを作るというようにしたいんですが
> 開けなかったらプログラム終了だと先に進まないから
ファイルの存在如何によって処理の内容を変える場合は、
open ではなくファイルテスト演算子(-e など)で条件分岐させる。
ファイルテストが通ったにもかかわらず実際に open した時にエラーが出るのなら、
仕様として想定していない事態が起こっているのだと考え、
やはりそこで実行を中止させて何が起こったのか($! の内容)を確認するべき。
> 必ずしも開けなかった場合の例外処理をする必要はないですよね? 考え方が逆だと思うが 正常に開けた場合に限って処理を続行する、だろ
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); これでいいだろ
さすがにそれでは良くねーわ
>>483 だめ。
> }
> #test.datを開けた場合は以下の処理
> @lines = <IN>;
> push(@lines,"新しい行\n");
>
> open(OUT,">test.dat"); ← ここでopenできなかった場合の処理が抜けている。
> foreach(@lines){
いや、まてお前ら、 よくわからんが、
>>467 に書いてある内容で何か足りないのか。
、、、、、ところで
>>467 の切り詰めるってどういう意味ですか
487 :
486 :2011/10/08(土) 13:46:58.79
今の流れって、エラーハンドリングする正解は分かってるけど、自分で理解したいからこういう流れになってるだけ?それとも天邪鬼か。
原文で「切り詰め」に対応する動詞は1段落目のが truncate で3段落目は clobber この場合は一部じゃなく全部をすっかり消して上書きするってことだからこの訳は微妙だな
とりあえず
>>483 が全体的に残念なコードだということは言える
>>488 なるほど、ありがとう。
また質問なんだけど、
ファイルの1行に単語とその出現回数などが書かれているデータがあって、それを読み込んで木を作成してる。
んで、ファイル全行を読み込むのはメモリ食うからダメかなと思うんだけど、
1単語ごとにmake_tree($word)みたいな関数を呼ぶのもオーバーヘッド過ぎるのでは、と思う。
だから以下のように100行ずつ読み込むといったことがしたいのだけど、簡潔な書き方はないでしょうか。
whileの条件式の中にまとめて読む行数を指定できれば読み易そうなんですが。
my @line;
while (<$IN>) {
push @line, $_;
if ($. % 100 == 0) {
make_tree(\@line);
@line = ();
}
}
ただ問題解決の方向性自体が間違ってる感もあるので、合わせて募集。板チだろうか。
そんな技巧に走って、 「ファイルの総行数が 115行だったら、15行make_tree走査しないじゃん。 しゃーないから eof 条件に追加。」 ↓ if ( $. % 100 == 0 or eof ){ とかするくらいだったら、普通にコード走らしたら? 後、実際にBenchmark取れ。
お前さん、 そのDevel::DProfなりDevel::NYTProfなり、常用してんのか?
おぉ、ありがとう。NYTProfは1週間くらい前に初めて触ったってくらい。Tie::Fileは使ったことなかった。 ちょっと出直してきます。 perldocのFAQは全部読んでおいたほうがいいですね、すげぇ。
>>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のエラー処理もしたぞ
ファイルロックとかは考えなければこれで完璧だろ?
こんなのでどうだろう open(OUT, ">>", "test.dat") or die "cannot open/create `test.dat': $!"; print OUT "NEW LINE\n"; close(OUT);
排他処理(file lock)してないけどええのん?
あれ、いつのまにかtmp.datがどこかに行っちゃってるぞ?
>>500 結構見落としがちだけど、出力先の空きがなくなったりすることもある
forとforeachって名前が違うだけってのは知ってるんだけど、どう使いわけてる? プログラミングPerlには名前が短いから常にforを使うっていう記述がおそらくギャクで書いてあるんだけど。
506 :
505 :2011/10/09(日) 01:24:09.43
forはCループ形式で、foreachはforeach (@hoge)とかforeach (keys %hoge) でも後置のときはforで書いてるな。見かけるサンプルがそうだったからだと思う。
出力時は close のエラーチェックも print と同じかそれ以上に大事だよ。 というか原則的にはこう↓ > ・われわれが3回繰り返すことは真実である: > システムコールの戻り値は必ずチェックせよ。 > システムコールの戻り値は必ずチェックせよ。 > システムコールの戻り値は 必 ず チ ェ ッ ク せ よ! (青ラクダ本第 3 版「24.3 プログラミングの書法」) 実際には die, <> のようにチェックできない・チェックすると 不自然なコードになるケースもあると思うけど。
例外があれば、そのめんどくささから 解放されるのにね。
>>505 常にfor。
自分が昔書いた古いスクリプトにforeachを見つけると全部forに直すくらいfor。
>>505 常にfor
Cタイプのforを使う意味が無いから、使い分け自体が成立しない。
509氏の真似じゃないけど、
自分が昔書いた古いスクリプトにCタイプのforが書かれてると、全部書き直す。
もちろんforeachもforに。
Cタイプforじゃないと困る場面はそれなりにあると思うが
無い。 until EXPRと同じレベル。
foreachの所を、for使うって、まさか、 for my $v (@ary) { ... } とかってしてるの? だとしたら、俺的には信じられない・・・ for (my $i=0; $i<scaler @ary; $i++) { ... } とかなら良いけど。
for my $i ( 0 .. $#ary ){ … }
>>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等でもそれが普通に使われてるのが現実。
・・・ぱ・ぱ・ぱぱっぱ・Perl Rice (゚д゚)
>>515 my $i = 0 ;
while ( $i <= $max ){
$i += 2;
}
>>510 増分がマイナスの時とか制御変数が複数あると便利な時にはCタイプのforループは普通に使うよん。
Perl脳で見るとなんかPerlっぽくないな〜とつい思っちゃうけど、使うことは使う。
>>517 そりゃforと同じことをwhileでも書けるのは当たり前、
というかwhileを実用に即して糖衣構文化したものがforなのに、
forが適任の場面でそれをあえて使わずにwhile使えというのは主客転倒だろ。
ネタで言ってるんだと信じたいものだが。
あと、それだと$iのスコープが限定されないから、
forと全く同じにするにはさらに全体をブロックで囲む必要がある。
>というかwhileを実用に即して糖衣構文化したものがforなのに、 答え出てんじゃん。Cのforにしなくて良いじゃんw #実用云々は違うだろ。Cに慣れた人の為のfor(;;){}なんだから。 >あと、それだと$iのスコープが限定されないから、 >forと全く同じにするにはさらに全体をブロックで囲む必要がある。 これは同意。 PBP信者が喜ぶけど、PBP読んでからレスした方がいらん恥は書かんで済むよ。
for( my $i = 0 ; my $j = 0; $i < 10 and $j < 10 ; $i ++ ; $j ++ ){ } 狂気の沙汰だ
違うわ、 for( my $i = 0 ; my $j = 0; $i < 10 and $j < 10 ; $i ++ and $j ++ ){ } か?
違った。もういい
for (my ($i, $j) = (0, 0); $i<10 && $j<10; $i++,$j++)
unless,until,do-while,Cスタイルforは使用禁止。 for,whileのポストフィクス禁止。 ねーよ > PBP
>>520 すまん、糖衣構文の話はそもそも「Cの」while(
>>517 )とfor(
>>515 の上)について言ったつもりだ。
俺は場合によって最善手を選べばいいと考えているだけで、
for (LIST) で綺麗に書けるようならもちろんそれを使うよ。
ただし、
>>515 とか
>>518 のような場合なら for (;;) を使うこともある。
ちなみにPBPは一応持ってます。
前にもこのスレで書いたけど、 ループで扱う数がデカ過ぎるときとかは Cタイプ for 使う事あるよ for ( my $i = 2; $i <= 600851475143; $i++ ) { ... }
その、Cタイプforってなんなの?
perlのwhile,until,for(;;)はシンタックスシュガー(微妙に違うけど) なんだから、for(;;)完全排除出来て当たり前 それをするかしないかは、個人の勝手 何でこんなに議論になる? つーか極端な話、whileすら排除出来るけど(読み易さを犠牲にすれば)。
>>530 まったく。goto文さえあればwhileもforもuntilも不要になっちゃうもんな。
gotoも必要無いだろ、LOOPに限れば
10ループ程度なら直接書けばいいのさ
再帰…
perl -le '{ print +$i++; redo if $i <= 9;}'
俺はCスタイルfor、foreachスタイルの両方を使うなあ。 単純にn〜mまで繰り返すとかならforeach(n..m)でやるけど Cスタイルは結構特殊な挙動を取らせたりできるからね。 まあwhileに書き直すことも勿論できるけどさ
538 :
505 :2011/10/09(日) 14:09:39.68
なるほどねー、まぁどっちでもいい感じですか。 ただCスタイルよりは for my $i (1..100) のほうが速かった。
>>519 {
my $i
while (){
}
}
って書くのは面倒臭いね。ファイルを読み込むときはforじゃなくてwhile使うから、$iが必要なときはこう書かなきゃいけないけど。
>>520 PBPはかなり熟読したけど、whileとforの使い分けはできてないな。気にはしてるけど。
for
固定回数ループのとき
反復カウントや、条件式が1つのとき
反復カウントがインクリメントのとき
while
不規則にカウントされるもの
反復カウント変数や、条件式が2つ以上のとき
反復カウントがデクリメントされるとき
reverse 0 .. 100 でデクリメントするとか忘れてた。
540 :
538 :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に変換された。
>>540 変換もなにも、後者はforeachそのもののような
配列を頭から走査して、条件に合わない要素を配列から削除したい。 どうしたら格好よく書けるの? for文で普通に書いたら当たり前のようにバグった。
>>542 バグがでたからって小手先のテクニックに頼ろうとするな。
単にお前が技術力が低いだけだ。コード書いて練習しろ
それぐらいfor文でもバグ無しで書けるようになれ。
例えば、配列の中の数字が7の倍数の時だけ削除する。などのような
簡単なものを実装してみ。
>>542 @array = grep ! 条件に合致, @array;
% 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使え 普通に新規配列作れ
>>541 そうなんだ、、、、
>>542 とりあえずソース。
先頭にスペース入れるのはどうやってるんだ。全角スペースとかか。
テスト
for
for
>>545 > 普通にgrep使え
> 普通に新規配列作れ
grepを使うか、またはforeachを使うなら新規配列を作れ、ってことですね。
>>546 全角スペースでもいいし でもいい
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使う事も出来るけど。
小手先に走らんでも良かろ。
重複しないIDの作成って $time = time; $ID = $time.$$;で問題ないんですか?
ある1台のマシンのみで、1プロセスごとに1つだけのIDを生成するものだとして、 1秒以内にPIDが一巡する可能性がなくて、 運用中にマシンの時刻を修正する可能性もなくて、 "1234567890"."12345" と "12345678901"."2345" のような衝突が起こりうるほど長く運用する可能性もない、 という条件が確実に満たされるのであればなかなか重複しなさそうには見える。
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.
555 :
sage :2011/10/11(火) 23:35:01.98
↑す、すみません。ここじゃないですね。 初心者版に書くつもりで間違えてました(><; 上二件、見なかった事にして下さい;;
>>550 サーバサイドで外からのアクセスに対してユニークID を与える場合だと
Data::UUID 使うと良いんじゃね?
物販サイトでそんなID与えてたらソッコーでカネが抜かれる
my $count = (() = $str =~ /はてな/g); これで$strの中の「はてな」の数を数えられるらしいんだけど 何が起きてるのか分かりますでしょうか?頭がおかしくなりそうです
$str =~ /はてな/g の返り血はリスト、配列。 リストを明示的にスカラーにすれば言うことなしだな リストをスカラーに=でつなげば文脈で判断してリストの要素の個数が戻り値になる
>>559 はやいっ!ありがとうございました!
配列をスカラー変数に入れると、要素の個数がスカラー変数に入るとは恐るべし
>>559 ズバッ!! ブビュッ!! って感じだね。
> 返り血
スカラーコンテキストでは、真偽値を返し(スカラに対する直接の//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 当然知ってて省略してるんだと思うが一応。
×リストコンテキストでは正規表現に当った値を返す。 ◯リストコンテキストでは正規表現に当った値をリストにして返す。
564 :
デフォルトの名無しさん :2011/10/12(水) 18:26:24.90
質問です Parl忍者をアク禁にしてください
565 :
デフォルトの名無しさん :2011/10/12(水) 18:27:04.20
質問です 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);
>>567 普通は読み込みファイルを開いてエラーがないときに
書き込みファイルを作るな。逆だとゴミファイルの
始末がめんどくさい。エラー処理を気にしない人は
どっちでもOK
perldoc へのリンク*だけ*貼るの禁止ってテンプレに追加しとこうよ。なんかムカツク。
なんかムカツクからと言われても全く同意も共感もできないんだが。
570には同意できない…と書いた所でIDも出ない板だから意味ないか
リンクだけ貼られても話が広げられんしなあ、 回答者の間違いやらに細かい突っ込みが入るところから 理解が広がる場合もあるのに、自ら放棄する行為だし 何より、他者の回答後に貼られて、 「はい、この質問はこれでしゅーりょー」 って言ってる、どや顔が浮んできもい あのロシア人の超音波歌手みたいな、どや顔が。
別に回答者は何人居ても構わないんだから、 好きな人が好きなスタイルで回答すればよかろ。 説明が足りないとおもったら、補足すればいいし。
BOTまがいの行為の何が楽しいんだろ?とは思うけど
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 で動作確認したかったんだけど困ったなあ。
他の回答者への敬意がかんじられんし、 普段は質問側の人間だろ
こんなのでムカツクのは「わからない5大理由」に当てはまっている奴だろうな
空気読めない奴だな、おまけに読解力もねーし
>>568 役に立つサイトなんだろうけど、横幅固定のデザインがうぜぇ
すまん教えてくれ 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==?= これのせいで受信側では余計なスペースが表示されてしまうんだがどうしたらいいんだ?
openで開けない場合ってファイルが存在しない場合だけですか? つまりif(!open(IN,"test.dat")){}と unless(-e "test.dat"){}は同じことですか?
>>583 ファイルロックがかかっている場合や、
パーミッションがなかった場合など
>>582 Subjectに↓をセットしてみては。
=?ISO-2022-JP?B?GyRCJCskTyQ/JE8kNSQrJCIkSiReJD8kSiRPJCskSiQ/JGQkSiRPGyhC?=
=?ISO-2022-JP?B?GyRCJCskSiRPJEokKyQ/JEokTyRkGyhC?= - Google
=?ISO-2022-JP?B?GyRCOCE6dxsoQg==?=
586 :
582 :2011/10/14(金) 06:35:34.26
>>585 thx
まさかと思ったけどこれでうまくいった
でもなんか気持ちわるい
MIME::Liteはなぜスペース入れちゃうんだ?
MIMEの仕様とかぜんぜん詳しくないけど、 そもそもメールのSubjectに改行が入ってる時点でなんか気持ち悪いんだが。
メールはもともと、ただのテキストエディタでも 読めるように仕様が作られた。 日本語+MIMEメールじゃ読めたもんじゃないがw だからメールは76文字ぐらいを超えると 読みやすさのために改行することを推奨している。 また140文字? かいくらか忘れたがを超えると 推奨じゃなくて改行しなさいという仕様。
あと、英語だとスペース=単語の区切りで、改行入れるときは 単語の区切りにしとけよとか、複数のスペースは一つのスペースに みなせるよね。英語だと。 じゃあ日本語はどうしろと?という問題もある。
590 :
589 :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)。
591 :
589 :2011/10/14(金) 22:16:05.71
でメールの仕様的には > まとめると「=?ISO-2022-JP?B?(略)?=」ブロックと「=?ISO-2022-JP?B?(略)?=」ブロックの間にある、 > "CR LF SPACE(又はTAB)"の1つ以上の繰り返しは削除すべしということになります。 ということらしいので、受信側のバグじゃね?w
>>591 > > まとめると「=?ISO-2022-JP?B?(略)?=」ブロックと「=?ISO-2022-JP?B?(略)?=」ブロックの間にある、
> > "CR LF SPACE(又はTAB)"の1つ以上の繰り返しは削除すべしということになります。
ふむ。ここのところはHTMLの仕様と一緒だな。
>>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"になるし。
594 :
582 :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を入れるようにしているのかもしれない
片手間に質問に答えても正確性にかけるしperldocがいいだろ。 お前のせいでリンクはってくれてた人がいなくなったら、すげー迷惑。
perlではtry-catchのかわりにevalを使うそうですが、 例外クラスを使い分けるにはどうしたらいいですか。 つまり try { ... } catch(FooException $ex) { ... } catch(BarException $ex) { ... } に相当するコードは、Perlではどうかきますか。
質問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
>>595 "perl try catch 例外クラス +site:perldoc.jp"でググれば、Error.pmの日本語perldoc が出るし、
>>598 前者
% perl -le 'my $fh = \*STDERR ; print $fh q{hoge}' 2> /dev/null
後者
File::Tee, IO::Tee "tee +site:search.cpan.org"
本当はrubyの人にレスるつもりは毛頭なかったけど、
599を書いてる途中で書き込んじまってどうでも良くなった。
>>596 どうしても try-catch形式で書きたければ Try::Tiny 使ってみたら
603 :
602 :2011/10/15(土) 09:04:36.50
こんな感じ use Try::Tiny; try { ...; } catch { if ( ... ) { ...; elsif ( ... ) { ...; else {<br /> ...; }
604 :
602 :2011/10/15(土) 09:09:11.30
>>603 は間違い、こっちの方が正しい。
use Try::Tiny;
try {
...;
} catch {
if ( ... ) {
...;
elsif ( ... ) {
...;
else {
...;
 }
};
>>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";
};
>>598 例示はファイルハンドルのコピーでなくエイリアスなので、
>>600 でいいのかな?
handle = $stdout.dup
handle = $stdout.clone
のように本当のコピーなら、
>>605 かな?
Perlで、オブジェクトIDみたいなのは取ってこれますか。 my $obj = new Foo(); print $obj->__id__; #=> 0x314159265358 $obj = new Foo(); print $obj->__id__; #=> 0x314159298940 みたいなの。
>>608 うーん?
そのまま、print $obj で表示される物じゃダメ?
+0 も実際には邪道だろ。danは使うけど、 use Scalar::Utils qw( refaddr ); my $addr = refaddr $objct;
ゴメン s/Utils/Util/;
overloadが設定されてるオブジェクトに対してはrefaddr使うしかない URIとかTime::PieceとかDateTimeとか そうでなければ+0とかでもいいと思う
615 :
576 :2011/10/15(土) 13:04:12.72
>>578 cpan や cpanm ではテストにパスしないとインストール出来ないけど、
ppm にはしっかり Encode-Locale-1.02 があって
問題無く使われているみたいだったので、
テストでコケたのを無視して、
展開された作業用ディレクトリからインストールしたら無事期待通りに使えた。
Encode::Locale自体じゃなくて t/env.t の方に問題があったみたいだね。
しかし、いくら普通に使えるからといってテストでコケるのを放置してるのは何だかなあ。
cpan の force install やら、cpanm -f やら試した? テスト無視するだろ? 元のレスもその程度の問題だと認識して「なんだかなー」と思ってたんだが。
あるぇ?
>>610 で、=でsplitして、[0]はクラスの型で[1]で参照先のチェックじゃダメなの?
必ずしもだめではないが、無駄手間。
あと
>>614 の言うような場合には当然使えない。
ダメだろ $ perl -Mstrict -Mwarnings -le ' print bless({}, q{Foo=Q(})' Foo=Q(=HASH(0x7fec4a802eb8) なんで態々数値に変換してるかって、数値である事が保証されてるからだよ。
ソフトウェアなんて数値どころか 0と1で出来てるんですが。 コードも0と1だよ。
生理中の三十路女かよ
そうなんだすごいね!
>>617 ユニークなIDが欲しいだけなら数値コンテキストに置こうが文字列コンテキストに置こうが
同じ事 (一意な文字列である事は保証されている) だが、
>>614 のような問題があるので
Scalar::Util::refaddr() が最善。
625 :
608 :2011/10/15(土) 16:57:02.83
>>610-614 ありがとうございます。Scalar::Util::refattr() 使うことにします。
626 :
578 :2011/10/15(土) 17:32:16.08
>>615 調べたらこんな感じだった。
env.t
> Encode::Locale::reinit("cp1252");
・Windowsではコードページの変更が出来ない
> $ENV{"m\xf6ney"} = "\x80uro";
・コードページ"cp932"(日本標準)ではこの設定ができない
・なぜかPerlが落ちる
・コードページが元から"cp1252"(西欧標準)の場合は上手く行く
英語版のWindowsだと問題を把握できないかも。
関数定義におけるプロトタイプ宣言について質問です。 sub f(&) { my ($closure) = @_; } と定義すると、 f { print 123 }; のように使えます。 同じように、メソッド定義で package Foo; sub f($&) { my ($this, $closure) = @_; } のようにしたいですが、$thisのせいで$closureが第1引数にできないようです。 プロトタイプ宣言はメソッド定義では使えないのでしょうか。
BOT
630 :
615 :2011/10/15(土) 18:56:38.68
>>626 なるほど、英語版の Windows じゃ再現性が無いから、
Encode::Locale のメンテナも何が問題になっているのか把握出来て無いのか。
教えてくれてありがとう。
>>628 そのURL先にこう書いてありました。
> メソッド呼び出しはプロトタイプを行う/行わないによる影響を受けません。
> なぜなら正確な呼び出しコードは、継承に依存しているために コンパイル時には
> 不確定だからです。
やっぱりメソッドでは使えないのですね。分かりました。
動的型付け言語の欠点だよな。
どーしてって言われても実装がそうだからとしか、、、 正規表現周りで、実装が他の算術計算やらと別枠になってんじゃねーの? 新しいバージョンでも ~~ がオーバーロード可能になってるだけだし。 (~~ はどっちかっつーと他の正規表現のラッパー的挙動だし)
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; こういうのならできないこともない
「perl 予約語 一覧」でぐぐったけど、ヒットしない。 perlの予約語って、どこかにリストアップされてませんか?
制御構造なら 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のダウンロード先探してます。 だれかご存知の方いらしゃいますか?
予約語といえばyでつまづいたことがあったな
y?
y///
同様のパターンで s があった。ありふれてるけど。 あと tr とかも場合によってはやっちゃいそう。
最新版のActivePerlでも使えますよ
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でも同じように書きたいです。
ほぼ全てのモジュールはExporterの仕様に準じてる。 この前提の元に話しをすすめると、 use Something qw( /^…$/ ); でこのケースには対応出来る(ハズ) EXPORT_TAGやら、そこらへんで挙動が変更されるのかも知らんが 詳しくは、 perldoc Exporter して Advanced features Specialised Import Lists を。 TAGとかに関しては使ってるモジュールのpod読めとしか
>>646 ありがとうございます。調べてみます。
でもPythonと比べるとやはりPerlは複雑ですね。
648 :
デフォルトの名無しさん :2011/10/16(日) 21:52:56.88
>>648 cpan -r Task::Catalyst
>>644 ありがとうございます。
窓の杜を見ると、最新版がXP以降になってたので‥。
とりあえずダウンロードして試してみます。
651 :
デフォルトの名無しさん :2011/10/16(日) 22:08:02.50
>>649 エラーが出なくなりました。
バージョンの違いだったのかな・・・
ありがとうございます。
>>649 オ プ シ ョ ン っ て わ か る?
自機の分身でレーザーの次にあるやつだろ?
654 :
651 :2011/10/16(日) 22:25:03.15
Perl忍者さん、自作自演ですか?w
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 のように見なして実行してくれる機能です。 ライブラリをインストールすれば、コマンドライン用のスクリプトを別途用意しなくて済むのが便利です。
>>656 無いです。
モジュール自体に実行スクリプトとしての機能を組む方法はありますが、
それをしたとしても、
perl `perldoc -l Hoge` arg1 arg2
と二段階の手順を踏む必要が出ます。
そもそも、perl では、モジュール兼実行スクリプトは(ほぼ)
自分で書いたコードでしょうから、置き場所くらいは分るんでは?
ちなみにCPAN moduleで実行スクリプト機能を組み込んだコードは
あまり見たことはありません。
cpan, cpanm, perlbrew, perltidy, perlcritic
とかは別途コードを用意してるし。
662 :
651 :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"
やるな忍者
tar.gzの直リンはよせよ
何で、忍者のレスから2分でインストールして確認して 返答レスが付けられるんだよw
>>645 必要なのがそんないっぱいあるのは、何か間違ってないか
あと全部指定にすると、後々整理するとき不要なのかどうか判断しずらい。
一人で開発してるならいいけど。
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も設定してなかったら、結構な数が並ぶ事もある。 後半は同意。
名前の衝突が怖いから、最小限インポートするか、 完全修飾名で呼び出すのがPerl流。
669 :
639 :2011/10/17(月) 08:18:12.46
Windows2000 に現行バージョンのActive Perlインストールしてみましたが、最後に弾かれてしまいました。p(´⌒`q) 2000じゃ無理ですかね。やっぱり。
>>669 今となっては 2K じゃネットに繋いで使うには危な過ぎるから
完全にスタンドアローンで使っているのでなければ
Linux を入れて Perl を使ってみては如何?
Perlで、指定したファイルをPerlスクリプトとして読み込む関数は何でしょうか。 useではなくて、PHPのrequireやinclude、Rubyのload相当を探しています。
require じゃないの?
use warningsすると、
ttp://perldoc.jp/docs/perl/5.10.0/perldiag.pod にあるような警告がだされますが、このうち、一部の警告だけを無視することはできますか。
Pythonにこのような機能があって、たとえば古いプログラムを動かす時には、obsoleteなモジュールを読み込んだときに出る警告だけを抑制する、といったことができます。
こんな感じで、特定の警告だけを抑制する方法がPerlにあれば教えて下さい。
warnings
perllexwarn嫁
>>677 no warnings '...' でいけました。ありがとうございます。
ただ、perllexwarn に書かれてあるカテゴリ名が、perldiagに書かれてある警告メッセージのどれに対応するのか分からず、全部試してみるはめになりました。
どっかに、警告メッセージとカテゴリ名の対応があるといいですね。
>>678 perldiagに書いてあるだろ?
> 上記のうち、最初の三つ (W, D, S) に分類されるメッセージの大部分は warings プラグマで制御できます。
> メッセージが warnings プラグマで制御できる場合、 警告カテゴリは以下の説明で分類文字と共に記されています。
で、例えば
> accept() on closed socket %s
> (W closed) クローズされたソケットに accept を行なおうとしました。 socket() の呼び出し時に、返却値のチェックを忘れたのではありませんか。 "accept" in perlfunc を参照してください。
でclosedカテゴリだってわかるようになってる訳だが。
くだらねーことやってんだな情弱
>>680 僕のフリしないでくれませんか?
情弱はPerl忍者本人だ
Perlで、hashやarrayの同値性と同一性はどうやって判定しますか。 Pythonだとこんな感じのことを、perlでやる方法です。 a1 = [1, 2, 3] a2 = [1, 2, 3] a1 == a2 # 同値なのでTrue a1 is a2 # 同一ではないのでFalse
文字数のカウントについて質問です。 某スレ用に2chのスレタイを生成するジェネレータみたいなものを作っているのですが、 2chのスレタイのルールは 64バイト以内 全角文字は2バイト、半角文字は1バイト ただし半角カナは1バイトとして数える という感じらしいのですが 半角カナ混じりの文字列の長さを2chルールでカウントするためにはどういう方法が考えられますでしょうか…。 半角カナ⇔全角カナ変換などは見かけるのですが、これですと2バイトが2バイトに変換されるだけなので結果変わらず、悩んでます。
ルールも何もshiftjisでのバイト数ってことだろ。cp932に変換してlength取ればいい。 ついでに言えばスレタイの文字数とかは板ごとのSETTING.TXTで決められてる。
ああああそうか…orz eucで必死にやってました。 変換したらとれました。ありがとうございました。
偽が沸いてるwww
package Hogehoge; sub foo { }; で定義されたパッケージや関数を、いったん未定義にできますか。 undef Hogehoge; とかしてみたけど、同然のようにエラーになりました。
サブルーチンは undef *foo; (Hogehoge の中からの場合) undef *Hogehoge::foo; (同、外) でいけると思うが、パッケージそのものを定義とか未定義にするって言い方は普通しないな。 package Hogehoge; は、これがあるブロックで定義するグローバル変数やサブルーチンは 基本的に Hogehoge:: に属させることにしますよ、という宣言にすぎないのであって、 package 宣言なしで main から sub Hogehoge::foo { } としてもほぼ等価なわけだし。
>>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";
>>688 > とかしてみたけど、同然のようにエラーになりました。
×同然 → ○当然
>>689-690 ありがとうございます。
よく考えたら、自分の使う範囲では、関数の削除ができれば当面は困らないことが分かりましたので、この方法でやってみます。
693 :
Perl忍者 :2011/10/18(火) 17:42:43.62
てす。
694 :
デフォルトの名無しさん :2011/10/18(火) 21:56:45.67
split(/。/,"あいう、えお。かきく、けこ。なにぬ\n") したときの返り値が↓ (あいう、えお。, かきく、けこ。,なにぬ\n) みたいにデリミタが残るような自作splitを作りたいんですが、いい方法はないですか? あとからmapでデリミタを付与するみたいなのは無しで。
696 :
デフォルトの名無しさん :2011/10/18(火) 22:02:03.37
699 :
デフォルトの名無しさん :2011/10/18(火) 22:33:02.76
700 :
デフォルトの名無しさん :2011/10/19(水) 09:18:55.57
700GET
正規表現で、否定を表す書き方はありますか。 たとえば、/¥.html$/ は拡張子が .html である文字列にマッチしますが、 「拡張子が .html ではない文字列」を表すような正規表現が知りたいです。 もちろん、 if ($str =~ /¥.html$/) を if ($str !~ /¥.html$/) と書けばいいのですが、(設定ファイルを使って)自分が指定できるのは正規表現だけで、 該当のif文は(フレームワークのコードなので)自分では変更できません。 なので、全体を否定するような正規表現が欲しいです。 /(?!¥.html$)/ みたいに書けたりしないですかね?
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); }
>>701 否定を表す書き方はありません。
拡張子が.htmlでないというだけでいいなら固定文字列なので否定戻り読み
が使えるから
/¥z(?<!¥.html)/
と書けるけど、これはどっちかというと例外だね。
ある正規表現にマッチしない文字列にのみマッチするような正規表現は
存在するから自分で書けば原理的にはできるけど場合によっては長く
なったりして大変なんだな。正規表現を有限オートマトンに変換するのは
簡単だし、その有限オートマトンから補集合を受理する有限オートマトン
をつくるのは受理状態をひっくり返すだけだから簡単なんだけど、できあ
がった有限オートマトンを正規表現に変換するのはけっこうめんどくさい
のでした。
カブったorz
>>704 ないですか。
>>705 理論的には可能だけど、標準機能としては用意していない、ということですね。
>>706 リンク先に
> ある文字列を含まないものにマッチする正規表現
> (?:(?!foo).)*
とあるんですが、仕組みがわかりません。
(?!foo) は否定の先読みで、(?: ) は後方参照を行わないグループ化で、それを組み合わせるとなぜ否定の正規表現になるのでしょうか。
^(?:.(?!foo))*$ ならなんとなくわかるのですが。
正直ね、正規表現を指定できるツールは 全て「否定」のチェックボックスを用意するべきだと思うのw
Perlのグローバル変数、具体的には「$@」と「$!」なんですが、 これらはマルチスレッドに対応していますか? つまりあるスレッドで「$@」を書き換えても、それが別のスレッドに 影響を与えないかどうかを知りたいです。
>>683 すみませんが、そこを読んでもわかりませんでした。
そこを読むと、Pythonの「a1 == a2」(同値判定)に相当するのが、Perlの「~~」のように見えますが、
スマートマッチング演算子はそもそも同値判定のための演算子ではないようです。
またPythonの「a1 is a2」(同一判定)については触れられてもいませんでした。
>>714 同値判定には ~~ が大概有効だが、「1つの決まった書き方」はないってことさ
同一判定についてはそれぞれのリファレンスが等しいかどうかを比較すればいい
…というか、同一判定をする予定があるのなら
リストとして生成するよりも、始めからリファレンスとして生成しておくことも考えてみて
そういえばPythonは誰が書いても同じようなコードになる言語だって どこかで見た覚えがあるな Perlのモットーは「やり方は何通りもある」だからな
「やり方は何通りもある」 っていう かっこいい言葉の裏には物凄い悲惨さが込められてるのは、お前は知らない どれだけの人間がそれで苦労してるかしらないようだな
>>714 同一ならScalar::Util::refaddr()で判定だろうね。
同値はテスト以外でやったこと無いから分からんちん。
テストではもっぱらTest::More::is_deeplyを使ってる。
Test::DeepやTest::Differenceとかあるらしい。
何にしても、単純に比較できないオブジェクトが紛れると厄介だったり。
やり方をガチガチに固める所では使うなってことなんじゃないの
無能な石頭にとっては「やり方は何通りもある」のは悲惨だろうさw
Perl敗者(
>>717 )にとっては過酷な言語だよな
これだからPerlは嫌いだ。好きだけど。
"/foo/" を qr/foo/ に変換する必要があり、 my $str = "/foo/"; my $re = eval "qr$str" if $str =~ /^¥/.*¥/$/; とやっているのですが、これでいいでしょうか。 もっといいやり方があれば教えて下さい。
>>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);
>>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でもやりたいです。
&f($sub2); でプロトタイプ無視させる
>>728 すごい!うまくいきました。ありがとうございます。
>>719 > やり方をガチガチに固める所では使うなってことなんじゃないの
普通はやり方を固めるもんだよ。
もしそれが、自分一人のプロジェクトだとしても、
自分のルールに固めるだろう?
一つのプロジェクトで、日付処理用のモジュールとして
Date::Handler と Date::ICal と Class::Date と Date::Simple と
DateTime と Time::Piece を全部使おう。やり方はいくつもあるんだから!
なんていう人はいないでしょ。
>>730 そういうことを言ってるんじゃないのよねw
言ってるんじゃないというのなら、 どう言っているかを答えれば良い。 反論を待つ。
忍者の言う通り
730の言う通り
>>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) ;
1.「やり方は何通りもある」は、仕事が終わるならどう書いてもいい、 っていう意味で、 2.「物凄い悲惨さが込められてる」は、それを別の人がメンテナンス するときの話。 この2つはそれぞれ事実なんだろうけど、おれはそれでもPerlが 好きだし、Perlのこのアプローチが間違っているとは思っていない。 2.メンテできないものは無理してメンテせず、1.自分がメンテ できるように書き直すのが吉。なんか無駄っぽく感じるけど、そう いう事態を招いた組織側の責任なので、担当者として責任を感じる 必要はない。
perl忍者は、2chの過去レスの(中二病的に)かっこいい部分だけで、
レス作るから、まじめに相手しても無駄だよ。
実際の悲惨さ知ってるわけないもん。
>>736 >自分がメンテできるように書き直すのが吉。
VBAの変数名が「あ」「い」「う」「え」…てーのの
凄まじいスパゲティーコードを書き直した事があるが、地獄だぞ。
(ちなみに顧客のコード)
2.の業務を押し付けられたらどっちに転んでも悲惨だよ、
前任者がコードの内規守ってる事を祈るのみ。
>>735 >my $re = qr/$1/ if $str =~ m{^/(.*?)/$};
さんくす!
739 :
デフォルトの名無しさん :2011/10/21(金) 01:40:30.80
これからPerlの勉強を始めようと思ってるんだが StrawberryとActiveとかいうのどちらをDLしたほうがいいのか 教えろください
>>739 ActivePerl に不満が出たら Strawberry Perl その他
>>739 少し前までは Strawberry Perl を薦めてたけど、
今はどっちでも大差ないかもね。
ppm で楽をしたいなら ActivePerl、
最初から CPAN経由でいろいろ突っ込みたいなら ActivePerl か?
742 :
741 :2011/10/21(金) 02:29:34.61
おっと最後の行は、 最初から CPAN経由でいろいろ突っ込みたいなら Strawberry Perl か? だね。
743 :
デフォルトの名無しさん :2011/10/21(金) 02:33:59.60
>>740-742 ありがとうございました。
まだ使ってないから不満もないし、楽をしたいので
とりあえずActive Perlを
インストールすることにします。
本当にありがとうございました。
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でもこんなかんじで簡潔に書く定石みたいなのはありますか。
>>744 $_ == $value and $found = 1, last;
>>744 my $found = grep{ $_ == $value }@array;
ってのはどうかな、Rubyに直訳すると
found = array.select{|v| v == value }.length
って感じなんだけど、PerlはRubyと違ってゼロは偽だから
返された「見つかった個数」をそのまま if に通せば有無の判定になるし
#全行対象の定石てんなら、 #my $found = grep { $_ == $value } @array ; かぶった 5.10以降なら my $found = $value ~~ @array ; お遊び my $found = sub { for ( @array ){ return 1 if $_ == $value } }->() ;
>>744 > 5: break;
break???
>>735 先行宣言忘れてた。
>>744 use List::MoreUtils qw(any);
...
my $found = any{ $_ == $value } @array;
rubyだと
found = array.any? {|x| x == value }
今で perl のオブジェクト指向プログラミングを勉強するにはどの本がおすすめでしょうか。 perl は6年ぐらい前にリャマ本読んで、システム管理用のツールをたまに作るぐらいのレベルです。 オブジェクト指向については全くの初心者です。 よろしくおねがいします。
あるインスタンスだけメソッド定義を上書きすることはできますか。 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チックなことをしたくて、それでインスタンス別に挙動を変える方法を知りたいです。
>>750 本を買う前にまず perldoc で perlboot, perltoot, perltooc, perlbot を読んでみては?
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() { ... })() みたいなもの?
>>753 grepについての疑問のとこは細かい話に見えるかもですが
スカラーコンテキストでは個数が返る、です。
perldoc -f grep
> In scalar context, returns the number of times the expression was true.
用語の質問です。 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?
>>754 >スカラーコンテキストでは個数が返る、です。
ということは、grep がいつも配列を返すのではなく、
grep自体がコンテキストを認識して、配列が要求されている場面なら配列を、
スカラー値が要求されている場面なら数を返すということなんですね。
興味深い挙動だけど、複雑すぎ!
>>756 > grep自体がコンテキストを認識して
grep自体がじゃなくてPerl処理系がじゃないかな
grepは処理結果としてスカラ値(個数)と処理済の配列の両方を持ってる
>>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).
sub x : lvalue { $_[0]->{x} }; sub y : lvalue { $_[0]->{y} }; こういうのかな。 メソッドでもLvalue subroutineと呼ばれてる希ガス。
perlの言語仕様でいうところのattributeはサブルーチンやレキシカル変数に つけられるやつの方だけど、オブジェクト指向でもattributeという言葉は よく使われるのでperlのオブジェクト指向ライブラリの一つのMooseみたいに その意味でattributeを使っちゃってることもある。どれを指しているかは よく考えながら読むしかないね。
762 :
755 :2011/10/21(金) 17:20:01.32
>>756 grepの部分に配列を書いても同じことだよ
スカラを要求する文脈で配列が書かれれば配列の長さが返る
例えば「配列@aryの長さより$nが小さい」は $n < @ary と書ける
これがPerlの「コンテキスト」って概念ね
ファイルをopenしてcloseする前にrenameしたら そのファイルが入っているフォルダがエクスプローラで見れなくなりました mkdirでフォルダ作成してもこそのフォルダだけエクスプローラで表示されません どうすれば元に戻りますか? 環境はwindowsでactiveperlです
>>751 できるよ。
まずすべてのインスタンスに何も挙動が変わらない
メソッド定義を付け加えましょう。
つーか
>>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 ;
それいったら、「use Aspectしろ」で終る話だろ。
Aspectは特定のインスタンスだけ 置き換える機能は持っていません。 冷静になったら?
>>767 ありがとうございます。
でもこの方法だと、単にメソッド定義を上書きしているため、全部のオブジェクトに影響するんですよね。
そうではなくて、インスタンスオブジェクトごとに、個別に設定したいのですが、perlだと無理そうですか。
やりたいのは、AOPのように、指定したメソッドの前後に処理を挟み込んで、
たとえばロギングを追加したりとか、実行時間を計測したりとかしたいんですが、
それをある特定のインスタンスにだけ適用させたいと考えてます。
クラス定義自体を上書きすると、ほかのインスタンスにも影響を与えるので、
それは希望する動作ではないです。
JavaScriptとかだと簡単なんですけど、それをぜひperlでやりたい。
どっちでも良いけど、用語は厳密に使い分けてくんない? インスタンスは完全にオブジェクト指向の用語で、 AOPに使われると混乱するんだが。
は? AOPはオブジェクト指向を補完するもので 普通はオブジェクト指向と一緒に使うんだが。
単に 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 ;
コピペまちがえ。 ×sub hello { shift ; print qq{bye\n}} の行いらない。 ×local *{Foo::hello} = sub { main::hello(@_) ; } ; ◯local *{Foo::hello} = sub { shift ; print qq{bye\n} } ;
>>774-775 それはクラス定義を書き換えている。
もしFoo::helloのなかで新しくFooオブジェクトを作る処理が入っている場合、問題になる。
CPANモジュールを作るのに、参考にすべきページはどこでしょうか。 「CPAN モジュール 作り方」でぐぐるといろいろでできますが、ページごとにやり方が違ったりするので、 ここだけ読めばおK!というのを教えて下さい。
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 ;
use strict や use warnings の有効範囲って、どこまでですか? use strict; use warnings; package Hogehoge; としたら、use strict や use warnings は package Hogehoge の中でも有効ですか? やってるうちにわかんなくなってきたので教えて下さい。
>>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!
>>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();
>>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しなおすことですね、きっと。
すばらしいです。感謝にたえません。
動的に新しいクラスなんか作ったら 元のオブジェクトと動きが代わるってことだろ。
最近回答がヌルーされるので、しばらく旅に出ることにします。
>>779 プラグマの範囲はレキシカルスコープだから、レキシカルスコープでググレ。
前に出てる質問だから、過去ログ漁っても出てくる。
まあ、直接 foo; とか書いてテストした方が早いけどな。
じゃ、また。
http://search.cpan.org/ に、モジュールを分類した一覧が表示されますが、これってどうやって登録するんでしょうか。
たぶんモジュールのなかのメタ情報に書くんだと思いますが、どう書くのかわかりません。
だれかおしえて。
>>787 もしかして
>>777 か?
そんなことを2chで聞かないとわからないレベルのくせにcpanに何か登録するつもりなのか?
Perlで外部プログラムを同時起動させて あるプログラムの戻り値が帰ってきたら全部終了させるってことは どうすればいいですかね?具体的に教えてもらえるとありがたいです
>>789 訂正します
あるプログラムの戻り値「で特定の値が帰ってきたとき」全部終了させるってことは
>>788 カテゴリ登録の仕方って、どっかに載ってます?
CPANモジュールてきとうに漁ってみたけど、カテゴリを登録してるような記述はどこにもなかったです。
これって、もしかしてパッケージをつくる側が指定するんじゃなくて、運営側が分類してたりするんでしょうか。
モジュールなんてPerl忍者ですらできたことだが・・・
index()で日本語を検出できません <h3>あ</h3>というタグの位置が欲しいのに、-1が帰ってきます。 index()は日本語は使えないのですか? 文字コードはutf-8です。
794 :
793 :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); この正規表現では取得できません。 どのようにすればよいですか?
use utf-8をつける
use utf-8;をつけると <h3>あ</h3>というタグの位置が欲しいのに、-1が帰ってきます。 index()では、どのようにすればよいですか?
use utf-8をはずす
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); この正規表現では取得でき
なんかのhtmlをDLしてそれスクレイプしてんだろ? そのHTMLの文字コードは何?
>>798 その $word はちゃんと decode('utf8', $source); してあるんだろうな。
use utf-8をはずす +1 票。
そしてまたつける
use utf8; は使うひとを選ぶから、道具としてちょっとね
use tf8はソースコードに(コメント以外)日本語を 書かない人には関係ない話。
# ファイル名を 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__
806 :
793 :2011/10/23(日) 02:39:10.98
>>799 utf-8です。
>>800 utf-8で読みこんでますので、特にしてません。
試してみます。
明らかに use utf8 や encode/decode の効果を理解できてないね あれは初心者や他言語からの人にはなかなか馴染みづらいだろうし仕方ないけど
808 :
793 :2011/10/23(日) 02:55:22.83
>>807 ええ、調べて書いたんですけどね。
学生の頃、シェルスクリプト代わりに使ってたけど、
日本語を扱うのがこんなに大変とは思わなかった。
utf8フラグとい名前がまずかったね。 文字列フラグなどという名前だったらよかった。 文字列フラグはPerl固有のものだから Perlコード外部から渡されるのは文字列ではない。 文字列でなかったらなにか?それはバイナリ。 バイナリを文字として扱いたければ、文字に変換しないといけない。 それがdecode。 ではソースコードに書いてあるのは、文字かバイナリか。 それはuse utf8を使えば文字で、そうでない場合はバイナリ。 話はこれだけ。
810 :
793 :2011/10/23(日) 03:02:29.22
ファイルを開いて、全レコードの一番最初に出現する”,”(カンマ)をスペースに 置換するスクリプトを教えてもらえませんか 例: 変換前: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
>>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 /;
としたほうが、トラブルが少なそう。
>>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モードは書き込み・読み込みどちらで開いたらいいのでしょうか?
815 :
793 :2011/10/23(日) 10:34:25.92
>>800 decodeしたら上手く動きました。
ありがとうございます。
fork
文字列フラグなどという名前だったらよかった。 と考える実装初心者・命名中級者。
Win7/x64使っています。 ファイルのタイムスタンプを変更する utime が失敗します。 管理者権限を perl.exe やコマンドプロンプトにつけてみましたが、変わりませんでした orz なにかヒントがあればお願いします m(__)m
「内部文字列フラグ」がよりマッチしていそう そうするとだんだん核心にちかづくw
>>814 ワンライナの挙動の説明、書くのが面倒だったからDeparseしただけ。
保存して使いたければ、どうぞ
>openモードは書き込み・読み込みどちらで開いたらいいのでしょうか?
813氏では無いが、貴方は取り敢えず今回は
perl -i.bak -lpe "s/,/ /" hoge.txt
で満足して、多少は自力で勉強をしてきたら如何か?
やなこったw
ワンライナー、windowsで動かないのはどうしてだよ
お前の書き方が悪い
>>818 言い出しっぺの一人だけだろ、言ってんの。
>>826 過去にutf8フラグを理解してないって
こてんぱんにやられたやつでしょw
perl -lpe "s/^(\d\d\d\d-\d\d-\d\d),/$1 /" hoge.txt > hoge2.txt でいけるだろうけど、そのファイルを出力するプログラム を変更できるならその方がはやい
>>824 perl -e "print qq/Windows Oneliner\n/"
>>809 >utf8フラグとい名前がまずかったね。
なんでまずいの?utf8だからutf8フラグなんじゃないの?
>>821 >そうするとだんだん核心にちかづくw
核心に近づくとどうなるの?おいしくなるの?それならいいけど
そのとおり。 そしてそれは多くの場合ユーザーの意図するところではないと考えられるので、 素通しせずエラーで死ぬ仕様にしておくことで、すぐ間違いに気づけるようにしている。
>>830 UTF-8バイナリ文字列と内部表現がUTF8の文字列を混同する人(同一と思ってる人)が多発してるからとか?
知っている人がいないかやっぱり
>>832 ありがとうございます。ここはsubで新しくスコープ作らないといけないんですね。
空気読んでたが、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
>>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 は文字列が内部でどのように保管されているかを知っていて、この知識を エンコードする ときに使います。
> 言い換えると: ”特定の文字列の内部エンコーディングが何かを 調べようとしてはいけません;”
> 代わりに、単に望みのエンコーディングに エンコードしてください。
836,837に誘導レスが二つも付いてて、更にレスすんのか? しかも836にURLが張ってあるのの引用だけで
>>836 >「は? 文字列はバイナリも含むだろ」っつー初歩のつっこみが入って混乱する。
そんな突っ込み入ってないじゃんw
文字とバイナリの区別ぐらい普通の人はつくと思うけどねぇ。
バイナリは、その名の通りビットの集まり。
数値型にバイナリが含まれないように文字列型にバイナリは含まれない。
たとえ数値の内部表現がバイナリであったとしてもだ。
たとえばMySQLでデータ型がバイナリなら任意のビット(バイト)列を格納できるが、
文字列型ならそこに指定されたエンコーディング以外の文字が正しく格納される保証はないとわかるはず。
明らかに違うものと認識しているはずだがね。
ここはあまり詳しい人いないね
そういえばファイルを開く時にも テキストモードとバイナリモードがありますね。
本来はバイナリモードしかないんだが、Windows(MS-DOS)がうんこだから 仕方なくテキストモードを作った。
>>844 > Windows(MS-DOS)がうんこだから
ちがうよ。単に環境によって改行の仕様が違ってるからそれに対処するためだだよ。
それは歴史的事情により仕方ないんだよ。
ftpにもasciiモードとbinaryモードっつーのがあるよ。
Macの改行も忘れるな
>>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.
>>847 だからね、UNIXの改行コードがLFなのもDOS(Windows)の改行コードがCR+LFなのも
それぞれの歴史的事情によるのよ。別にDOSが“タコ”だからとかじゃないのよ。
例えばメールの改行コードは昔からCR+LFだったりするのよ。
> Macは、MacJPerl(OS9)の昔からperlのバイナリモードは無関係だぞ
Macはみそっかすだから考慮外なだけなのよ。きっと。
MacJPerl(OS 9)の改行コード周りの仕様がどうなってたんだかは知らないけど。
いや、DOS/Winがうんこなのは、改行がCR+LF であることじゃなくて、 それをファイルの区切りとして処理しちゃうテキストモードというモードを、 システムコールのレベルで作っちゃったことじゃね。
>>848 だから「DOSとWin」の為だろ。おれはDOSがタコだウンコだ
なんて一言も言ってないし、どーでもいい。
一般化して、「環境依存の改行仕様が原因」と書いてるから
そんなんじゃなくて、特定の環境(DosとWin)に対応する為だと
レスしただけだ。
> 844 名前:デフォルトの名無しさん[sage] 投稿日:2011/10/23(日) 19:33:02.05 > 本来はバイナリモードしかないんだが、Windows(MS-DOS)がうんこだから > Windows(MS-DOS)がうんこだから > Windows(MS-DOS)がうんこだから あれ? 言ってない? あれ?
>>849 > いや、DOS/Winがうんこなのは、改行がCR+LF であることじゃなくて、
> それをファイルの区切りとして処理しちゃうテキストモードというモードを、
> システムコールのレベルで作っちゃったことじゃね。
DOSが改行CR+LFを「ファイルの区切りとして」処理しちゃう?
どゆこと?
システムコールのレベルで? って何?
それとPerlのbinmodeとどう関係するの?
854 :
845 :2011/10/23(日) 21:55:52.76
855 :
847 :2011/10/23(日) 21:57:06.99
856 :
847 :2011/10/23(日) 22:00:23.63
> > なんでまずいの?utf8だからutf8フラグなんじゃないの? > perldocに内部形式がutf8だと意識してはいけないと書いてあるからさ。 もともとPerlはUNIXユーザが、こうだったらいいのになあって思った 言語仕様が体現されていてブレークしたわけで、言い訳がましい ドキュメントでは、勘弁してあげない。 > UTF-8バイナリ文字列と内部表現がUTF8の文字列を混同する人 >(同一と思ってる人)が多発してるからとか? その意味で、UTF-8バイナリ文字列はUTF8の文字列であるのは当然で 内部表現が異なっていることをプログラマにむき出しにしているの は、Perl的ではない。 言い訳ドキュメントの有無、既読・未読に依存しないインタフェース のほうがおいしい。
>>857 お前のひとりよがりの意見を押し付けるな。
複数のファイルハンドルをひとつのオブジェクトにtieするのってどうやるんですか。 いまは my $out = tie(local *STDOUT, 'Foo1'); my $err = tie(local *STDERR, 'Foo1'); とやってるんですけど、この方法だとstdoutとstderrが別々になっちゃうんで、 できれば両方を同じオブジェクトにひもづけたいです。 shellでいうところの 2>&1 みたいなの。
$ret = `echo $text | /usr/bin/mail $address -s "Title"`; とすると sh: Sytax error: "|" unexpected のエラーになってしまいます。 パイプは使えないんでしょうか?
ドキュメントを書くのは大変なことだと思うし、それを 翻訳するのも決して楽だとは思えない。 一人のひとが読む労力はたいしたことないかもしれないけ ど、読者総人数の総時間ともなれば、これまた大変な時間 になる。 これってひとりよがりの意見なの?
>>853 俺はDOS/WINをうんこだとは思わないが、一応説明しておこう
Unix系の改行はLFだが、Unix系システムはそれを全く特別扱いしない
あくまで、ただの0Dの値を持つデータでありそれ以上でもそれ以下でもないんだ
だから例えば画像データをそのまま標準入出力に流したとしても
そのまま画像データとしてリダイレクト出来る
一方、Windowsにはテキストモードとバイナリモードという区分がある
バイナリモードはUnix系と同様、データはそのまま流れる
ではテキストモードってのは何かっつーと
簡単に言えば改行コードを特別扱いするモードだ
例えばLFを出力しようとするとCR+LFへ変換される
当然ながらこのモードのまま画像データなど出力してはデータを壊してしまう
んでWindowsのデフォルトはテキストモードであり
コマンドプロンプトも基本それで動く
この差がUnix系とWindows両方で使うようなコードを書いたときに
しばしば問題を引き起こす
特にUnix系で書かれたコードが問題で、開発環境では上手く行くのに
Windowsに持っていくとデータ破壊を引き起こしてしまう
元々PerlはUnix系の文化なんで、そういうコードもあったりするし
WindowsでPerl書いたことない人もたまに居たりして
そういう人は頭では理解しててもバイナリモードの適切な運用が出来ない
ひとりよがりの意見というのは、
>>857 の内容のことだろw
>>853 システムコールの概念も知らないなら、
OSの議論になんか首突っ込まなきゃいいのに。
Perlって一行を読み取るコードあるけど、 UTF16で書かれたファイルの場合に、 ちゃんと一行読み取れるの?
utf8フラグもWindowsのためにできたのか まったくしょうがないOSだな、Windowsっていうのは
>>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\"してみれば?
Windows上で無理してUTF-8を使わなくてもいいと思う
別にいいんじゃね? UTF-8はメモ帳でさえ対応しているんだから。
その点でメモ帳は優秀らしい
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
xyzzyなんかはなんで抜けてるの?まさかetc.あつかい?
テキストエディタスレで簡単に調査とかいうけど、 アラビア語とかタイ語とかそういうのはどうやって打ち込んだんだろna 記号を配置するだけでもクソの処理だし、 打ち込んだ記号が正しく配置されてるかなんて、アラビア語かじっただけじゃ分からんだろ 意味の無い記号の並び、実際にはありえない記号のならびとかも機械的に処理しちゃってるんじゃね? あとxyzzyが無いのは高度すぎて使いこなせなかった……とかか? emacsもないし。
emacsはちゃんと表示できるのかもしれんが デフォルトではそうなってなくて、 設定が必要だが、正解はどれだ!?みたいな感じだからなぁ。
>>865 openするときにデフォルトのLatin-1のままでなく、UTF-16を指定すればできるんじゃないのかな?
ただ読み込まれた文字は現在議論の的であるテキスト文字列になるけど。
open my $fh, "<:encoding(UTF-16)", "somedata.txt" or die $!;
>>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};
引き続き、アドバイスお願いします。
>>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};
>>878 それ、STDOUTとSTDERRが別のインスタンスオブジェクトにtieされませんか?
実行したらわかりますが、最後の print "--- output ---¥n", $out->{output}; で
"into STDOUT¥n" は表示されますが "into STDERR¥n" は表示されません。
最初の質問
>>859 に書いたように、shellの 2>&1 をしたうえで、printの出力先をオブジェクトにtieしたいので、878のコードだとちょっと違います。
Perlのバージョンは $^V だと思ったのですが perl -e 'print $^V,"¥n"' としたら、5.8では出てこなくて、5.10だと出てきました。 もしかして、5.8では $^V って使えないんでしょうか。 あと、ぐぐるときに「Perl "$^V"」ってやってもうまくヒットしません。 Perlの特殊変数をぐぐるコツを教えて下さい。
>>880 ぐぐらない。
ぐぐるなら、そのまま「特殊変数」だとか、目的である「バージョン」とかで良いんじゃないか。
print $_ for (1..100) ; map {print $_ } (1..100) ; 1から100まで出力する方法、他にありますか?
>>883 print join(' ',(1..100));
print 1..100
>>883 perl -E "do say ++$_ until chr eq 'd'"
>>881 ,882
ありがとうございます。
できればその、$^V がPerl 5.8で使用可能かどうかもお願いします。
webページのpreタグで囲まれた部分を普通のテキストとしてダウンロードしたいのです。どんなスクリプトでダウンロードすればいいのでしょうか 単純にダウンロードすると < が > になってたりして困っています
890 :
860 :2011/10/25(火) 07:23:49.72
#!/usr/bin/perl $ret = `ls | wc`; は、ちゃんと動くんですが $ret = `echo $text | mail $address` だと、|がシンタックスエラーになってしまう どうして?
> Perlコード外部から渡されるのは文字列ではない。 > 文字列でなかったらなにか?それはバイナリ。 > バイナリを文字として扱いたければ、文字に変換しないといけない。 これこそひとりよがりだと思うけどな。 入力するファイルに"ABC"って書いてあったら、バイナリであると同時 に文字列でもある。文字列フラグと言いかえても、ASCII文字列はフラ グが立たないから問題のすり替えでしかない。
>>889 HTMLの仕様についてまず勉強しなさい。
894 :
860 :2011/10/25(火) 10:27:07.39
>>893 緯度経度の数字が,でつながってます
34.00000,135.00000
みたいな
>>894 末尾に改行コード入ってないかい?
chomp $text; してからやってみたら?
バッククオート使う前にまず普通のダブルクオートで囲ってprintしてみろよって話だよな
まあ用心で echo "$text" にしておいた方がいいかな
>>879 私の環境(ActivePerl5.8.9 build 826 for MSWin32-x64-multi-thread)では以下のように出力
されますが、
>>879 さんの環境は何でしょうか?
--- output ---
into STDOUT
into STDERR
それとも上記出力が意図と違うということでしょうか?
899 :
860 :2011/10/25(火) 21:22:57.71
>>895 ありがとうございます。できました。
chomp $test;
$ret = `echo $text | /usr/bin/mail mail\@domein.jp -s Title`;
にすると送れました。
ただ、@をエスケープしないとダメなんですね。
アドレスを変数で渡したいんですが、変数に入れる前にエスケープで整形するしか
方法はないんでしょうか?
>>899 やってみれば早いと思うが、
my $address = '
[email protected] ';
$ret = `echo $text | /usr/bin/mail $address -s Title`;
みたいな感じでいけるよ。
901 :
899 :2011/10/25(火) 22:25:52.49
>>900 sh: Syntax error: newline unexpected
になってしまうんです。
また、改行コード?と思いchomp $address;
を入れてみたら
sh: cannot open
[email protected] : No such file
となります。
>>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; の有無でエラー内容が変わるってことはそうなんだろうけど…。
なんでわざわざ改行コードを入れるの? 何やってるの?
なんか興奮して変な書き込みをしてしまった。すまん。 たぶんすごく基本的なところをミスってるんだと思うぞ。
906 :
899 :2011/10/26(水) 09:05:20.60
>>902-905 すいません、まさにご想像の通りでした
おはずかしい
解決です、どうも、ありがとうございました。
状況によるだろうけど、スクリプトからのメール送信は mail よりも sendmail コマンドを使ったほうがいいんじゃないかな。 基本的には、 mail : 対話的な利用向けのコマンド sendmail : プログラム内部から呼び出すためのコマンド だよね。 でも最近の mail コマンドは高機能でその機能を利用したい、 というケースもあるかな。
外部コマンドを呼び出さずにモジュール使った方がオーバーヘッドが少なかったりしないかな。 まあオレは面倒だから大抵外部コマンドを使っちゃうけど。
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";
>>910 ロックファイルを一つにして
ロックの有無で書き込み実行を制御する。
>>911 $name!='jp' → $name !~ 'jp'
>>911 いやまて、ダブルでおかしいから解答間違えた。
文字列の比較はneとeqだ。
その行間なんとかしろ、見にくい。
916 :
デフォルトの名無しさん :2011/10/26(水) 15:28:25.83
>>914 ありがとw
文字だからne eqかwww
超わかんなっかたw とんくす
>>910 form.datのロック
toukousuu.datロック
form.datへフォームデータを書き込む
toukousuu.datへの書き込み(書き込み数保存ファイル)
form.datのロック解除
toukousuu.datのロック解除
>>917 時間差がある限りそれでも回答としては不完全だな。
>>918 いや、これで行けるだろ・・・
どんなパターンで行けないのさ
>>919 この記事の内容では、
open(LOCK, "$file");
flock(LOCK, 2);
$data = <LOCK>;
close(LOCK)
だと、少し隙間があるとかってなってるけど・・・
これについて、俺も独自で検証した事はあるよ
10万回ループして、ひとつのファイルから読み込んで、
+1して書きこむ。簡単なカウンターを作ってね。
それを、5個同時に走らせたけどカウントは壊れず最終カウント50万になったよ。
どうすれば、その「ロックの隙間」が再現できるのか教えてもらいたい。
>>921 実は自分はその点についてはあんまり重要視してないんだが・・・。
専用のロックファイルを1つ作ったほうが、
複数の書き換えファイルをいちいちロックするよりも処理が簡単になるというのが肝だと思ってる。
その(実用上はめったに起きないであろう)問題へも対処できる、ってのはおまけのようなもんだと思う。
直接ファイルに書き込むのはやめて、行ロックやロールバック機能のあるDBMSを使いましょう
>>922 だから、どういう事なのか言ってみろってば。
どういう時間差が出るんだよ、マジで。
>>925 >どういう時間差
そのまんまの時間差。
ってか時間差が出ないほうの説明が聞きたい。
>>926 いや、待てよ。
答えになって無いだろ
時間差が出るのはわかる
が、どういう時間差が原因で不具合が出るって言ってるんだよ
1000万回ループ回してみたけどカウンターは壊れなかった
>>919 のサイトの言ってる事は信用してはいけない
>>927 そのファイルはそのプログラムからしか使われないのか?
万が一でも可能性があるなら排除する。
プログラマの鉄則だろ。
>>927 自分が正しい前提でえらっそうですね。
910がダメで920がダメじゃない理由がしりたいw
>>931 だから、何がダメなのか俺にはわからないから言ってみてくれって言ってんだろ・・・
>>932 910がダメで920が大丈夫な理由は?
まずそれを聞かないともう答えられない。
なんだこりゃ・・・もう結構です。
あれ、openの時点で読み書きモードにしなくても大丈夫?
逃げずに説明せよせよせよ(残響)
とりあえず>919のリンク先がおかしいのは確実だと思う。 「flockの隙間」の項目を読んでいるのだが、openとflockの間に隙間があっても問題ないと思う。 flockから先に行かせない(実際にデータを読ませない)のがflockの役割だろう。 また、同じ項目に、 >全てのスクリプトからファイルの中身が読み取れてしまいます。 とあるが、flockで順番待ちしているのだから、終わったら読み込めるのは当然だ。
>919のはopen()がsnapshotをしてると思ってる、と読んだ
>>939 Perlのopenがstdio使ってたら
openとflockの間にstdioがbufferingする可能性はないのかな
>>921 open(LOCK, "$file");
flock(LOCK, 2);
$data = <LOCK>;
close(LOCK)
これだとopenしてからロックしてるじゃん
逆だろ
flock(LOCK, 2);
open(LOCK, "$file");
が正しいはず
こ れ は 新 機 軸
こ れ は 新 喜 劇
strace perl -e 'open(FILE, "/dev/null"); flock(FILE, 2);' してもbufferingしてるようには見えなかった。そりゃそうか
> flock(LOCK, 2); > open(LOCK, "$file"); さすがに open もしてないファイルハンドルをロックすることは できないだろ。
つーか or die してくだしあ
次はRubyか。楽しみだな。
次はRubyか それは本当に楽しみだな
穴二つっていうぞ、くわばらくわばら・・・。
つまり俺?
アッー?
人を呪わばなんと奇遇な
次はVisual Basicか、くわばらおばら・・・。
strftimeとstrptimeがどっちがどっちか覚えられないんだけど、 formatとparseの略なのかな? $time = Time::Piece->strptime('2007-01-01', "%Y-%m-%d") は与えた時間をパースして、timepieceのインスタンスにする。 $time->strftime(%Y%m%d) はインスタンスが持ってる時間をフォーマットに整形して返す。
strptime - convert a string representation of time to a time tm structure strftime - format date and time manコ
959 :
デフォルトの名無しさん :2011/10/28(金) 08:25:43.19
くりすぴーか
ファイルロックについては意見が分かれて議論になる場合が多いから 明確な答えはないということは分かった
ここって意外と分かっている人が少ないね
便所の落書きですがなにか
ンコしながら書き込んでるからな。 あまり詳しくは説明できんのだよ。
そうだな。カキコに気を散らしてるとせっかく出かかったやつが引っこんじゃうしな。
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); 「難しいてすと」だと文字化けせずに「てすと」文字化けします。 なぜですか?教えてください。
>>965 すれ違いです。テキストエディタスレに行ってください。
あ、文字化けするのは出力後のテキストファイルの話です
968 :
957 :2011/10/29(土) 12:47:23.26
ありがとです
>>965 >>967 コードからは文字化けを起こす要素が無い気がするけども。
Perl のコード以外の問題じゃないのかな?
あれほど$aを使うなと言っているのに…… てすとが文字化けした時ってのは$aにてすとを突っ込んだ時の話じゃねーの? 状況は最初から全部明確に書けアホ
>>966 が言っているのは、エディタが、「難しいてすと」だと文字コードを適切に判断できてるけど、
「てすと」だけだと短かすぎて判別を誤ってるってことでは?
>>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 なんて変数は使わないよね。
>>971 確かめもしないでいい加減なことを書いてるんじゃねえよ。
オマエと
>>965 のレベルはどっこいどっこいだな。
いいから出力をhexdumpしろよ早くしろよ
977 :
デフォルトの名無しさん :2011/10/29(土) 18:45:38.10
$s='<hoge>piyo<foo>bar'; $s=~/<([^>]+)>/g; ↑のグローバルマッチングでhogeとfooを後方参照で取り出すにはどーしたらいい?
ああそうか、$2 とか @- に入ってくれないんだっけ。 pos関数で地道にやるのは全然スマートじゃないしなあ。
素直に、@arr = $s=~/<([^>]+)>/g; すれば?
/(.)\1/ の \1 は後方参照 (backreference) だが、 /(.)/ の後に $1 を使うのは違う。
PerlやったあとC言語やるとダルいな 特に日本語文字列あたり
Cはコンピュータ、perlは自然言語向きだからな。 やることが大幅重なってる言語なんて必要ない 特化が全て
ブレスなんてのも宗教用語っちゃ宗教用語だしな
以下のコードが動きましたが、文字コード周りが混乱しているので教えてください。 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を呼び出して使用しているのでしょうか。
> encodeing ホントにこのスクリプト動くの?
すみません、コピペじゃなくて打ち直したのでtypoしてます
typoどころじゃなく動かねえよこれ。 打ち直してないでコピペしろ。
$csv->column_names($csv->getline($fh)) { print $_ for @$row; } 謎すぎる構文
>>989 たぶんperldoc text::csvから引っぱってきてるんだろうけど。
当人じゃないとどことどこをどう改変したんだかわかんねえや。
$rowはどこから持ってきてるんだよって。
ところで次スレって
>>950 が立てるんだっけ?
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; }
992 :
991 :2011/10/30(日) 05:09:21.62
すみません、最近VertualBoxからコピペできなくなってしまってずさんなことしました。
VirtualBoxも打てないんじゃ無理じゃないの?
>>992 > 最近VertualBoxからコピペできなくなってしまって
バージョンアップの後にExtension Packもアップデートした?
そしてJcodeを使い始める。
require 'jacode.pl'; while(<>){ chomp; my @row = split(/,/, $_); for my $row (@row){ jcode::convert(\$row,'utf8','sjis'); print $row; } }
ネタでもjcodeとかjacodeとか見たくもない 百歩譲ってもJcodeまでだ
じゃあこうで
>>991 >>993 ですが、最初の質問の意味を取り間違えてました。
その文字列は、テキスト文字列といい、 Data::Dumperではその文字のUnicodeのコードポイント
を返してますね。
\{ff84}:Unicode U+FF84
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。