PageID:Perl/Perl-FAQ3J

Perl初心者の部屋 Perl FAQ 序章 第1章 第2章 第3章 第4章 第5章

Perl-FAQ Part3J

これは、comp.lang.perl.announceに投稿されたものを翻訳、転載したものです。 ご質問等は、comp.lang.perl.misc、fj.lang.perl等のニュースグループへ お願い致します。
#簡単なことでしたら、最下部のメールボックスへどうぞ。

翻訳:「Perl FAQ 翻訳グループ」
同メンバ:
樋口さん、上原さん、高田さん、関谷さん、妻鹿さん、三島

------------------------------------------------------------------------------
Stephen P Potter Pencom Systems Administration AMP Incorporated spp@peach.epix.net spp@psa.pencom.com steve.potter@amp.com Home: 717-540-0131 Pager: 1-800-759-8888, 547-9561 Work: 717-986-5401 Systems Administation: It's a Kind of Magic ------------------------------------------------------------------------------

Archive-name: perl-jfaq/part3 Version: $Id: part3,v 1.1 1996/05/24 21:46:02 sekiya Exp $

Part 3 - プログラミングの支援

3.1) perl を対話的に使う方法は?

3.2) perl のプロファイラはありますか?

3.3) perl のための yacc はありますか?

3.4) Perlのプリティプリンタ(indent(1)と似たようなもの)はありますか?

3.5) どうすれば私は私のperlスクリプトを直接Cに変換したり バイナリ形式にコンパイルしたりすることができますか?

3.6) emacs の perl mode はどこから入手できますか?

3.7) perl のシェルはありますか?

3.8) perl で curses を使うには?

3.9) perl で X や Tk を使うには?

3.10) C のユーザ・ルーチンを動的にロードできますか?

3.11) undump って何ですか、どこで入手できますか?

3.12) MS-DOS で '#!perl' を働かせる方法は?

3.13) 役に立つ perl プログラムをコマンドラインで書けますか?

3.14) 「クロージャ」って何ですか?

Part 3 - プログラミングの支援

3.1) perl を対話的に使う方法は?

これを最も簡単に行なう方法は Perl をデバッガ上で実行することです。 もしデバッグ対象のプログラムがないのなら、以下のようにして「空の」 プログラムを対象にデバッガを起動することができます。
    	perl -de 0
(もっと前向きなハッカーは "perl -de 1" の方を好みます。:-)

これで、あなたはどんな正規の Perl コードでも入力することができ、 そしてそれはただちに評価されるでしょう。あなたはまた、スタックを バックトレースしたり、変数の値を調べたり、そしてもし望むなら、 ブレークポイントを設定するというような、シンボリック・デバッガ 上でできる様々なことを行なうことができます。

目次

3.2) perl のプロファイラはありますか?

perl ソースの配布キットには(まだ)含まれていませんが、いろいろな人 が、少なくともある種のプロファイリングができるようにするパッケージ を書きました。これらのパッケージの作者は以下の方々です。

	Wayne Thompson 		<me@anywhere.EBay.Sun.COM>
	Ray Lischner 		<lisch@sysserver1.mentor.com>
	Kresten Krab Thorup 	<krab@iesd.auc.dk>  
この 3名によるプロファイラを含んだオリジナルの記事が、 ftp://convex.com/pub/perl/info/profiling.shar から入手できます。

最近、Dean Roerich* がバージョン5 のためのプロファイラを書きました。 おそらくこれは、標準リリースと一緒に配布されるようになるでしょう。 さしあたり、どのエクステンション・アーカイブからでも、DProf.tar.gz として入手できるはずです。

目次

3.3) perl のための yacc はありますか?

あるんです!! それはバークレイ yacc の一バージョンで、C コードの代 わりに、なんと Perl コードを出力します! あなたは ftp://ftp.sterling.com/local/perl-byacc1.8.2.tar.Z から、または作者に詳細を書いてメールすることによって、それを入手できます。

目次

