翻訳:「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 $
3.4) Perlのプリティプリンタ(indent(1)と似たようなもの)はありますか?
3.5) どうすれば私は私のperlスクリプトを直接Cに変換したり バイナリ形式にコンパイルしたりすることができますか?
3.6) emacs の perl mode はどこから入手できますか?
3.10) C のユーザ・ルーチンを動的にロードできますか?
3.11) undump って何ですか、どこで入手できますか?
3.12) MS-DOS で '#!perl' を働かせる方法は?
3.13) 役に立つ perl プログラムをコマンドラインで書けますか?
perl -de 0
(もっと前向きなハッカーは "perl -de 1" の方を好みます。:-)
これで、あなたはどんな正規の Perl コードでも入力することができ、 そしてそれはただちに評価されるでしょう。あなたはまた、スタックを バックトレースしたり、変数の値を調べたり、そしてもし望むなら、 ブレークポイントを設定するというような、シンボリック・デバッガ 上でできる様々なことを行なうことができます。
perl ソースの配布キットには(まだ)含まれていませんが、いろいろな人
が、少なくともある種のプロファイリングができるようにするパッケージ
を書きました。これらのパッケージの作者は以下の方々です。
3.2) 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 として入手できるはずです。
あるんです!! それはバークレイ yacc の一バージョンで、C コードの代
わりに、なんと Perl コードを出力します! あなたは
ftp://ftp.sterling.com/local/perl-byacc1.8.2.tar.Z から、または作者に詳細を書いてメールすることによって、それを入手できます。
あなたの意図にもよります。もし、あなたがPerlプログラムでのvgrindの
よに働くものが欲しいなら、答えは「はい、ほぼお望みのものがあります」
です。以下はperl用のvgrindのエントリです。
David Levineは以下を使っています。
もちろん、perlstyle(1)におけるガイドラインに沿っていれば、あなたは
再フォーマットなどする必要はないわけですが。
短く答えると、次のようになります。「いいえ、あなたはperlをCにコン
パイルする事はできません。まる。」
しかし、上の様には言ったものの、perlからCへのトランスレータを書く
事は可能であると信じられています。といっても、それは博士号の学位論
文として出くわすことを待っている程のもんです。誰か、とてもやりがい
のある学位論文を必要としてる人はいませんか?
長くなりますがもっと詳細に説明すると、Cへのコンパイルを行う理由は、
以下の1つ、あるいはいくつかにおおむね分類できると思います。
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.によって「あるがままの状態で」
供給され、明示・暗黙を問わずいかなる保証(特定目的に対する
商業上の暗黙の保証と適合性を含む。ただしそれに制約されるも
のではない)も否認されます。とにかく、評議員あるいは貢献者
に責任があり、直接・間接・付帯的・特殊・模範、あるいは重大
な損害(代替品あるいはサービスの調達、使用権・データ・利益
の損失、商取り引きの中断、を含む。ただしそれに制約されるも
のではない)を引き起こされても、また任意の責任論上でも、契
約上であろうが厳密に責任上のものであろうがこのソフトウェア
の使用方法の逸脱で生じた不法行為(怠慢その他を含む)であろう
が、熟慮の上のそのような損害の可能性でも責任がある事象では
ありません。
保守性について:
5) もしあなたが人々によって変更されることを、サポート上の問題を考
慮して止めさせたいだけなら、あなたはもし彼らがファイルに触れた
ら保証を受けることが無効になりますよと言うようなでかい声明文を
先頭に置くことができます。そしてそれについてのなんらかの質問に
答える前に、ユーザーにそのファイルのサイズとチェックサムとバー
ジョンを言わせるようにすればいいのです。
もしあなたが内部のクライアントマシンに対してソフトウェアを配布
するような中心的なサイトを保守しているなら、rdist(1)を適切な版
を周辺に定期的に送るために使うと良いでしょう。たぶんインストー
ルにはソースより若い配布先をフラグするために-yオプションを使う
ことになるでしょう。
以下をより注意しなさい: Perlの作者は長い間、ソフトウェアを再配
布自由にリリースしサポートしていましたが、その期間、ソースをい
じって彼のソースコードを壊した人によって作り出されたインチキな
バグ報告に「決して一度も」だまされたことはありませんでした。む
しろ、彼と供給されるたくさんの他のオープンソフトウェアは(ここ
ではオープンソフトウェアはソースが供給されるような、まさしくオー
プンなソフトウェアを意味します)、人々に自分自身でソースコード
を覗く事を許したおかげで、何千回以上もの数え切れない労働を彼ら
に節約させてくれました。独占的にソースコードを秘蔵することはそ
れ自身頭痛の種です。
従って、保守性のための難解さというのは「薫製ニシン」であるよう
に見えます。[訳注: 「薫製ニシン」は「人の注意を他へそらすもの,
人をまどわすような情報」の例え]
6) もしあなたが配布先の顧客でperlがインストールされていることをあ
てにできないなら、どうぞ、単にそれをあなたのプログラムと一緒に
出荷すれば良いのです。困難なことはありません。なぜならソフトウェ
アの供給者はマシン固有のバイナリ形式でソフトウェアを出荷する事
には慣れているからです。基本的な考え方は単に
Emacs version 19 パッチレベル 22 から,perl-mode.el と,内蔵で
perl デバッガのサポートがあります.
perl のソースディレクトリ中に,"emacs" と言うディレクトリを見つけ
るでしょう,そこにはあなたの助けになるファイルがいくつか含まれてい
ます.
emacs の perl-mode は "main'foo" (シングルクォート) に発作を起こし,
インデントとハイライトを台無しにするでしょう,ということを付け加え
ておきます.しかし perl5では,"main::foo" を使うべきです.ところで,
我々は,あなたがアップグレードすべきだと,言っているのでしょうか?
まさか.Perl はプログラミング言語であり,コマンドインタプリタでは
ありません.Perl のソースコード配布に含まれている,"perlsh" と呼ば
れる大変簡単なものがあります.それは以下のようにするだけです:
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 からコピーを手に入れることが出来ます.
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 は 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 で手に入れることもできるか
も知れません:
今,あなたにはいくつかの選択肢があります.もしまだ 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 を使うこともできます.
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.3) perl のための yacc はありますか?
3.4) Perlのプリティプリンタ(indent(1)と似たようなもの)はありますか?
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のようなものに対しては混乱をきたし
てしまいます。
# 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のパーサを書く事
を最高に挑戦的なものにしています。
3.5) どうすれば私は私のperlスクリプトを直接Cに変換したりバイナリ形式にコンパイルしたりすることができますか?
A) 速度
B) 守秘
C) 保守性
速度について:
これはXYZZY, Incの非公開の独占的ソースコードです。事前の許
諾無くこのファイルの内容を第三者に対して公開すること、及び
コピーあるいは複製することは、部分・全体を問わず許可されて
おりません。
shar /usr/local/{lib,bin,man}/perl myprog
というように簡単です。彼らがperlを持っていたら、すでにインストー
ルされている彼らのPerlを上書きしないようには注意して下さい。
3.6) emacs の perl mode はどこから入手できますか?
3.7) perl のシェルはありますか?
$/ = ''; # set paragraph mode
$SHlinesep = "\n";
while ($SHcmd = <>) {
$/ = $SHlinesep;
eval $SHcmd; print $@ || "\n";
$SHlinesep = $/; $/ = '';
}
全然おもしろくないでしょう?
3.8) perl で curses を使うには?
menu.pl.v3.1.tar.Z
menu.pl は perl+curses 用の完全なメニュフロントエンドであり,多く
のことを説明してくれます (さらに,フルスクリーンの選択メニュ機能が
欲しいなら,ブートするのに使いやすいです).それは,3つのメニュス
タイル (単一選択,複数選択,および,ラジオボタン) のフルスクリーン
メニュ選択機能を提供します."perl menus" パッケージにはフルスクリ
ーンのデータ登録のためのルーチンも含まれています.登録,データベー
ス,あるいは他のレコード指向のタスク用のデータエントリを構築用の,
単純な(しかも,柔軟な) perl のインタフェースを作るために,"テンプ
レート" の概念が実装されています.
begin
send PERL/cterm.shar.Z
end
そこのメールサーバから,その他のおもしろいアイテムを手に入れる方法
に関するより詳しい情報については,"mailで perl を手に入れるには"の
質問を見なさい.
3.9) perl で X や Tk を使うには?
#!/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' を働かせる方法は?
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.
目次
ご意見、ご要望は、
電子メールまたは
投稿にお願い致します。