#acl SomeUser:read,write All: = Lightweight Language Lovers = == 火事場のCPAN 〜 偉大なるLLの"オカン"Perl 〜 == . 最近、1つのPDFファイルを複数のファイルに分割する必要に迫られました。 . Windows用のフリーソフトがいくつかあるようですが、自動化を考えるとLLで処理したいものです。 . ただ、今回は急で時間がほとんどありません。こんな時、火事場の○○力になってくれるのがPerlのCPANです。[[BR]] PDF::API2というモジュールを使うと、本当に簡単に実現できてしまいました。 . CPANについてはあちこちで説明されていると思いますので、ここではポイントだけ書いておきます。[[BR]] まず、CPANを使うための準備ですが、 {{{ # perl -MCPAN -e shell }}} として、基本的にはデフォルトですすめていくのですが、proxy の設定でちょっとつまずいてしまいました。あわてていたので、そのページに出ていたとおり、 {{{ Your ftp_proxy? [http://proxy:8000/] }}} と[]まで入れて答えてしまいました。今、冷静に考えるとこれはデフォルト値が表示されている例だったのですね・・・ 何のことはない、普通にURLだけ入れれば良かったのです。アドレスだけ入れたり、IPアドレスで入れてみたりしても つながらなかった訳です。 . Python でこれを実現するにはどうすれば良いでしょうか? 具体的な例として、「年齢」という引数を受け取って、「年齢別件数」という名前の辞書を生成して返す場合を考えてみます。マニュアルを調べたり、インターネットを検索しても難解な解説ばかりで、インスタントな実現方法を見つけることが出来ませんでした。そこで代用となるやり方を考えて見ました。 . まず、変数の値を変数名として評価し、値を展開するには、evalを使うのが簡単だと思います。 {{{#!python var1 = 'var2' var2 = 'Value of var2' eval(var1) 'Value of var2' }}} . ただ、これだと代入文の左辺では使えません。多少乱暴ですが、 {{{#!python arg = 'nenrei' exec('dict_' + arg + ' = {}') print dict_nenrei {} }}} とすれば、目的とする名前の辞書が作られたことが分かります。 . でも良く考えてみると本当に必要なのは、「ある名前に対応するオブジェクトを作成」することです。これは辞書そのものです。 {{{#!python counter = {} arg = 'nenrei' counter[arg] = {} print counter['nenrei'] {} }}} . 確かに一番最初の書き方は簡潔で洗練されているように感じます。しかし、簡潔な分、$が一つ無くなっただけで全然意味が違ってきてバグの元ですし、「これは便利」と説明性を考えずに安易に使ってしまいがちです。後の書き方は稚拙なのかも知れませんが、とても「堅牢」な感じがします。 . ~-この「堅牢である」という感覚、COBOL+メインフレームで育った人間特有の感覚かも知れません。(それとも私だけか・・・)命令文の書ける桁等も決まっていて、特にIF文では最後のピリオド1つで意味が大きく違ってしまうような言語を使っていると、すべて大文字で厳格なコーディング規約に従った図形的に整然としたソースを見ると安心するのです。英小文字や{}が多い最近のコードを「軟弱」と感じてしまうのです。悲しき職業病ですね・・・-~ . 私達は、ある言語で使える機能が他の言語に無いと、その言語は劣っていると感じてしまいがちですが、大切なのは、「可変変数がある」ことではなく、「実現したいことが出来る」ことです。 . 私は今回の例を通じて、言語のデザインとして、「何が出来ないか」も、とても大切な要素だと感じました。次世代Python (Python 3000)の計画では、組み込み関数から除外される関数もあるそうです。Pythonは使っていて、あっと驚くことが無く、感覚として「理にかなっている」と感じることが多いのは、こんな風に慎重にデザインされていることに理由があるのかも知れません。 ---- CategoryPython