3.4) Perlのプリティプリンタ(indent(1)と似たようなもの)はありますか?

あなたの意図にもよります。もし、あなたがPerlプログラムでのvgrindの よに働くものが欲しいなら、答えは「はい、ほぼお望みのものがあります」 です。以下はperl用のvgrindのエントリです。

	PERL|perl|Perl:\
	    :pb=^\d?(sub|package)\d\p\d:\
	    :bb={:be=}:cb=#:ce=$:sb=":se=\e":lb=':\
	    :le=\e':tl:\
	    :id=_:\
	    :kw=\
	    if for foreach unless until while continue else elsif \
	    do eval require \
	    die exit \
	    defined delete reset \
	    goto last redo next dump \
	    local undef return  \
	    write format  \
	    sub package
実際には、これではすべてを正しく行ってくれる訳ではありません。特に、 $#, $', s#/foo##, そして$foo'barのようなものに対しては混乱をきたし てしまいます。

David Levineは以下を使っています。

    # perl 4.x                    David Levine <levine@ics.uci.edu> 05 apr 1993
    # Derived from Tom Christiansen's perl vgrindef.  I'd like to treat all  of
    # perl's built-ins as  keywords,  but vgrind   fields are  limited  to 1024
    # characters  and the built-ins overflow that (surprise  :-).  So, I didn't
    # include the dbm*, end*, get*, msg*, sem*, set*,  and  shm* functions.   I
    # couldn't come up with an easy way to  distinguish beginnings  of literals
    # ('...') from package prefixes, so literals are not marked.
    # Be sure to:
    # 1) include whitespace between a subprogram name and its opening {
    # 2) include whitespace before a comment (so that $# doesn't get
    # interpreted as one).
    perl4:\
	    :pb=^\d?(sub|package)\d\p\d:\
	    :id=$%@_:\
	    :bb=\e{:be=\e}:cb=\d\e#:ce=$:sb=\e":se=\e":\
	    :kw=accept alarm atan2 bind binmode caller chdir chmod chop \
    chown chroot close closedir connect continue cos crypt defined delete \
    die do dump each else elsif eof eval exec exit exp fcntl fileno flock \
    for foreach fork format getc gmtime goto grep hex if include index int \
    ioctl join keys kill last length link listen local localtime log lstat \
    m mkdir next oct open opendir ord pack package pipe pop print printf \
    push q qq qx rand read readdir readlink recv redo rename require reset \
    return reverse rewinddir rindex rmdir s scalar seek seekdir select send \
    shift shutdown sin sleep socket socketpair sort splice split sprintf \
    sqrt srand stat study sub substr symlink syscall sysread system \
    syswrite tell telldir time times tr truncate umask undef unless unlink \
    unpack unshift until utime values vec wait waitpid wantarray warn while \
    write y: 
もしあなたが聞きたいことが「Cに対してindent(1)が行うような、Perlプ ログラムの再フォーマットを行うプログラムがあるかどうか」ということ なら、答えはNOです。スキャナとパーサの複雑なフィードバックが (vgrindで混乱を引き起こしているように)、独立したPerlのパーサを書く事 を最高に挑戦的なものにしています。

もちろん、perlstyle(1)におけるガイドラインに沿っていれば、あなたは 再フォーマットなどする必要はないわけですが。

目次

3.5) どうすれば私は私のperlスクリプトを直接Cに変換したりバイナリ形式にコンパイルしたりすることができますか?

短く答えると、次のようになります。「いいえ、あなたはperlをCにコン パイルする事はできません。まる。」

しかし、上の様には言ったものの、perlからCへのトランスレータを書く 事は可能であると信じられています。といっても、それは博士号の学位論 文として出くわすことを待っている程のもんです。誰か、とてもやりがい のある学位論文を必要としてる人はいませんか?

長くなりますがもっと詳細に説明すると、Cへのコンパイルを行う理由は、 以下の1つ、あるいはいくつかにおおむね分類できると思います。

	A) 速度
	B) 守秘
	C) 保守性
