Hatena::Groupperl

Perl Study Memory

There is a difference between knowing the path and walking the path.

自己紹介  | 初めてのPerl 第3版  | 続・初めてのPerl 改訂版  | アーカイブ  | 参考書籍・推薦図書

2010-06-09

Catalyst本購入

| 23:55 | はてなブックマーク - Catalyst本購入 - Perl Study Memory

こんばんは、AzureStone(あーじゅ・すとーん)です


f:id:azurestone:20100609234914j:image:w450


ついに買っちゃいました!




PerlフレームワークCatalyst完全入門

PerlフレームワークCatalyst完全入門

2010-04-03

perldoc.jpのドキュメントをポケットリファレンス代わりに使う

| 02:06 | はてなブックマーク - perldoc.jpのドキュメントをポケットリファレンス代わりに使う - Perl Study Memory

こんばんは、AzureStone(あーじゅ・すとーん)です。

明日(04/03)と明後日(04/04)は、用事で遠方に行ってきます。この記事を書き終えたら出発の準備をしようと思っている今日この頃です。

さて昨日(04/02)の記事では、「Googleで無闇矢鱈に関数を検索するよりもperldoc.jpで探せばちゃんと正しい情報が手に入りますよ!」と記しました。

その後、あることを考えていました。

  1. InternetExploreやFirefoxなどのWebブラウザからではなくコンソールまたはターミナルからperldocコマンドのようにperldoc.jpのドキュメントを使用するにはどうすればよいのかを試行錯誤していました。
  2. さらに特定の組み込み関数をVimから辞書をひくにはどうしたらよいか考えていました。

今回は、1の部分のみに焦点を当てて記してみたいと思います。

毎度の事ですが、先に結論から言うと「石垣憲一さんが作成されたPod::PerldocJpをインストールして使えばよい」でしょうか。*1

本当は、「HAHAHA,俺の自作モジュールどうだ!!!」というアピールをしてみるのもよいと思ったのですが、その存在を知っていて作成するのと知らないで作成するのとは大違いです。

そもそも、「これからドキュメントを熟読して頑張るぜ!」なんて公言している人間が、この類の物を作るには限界があると思いました。はじめから諦めているのではなく、コードを書くためにコードを書くというなんだかよくわからないことになってしまいます。ですので今回は、秀作としての車輪の再発明から逃げました。

Pod::PerldocJpのソースコードを眺めれば*2その判断は、間違ってなかったように思います。興味ある方は、下記のURLからどうぞ。

さてその考えに至った経緯を説明していきましょう。本当は、説明としては上記までにとどめておく方が簡潔な文章として成立するのですが、後術する理由のために少し文章を追加しておきたいと思います。

Pod::PerldocJpを知らなければどういった行動にでるか?

おそらく下記にリストアップされた物のどれかを選択するのではないでしょうか?

  1. CVSでリポジトリで管理されているので定期的にダウンロードしてlvコマンドなどでキーワード検索して利用する
  2. perldocコマンドから読み込ませて利用する
  3. 愛用のエディタからキーワード検索する、エディタプラグインを作成する

私もPod::PerldocJpを知るまでは、そう考えていました。そしてやはりGoogleで検索してみると同じようなことを考えている方がいらっしゃるようです。

誤解の受けないように先に言っておくとこの方達が、何か悪いことをしているわけではないと私は思います。記事の日付をそのまま信用するとしたらPod::PerldocJpの方が、後発です。もしかしたらPod::PerldocJpの作者が参考にしたのかもしれません。あくまでも仮説です。

この記事を読んでいる方がいらっしゃってPod::PerldocJpをご存知ないのであれば、Pod::PerldocJpをインストールして使ってみませんか?その方が、時間の節約になります。自作しようとして時間を他の時間に使うことができますよ。

Pod::PerldocJpのセットアップ/インストール

Ubuntu 9.10だと下記のように実行することでなんの問題なくインストールが完了しました。

sudo aptitude -y install g++ libssl-dev
sudo cpan -i Bundle::CPAN
sudo cpan -i Pod::PerldocJp

Pod::PerldocJpを使ってみる

インストールが、完了したら、下記のようにしてみましょう。

perldocjp -h

そうすると下記のようなメッセージが出力されます。

azurestone@nsa01:~$ perldocjp -h
perldoc [options] PageName|ModuleName|ProgramName...
perldoc [options] -f BuiltinFunction
perldoc [options] -q FAQRegex
perldoc [options] -v PerlVariable

