argius note

プログラミング関連

Perl

私はPython使いになるかも知れない

ただの日記です。いままでスクリプト言語はPerlがメインでしたが、これからはPythonがメインになるかも知れない、というお話です。ことさらPythonを持ち上げる(いわゆるマンセー)とか、Perlを貶める(いわゆるdis)という意図は全くありません。

WebサービスからJSONを取得してフロントPerlCGIで整形

フロントのWebサーバはPerl,PHP,Rubyくらいしか使えない環境で、アプリ本体はそれ以外で実装したい。 プロキシサーバも使えないので、どうしたものかと思っていたら、Webサービス方式にすれば良かったことに気づいたので、ちょっと試してみました。 データ形…

daemondoの劣化バージョンをPerlで書いてみる

昨日のエントリとちょっと関連してます。 直接デーモンプロセスを生成しない起動コマンドを持つアプリケーションをlaunchdで制御しようとした場合、デーモンの身代わりになってくれるdaemondoというユーティリティを使ったりします。 daemondoはMacPortsに付…

リストから一意のリストを得る(uniqコマンドを作る+余談)

今日は久々にPerlが大活躍したので何か書きます。 やっぱりあらゆるUnix-like環境でデフォなのは強い。 そういえば、Perlには組み込みのuniqって関数は無いんですね。今までやったことが無くて気づかなかった。もちろんモジュールを使えば簡単にできますが、…

代替引用符

Perlの場合は、 my $s = "1"; # シングルクォーテーションの代替 q('abc$s'); # => 'abc$s' q!'abc$s'!; # => 'abc$s' # ダブルクォーテーションの代替 qq("abc$s"); # => "abc1" qq!"abc$s"!; # => "abc1"

ペアの2ファイル間でタイムスタンプをコピー

見出しがちょっと分かりづらいかも知れませんね。 例えば、ディレクトリAとBの下に同じファイル名だけどタイムスタンプの異なる一連のファイルがあって、AとBのファイルのタイムスタンプを同じにしたりする方法です。複数ファイルの改行コードをCRLF→LF変換 …

複数ファイルの改行コードをCRLF→LF変換

操作を誤ると危険なコマンドです。自己責任でお願いします。今更ながら、ファイル一括変換の方法を。 次のコマンドは、カレントディレクトリ以下のhtmlファイルの改行コードを一括でCRLF→LFに変換します。 $ find . -name "*.html" | xargs perl -i.bak -pe …

ある要素が配列に含まれているかを調べる -解決編(?)-

ある要素が配列に含まれているかを調べる一般的な方法は? - argius noteの解決案。一般的かどうかはちょっと分かりません。 use strict; use warnings; my @a = ("APPLE", "BEER", "CANDY"); my $include = sub { (grep { $_ eq $_[0] } @a) > 0 }; my $fin…

演算子オーバーロード

overload - Perl の演算子のオーバーロードを行うパッケージ(perldoc.jp)こんなのがあったんですね。perldoc一覧のインデックスで見たことはあったのかも知れません。必要なかったので、スルーしてました。今回、なんとなく遊んでみたのでここに置いておきま…

データ圧縮:平均情報量(エントロピー)を求める

可逆圧縮アルゴリズムのシャノン符号とハフマン符号関連で、平均情報量(エントロピー)を求めるスクリプトを書いてみました。Perlである必要性は全くありませんが、最近はJavaとPerl以外はご無沙汰でして、手っ取り早いPerlで書きました。 Algorithms with P…

"ls -l"の真似