速度について:

1) あなたはperlのソースコードあるいはperlの中間コードを、実行速度 を向上させるためにネイティブな機械語コードに変換する事はできな いし、perlの中間コードをセーブする事も、実際にはあなたが期待す るほどの速度向上にはなりません。もし本当にやらなければならない のなら、undumpとunexecの選択肢をチェックして見なさい。あなたの 動機が速度ならば、あなたの役に立つかどうかはわかりませんが。

また、実行時(on the fly)のオートローディング関数を見ても良いで しょう。これは大幅に起動時間を短縮してくれます。

もしあなたが2,3のルーチンで動きがとれなくなっているのであれば、 そのルーチンだけを手動でCに変換することを期待できます。そして それらを動的にロードするのです。詳細についてはperlapi(1)を御覧 下さい。しかしながら、速度向上をするためには、たいていの場合は あなたのperlでのアルゴリズムを再編成することが最善でしょう。

ソースコードの守秘について:

2) もしあなたが、あなたがしている事を見られてしまうことを 止めさせたいのならば、あなたはそれを包んでしまうことができます。 すなわち、すべての識別子をばかげたがらくたに変え、文字列を再配 置し、冗長な空白文字を取り除きます。外にはShroudIt!というプロ グラムがあり、これはPerlを含むたくさんの言語に対して動作します。 もっとも、これは商用製品です。さらなる情報はDavid Webber (webber@lnk.com)に問い合わせ下さい。

3) perlソース中にあるcryptswitch()要素も見てみると良いかもしれませ ん。これによって読めない形式で何かを出荷できるようになります。 これは特に文書化されていません。

4) 誰かがあなたのソフトウェアを許可無く使用する事を心配しているの なら、以下のような何かを言明する巨大な声明文を先頭に置いておけ ば良いでしょう。これが実際に最良の解決方法です。なぜなら、あな たの心配しているのが法的な正当性ならば、実際に役に立つのは法律 的な解決方法だけだからです。技術的な解決策によって法的な問題を 解決しようと試みる事は、努力するに値しませんし、回避するのは簡 単すぎる程です。

[巨大な声明文の例]
これはXYZZY, Incの非公開の独占的ソースコードです。事前の許 諾無くこのファイルの内容を第三者に対して公開すること、及び コピーあるいは複製することは、部分・全体を問わず許可されて おりません。

この結果、変更されていない状態におけるこのソースコードを使 用するための許可は、あなたの責任においてのみ保証されます。 このソースコードを、XYZZY Inc.の管理下以外で許可無く変更す る事は許されておりません。許可の無い任意の状況において、ソー スあるいはバイナリなどのいかなる形式であってもこのソースコー ドが与えられることもまた許可されません。このソースに対する 変更は契約違反を構成し、XYZZY Inc.による任意の潜在的な起こ り得るサポート責任を無効とします。このソースコードの内容を そのまま、あるいは言い替えによってライセンスされていない相 手に対して直接もしくは間接的に漏洩する事は合衆国著作権法あ るいは国際著作権法・売買秘密法の違反を構成します。そして法 律のもとで最大限正式に許可された範囲で正式に起訴されるでしょ う。

このソフトウェアはXYZZY Inc.によって「あるがままの状態で」 供給され、明示・暗黙を問わずいかなる保証(特定目的に対する 商業上の暗黙の保証と適合性を含む。ただしそれに制約されるも のではない)も否認されます。とにかく、評議員あるいは貢献者 に責任があり、直接・間接・付帯的・特殊・模範、あるいは重大 な損害(代替品あるいはサービスの調達、使用権・データ・利益 の損失、商取り引きの中断、を含む。ただしそれに制約されるも のではない)を引き起こされても、また任意の責任論上でも、契 約上であろうが厳密に責任上のものであろうがこのソフトウェア の使用方法の逸脱で生じた不法行為(怠慢その他を含む)であろう が、熟慮の上のそのような損害の可能性でも責任がある事象では ありません。