オプション:
    -h   このヘルプを表示する
    -V   バージョンを表示する
    -r   再帰検索 (時間がかかります)
    -i   大文字小文字を無視する
    -t   pod2manとnroffではなくpod2textを使って表示(デフォルト)
    -u   整形前のPODを表示する
    -m   指定したモジュールのコードも含めて表示する
    -n   nroffのかわりを指定する
    -l   モジュールのファイル名を表示する
    -F   引数はモジュール名ではなくファイル名である
    -D   デバッグメッセージを表示する
    -T   ページャを通さずに画面に出力する
    -d   保存するファイル名
    -o   出力フォーマット名
    -M   フォーマット用のモジュール名(FormatterModuleNameToUse)
    -w   フォーマット用のオプション:値(formatter_option:option_value)
    -L   国別コード。(あれば)翻訳を表示します
    -X   あれば索引を利用する (pod.idxを探します)
    -J   perldoc.jpの日本語訳も検索
    -q   perlfaq[1-9]の質問を検索
    -f   Perlの組み込み関数を検索
    -v   Perlの定義済み変数を検索

PageName|ModuleName...
    表示したいドキュメント名です。「perlfunc」のようなページ名、
    モジュール名(「Term::Info」または「Term/Info」)、「perldoc」
    のようなプログラム名を指定できます。

BuiltinFunction
    Perlの関数名です。「perlfunc」からドキュメントを抽出します。

FAQRegex
    perlfaq[1-9]を検索して正規表現にマッチした質問を抽出します。

PERLDOC環境変数で指定したスイッチはコマンドライン引数の前に適用されます。
PODの索引には(あれば)ファイル名の一覧が(1行に1)含まれています。

[PerldocJp v0.06 based on Perldoc v3.15]
azurestone@nsa01:~$

どうでしょうか?説明文を簡単に読むだけでもかなり高機能なだと感じませんか?

ちなみに私が作ろうとしていたものは、ここまで考えていませんでした。

  • J 以外は、perldocコマンドと一緒のようです。

さて、一度LANケーブル、emobileWiFiなどのインターネットから隔離された状態で先日のlength()を検索してみます。

azurestone@nist01:~$ perldocjp -Jf length
    length EXPR
    length  EXPR の値の *文字* の長さを返します。 EXPR が省略されたときには
            、$_ の長さを返します。 これは配列やハッシュ全体に対してどれだ
            けの要素を含んでいるかを 調べるためには使えません。 そのような
            用途には、それぞれ "scalar @array""scalar keys %hash" を 利
            用してください。

            *文字* 関する注意: EXPR が Unicode の場合、バイト数ではなく、文
            字の数が返ります。 内部文字列のバイト数が必要な場合は bytes を
            参照して、 "do { use bytes; length(EXPR) }" を使ってください。
            内部エンコーディングは様々なので、バイト数は普通は無意味です。
            UTF-8 でエンコードされている場合の文字列のバイト数を得たい場合
            は、 "length(Encoding::encode_utf8(EXPR))" を使ってください。
azurestone@nist01:~$ 
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!

おっと失礼しました。あまりの感激で、、、つい。こんな感じで*3便利に使えます。

どうでしょう?少なくとも明日、岡山県に青春18切符で出かける私としては、かなり便利だと思います。

一般人は、Pod::PerldocJpの情報に辿り着けない?

私が、ここまでPod::PerldocJpについて書いている主な理由は、初学者の方で英語を得意とされない方は、Pod::PerldocJpまで辿りつけるのだろうか?ということです。

何故ならば、僕もこの情報にたどり着くのに時間がかかったからです。見つけられたのも運が良かっただけではないかと思うくらいです。「モダンPerlの世界へようこそ」を執筆されている方のBlogを最新の物からロールバックするようにして記事を閲覧していたらたまたま、見つけました。

前回の記事で、紹介していました下記のサイトには、作者であるにも関わらずその記述がありません。最初、どうして宣伝していないのだろうかと考えていました。よく見たら、この記事のあとにリリースされたから、どうりで告知がないわけです。勿体無い・・・。*4

もっとどっかでドーンと出ていたらよかったのにと思いました。ですが、他力本願では状況が変わらないので誤解を受けないようにこの記事をかいておいたというわけです。

