perlfaq - Perl に関するよくある質問
perlfaq は、Perl と Perl プログラミングに関するもっともよくある質問へ 回答しているいくつかの文書から構成されています。 これはこの文書に概説されている、9 個の大きな区分に分割されています。
perlfaq は標準 Perl 配布に含まれているので、Perl があれば perlfaq も
あるはずです。
perlfaq を読むには perldoc
ツールもあります:
$ perldoc perlfaq
ローカルシステムの他に、http://perldoc.perl.org/ などの web にも perlfaq はあります。
perlfaq は発展しつつある文書で、最新版は http://faq.perl.org/ で読めます。 perlfaq-workers は定期的に最新の perlfaq の抜粋を comp.lang.perl.misc に 投稿します。
ソースツリーは https://github.com/briandfoy/perlfaq で読めます (これはメインの Perl ソースツリー外です)。 git リポジトリは FAQ への全ての変更を記録して、作業中の最新のバージョンを 保持しているので、Perl の最新バージョンで配布されたものと大きく 異なっているかもしれません。 修正箇所を送る前にリポジトリをチェックしてください。
追加、修正、提案は <perlfaq-workers AT perl DOT org>
に
メールしてください。
perlfaq のボランティアはこのアドレスを、作業の協調と perlfaq 開発の
記録のために使っています。
彼らはあなたの FAQ に対する貢献に感謝していますが、個々の助けを提供する
時間はないので、FAQ を尋ねるのにこのアドレスを使わないでください。
perlfaq サーバは perlfaq の抜粋をニュースグループに 6 時間(ぐらい)毎に 投稿し、ボランティアのコミュニティが答えのレビューと更新を行います。 もし答えのレビューと更新を手伝いたいなら、comp.lang.perl.misc を 見てください。
また、perlfaq のための git リポジトリを fork して、pull 要求を出すことで 変更をメインリポジトリに取り込ませることもできます。 リポジトリは以下の場所にあります:
https://github.com/briandfoy/perlfaq
perlfaq-workers は、処理されつつある作業(および処理される必要がある 作業)が全員に見えるように、全てのトラフィックが perlfaq-workers リストに 流れることを好んでいます。 このメーリングリストは公式な記録となります。 もし作者やメンテナに直接メールすると、おそらく「メーリングリストに 投稿するように」という返信を受け取るでしょう。 返信を受け取らない場合、それはおそらくその人がメッセージを読んでいないか、 それを処理する時間がないことを意味します。 メーリングリストに投稿することで、他の人が忙しい時に、時間のある人が それを扱えるようになります。
もしこの FAQ にない質問があって、それに関する助けがほしいなら、 perlfaq2 にあるリソースを試してみてください。
Tom Christiansen が最初の perlfaq を書き、Nat Torkington の助けを借りて 拡張しました。 perlfaq-workers が現在の文書を保守し、comp.lang.perl.misc の住人が定期的に FAQ のレビューと更新を行っています。 何人かの人々が回答、訂正、コメントを提供し、perlfaq は適切なものは何でも これらの貢献を記録しています。
Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and other authors as noted. All rights reserved.
Tom Christainsen wrote the original version of this document.
brian d foy <bdfoy@cpan.org>
wrote this version. See the
individual perlfaq documents for additional copyright information.
This document is available under the same terms as Perl itself. Code examples in all the perlfaq documents are in the public domain. Use them as you see fit and at your own risk with no warranty from anyone.
Perl に関する非常に一般的で高レベルの質問。
Perlってなんですか?
だれが Perl をサポートしているのですか? 誰が開発しているのですか? なぜフリーなのでしょうか?
どのバージョンの Perl を使うべきなのでしょうか?
Perl 4, Perl 5, Perl 6 って何ですか?
Ponie って何ですか?
Perl 6 ってなんですか?
Perl はどのくらい安定しているのでしょうか?
Perl は学ぶのが難しいのでしょうか?
Java, Python, REXX, Scheme, Tcl といった他の言語と比べて Perl はどうなんでしょうか?
Perlで○○を行えますか?
Perl でプログラムするべきではないのはどういう場合ですか?
“perl”と“Perl”の違いはなんですか?
Perl プログラム、それとも Perl スクリプト?
JAPH ってなんですか?
Larry Wall の「お言葉」(witticisms) はどこで手に入れられますか?
他の人に、どうすれば Perl を使うように説得できるでしょうか?
Perl のソースや Perl に関するドキュメントが 手に入れられる場所に関する質問や、サポートとトレーニング、関連した 出来事に関する質問。
perl はどんなマシンで動きますか? どこで入手できますか?
バイナリ形式の perl はどうすれば入手できますか?
私は C コンパイラーを持っていません。どうすれば自分用の Perl インタプリタをビルドできますか?
perl のバイナリをあるマシンから別のマシンにコピーしたのだけど、スクリプトが動きませんでした
ソースを取ってきてコンパイルしようとしたのだけど、gdbm/dynamic loading/malloc/linking/... failed. となってしまった。動くようにするにはどうすればいいの?
Perlに使えるモジュールとかエクステンションってなんですか? CPAN ってなに? CPAN/src/... ってどういう意味なんですか?
ISO や ANSI で認証された Perl はあるの?
Perl に関する情報はどこで手に入れられますか?
Usenet にある Perl のニューズグループはなに? 質問はどこに投稿するの?
ソースコードはどこに投稿すべきなのですか?
Perl の書籍
Perl 関連の雑誌は?
Perlのためのメイリングリストって?
comp.lang.perl.misc のアーカイブはどこにありますか?
どこで商用版 perl を買うことができますか?
バグレポートはどこへ送るの?
perl.com, Perl Mongers, pm.org, perl.org, cpan.org ってなんですか?
プログラマーツールやプログラミングサポート。
○○をするにはどうすればいいの?
対話的に Perl を使うには?
Perl シェルはありますか?
自分のシステムに入っているモジュールを知るには?
私の Perl プログラムをデバッグするには?
私の Perl プログラムのプロファイルを取るには?
私の Perl プログラムのクロスリファレンスをとるには?
Perl 用のプリティプリンター(フォーマッター)はありますか?
Perl 用の ctags はありますか?
Perl の統合開発環境とか Windows Perl Editor はありますか?
vi 用の Perl マクロはどこで入手できますか?
emacs の perl-mode はどこで入手できますか?
Perl で curses を使うには?
Perl で GUI (X, Tk, Gtk など) を書くには?
私の Perl プログラムをもっと速くするには?
私の Perl プログラムのメモリ消費量を少なくするには?
ローカルやレキシカルなデータへのポインターを返すことは安全ですか?
配列やハッシュを解放して私のプログラムを小さくするには?
私の CGI スクリプトをもっと効率よくするには?
私の Perl プログラムのソースを隠すには?
私の Perl プログラムをバイトコードや C へコンパイルするには?
MS-DOS, NT, etc で '#!perl' が動作するようにするには?
コマンドライン上で便利な Perl プログラムを書けますか?
なぜ私の DOS/Mac/VMS システムでは一行野郎は動かないのでしょうか?
Perl による CGI や Web プログラミングについてどこで学べますか?
オブジェクト指向の Perl プログラミングはどこで学べますか?
C と Perl のリンクについてはどこで学べますか?
perlembed や perlguts なんかを読んだのだけど、私の C プログラムに perl を組み込めません。何が悪いのでしょうか?
私のスクリプトを実行したとき、こんなメッセージを受け取りました。これって何を意味しているのでしょうか?
MakeMaker ってなんですか?
数値、日付、文字列、配列、ハッシュその他の データの取り扱い。
なぜ 19.95 のような数字ではなく、19.9499999999999 のような長い数字が出てきたんでしょうか?
なぜ int()
は壊れているのでしょう?
なぜ私の 8 進データは正しく解釈されないのでしょうか?
Perl には丸め関数がありますか? ceil()
と floor()
とは何ですか? 三角関数は?
数値表現や基底や基数を変換するには?
なぜ & は私の思った通りに動作しないのでしょうか?
行列の積を計算するには?
整数値の並びに対してある操作を実行するには?
ローマ数字を出力するには?
なぜ私の乱数はランダムでないの?
X と Y の間の乱数を得るには?
その年の何日目であるかを知るには?
現在の世紀や千年紀を知るには?
二つの日付文字列を比較するには?
文字列を受け取って、それを紀元からの経過秒数に変換するには?
ユリウス日を求めるには?
昨日の日付を得るには?
Perl には 2000 年問題があるのですか? Perl は 2000 年対応ですか?
入力を検査するには?
文字列のアンエスケープ (unescape)をするには?
キャラクタの連続した組を取り除くには?
文字列中にある関数呼び出しを展開するには?
何かがマッチしている/ネストしているということを検出するには?
文字列をひっくり返すには?
文字列中にあるタブを展開するには?
段落を整形するには?
文字列の最初の N 文字にアクセスしたり、それを変更するには?
何かの N 番目のものを変更するには?
ある文字列の中に存在する部分文字列が何個あるのかを数えるには?
一行にあるすべての単語をキャピタライズするには?
(とある文字)の内側にある時を除き、(とある文字)で終端されている文字列を分割するには?
文字列の先頭や末尾にある空白を剥ぎ取るには?
文字列に空白をパッディングしたり、数値にゼロをパッディングしたりするには?
文字列から選択されたカラムを取り出すには?
文字列の soundex 値を見つけるには?
テキスト文字列の中にある変数を展開するには?
常にクォーティング "$vars" することの何が悪いの?
なぜ私の <<HERE ドキュメントがうまく動かないのでしょう?
リストと配列の差とはなんですか?
$array[1] と @array[1] との間の違いはなんですか?
配列やリストにある重複した要素を削除するには?
リストや配列の内容にある特定の要素があるかどうかを確かめるには?
二つの配列の差(difference)を求めるには? 二つの配列の共通要素(inter section)を求めるには?
二つの配列や二つのハッシュが等しいかどうかを検査するには?
ある条件が真となる最初の配列要素を見つけだすには?
リンク付きリストを扱うには?
循環リストを扱うには?
配列をランダムにかき混ぜるには?
配列の各要素に対する処理や、変更を行うには?
ある配列からランダムに要素を選択するには?
N 要素を持つリストの順列(permute)を求めるには?
(なにか)で配列をソートするには?
ビット配列を扱うには?
なぜ空の配列やハッシュに defined()
を使ったときに真が返ってくるのでしょう?
ハッシュ全体を処理するには?
二つのハッシュをマージするには?
ハッシュに対して反復操作を行っているときにキーの追加や削除をすると何が起きますか?
ハッシュの要素をその値で検索するには?
ハッシュにどれくらいの要素があるのを知るには?
ハッシュを(キーではなく値で)ソートするには?
私のハッシュを常にソートされた状態にしておくには?
ハッシュに対する "delete" と "undef"との間の違いは?
なぜわたしの tie されたハッシュは defined と exists を区別しないのでしょうか?
each()
操作の途中でリセットしてしまうには?
二つのハッシュからユニークなキーを取りだすには?
DBM ファイルに多次元配列を格納するには?
わたしのハッシュが格納した順番を覚えておくようにするには?
なぜあるハッシュの未定義要素をサブルーチンに渡すとそれを作成するのでしょうか?
C の構造体/C++ のクラスのハッシュ、配列のハッシュ、配列と等価なものを Perl で作成するには?
ハッシュのキーとしてリファレンスを使うには?
バイナリデータを正しく扱うには?
あるスカラ値が数値/整数/浮動小数点数かどうかを決定するには?
プログラムの呼び出しの間に、データ構造を永続的に保持するには?
再帰的なデータ構造を出力したりコピーするには?
すべてのクラス/オブジェクトのためのメソッドを定義するには?
クレジットカードのチェックサムを検査するには?
XSプログラムのために倍精度実数や単精度実数の配列を pack するには?
入出力と“f”に関する事柄: ファイルハンドル (filehandle)、フラッシング(flushing)、フォーマット(format)、 フッター(footer)。
出力ファイルハンドルを flush/unbufferするには? なぜ私はこれをやらなければならないの?
ファイルの一行を変更する/ファイルのある行を削除する/ファイルの中程で一行挿入する/ファイルの先頭に追加するには?
あるファイルの行数を数えるには?
プログラム内から Perl の -i
オプションを使うには?
ファイルをコピーするには?
一時ファイルの名前を作り出すには?
固定長レコードのファイルを操作するには?
ファイルハンドルをサブルーチンに局所化するには? サブルーチンにファイルハンドルを渡すには? ファイルハンドルの配列を作るには?
ファイルハンドルを間接的に扱うには?
write()と一緒に使うフッターのフォーマットのセットアップをする方法は?
文字列に対して write()
するには?
ファイルハンドルを文字列としてオープンするには?
出力する数字にカンマを付加するには?
ファイル名の中にあるチルダ (~) を変換するには?
ファイルを読み書きモードでオープンしたときに内容をクリアしてしまうのはなぜ?
なぜ <*> を使ったときに "Argument list too long" (引数リストが長すぎる)となることがあるの?
glob()に leak/bug はあるの?
名前の先頭に">"があったり末尾に空白があるようなファイルをオープンするには?
信頼性のあるファイルのリネームをするには?
ファイルをロックするには?
なぜ単に open(FH, ">file.lock")とできないの?
まだロックができません。ただ単にファイルにある数値をインクリメントしたいだけなんだけど。どうすればいいの?
ファイルの末尾にちょっとしたテキストを追加したいだけなんです。それでもロックが必要なの?
バイナリファイルをランダムに更新するには?
perl でファイルのタイムスタンプを取得するには?
perl でファイルのタイムスタンプを設定するには?
複数のファイルを一度に表示するには?
ファイル全体を一度に読みこむには?
ファイルをパラグラフ毎に読み込むには?
ファイルから 1 文字だけ読み出すには? キーボードからは?
あるファイルハンドルが読み込み待ちの文字を待っているかどうかを知るには?
perlで tail -f
をするには?
Perl でファイルハンドルの dup()
をするには?
数値によるファイル記述子をクローズするには?
なぜ DOS のパスで "C:\temp\foo" が使えないの? なぜ `C:\temp\foo.exe` はうまくいかないの?
なぜ glob("*.*") で全てのファイルを得られないの?
なぜ Perl は読みとり専用ファイルを削除してしまうの? なぜ-i
clobberはファイルをプロテクトするの? これは Perl のバグじゃないの?
あるファイルからランダムに行を選択するには?
行の配列を出力したときになぜ余計なスペースがつくの?
ディレクトリツリーを辿るには?
ディレクトリツリーを削除するには?
ディレクトリ全体をコピーするには?
この章は驚くほど小さくなっています。 なぜならFAQの残りの部分は 正規表現を伴った回答と一緒にあちこちに散在しているからです。 たとえばURLをデコードするとかあるものが数値かどうか確認することは 正規表現を使って処理されますが、この回答はこの資料のあらゆる所で 見つけることができます(正確には perlfaq9: "How do I decode or create those %-encodings on the web" と perlfaq4: "How do I determine whether a scalar is a number/whole/integer/float")。
判読し難い、保守できないようなものにすることなく正規表現を使うには?
二行以上に対するマッチングでトラブルがありました。何が悪いのでしょう?
異なる行にある二つのパターンに挟まれている行を取り出すのはどうやればできますか?
XML, HTML あるいはその他の扱いにくくて不細工なものを正規表現でマッチングさせるには?
$/ に正規表現を入れたけど動きません。何が悪いの?
演算子の左辺では大小文字を無視して、演算子の右辺では元の大小文字を保存しておくような置換をするには?
\w
がローカルな文字セットにマッチするようにするには?
/[a-zA-Z]/
の locale-smart なバージョンでマッチさせるには?
正規表現の中で使う変数をクォートするには?
/o
は実際なんのためのものなのですか?
ファイルから、C 形式のコメントを剥ぎ取る(strip)するにはどのように正規表現を使えば良いのでしょうか?
Perl の正規表現をバランスされたテキストのマッチングに使えますか?
正規表現が貪欲(greedy)であるとはどういうことですか?
各行の単語単位に処理をするにはどうすれば良いですか?
語の出現頻度や行の出現頻度のまとめを出力するには?
曖昧なマッチング (approximate matching) はどうやればできますか?
たくさんの正規表現を一度に効率良くマッチングするには?
なぜ \b
を使った単語境界の検索がうまく行かないのでしょうか?
なぜ $&, $`, $' を使うとプログラムが遅くなるの?
正規表現の中で \G
を使うと何が良いのですか?
Perl の正規表現ルーチンは DFA ですか NFA ですか? また、それは POSIX に従ってますか?
無効コンテキストで grep を使うことのどこが間違っているのでしょうか?
マルチバイト文字を含む文字列をマッチングさせるには?
変数に入っている正規表現でマッチングを行うには?
他のセクションにはきっちりとあてはまらないような Perl 言語に関する一般的な事柄。
Perl のための BNF/yacc/RE は入手できますか?
$@%&* のマークはなんですか? これらをいつ使えばいいのかを知るにはどうすればいいですか?
文字列では常にクォートする/決してクォートしない必要があるのでしょうか? また、セミコロンやカンマについては?
戻り値の一部をスキップするには?
一時的に警告をブロックするには?
エクステンションてなんですか?
なぜ Perl の演算子は C の演算子とは異なった優先順位を持っているのでしょうか?
構造体を宣言したり生成するには?
モジュールを作成するには?
すでに CPAN にあるモジュールを引き継ぐには?
クラスを作るには?
変数が汚染されているかどうかを確かめるには?
クロージャ(closure)ってなんですか?
変数の自殺(variable suicide)って何で、それをどうすれば防げますか?
{関数, ファイルハンドル, 配列, ハッシュ, メソッド, 正規表現} を渡したり返したりするには?
静的変数を作るには?
動的スコープとレキシカル(または静的)スコープとの間の違いは? local()
と my()
との違いは?
どうやれば同じ名前のレキシカル変数がスコープにあるときに動的変数にアクセスできますか?
深い束縛(deep binding)と浅い束縛(shallow binding)との間の違いとは?
なぜ "my($foo) = <FILE>;" が正しく動作しないのでしょうか?
組み込みの関数や演算子、メソッドを再定義するには?
関数呼び出しを &foo で行ったときと foo()
で行ったときとの違いはなんですか?
switch 文や case 文を作るには?
どうすれば未定義な変数, 関数, メソッドに対するアクセスを捕捉できますか?
なぜ同じファイルにあるメソッドが見つけられないのでしょうか?
カレントのパッケージや呼び出しパッケージはどうすればわかりますか?
Perl プログラムの大きなブロックをコメントアウトするには?
パッケージをクリアするには?
変数を変数名として使うには?
"bad interpreter" とはどういう意味ですか?
FAQ のこのセクションでは、オペレーティングシステムとの対話に関する質問を 扱っています。 これにはプロセス間(IPC)、ユーザーインターフェース (キーボード、スクリーン、ポインティングデバイス)の制御、 その他データ操作に関連しないほとんどの事柄を含みます。 あなたの使っているオペレーティングシステム向けの移植について特有のことは、 それに関する FAQ とドキュメント(perlvms, perlplan9 など)を 読んでください。 そこには、あなたの使う perl についてのより詳しい情報があります。
実行しているオペレーティングシステムを見分けるには?
なぜ exec()
は戻ってこないのでしょう?
キーボード/画面/マウスの凝った機能を使うには?
色付きで何かを出力するには?
リターンキーを待たずにキーのデータを一つ読み取るには?
キーの入力待ちがあるかどうかチェックするには?
画面をクリアするには?
画面サイズを得るには?
ユーザーにパスワードを尋ねるには?
シリアルポートの読み書きを行うには?
暗号化されたパスワードファイルを復号化するには?
バックグラウンドでプロセスを起動するには?
制御文字やシグナルをトラップするには?
UNIX システムのシャドウパスワードファイルを変更するには?
日付や時刻を設定するには?
一秒未満の時間に対する sleep()
や alarm()
をするには?
1 秒未満の時間を計るには?
atexit()
や setjmp()/longjmp() をするには? (例外処理)
なぜ私のソケットプログラムはSystem V (Solaris) ではうまく動かないの? "Protocol not supported"というエラーメッセージの意味するところは?
Perl から私のシステムに固有の C 関数を呼び出すには?
ioctl()
や syscall()
で使うための include ファイルはどこで入手できますか?
なぜ setuid された perl スクリプトはカーネルの問題について文句を言うのでしょうか?
あるコマンドに対する双方向のパイプをオープンするには?
なぜ system()
を使ったコマンドの出力を得ることができないのでしょうか?
外部コマンドの STDERR を捕捉するには?
なぜ open()
は パイプのオープンに失敗したときにエラーを返さないのでしょうか?
無効コンテキストで逆クォートを使うことのなにが悪いのでしょうか?
シェルの処理をせずに逆クォートを呼び出すには?
なぜ EOF(UNIX での^D、MS-DOS での^Z)を受け取った後で STDIN から読み込むことができないの?
私のシェルスクリプトを perl に変換するには?
telnet や ftp のセッションを実行するために perl を使うことができますか?
Perl で expect を書くには?
“ps”のようなプログラムから、perl のコマンドラインを隠す方法はありますか?
perl スクリプトの中で、ディレクトリを変更したり環境変数を変更しました。なぜ、スクリプトを終了したときこれらの変更は無効になってしまうの? 変更が反映されるようにするには?
プロセスの完了を待つことなしにそのファイルハンドルをクローズするには?
デーモンプロセスを fork()
するには?
自分が対話的に実行されているかどうかを知るには?
遅いイベントをタイムアウトするには?
CPU のリミットを設定するには?
UNIX システムでゾンビを回避するには?
SQL データベースを使うには?
コントロール-C で system()
が exit するようにするには?
ブロックせずにファイルをオープンするには?
シェルからと perl からのエラーを見分けるには?
モジュールを CPAN からインストールするには?
require と use の間の違いとは?
自分自身のモジュール/ライブラリディレクトリを持つには?
私のプログラムの置いてある場所をモジュール/ライブラリの検索パスに追加するには?
実行時にインクルードパス (@INC) にディレクトリを追加するには?
socket.ph とは一体何で、それはどこで入手できますか?
ネットワーク、インターネット、web 関連。
CGI スクリプトからの返答の正しい形は?
(私の CGI スクリプトはコマンドラインでは動くのだけど、ブラウザ上では動きません (500 Server Error になります))
CGI プログラムから、もっとまともなエラーメッセージを得るには?
ある文字列から HTML を取り除くには?
URL の展開を行うには?
ユーザーのマシンからファイルをダウンロードするには? 別のマシンにあるファイルをオープンするには?
Perl で HTML のポップアップメニューを作るには?
HTML ファイルをフェッチするには?
HTML フォームの処理を自動化するには?
web上で %-encodings をデコードしたり生成したりするには?
別のページにリダイレクトするには?
私の web ぺージでパスワードを入力するには?
Perl を使って .htpasswd や .htgroup といったファイルを編集するには?
私の CGI スクリプトに悪影響をもたらすようなものを、ユーザーがフォームに入力できないようにするには?
メールのヘッダーを解析するには?
CGI フォームをデコードするには?
メールアドレスが正しいかチェックするには?
MIME/BASE64 文字列のデコードを行うには?
ユーザーのメールアドレスを返すには?
メールを送るには?
メールメッセージに添付するためにどうやって MIME を使えばいいですか?
メールを読み出すには?
私のホスト名/ドメイン名/IP アドレスを見つけるには?
ニュースの記事やアクティブなニュースグループを取得するには?
FTP ファイルをダウンロード/アップロードするには?
Perl で RPC を行うには?