保守性について:

5) もしあなたが人々によって変更されることを、サポート上の問題を考 慮して止めさせたいだけなら、あなたはもし彼らがファイルに触れた ら保証を受けることが無効になりますよと言うようなでかい声明文を 先頭に置くことができます。そしてそれについてのなんらかの質問に 答える前に、ユーザーにそのファイルのサイズとチェックサムとバー ジョンを言わせるようにすればいいのです。

もしあなたが内部のクライアントマシンに対してソフトウェアを配布 するような中心的なサイトを保守しているなら、rdist(1)を適切な版 を周辺に定期的に送るために使うと良いでしょう。たぶんインストー ルにはソースより若い配布先をフラグするために-yオプションを使う ことになるでしょう。

以下をより注意しなさい: Perlの作者は長い間、ソフトウェアを再配 布自由にリリースしサポートしていましたが、その期間、ソースをい じって彼のソースコードを壊した人によって作り出されたインチキな バグ報告に「決して一度も」だまされたことはありませんでした。む しろ、彼と供給されるたくさんの他のオープンソフトウェアは(ここ ではオープンソフトウェアはソースが供給されるような、まさしくオー プンなソフトウェアを意味します)、人々に自分自身でソースコード を覗く事を許したおかげで、何千回以上もの数え切れない労働を彼ら に節約させてくれました。独占的にソースコードを秘蔵することはそ れ自身頭痛の種です。

従って、保守性のための難解さというのは「薫製ニシン」であるよう に見えます。[訳注: 「薫製ニシン」は「人の注意を他へそらすもの, 人をまどわすような情報」の例え]

6) もしあなたが配布先の顧客でperlがインストールされていることをあ てにできないなら、どうぞ、単にそれをあなたのプログラムと一緒に 出荷すれば良いのです。困難なことはありません。なぜならソフトウェ アの供給者はマシン固有のバイナリ形式でソフトウェアを出荷する事 には慣れているからです。基本的な考え方は単に

	    shar /usr/local/{lib,bin,man}/perl myprog
というように簡単です。彼らがperlを持っていたら、すでにインストー ルされている彼らのPerlを上書きしないようには注意して下さい。

目次

3.6) emacs の perl mode はどこから入手できますか?

Emacs version 19 パッチレベル 22 から,perl-mode.el と,内蔵で perl デバッガのサポートがあります.

perl のソースディレクトリ中に,"emacs" と言うディレクトリを見つけ るでしょう,そこにはあなたの助けになるファイルがいくつか含まれてい ます.

emacs の perl-mode は "main'foo" (シングルクォート) に発作を起こし, インデントとハイライトを台無しにするでしょう,ということを付け加え ておきます.しかし perl5では,"main::foo" を使うべきです.ところで, 我々は,あなたがアップグレードすべきだと,言っているのでしょうか?

目次

3.7) perl のシェルはありますか?

まさか.Perl はプログラミング言語であり,コマンドインタプリタでは ありません.Perl のソースコード配布に含まれている,"perlsh" と呼ば れる大変簡単なものがあります.それは以下のようにするだけです:

        $/ = '';        # set paragraph mode
        $SHlinesep = "\n";
        while ($SHcmd = <>) {
            $/ = $SHlinesep;
            eval $SHcmd; print $@ || "\n";
            $SHlinesep = $/; $/ = '';
        }
全然おもしろくないでしょう?

Daniel Smith <dls@best.com> SoftList と呼ばれる対話型の Perl シェ ルの仕事をしています.現在のバージョンは 3.0b7a (ベータ)です. SoftList 3.0b7a には tcsh ライクなコマンド行編集があり,別名 (aliases) のファイルを定義することができるので,かなりたくさんの perl や UNIX コマンドなどを実行するとができます.ftp.best.com の /pub/dls/SoftList-3.0b7a.gz からコピーを手に入れることが出来ます.

目次

3.8) perl で curses を使うには?

