Perlについて

2008/08/04(月) 20:58:41
質問スレはあるけど、Perl自身について語るスレがないので、立てました。
2011/10/10(月) 01:22:29.43
> cpanmやperlbrewの作者たちは僕の中でプロと思える存在だったんだけど
え?

cpanmやperlbrewが無益なものだとは言わないけど、
自分で好きなサーバーを選べないrootも持ってないそういう
ニッチな需要に対応するもので、
プロの間では使うことはまずない道具だろ。

技術的には、ネットからダウンロードして
パッケージに付いてるコマンド実行するのと
パスとディレクトリ変更するだけのものだし。

2011/10/10(月) 01:40:11.10
プロハープロハー
2011/10/10(月) 02:29:19.58
>>551
別にcpanmやperlbrewやその作者をdisっている訳ではなくて、
必要があれば使うしなければ使わないってだけの話でしょ。
すごいプロダクトならとにかく使わなきゃいけないって考えは変だろ。
>>552
> プロの間では使うことはまずない道具だろ。
んなこたあない。お前の「プロ」定義、歪んでるぞ。ものすごくシロウト臭い。
2011/10/10(月) 06:01:08.40
そもそも
> 自分で好きなサーバーを選べないrootも持ってないそういう
> ニッチな需要に対応するもので、
ここの認識から違う。
どっかの記事みてそう思っちゃったんだろうけど
2011/10/10(月) 06:46:36.59
>>555
なにが違うん?

普通にインストールすればいいだけじゃん。
2011/10/10(月) 07:58:34.12
>> 自分で好きなサーバーを選べないrootも持ってないそういう
>> ニッチな需要に対応するもので、
>ここの認識から違う。
1. cpanmは、コマンドcpanの代替であって、上記のニッチもへったくれも
 無いだろ。local::lib使えばroot云々無関係だし。perlbrewと切り分けろよ
2. 自分で鯖を選べてrootも持ってるが、perlの他バージョンの挙動を調べたい。
 冷やかしのガキを除けば、そっちの用途の方が多いだろ、perlbrewは。
3. perlbrew及び、それでインストールされるperlは、
 必ずしも$HOMEにインストールしなければならない物ではない。
 /usr/local以下に突っ込んで運用出来る

さて、どの意図でレスされたんだろう?それとも上述以外?


545氏に突っ込むのは徒労だと思うが、そもそも
>>544
> てかこのスレの住人だってcpanmとかperlbrew使ってるの5人もいないだろ
Encodeの使用者も少ないって言いたいなら、例が悪すぎる
core moduleと比較すんのにCPAN moduleを例に出すなよw
需要も重要度も全く次元が違う
おまけにJcode.pmの使用者は間接的にEncodeの使用者だ
2011/10/10(月) 13:42:54.40
>>557
cpanm(cpan)はアンインストールできないので
パッケージを作ったほうが優れている。

また他のperlのバージョンの挙動を調べたいのなら仮想マシン使う。
そんな環境がごちゃごちゃするようなやり方はしない。
2011/10/10(月) 13:51:15.34
プロ様お疲れ様っす!
2011/10/10(月) 14:31:27.78
>>558
> cpanm(cpan)はアンインストールできないので
ん? できるでしょ? ちょっと手間はかかるけど。
インストール時にパッケージ作る手間とどっちを取るか、って感じ?
2011/10/10(月) 14:46:10.85
パッケージを作るのは1行〜数行で終わる。

cpanのアンインストールは、モジュールによって
やり方が違い、make uninstallを備えていないのも多い。
2011/10/10(月) 15:35:57.38
そうか。
まあ基本的にアンインストールしないから関係ないや。
Perlのモジュールなんてインストールされてて困ったなんてことないしなあ。
2011/10/10(月) 16:34:22.42
>>562
そこがプロとアマの違いね。
今どのモジュールがどうやってはいったか把握してないでしょ?

アマなら動いていればいいじゃんで終わるんだろうけど、プロだとちゃんと環境を把握している。
(覚えているのではなく簡単に調べられるということ)
環境を把握しているから、なにかトラブルが起きた時その原因の切り分けが簡単にできる。

cpanモジュールをパッケージにしていれば、パッケージのバージョンアップで
なにか動作がおかしくなった時、今のバージョンを完全に綺麗な状態に消して古いバージョンを入れられる。