訳あって、Perlで限定版ll(ls -l)を実装。パラメータは無し。アクセス権はrwxだけ、タイムスタンプは一律"yyyy/mm/dd hh:mi:ss"。 use strict; use warnings; sub to_type_s { $_ = shift or return; return "d" if -d; return "b" if -b; return "c" if -c;…

文字/パターンが幾つあるか数える

my $count = () = "bbbababbbaaaa" =~ /(ab)/g; # => 2 少し悩んで、こんな風に書いてみたら上手くいったので載せておきます。空の括弧のお陰で一時変数を使わないで済むのがポイント。 これって良く使われる方法でしょうか。もっと上手い方法がありましたら…

英単語の頻度を簡易集計する

なんとなく思いついたので、やってみました。入力に使ったページはhttp://en.wikipedia.org/wiki/Multiprocessing,http://en.wikipedia.org/wiki/Blogです。マルチバイト文字には対応してません。 shコマンドだけでやってみる 出現回数が多い順に、上位10件…

cvs2cl.pl CVS履歴からChangeLog生成

CVSのコメントからChangeLogを自動的に生成してくれる。単純な(伝統的な?)テキスト形式のを作るなら、 $ cvs checkout TheModule $ cd TheModule $ cvs2cl.plとするだけ。

Slurp(入力を一度に読み込むイディオム)

http://perldoc.jp/docs/modules/File-Slurp-9999.01/extras/slurp_article.pod Perlがメインだった頃の私は今以上に何も知らなかったので、こういう資料が今でもためになります。今からみっちり復習するのはちょっとつらいので、ちょっとずつ、何か発見があ…

手動ソート

いくつかの候補を順位付けしたいんだけど、普通にやると上手くいかない。そこで、「AとBならどっち?」と言う風に聞かれたら答えやすいかな、と考え付いたのがこれ。 正確には比較を手動で行うので「手動比較ソート」となるのでしょうか。 PerlとRubyとJav…

ある要素が配列に含まれているかを調べる一般的な方法は?

Javaなら Collection.contains(Object) 、Rubyなら ary.include?(val) を使うと思いますが、Perlの場合はどうやるのが一般的なのでしたっけ?スクリプトを書いていて、そういう関数があるのかどうか思い出せず、時間がないので defined関数 を使ってやってし…

使い始めたきっかけと今の使い道

Perlを始めるきっかけになったのは、CGIプログラム。今で言ったら、PHPのような感覚で使っていたわけです。当時はCGI対応Webサーバが無いと実行できないと思っていて、スクリプト言語という言葉を知ったのはずっと後のことになります。 DOSプロンプトで実行…

ライブラリを使わないマルチバイト文字操作

久しぶりにやったら混乱したのでメモ。 文字コード関連のライブラリを使わないで、マルチバイト文字を操作する場合の注意。例えば、SJISで書かれた以下のファイルがあるとき、 1と2と3 と4と5と「と」を全て削除する場合、 while (<>) { s/と//g; print; } $…

アルファベットの繰り上がり

こんなのがあるんですね→どう書く?org。 もっとも手っ取り早い方法だとこう? print join ", ", ("A".."CV");でも、これだと1から100というのが見えない。 これなら、数値の範囲が分かり易いかな。 print join ", ", map { $a = "A"; for (2..$_) { $a++ } …

使わないと忘れる

2年前まではまだ、習得率(?)がJavaと変わらない程度だったんですが、最近は圧倒的にJavaが多くなったのと、shellスクリプトを使うことが増えたため、使う機会が減っていました。 で、先日久しぶりにPerlで使い捨てスクリプトを書こうとしたら、「あれ、代入…

findやgrepで検索したファイルをGUIテキストエディタで開く

一般的なGUIテキストエディタには、GREP検索機能が付いていて、検索結果から対象ファイルにジャンプすることができる(タグジャンプ)。しかし、このGREP機能で指定できる検索条件では、指定できる条件に不満がある。 そこで、findまたはfind+grepなどで検索…

複数のアーカイブファイル内を一度に検索

ローカルファイルシステムに散らばったアーカイブファイル内のファイルから、指定した拡張子のファイルを探したい。アーカイブの種類は拡張子で特定できる前提として、"lzh""zip""tar""tar.gz""tar.bz2"を対象とする。 まず、次のようなPerlスクリプトを用意…

「とうとう」Ajax体験 (2)

一応、理屈は分かってると思うけど、説得力ないので書いてみるです。 まず、サーバ側。PerlのCGIで、単語リストの中からランダムで一語取り出して返す。 #!/xxx/perl use strict; my @list = qw( Water Milk Cider Coffee Wine Tea Vodka Beer ); my $x = in…

Parrotちょっと勉強

Parrotは将来的にはPerlに限らないようですが、Perlのカテゴリとして書いてみます。 Parrot 入門 - The Parrot Primer ぐぐるのラッキーさん*1で開きますが、いまやRubyでもYARVの開発をされていることで有名なささださんによるページ*2です。勝手な解釈かも…

Enumerable使いこなしたい

Rubyリファレンスによると、Enumerableは「繰り返しを行なうクラスのための Mix-in。」とある。Arrayクラスなんかが代表的だが、Enumerableのメソッドはたくさんあって覚えるのがたいへんそう。実際、まだいくつか良く分からないものがある。 よく使うのは、…

1行ずつ処理する-知らなかったこと

テキストデータを1行ずつ処理する場合。 # Perl while (<>) { print if /end/i; } これを使うとき、こうやって実行していた。 $ cat file.txt | perl grep.pl しかし、これで動くことを今日知った。 $ perl grep.pl file.txt それと言うのも、Rubyでは # rub…

環境変数PATHやCLASSPATHの値をチェックする

sardineさんの日記(id:sardine:20060331)で、「パスのリスト」が含まれる任意の環境変数の値をチェックするツールをD言語で書いてらっしゃいます。 私はこれをPerlとRubyで書いてみました。ちょうどRubyのファイル関連を調べていたので、良いお題かと思い…

Ruby@ぱるま

20060401-Legwork - Perlish Magazine(ドメイン名に注目) (経路:) どっちなんだw。

Pugs, Parrot - Perl6関連

Perl6について調べてみたら、今のところこの2つがホットトピックぽい。 Pugsは、Perl6の実装がいつまでも提供されないことに業を煮やした誰かが作った、HaskellによるPerl6処理系。Haskellの処理系Hugsに由来しているのかどうかは不明。 Parrotは、Perlの処…

正規表現で文字列置換えしよう

世間では海豚*1暴れ馬の話題に沸いているようですが、自分はまだ蟷螂と戯れています。 さて、Perlの正規表現による文字列置換をJavaでやるには、1.3まではJakartaとかのライブラリ(OROだっけか)使ったりだったが、1.4から標準ライブラリ(java.util.regex)…

固定長テキストを項目でソートする

先日ひさびさにPerlを使ってツールを作りました。もうソラで書く自身はあまりありませんが、CVSのhistoryコマンドで得た出力を編集したいというのを頼まれたので、ちょっと作ってみました。 #!/usr/bin/perl # sorter.pl use strict; # 固定長テキスト→配列 …

バカっぽいOneLiner

perl -i.bak -ne 'tr/[A-Z]/[a-z]/;print;' *.htmlOneLiner*1でアルファベット大文字を小文字に変換する処理だけど、Perlは2バイト文字も1バイト文字として変換するので、文字化けみたいになる。 最初は意図せずやっていたんだけど... Xで始まる単語 - xで始…