perl のリリース4 でこれを行なう唯一の方法は,perl のソースディレク トリの usub サブディレクトリの中に記述されていますが,あなたの Cの curses のライブラリをリンクすることによって curseperl バイナリを構 築することです.これには多少の仕事が必要ですが,すべて Cの中なので, かなり速いでしょう (curses をかなり速いとあなたが思っている,と仮 定しています :-) この方法で書かれたプログラムを走らせるためには, 修正された curseperl が必要で,vanilla perl ではありません.これは ちょっとした欠点でありますが,termcap を直接使って,あなた自身で操 ろうとするより,curseperl を使う方がより良いということは,経験が示 しています.

幸い version 5 では,Curses は William Setzer* によるダイナミック ロード拡張です.Perl 5 が手に入れられるところならどこでも,それを 手にいれることができます,さもなくば,最低でも以下の場所に (あなた がこれを読むまでにはバージョンが変わっていることは予想されます):

ftp://ftp.ncsu.edu/pub/math/wsetzer/cursperl5a6.tar.gz ftp://ftp.metronet.com/pub/perlinfo/perl5/cursperl5a6.tar.gz ftp://ftp.cs.ruu.nl/pub/PERL/perl5.0/cursperl5a6.tar.gz

Perl で curses を使う良い例のために, "ftp.iastate.edu" から anonymous FTP で,Steven L. Kunz's* の "perl menus" パッケージ ("menu.pl") のコピーを手にいれたいかも知れません.それは, /pub/perl ディレクトリ中にあります:

        menu.pl.v3.1.tar.Z
menu.pl は perl+curses 用の完全なメニュフロントエンドであり,多く のことを説明してくれます (さらに,フルスクリーンの選択メニュ機能が 欲しいなら,ブートするのに使いやすいです).それは,3つのメニュス タイル (単一選択,複数選択,および,ラジオボタン) のフルスクリーン メニュ選択機能を提供します."perl menus" パッケージにはフルスクリ ーンのデータ登録のためのルーチンも含まれています.登録,データベー ス,あるいは他のレコード指向のタスク用のデータエントリを構築用の, 単純な(しかも,柔軟な) perl のインタフェースを作るために,"テンプ レート" の概念が実装されています.

menu.pl は Perl4/curseperl と Perl5/Curses でサポートされています. 完全なユーザドキュメントは,いくつかのデモと "初心者アプリケーショ ン" と一緒に提供されています.メニュユーティリティモジュールが提供 されており,それはあなたのアプリケーションから呼ばれるであろう,便 利な Perl の curses ルーチン ("ポップアップ質問ボックス"のような) の集まりです.

もう一つの可能性は,Henk Penning の cterm パッケージという,perlで 書かれた curses のエミュレーションライブラリを使うことです. cterm は実際には,pipe を使って通信する分かれたプログラムです.それは, anonymous ftp で,ftp.cs.ruu.nl [131.211.80.17] の pub/PERL ディレ クトリ,から手に入れることができます.また,以下の行を含めたメッセ ージを mail-server@cs.ruu.nl に送ることによって,compress と uuencode された形式のパッケージを email で手に入れることもできるか も知れません:

        begin
        send PERL/cterm.shar.Z
        end
そこのメールサーバから,その他のおもしろいアイテムを手に入れる方法 に関するより詳しい情報については,"mailで perl を手に入れるには"の 質問を見なさい.

目次

3.9) perl で X や Tk を使うには?

今,あなたにはいくつかの選択肢があります.もしまだ perl4 を使って いるなら,WAFE あるいは STDWIN パッケージを使いなさい,さもなくば, あなた自身の usub バインディングを作ってみなさい.

しかし,もしすでに version 5 にアップグレードしているなら,いくつ かわくわくする可能性があり,毎日いろんなことがあります.今,Tk と Sx はそのような最も良く知られた拡張(モジュール)です.