もしそうなっていなければ、今モジュール入っているんだっけ? 全部ちゃんと消したっけ?
あれ? なんか古いモジュールと新しいモジュールがごっちゃになってる。
インストールが途中でエラー終了したんだけど、今どういう状態になってるんだ?みたいな混乱が起きることになる。
2011/10/10(月) 16:43:47.58
データ解析系の人間からすれば、
debianでアプリ開発して移植先がSolarisだったらどうすんの?とか、
仕様書に「野良パッケージが便利だからdh-make-perl入れます」と書くのか?とか。
もうね、、、

その上で、自分はプロ!だからなあ。
2011/10/10(月) 16:45:08.96
ああ、「実際の運用時にはcpan使うだろJK」か。
2011/10/10(月) 17:08:01.67
納品先の鯖の保守契約自体は、他の会社(例えば、HPだの)にあった場合に、
そちらに依頼してモジュールのインストールしてもらわなきゃならない、
もしくは仕様書を渡してこちらでインストールなりをする。
鯖のrootにはそれだけの重みと柵がある、例えweb鯖でも。
それのに、気軽にプロなら、とか言ってくれるなよ。
どれだけ軽いrootだよ、お前様の鯖は。

perlbrewもcpanmもどうでも良くて、あんまりのレスについ書いちまった。
2011/10/10(月) 17:11:08.43
>>563
いやいや、むしろ"プロ"ならcpanで入れた分だってちょっと調べりゃ綺麗にアンインストールできるでしょ。
make uninstall なんか使えなくってもさ。
パッケージ作るかどうかなんてのは好みだから別に好きにすればいいと思うけど、
基本的にはアンインストールが必要になることなんて滅多にない場合は、
必要が生じた時だけちょっと手をかけてアンインストールすることにして、
インストール自体はcpanで済ませても問題ないじゃない。時間の節約にもなる訳だし。

まあ別に"プロ"じゃないけどね。あ、昔仕事でスクリプト書いたことはあったんでその時だけは"プロ"だったか。
2011/10/10(月) 17:43:24.97
> ちょっと調べりゃ

はい、その調べる手間が無駄です。
2011/10/10(月) 17:56:21.01
>>564
> 仕様書に「野良パッケージが便利だからdh-make-perl入れます」と書くのか?とか。
「野良パッケージが便利だからcpanで入れます」と書くのか?
お前の意見はどっちなんだ? 野良パッケージのインストールをするなってことなのか?
それはそれで有りだと思うよ。だが今の話とは関係ない。

今は野良パッケージを入れることが前提の話。
野良パッケージを入れる場合、cpanで入れてOSの安定性ぶち壊すのか、
それともパッケージにして管理された状態でモジュールを使うのか。
どっちが優れてるかなんて言うまでもない。
SolarisならSolarisのやり方でパッケージ管理するだけの話。


>>556
お前のほうが軽くね?
だって、モジュールのインストールは他の会社に頼む。
うちはモジュールのインストールはしない。そう言ってるわけでしょ?

つまり、お前の場合は、モジュールのインストールしない側の話であって
今話してるのは、モジュールインストールする側の話だよ。

わかりやすく言えば、root持ってないお前が頼むのがroot持ってる俺の会社ってわけだ。
モジュールのインストールという責任あることをcpan使って気軽にやるかよw

ちゃんとパッケージ作ってちゃんと管理する。これはディストリがやってるのと同じ方法だ。
なぜディストリはパッケージを使っているかその理由ぐらい分かるだろう。
2011/10/10(月) 18:05:05.09
厚顔無知
2011/10/10(月) 18:50:17.18
>>569
> 今は野良パッケージを入れることが前提の話。
えっ?いつからそんな前提の話に変わってたの?

> 野良パッケージを入れる場合、cpanで入れてOSの安定性ぶち壊すのか、
えっ?cpanで入れるとOSの安定性がぶち壊れるの?
コワ〜イ(><)
2011/10/10(月) 18:55:09.29
この手の「なにがなんでも自分が最後に勝ちたい」“プロ”とは絶対一緒に仕事したくないってことだけは確かだなw
2011/10/10(月) 19:04:11.84
>>571
> えっ?いつからそんな前提の話に変わってたの?

