MacPortsを入れて解決しました。コマンドラインでperl越しに色見本とか作る時にスゴく重宝していたので助かりました。
どうすれば良いの?という全く未知の領域の質問を知り合いの知り合いのまたその知り合い(いい加減にしろって?)にされました。ということで久々のスクリプトネタです
無知なわたしはPerlはUTF-8がわかるから、それでやったらどう?と言ったのですが、それではダメなんだそうです。これから行くから一緒に見てほしいだなんて。明日からまた旅行だし、折角の週末をゆっくりしようと思っていたのに だいたい日曜の朝8時に電話をかけるなんて非常識だ!なんてお世話になっている人の知り合いに言えるはずもなくしかたなく引き受けました。で、一人で来るのかと思ったら4人も!でもね、かわいいロシア人の娘をつれて来たから喜んで引き受けましょうと先きほどまでの不機嫌はどこかへ消えたデブネコでした。まさかこれが狙いだった?そうだとしたらS匠に入れ知恵されたね。
で、見せてもらったんですが、これ何ということばですか?なにかうどの大木のような名前でした。うどはいいんですけど、きみ、なんで偉そうに新しいMacBook Proをもっているの?思いっきりペタペタと触って手垢つけてあげるからね
で、やっと本題。フムフム。確かにPerlのソートでは彼らの辞書らしきものと同じアルファベット順にはなりませんね。しかしわたしの知識もISO-8859-1とUTF-8に限られているんですが。だって北欧では他に必要ないもんね。実は日本語のことだってよく知らないのに。で、とっさに閃いたのがMS Wordの使用。Wordファイルにテキストをコピーしてソートしたらバッチリ!やったーと思ったのもつかの間。そんなのは前から知っていると言われてしまいました。お見それしました 大量に処理するし、後で色々なファイルに変換するからWordでは不便なんだそうです。
かわいい娘を前にして無知を曝け出しネット検索を始めるわけにもいかず、ない頭で必死に考えましたよん。10分ほどですが で、ない頭の割にはあっさり解決方法が浮かびました〜!キリル文字というから難しく思ってしまいましたが、よ〜くよく考えてみれば彼らが望む順番で文字に番号を割り当ててソートすればいいだけではないですか〜。ソートし終わったら番号を文字に戻せばいいんだし。文字は大小合わせて76文字なんですね(キリル文字って点付きやら点なしやら色々あるんですねえ。知らんかった。勉強になります〜。明日にはもう覚えてないでしょうけど)
で、結果はうまくいきました。手順をもう一回まとめますと、まずはキリル文字を全てs/а/01/g 〜 s/я/76/gみたいにソートしたい順番に番号を振り当てて置換します。はあとで数字が混ざらないようにするための適当な区切り文字ですが、Perlのメタ文字と勝ち合わなければなんでもいいです。で、この後ソートして、その後に数字をs/76/я/gみたいにして文字に戻すだけです。もちろんPerlでなくともどのスクリプト言語でもできますが、痴漢は速いにこしたことがありませんからね。あとPerlや他のスクリプト言語でやってもおもしろいんですが、AutomatorでWordを使えば処理は重たくなるけど手順的にはもっとスマートにできそうな気がしますな。そのうち実験してみますか。
と、いうことで慌ただしい朝になってしまいましたが、少しは良いことも。昼食をごちそうしてくれるそうです と、待ち合わせの時間までの暇を持て余すデブネコでした〜♪
かなりの間まともなのを書いたことがなかったですが、最近少しずつシェルの良さを見直しています。AppleScriptと一緒に使うと便利この上ないですねえ。
書いてしまいましたが、ほぼ1年ぶりにXML::LibXMLが1.70にバージョンアップしていました。で、早速いれたんですが、なんか無茶苦茶に速くなっていません?インテルマックだと速度差がわかりづらいのでクソ遅いPowerMac G5で試してみますか。
教えてほしいなんて、そんなこと自分で考えな!と普段だったら言うところですが、かわいい研修生にグリーンの瞳で見つめられながら言われては絶対に断れないですよね(しかしこの子は美人だ...)
ということで久々のスクリプトネタです。
喜んでしかたがないのでどのスクリプトでも通用しそうな方法をPerl様を使って教えました。これけっこう今までも訊かれることが多かったので、色々なやり方がある中で初心者の方にもわかりやすい方法だけを少しだけ書いておきます。まあ実際にはこのような形で使われることはめったにないでしょうが。
前置きとして検索する単語群と検索の対象になる文はどちらも配列に入っているものとすることにします。例では検索する単語群の配列を@tangogun、検索の対象になる文が行ごとに入った配列を@bunとし、全ての検索語にマッチした行だけをプリントすることにします。JavaScriptでも他のスクリプト言語でも似たようなことをすれば(番外編を除いて)動くはずです。
その1 検索する単語群の入った配列の要素数とマッチした回数をチェックし、二つの値が等しい場合にプリントする方法
コマンドラインでしたらcatで検索対象の文を読み込んで(別にcatを使う必要は全くないですがパイプライン処理だと想定して)Perlのオプションで-neを指定すれば下記の例のようにそのまま使えます。例では検索単語群は"Finland"、"restaurant"、"Kamome"ということにしておきます。
その2 検索する単語がマッチすれば的(まと)という変数に当たりマーク与え次の検索語へ進み、そうでなければハズレマークを与えてlastでループから抜け出し、最終的に的(まと)が当たりマークだったらプリントする方法
こちらもコマンドラインでやるにはその1と同様にcatで検索対象の文を読み込んでPerlのオプションで-neを指定すれば簡単にできます。
その3(番外編)検索単語群を「(?=.*Finland)(?=.*restaurant)(?=.*Kamome)」という感じに「(?=.*〜)」を使って連結して検索にかけるとあ〜ら不思議、上記2例と同じ結果が得られます。これは非常に有名ですがPerlでやると正直遅いです。ただSnow Leopardの入ったインテルマックだと速度差は気づきませんけどね。これを使うとPerl様でも全く歯が立たないくらい激速なのはSafariの(WebKitの)JavaScriptです。昔のFirefoxでは(1.Xの頃ね)動きませんでしたが今のバージョンではわかりません。例では検索単語群を連結したものを入れた変数$renketsuを使いました。
コマンドラインではクオート問題を回避するためにq//などを使ってやると下記のようにやると良いでしょう。
さっ、かわい子ちゃんと一緒にお茶してこよ
Pythonを除いて64ビットのものになっていました。で、Perlさまでもとうとう1ギガバイト(GiBではなくGBです)のテキストファイルを扱えるようになりましたよん。できたからって役に立つわけでもないですけどね。
リファレンスを読みながらXSHを少しだけ使ってみました。で、感想ですが、主にPerlと連携で使うならこれけっこう使えます。XSHは名前の通りシェルなので使いこなせるまでにけっこう覚えることがたくさんありますが、XMLの処理に特化しているぶんかなり強力です。特にノードの置換処理などにはもってこいのような感じです。簡単に下記のようなXPathで拾い物をして表示するだけのコマンドラインを書いてみましたが、さすがlibxmlを使うだけあって速い!
foreach my $i in { glob('/Users/misabazooka/Desktop/oshigoto/*.xml') } { my $file := open $i; print (//music[finnish[@shop="iTunes"]]); }
XMLだけではなく色々とやりたい人にはコマンドラインからPerlでモジュールを使ってやった方がXSHを覚えて使いこなすよりは敷居が低いかな。(ご参考までにこちらもどうぞ)
あったんですねえ。何気なくCPANを漁っていたら見つけました。コマンドラインで使うんだったらこちらの方がPerlのlibxmlモジュール使うよりかは便利かも。でも古いっす。これに限らずCPAN自体が最近活気がないような。XPath 2.0のモジュールを誰か出してくれないですかね。libxmlの方では対応しないみたいだし悲しい...
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
最近のコメント