もし,tk パッケージが好みなら,Nick Ing-Simmoons* によって書かれた, Tk 拡張キットを手に入れるべきです.公式の配布ポイントは,

ftp://ftp.wpi.edu/perl5/private/Tk-b8.tar.gz

しかし今や,主要なアーカイブサイトの多くには,そこの /ext{entions} ディレクトリにもあります.あなたの場所によりますが,そこを調べるの は,よりいっそうよいかもしれません.さらに,あなたがこれを読む時に はバージョン番号は変わっているかも知れない,ということを覚えておい て下さい.

このパッケージは Malcolm Beattie* により,tkperl5 プロジェクトに置 き換えられました,それは,現在の 4.X に比べ 3.6 である,古いバージョ ンの Tk を基にしてありました.このパッケージは アルファステージ中 は,nTk (新しい Tk) としても知られていましたが,ベータでは,単なる Tk に変えられました.さらに,最低でも perl5.001 (利用できるように なったら,むしろ 5.002) が必要であると言われています.

あなたは,元は Dominic Giampaolo* によって書かれ,その後 Frederic Chauveau* により Sx として書き直された,古い Sx パッケージ (Athena と Xlib) を使うかも知れません.それは以下のサイトで手に入れること ができます:

ftp://ftp.pasteur.fr/pub/Perl/Sx.tar.gz ftp://ftp.khoros.unm.edu/pub/perl/extensions/Sx.tar.gz ftp://ftp.metronet.com/pub/perlinfo/perl5/Sx.tar.gz

STDWIN は Guido van Rossum (Python programming language の著者) に よって書かれたライブラリで,Mac と Dos と X11 の間で移植可能です. 一つは,この STDWIN サーバと話すための Perl エージェントを書くこと ができます.

WAFE は,Athena ウィジェット(X11R5) へのシンボリックインタフェース を実装しているパッケージです.典型的な Wafe のアプリケーションは, 二つの部分のフレームワークで成っています: フロントエンド (我々は, それを ウィジェット[Athena] フロントエンドのための Wafe と呼んでい ます) と,決まって別プロセスとして動いているアプリケーションプログ ラムです.そのアプリケーションプログラムは,任意のプログラミング言 語で実装され,標準入力を通して通信することができます.Wafe (フロン トエンド)は,拡張性のある TCL シェル (John Ousterhout を引用) を使 うために開発されました.アプリケーションプログラムは,グラフィカル ユーザインタフェースを構築するために,要求を動的にフロントエンドに 送ります; アプリケーションはフロントエンドに,アプリケーション特有 の手続きをダウンロードすることさえできます.配布には,同じ Wafe バ イナリと通信する,Perl,GAWK,Prolog,TCL 及び C のサンプルアプリケ ーションプログラムが含まれています.多くのデモアプリケーションが, Perl によって実装されています.Wafe 0.9 は 以下の anonymous ftp か ら手に入れることとが出来ます.

ftp.wu-wien.ac.at[137.208.3.5]:pub/src/X11/wafe-0.9.tar.Z

あるいは,tcl から wish を使うこともできます.

    #!/usr/local/bin/perl
    #####################################################################
    #  Perlの元でサブシェルとしてwishをcallし、ソケットを通じてそれと
    #  相互通信する例。
    #
    #  このスクリプトは直接 Gustaf Neumann のperlwafeスクリプトを
    # ベースにしています。
    #  Dov Grobgeld dov@menora.weizmann.ac.il
    #  1993-05-17
    #####################################################################

    $wishbin = "/usr/local/bin/wish";

    die "socketpair unsuccessful: $!!\n" unless socketpair(W0,WISH,1,1,0);
    if ($pid=fork) {
            select(WISH); $| = 1;
            select(STDOUT);

        # いくつかの TCL プロジージャを生成
            print WISH 'proc echo {s} {puts stdout $s; flush stdout}',"\n";

        # ウィジェットを生成
        print WISH <<TCL;
        # これはwish"内部"のコメントです。

        frame .f -relief raised -border 1 -bg green
        pack append . .f {top fill expand}

        button .f.button-pressme -text "Press me" -command {
            echo "That's nice."
        }
        button .f.button-quit -text quit -command {
            echo "quit"
        }
        pack append .f .f.button-pressme {top fill expand} \\
                       .f.button-quit {top expand}

TCL
        ;
        # ここからwishへコマンドを送受信するメインループです。
        # 
        while (<WISH>) {
            chop;
            print "Wish sais: <$_>\n";
            if (/^quit/) { print WISH "destroy .\n"; last; }
        }
            wait;
    } elsif (defined $pid) {
        open(STDOUT, ">&W0");
        open(STDIN, ">&W0");
        close(W0);
        select(STDOUT); $| = 1;
        exec "$wishbin --";
    } else {
        die "fork error: $!\n";
    }