元は、cpanm使う → そんなの使わねーよ、パッケージ作れよ。が発端。

ちゃんとスレ読んでから出直し。
2011/10/10(月) 19:06:51.87
>>571
> えっ?cpanで入れるとOSの安定性がぶち壊れるの?
そうだよ。

cpanで入れるとモジュールの整合性がおかしくなる。
モジュールをパッケージで入れた(ディストリがパッケージで提供してる奴)
同じモジュールをcpanで入れた。さてどうなるか。
削除するとき、本当にちゃんと削除できたか、何かが残っていて
予期せぬことが起きる可能性だってある。
2011/10/10(月) 19:23:10.53
モジュールをパッケージで入れないから問題ない。
2011/10/10(月) 19:25:59.06
そういうときこそlocal::libだな
2011/10/10(月) 19:34:20.56
入れないじゃなくて、
入れられないの間違いでしょw
自分専用のマシン用意してもらえないとかで。
2011/10/10(月) 20:33:05.15
パッケージ管理の方こそ信用ならん。
インストールは全部makeで、Perlのモジュールはcpan。
2011/10/10(月) 20:41:09.84
>>570
なんで信用ならんの?
2011/10/10(月) 21:16:17.19
debianの場合だと
往々にして妙にバージョンが古くて
それがトラブルの元になったりするから
とか?
2011/10/10(月) 21:34:07.52
それはパッケージの問題じゃねーよw
2011/10/16(日) 21:52:24.92
プロでもアマでもインストールは手動で行ってこそ、把握や管理が楽になる
2011/10/16(日) 22:18:05.00
Encodeの使用者って少ないって本当?
ネットにも本にも紹介されてるんだけど、実際に現場で使われてる
のは確かに見たことないんだよね。
2011/10/16(日) 23:23:37.06
「プロ」の次は「現場」ktkr

じゃあ現場でEncodeの代わりに何使ってるんだよw
2011/10/17(月) 00:25:08.22
変換しないから何も使ってないktkr
2011/10/17(月) 03:28:14.22
文字コードが混在してるわけじゃないので使用してませんが?
2011/10/17(月) 04:57:36.37
それは
Encodeの使用者が少ない
んじゃなくて
Encodeが必要になるような局面が少ない
っていうことか。
それならわかる。
2011/10/18(火) 05:02:53.39
有用か無用の判断はともかく、ファイルハンドルからファイル名って取得出来ないのかしら?
Devel::Peek::Dump($filehandle) みたいに渡すとファイル名が表示されるから、ファイルハンドルから
ファイル名が取れるはずなんだけど Devel::Peek を読んでもまったく意味が分からないw

ファイルハンドルからファイル名を取得する方法またはサンプルとか知ってるからいらっしゃいますか?
589デフォルトの名無しさん
垢版 |
2011/10/18(火) 06:33:09.89
自分の環境(Win7 64bit、ActivePerl5.8)ではファイル名が出ませんが、出力例を貼っていただけます?
SV = RV(0x30ea08) at 0x3621bb8
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
RV = 0x26b548
SV = PVGV(0x36a0e38) at 0x26b548
REFCNT = 1
FLAGS = (GMG,SMG)
IV = 0
NV = 0
PV = 0
MAGIC = 0x2c6b68
MG_VIRTUAL = &PL_vtbl_glob
MG_TYPE = PERL_MAGIC_glob(*)
MG_OBJ = 0x26b548
NAME = "$filehandle"
NAMELEN = 11
GvSTASH = 0x26b428 "main"
GP = 0x36e33b8
SV = 0x26b638
REFCNT = 1
IO = 0x26b688
FORM = 0x0
AV = 0x0
HV = 0x0
CV = 0x0
CVGEN = 0x0
GPFLAGS = 0x0
LINE = 3
FILE = "a.pl"
FLAGS = 0x0
EGV = 0x26b548 "$filehandle"
2011/10/18(火) 06:42:23.51
>Devel::Peek::Dump($filehandle) みたいに渡すとファイル名が表示される
されないだろ