今回を後術する理由としては、関連キーワードで検索したらこの記事に辿りつけるようにとしたかったということを伝えたかっただけです。(;^_^A アセアセ…

さて、眠くなってきました。それとそろそろ明日の準備をする必要があるので今日は、これでおしまいです。次回は、Vim編です。


本日おすすめの関連書籍

CGI & Perl ポケットリファレンス (Pocket reference)

CGI & Perl ポケットリファレンス (Pocket reference)

*1CPANモジュールの登録が、本名?だったのでそっちを選択しました。

*2:読むことと眺めることは違う

*3:どんな感じ?汗、、

*4:うーんん、、、この発言、上から目線に捉えられてしまうのではないだろうか心配です・・・。

ktatktat2010/04/06 09:25POD2に対応させたのを作ってました。
http://d.hatena.ne.jp/ktat/20091219/1261159738

pipi_onepipi_one2010/05/17 19:33初☆ and 初ブックマーク ありがとうございます。

DeejayDeejay2011/10/08 01:31I was ralely confused, and this answered all my questions.

kwbqlemkwbqlem2011/10/08 21:20AwjUkV <a href="http://mfxkglyiizrr.com/">mfxkglyiizrr</a>

gvcgvgbxcvrgvcgvgbxcvr2011/10/10 19:03WMnSRH , [url=http://igchcswgrpqg.com/]igchcswgrpqg[/url], [link=http://nwsnqfcfmkwc.com/]nwsnqfcfmkwc[/link], http://lfihxrutfjlx.com/

kxtmbjtxkxtmbjtx2011/10/11 02:18qaegPD <a href="http://qlkkfadjgmvk.com/">qlkkfadjgmvk</a>

2009-02-044章 リファレンス入門

4.1 多くの配列に対して同じ処理を実行するには

| はてなブックマーク - 4.1 多くの配列に対して同じ処理を実行するには - Perl Study Memory

リファレンス(参照)とは

複雑なデータ構造、オブジェクト指向プログラミング(OOP)サブルーチンを使ったマジックのための基礎です。

リファレンスは、これらすべてを実現するためにPerl5から追加された機能

  • スカラー変数は、1つの値を保持する
  • 配列は、1つ以上のスカラーの順序付きのリスト
  • ハッシュは、スカラーのキーからスカラーの値を引けるようにしたデータ集合

リファレンスは、データの複雑な相互関係を表現するに適したデータ型


持ち物チェックを例に

  • 救命胴衣(preserver)
  • 日焼け止めクリーム(sunscreen)
  • 水筒(water_bottle)
  • 防水ジャケット(jacket)
  • 船長(Skipper)
#!/usr/bin/perl                                                                                               

use strict;
use warnings;

my @required  = qw(preserver sunscreen water_bottle jacket);
my @skipper   = qw(blue_shirt hat jacket preserver sunscreen);

for my $item (@required) {
  unless (grep $item eq $_, @skipper) {
    print "skipper is missing $item.\n"
  }
}

1;

$ chmod 700 04.01.01.pl 
$ ./04.01.01.pl 
skipper is missing water_bottle.
$ 

#!/usr/bin/perl

use strict;
use warnings;
#use utf8;

my @required  = qw(preserver sunscreen water_bottle jacket);
my @gilligan  = qw(red_shirt hat lucky_socks water_bottale);

for my $item (@required) {
  unless (grep $item eq $_, @gilligan ) {
    print "gilligan is missing $item.\n";
  } 
}

my @professor = qw(sunscreen water_bottle slide_rule batteries radio);
for my $item (@required) {
  unless (grep $item eq $_, @professor) {
    print "professor is missing $item.\n";
  }
}

1;
$ chmod 700 04.01.02.pl 
$ ./04.01.02.pl 
gilligan is missing preserver.
gilligan is missing sunscreen.
gilligan is missing water_bottle.
gilligan is missing jacket.
professor is missing preserver.
professor is missing jacket.
$ 


#!/usr/bin/perl

use strict;
use warnings;

sub check_required_items {
  my $who = shift;
  my @required  = qw(preserver sunscreen water_bottle jacket);
  for my $item (@required) {
    unless (grep $item eq $_, @_){
      print "$who is missin $item.\n";
    }
  }
}

my @gilligan  = qw(red_shirt hat lucky_socks water_bottle);
check_required_items('gilligan', @gilligan);

1;

$ chmod 700 04.01.03.pl 
$ ./04.01.03.pl 
gilligan is missin preserver.
gilligan is missin sunscreen.
gilligan is missin jacket.
$ 

#!/usr/bin/perl

use strict;
use warnings;

sub check_required_items {
  my $who = shift;
  my @required  = qw(preserver sunscreen water_bottle jacket);
  for my $item (@required) {
    unless (grep $item eq $_, @_){
      print "$who is missin $item.\n";
    }
  }
}

my @gilligan  = qw(red_shirt hat lucky_socks water_bottle);
my @skipper   = qw(blue_shirt hat jacket preserver sunscreen);
my @professor = qw(sunscreen water_bottle slide_rule batteries radio);

check_required_items('skipper'  , @skipper);
check_required_items('professor', @professor);
check_required_items('gilligan' , @gilligan);

1;

$ chmod 700 04.01.04.pl 
$ ./04.01.04.pl 
skipper is missin water_bottle.
professor is missin preserver.
professor is missin jacket.
gilligan is missin preserver.
gilligan is missin sunscreen.
gilligan is missin jacket.
$