目次

3.10) C のユーザ・ルーチンを動的にロードできますか?

    Yes -- dynamic loading comes with the distribution.  That means that
    you no longer need 18 different versions of fooperl floating around.
    In fact, all of perl can be stuck into a libperl.so library and
    then your /usr/local/bin/perl binary reduced to just 50k or so.
    See DynLoader(3pm) for details.

    In perl4, the answer was kinda.  One package has been released that does
    this, by Roberto Salama*.  He writes:

    Here is a version of dylperl, dynamic linker for perl. The code here is
    based on Oliver Sharp's May 1993 article in Dr. Dobbs Journal (Dynamic
    Linking under Berkeley UNIX). 

              dyl.h 
              dyl.c - code extracted from Oliver Sharp's article

              hash.h
              hash.c - Berkeley's hash functions, should use perl's but
                       could not be bothered

           dylperl.c - perl usersubs
              user.c - userinit function

            sample.c - sample code to be dyl'ed
           sample2.c -          "
             test.pl - sample perl script that dyl's sample*.o

    The Makefile assumes that uperl.o is in /usr/local/src/perl/... You
    will probably have to change this to reflect your installation. Other
    than that, just type 'make'...

    The idea behind being able to dynamically link code into perl is that
    the linked code should become perl functions, i.e. they can be invoked
    as &foo(...).  For this to happen, the incrementally loaded code must
    use the perl stack, look at sample.c to get a better idea.

    The few functions that make up this package are outlined below.

    &dyl("file.o"): dynamically link file.o. All functions and non-static
                   variables become visible from within perl. This
                   function returns a pointer to an internal hash table
                   corresponding to the symbol table of the newly loaded
                   code.

                   eg: $ht = &dyl("sample.o")

           This function can also be called with the -L and -l ld options.

                   eg: $ht = &dyl(""sample2.o", "-L/usr/lib", "-lm")
                       will also pick up the math library if sample.o
                       accesses any symbols there.

    &dyl_find("func"): find symbol 'func' and return its symbol table entry

    &dyl_functions($ht): print the contents of the internal hash table
    &dyl_print_symbols($f): prints the contents of the symbol returned by
    dyl_find() 

    There is very little documentation, maybe something to do for a future
    release.  The files sample.o, and sample2.o contain code to be
    incrementally loaded, test.pl is the test perl script.

    Comments are welcome. I submit this code for public consumption and,
    basically, am not responsible for it in any way.



目次

3.11) undump って何ですか、どこで入手できますか?

    The undump program comes from the TeX distribution.  If you have TeX,
    then you may have a working undump.  If you don't, and you can't get
    one, *AND* you have a GNU emacs working on your machine that can clone
    itself, then you might try taking its unexec() function and compiling
    Perl with -DUNEXEC, which will make Perl call unexec() instead of
    abort().  You'll have to add unexec.o to the objects line in the
    Makefile.  If you succeed, post to comp.lang.perl.misc about your
    experience so others can benefit from it. 

    If you have a version of undump that works with Perl, please submit
    its anon-FTP whereabouts to the FAQ maintainer.


目次

3.12) MS-DOS で '#!perl' を働かせる方法は?