% perl -MDevel::Peek -le 'open $fh, q{<}, q{Foo.txt} ; Devel::Peek::Dump $fh'
SV = IV(0x7fb632829140) at 0x7fb632829148
REFCNT = 1
FLAGS = (ROK)
RV = 0x7fb632803ed0
SV = PVGV(0x7fb63283f830) at 0x7fb632803ed0
REFCNT = 1
FLAGS = ()
NAME = "$fh"
NAMELEN = 3
GvSTASH = 0x7fb632803d38 "main"
GP = 0x7fb632406e80
SV = 0x0
REFCNT = 1
IO = 0x7fb632804050
FORM = 0x0
AV = 0x0
HV = 0x0
CV = 0x0
CVGEN = 0x0
LINE = 1
FILE = "-e"
FLAGS = 0x0
EGV = 0x7fb632803ed0 "$fh"
2011/10/18(火) 06:42:50.86
かぶった、リロードすべきでしたorz...
2011/10/18(火) 07:20:24.27
予防線を張ってるのを百も承知で書くが、ファイル名なんざ
<>の時は、$ARGVで、open FHの時は自身が変数なりで
保持してるのに、何でファイルハンドルから取り出したがる人がいるのか不思議だ
<>が複数ファイルの場合、$ARGVは最初のファイル名と思い込んでた人もいたけど、昔。
2011/10/18(火) 12:51:21.64
すんません FILE の行をファイルハンドルのファイル名と勘違いしてましたw
実行されたスクリプト名だったんですねorz


ファイルハンドルからファイル名を知りたいと思ったのは、ファイルハンドルを受け取る関数を作ってたんだけど、
ハンドルからファイル名を知れたらやりたい事が出来るようになるので楽かなと。

そうゆういった意味で聞きました。
2011/10/18(火) 14:57:40.26
>>593
その関数でファイルハンドルもファイル名も欲しいんだったら
両方渡してやるようにすればいいのでは
2011/10/18(火) 17:42:24.47
スクリプトが約100もあったので、どうにか呼んだ関数側のみで解決できないかなと^-^;
素直にファイル名も渡すように修正しました。

ありがとうございましたm(_ _)m
2011/10/19(水) 00:53:22.39
余計なモジュール入れたくないからEncode使いますが何か
2011/10/19(水) 06:41:15.22
ちなみにDump結果を変数にトラップする方法。
use Devel::Peek ;

close STDERR ;
open STDERR, q{>}, \my $hoge or die ;
open my $fh, q{<}, q{hoge.txt} ;
Dump $fh ;
close $fh ;
print $hoge;
2011/10/19(水) 20:16:02.34
my $dump = Dump($fh);
2011/10/19(水) 22:38:59.96
試してから書けばいいのに
2011/10/20(木) 23:43:05.41
余計なフラグいじりたくないからJcode使いますが何か
2011/10/21(金) 09:35:11.54
保守されてないモジュールを有り難がってもなあ。
2011/10/21(金) 23:03:40.46
COPYRIGHT に
you can redistribute it and/or modify it under the same
terms as Perl itself.

って書いてあるわけで、使われている間はすなわち保守されて
いると考える一途なオレでも、本当に保守されている jacode.pl
には目移りしている
2011/10/21(金) 23:46:13.18
しっつもーん

PAR で exe 化したプログラムを有償にする場合って、ソースコードの公開義務ってあるんですか?
2011/10/22(土) 00:53:11.74
買わないオレに公開する必要はない
2011/10/23(日) 13:29:22.89
PARはソースコード公開(添付)してるようなものだから必要ないだえお
2011/11/03(木) 15:53:26.69
仕事で使うなら最悪の場合、自分でソース読んで改造・修正する
必要がでてくるので、能力的にも時間的にも自分で何とかなる
範囲のモジュールやライブラリを選ぶことになる。

当時NKFがあったにも関わらず、あえてjcode.plが作られた目的
はそこにあったと思う。NKFの座はいまやEncodeが奪ったが、
jacode.plの利点は当時と同じく今も価値がある。




...なんてな
2011/11/05(土) 11:02:27.13
目指す方向の違いかも

Encode.pm -- 大は小を兼ねる(おとこのこ)
jacode.pl -- 小は大を兼ねる(おんなのこ)
608デフォルトの名無しさん
垢版 |
2012/01/09(月) 12:12:05.71
Padre使っている人ってどれぐらいいる?
perl editor使っている人はどれぐらいいる?
2012/01/09(月) 12:34:09.28
${どっちも知らない}++;
2012/01/09(月) 17:20:23.97
Perl言語でモンテカルロ・シミュレーションをやって、
ワクチンの効果を分析するっていうのがあるそうなんですけど、
とてもじゃないけど、学習が間に合わない。