John Dallman* がこれを行うプログラム"#!perl.exe"を書きました。 これは 匿名ftpのftp.ee.umanitoba.caのディレクトリ /pub/msdos/perl//pub/msdos/perl/hbp_30.zip から入手可能です。 [訳注:96.10.27現在ディレクトリは/pub/msdos/perl/tips-tricks/となって います。また16bit対応プログラムです。URLリンクは修正してあります。] このプログラムはスクリプトとperl.exeを見つけ、コマンドラインをビルドし 子プロセスとしてperl.exeを実行することでと機能します。 これ以上の情報は直接Johnにコンタクトしてください。

目次

3.13) 役に立つ perl プログラムをコマンドラインで書けますか?

    Sure, if they're simple enough.  Of course, for most programs,
    you'll enter them in a file and call perl on them from your
    shell.  That way you can go into the hack/execute/debug cycle.
    But there are plenty of useful one-liner: see below.  (Things
    marked perl5 need to be run from v5.000 or better, but the
    rest don't care.)

    # what's octal value of random char (":" in this case)?
    perl -e 'printf "%#o\n", ord(shift)' ":"

    # sum first and last fields
    perl -lane 'print $F[0] + $F[1]'

    # strip high bits
    perl -pe 'tr/\200-\377/\000-\177/'

    # find text files
    perl -le 'for(@ARGV) {print if -f && -T}' *

    # trim newsrc
    perl5 -i.old -pe 's/!.*?(\d+)$/! 1-$1/' ~/.newsrc

    # dbmfileをcatする
    perl -e 'dbmopen(%f,shift,undef);while(($k,$v)=each%f){print "$k:\
            $v\n"}' /etc/aliases 

    # Cプログラムからコメントを削除
    perl5 -0777 -pe 's{/\*.*?\*/}{}gs' foo.c

    # ファイルを今日より一ヶ月前の日付にし、reaperデーモンを打ち負かす
    perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *

    # 最初の未使用uidを検索
    perl5 -le '$i++ while getpwuid($i); print $i'

    # 100以降の最初の未使用uidを検索、perl4でも稼働
    perl -le '$i = 100; $i++ while ($x) = getpwuid($i); print $i'

    # detect pathetically insecurable systems
    perl5 -le 'use POSIX; print "INSECURE" unless sysconf(_PC_CHOWN_RESTRICTED)'

    # display reasonable manpath
    echo $PATH | perl5 -nl -072 -e '
        s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'

    Ok, the last one was actually an obfuscate perl entry. :-) 

目次

3.14) 「クロージャ」って何ですか?

   (Larry wrote) This is a notion out of the Lisp world that says if you
    define an anonymous function in a particular lexical context, it
    pretends to run in that context even when it's called outside of the
    context.

    In human terms, it's a funny way of passing arguments to a subroutine
    when you define it as well as when you call it.  It's useful for
    setting up little bits of code to run later, such as callbacks.  You
    can even do object-oriented stuff with it, though Perl provides a
    different mechanism to do that already.

    You can also think of it as a way to write a subroutine template without
    using eval.
以下はどんな風に動くかというちょっとした例です。:
        sub newprint {
            my $x = shift;
            return sub { my $y = shift; print "$x, $y!\n"; };
        }
        $h = newprint("Howdy");
        $g = newprint("Greetings");

        # 時間が経過...

        &$h("world");
        &$g("earthlings");

この出力:

        Howdy, world!
        Greetings, earthlings!

    Note particularly that $x continues to refer to the value passed into
    newprint() *despite* the fact that the "my $x" has seemingly gone out
    of scope by the time the anonymous subroutine runs.  That's what
    closure is all about.

    This only applies to lexical variables, by the way.  Dynamic variables
    continue to work as they have always worked.  Closure is not something
    that most Perl programmers need trouble themselves about to begin with.


目次

ご意見、ご要望は、 電子メールまたは 投稿にお願い致します。

ホームページへ戻る。