Perlの基礎から学習しないといけないし・・・。

はあー、タメイキ・・・
2012/01/09(月) 18:34:18.11
>>610
言語は何と何なら使えるの? ある程度の心得があれば大丈夫でしょう。
まるっきりのプログラミング初心者だと確かに大変かもしれないけど…
モンテカルロ法自体はそんなに複雑な方法でもないと思うし。
まさか最初から全部自分で書けって訳でもないだろうし。そのまさか?
2012/01/09(月) 19:25:59.38
>>610
漢字で書くべき単語を無駄にカタカナで書くおっさんには無理
2012/01/09(月) 20:25:52.92
激しく同意で御座います
2012/01/09(月) 22:59:46.40
>>611
プログラミング初心者です。
書けるのはHTMLくらいです。
論文に、前提と結果だけがあるんですけど、
プログラムがどんなか、わかりません。
2012/01/09(月) 23:05:44.42
active perlをインストールして、Hello world!だけはできました。
2012/01/09(月) 23:52:44.96
初心者なのかーそりゃ大変だ。
期間がどれくらいあるのかにもよるだろうけどねえ。
まあ周囲にプログラミングの心得のある人がいないか探して
ちょっとアドバイスとかいろいろ頼ってみたら。
2012/01/10(火) 00:04:45.05
>>612
文学がわかっちゃいないね、キミ
2012/01/10(火) 01:28:19.05
>>617
うるせえハゲ
2012/01/15(日) 11:01:32.44
>>610
ちょろっと検索しただけでいろいろ出てくるぞ。
でもPerlを覚えるのが目的ではないのだとしたら、おれならAWKで
書くな。その方が覚えることが少ないし、記述するのに機能が足り
ないってこともないと思う。もしどうしてもPerlでっていうならば
書き終わってから a2p でPerlスクリプトにすればいい。
2012/01/15(日) 13:05:04.45
AWKでネットワーク通信できるの?
2012/01/15(日) 17:28:55.42
何だ?ネットワークのネの字もなかったのにいきなり高度な...
ネットワークとモンテカルロ法は別物だから切り離したほうが
よくね?まさかGUIも必要だとか言いださないよな?一個ずつ
駒を進めようぜ。
622問題です
垢版 |
2012/01/18(水) 03:41:34.72
CP932の文字コードのみを使い、下の処理を実現してください。
モジュールは全て使えないものとします。

問1) まんじゅうこわい 難易度:★☆☆
(1-A)のように$matcherに文字列が設定されていています。
(1-B)の$textを走査して、(1-C)のように$matcherの内容が
最初に含まれる行の行数を表示してください。
行数は1から始まるものとします。

(1-A)
my $matcher = '饅頭怖い';

(1-B)
my $text = <<'EOL';
饅頭怖くない。
これは良い饅頭。
従って饅頭怖い。
EOL

(1-C)
3
623問題です
垢版 |
2012/01/18(水) 03:42:03.43
問2) パスの分割 難易度:★★☆
(2-A)のように$pathにパスが設定されていています。
ドライブ名、ディレクトリの各階層名、ファイル名を分割して
(2-B)のように表示してください。

(2-A)
my $path = 'C:\メモ\饅頭怖いよ\full.txt';

(2-B)
C:
メモ
饅頭怖いよ
full.txt
624問題です
垢版 |
2012/01/18(水) 03:42:27.39
問3) 裏から覗く? 難易度:★★☆
正規表現を使い、(3-A)の$textの中の「表」を「裏」に置換して、
(3-B)と同じ内容を表示してください。

(3-A)
my $text = '\\表\\\助\\封\\呂\\表\\\';

(3-B)
\裏\助\封\呂\裏\
2012/01/18(水) 20:30:24.83



宿題は自分でやりましょう


2012/01/20(金) 00:56:22.05
# 問1) まんじゅうこわい 難易度:★☆☆

my $matcher = '饅頭怖い';

my $text = <<'EOL';
饅頭怖くない。
これは良い饅頭。
従って饅頭怖い。
EOL

@_ = split(/\n/,$text);
my $i = 1;
for(@_){
if(/($matcher)/){
print $i, "\n";
}
$i++;
}

__END__
※ このスクリプトは jperl を使って実行します
2012/01/20(金) 00:58:15.41
# 問2) パスの分割 難易度:★★☆

my $path = 'C:\メモ\饅頭怖いよ\full.txt';

$path =~ s/\\/\n/g;

print $path, "\n";

__END__
※ このスクリプトは jperl を使って実行します
2012/01/20(金) 00:58:52.58
jperlなんて今更どうやって用意するのよw
2012/01/20(金) 01:01:19.90
# 問3) 裏から覗く? 難易度:★★☆

my $text = '\\表\\\助\\封\\呂\\表\\\';

while($text =~ /([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\xFF])/g){
if($1 eq '表\'){
print '裏';
}
else{
print $1;
}
}

__END__
※ このスクリプトは perl を使って実行します

perl と jperl の使い分けがポイントです。
授業で教えましたよね?

それと宿題を2チャンネルで行うのは今後、禁止いたします。
2012/01/20(金) 01:03:28.68
>>628
ちゃんと授業を聞いていましたか?
ベクターにあると説明したはずです。
631問題です
垢版 |
2012/01/20(金) 03:41:59.47
>>629
正規表現で置換してないので、間違いです。
それと、jperlとお幸せに。
2012/01/20(金) 21:22:29.16
べくたーwwwww
633へたくそ
垢版 |
2012/01/20(金) 21:37:23.75
問1)
my $matcher = '饅頭怖い';

my $text = <<'EOL';
饅頭怖くない。
これは良い饅頭。
従って饅頭怖い。
EOL

my $i = 1;
foreach (split(/\n/,$text)){
if (/\Q$matcher\E)/){
print("$i\n");
last;
}
$i++;
}

問2)
my $path = 'C:\メモ\饅頭怖いよ\full.txt';
my $char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

foreach ($path =~ /$char/go){
print( ($_ eq '\\') ? "\n" : $_);
}

問2)
my $path = 'C:\メモ\饅頭怖いよ\full.txt';
$path =~ s/([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])/\1?/g;
$path =~ s/\\(?!\?)/\n/g;
$path =~ s/\?//g;
print($path"\n");
634へたくそ
垢版 |
2012/01/20(金) 21:38:57.63
問3)
my $text = '\\表\\\助\\封\\呂\\表\\\';

$text =~ s/([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])/?\1?/g;
$text =~ s/\Q?表?\E/裏/g;
$text =~ s/\?//g;
print("$text\n");
635先生より
垢版 |
2012/01/20(金) 21:57:35.26
何人かの生徒から知らせを受けて、まさかと思いここをアクセスしたら
問題がそのまま掲載されていて、驚いています。

ここに掲載された回答を書いたひとは配点しませんので、そのつもりで
いてください。

問題を載せた君は月曜日に職員室に来てください。誰かは大体分かって
います。
636先生より
垢版 |
2012/01/20(金) 22:10:10.58
>>631
【正規表現を使い、(3-A)の$textの中の「表」を「裏」に置換して、】

「正規表現で置換する」とは言っていません。条件は、
1. 正規表現を使うこと
2. 置換すること
です。

あわてずに問題を読みましょう。
あ、それと君も職員室に来てください。
2012/01/20(金) 22:11:14.75
1.性器表現を使うこと
2.痴姦すること

ですね!
2012/01/20(金) 22:15:09.53
下ネタは5.8のほうでやってください。そっちに好きなひとがいるんで。
639先生より
垢版 |
2012/01/20(金) 23:39:20.06
誰も名のらなかった場合は、全員を減点します。
校長先生には許可をもらいました。

おや?そうなると進級できないひとがでてきそうですね。
もしかして、書き込んだのは...
640問題です
垢版 |
2012/01/21(土) 12:51:49.27
>>633-634
グッジョブでした。
641答え
垢版 |
2012/01/21(土) 12:53:34.05
問1)
'怖い'(\x95|\x82\xA2)にはバーティカルバーが含まれるため、
正規表現でマッチさせると'饅頭怖い'は'い'(\x82\xA2)を含む文字列にマッチする。
解決するには、メタキャラクタをクォートしてリテラルキャラクタにするか、
正規表現は忘れてindex()を使う。

my $matcher = '饅頭怖い';
my $text = <<'EOL';
饅頭怖くない。
これは良い饅頭。
従って饅頭怖い。
EOL

my $cnt = 1;
foreach(split /^/, $text) {
    if (/\Q$matcher\E/) {
        print $cnt, "\n";
        last;
    }
    $cnt++;
}
642答え
垢版 |
2012/01/21(土) 12:54:14.19
問2)
'饅頭怖いよ'の'饅'(\xE9\\)の2バイト目にバックスラッシュが含まれるので、
そのままsplit(/\\/, $path)すると'\xE9'と'頭怖いよ'に分割されてしまう。
split(/(?<![\x81-\x9f\xe0-\xfc])\\/, $path)では、
'モ\\'(\x83\x82\\)と'よ\\'(\x82\xE6\\)が分割できなくなる。
解決するには、頭からデータの並びを調べる。

my $path = 'C:\メモ\饅頭怖いよ\full.txt';

my $cp932 = qr/(?:[\x00-\x80\xa0-\xdf\xfd-\xff]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*?/;
print($1, "\n") while($path =~ /\G($cp932)\\/gc);
print($1, "\n") if ($path =~ /(.+)$/g);
643答え
垢版 |
2012/01/21(土) 12:54:50.53
問3)
漢字1バイトズレ問題。
'表'(\x95\x5C)を'裏'(\x97\xA0)にs/表\/裏/gで置き換えると、
'助\\'(\x8F\x95\x5C)が、"女\xA0"(\x8F\x97\xA0)に置き換えられ、
'封\\'(\x95\x95\x5C)が、"風\xA0"(\x95\x97\xA0)に置き換えられる。
解決するには、頭からデータの並びを調べる。

my $text = '\\表\\\助\\封\\呂\\表\\\';

my $cp932 = qr/(?:[\x00-\x80\xa0-\xdf\xfd-\xff]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*?/;
$text =~ s/\G($cp932)表\/$1裏/g;
print $text;

EUC-JP版のズレ対策はPerlメモさんにあります。
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
644答え
垢版 |
2012/01/21(土) 13:25:14.16
コードはTMTOWTDIってことで。

こんな面倒なことをやっても、このコードはCP932専用。
EUC-JPかUTF-8に変更されると書き直しに迫られる。
Perlの三大美徳の怠惰を忘れずに。
2012/01/21(土) 14:32:17.48
で本当の問題は、これをEncodeモジュールを使って
CP932、EUC-JP、UTF-8全て対応にするという物。
2012/01/21(土) 21:47:42.75
JperlじゃEncodeモジュール使えないじゃん。確かにそれは問題だな。
2012/01/21(土) 21:54:33.42
なんだ、やっぱりダメなんだなEmcodeは
2012/01/21(土) 22:46:51.21
# 問3) 裏から覗く? 難易度:★★☆

# my $text = '\\表\\\助\\封\\呂\\表\\\'; ← 表の後ろに \ が3つ
my $text = '\\表\\助\\封\\呂\\表\\';

$text =~ s/表/裏/g;

print $text;

__END__
※ このスクリプトは jperl を使って実行します

問題では変数 $text の表の後ろに3つの \ があるためにおかしな
ことになっていますが、現実の問題としては2つの \ ということに
なるでしょう。

こうすることで正規表現による置換ができます。
2012/01/22(日) 11:29:56.92
英語版のperlで日本語を処理しようとするのはナンセンスです。
すでにjperlがあるわけですから賢く使い分けましょう。また国際化
対応していれば日本語も扱えるとのたまう輩もおりますが、軽く
受け流して、可能なら5.8スレの方に誘導してあげましょう。
面倒な場合はスルーでも構いません。
2012/01/22(日) 11:47:22.87
Encode使う場合はこうかな

use Encode;
my $cp932 = find_encoding( 'cp932' );
my $um = $cp932->decode( $matcher );
my @text = split( "\n", $cp932->decode( $text ) );
for my $i ( 0.. scalar( @text )-1 ) {
 next unless ( shift( @text ) =~/$um/ );
 print $i + 1 . "\n";
 last;
}

問題がつまらんね
2012/01/22(日) 11:55:28.79
まあ、義務教育の中等学校だからそんなもんだね
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況