これは、Ubuntu Online、Fedora Online、Windowsオンラインエミュレーター、MACOSオンラインエミュレーターなどの複数の無料オンラインワークステーションの8つを使用してOnWorks無料ホスティングプロバイダーで実行できるコマンドperlfaqXNUMXです。
プログラム:
NAME
perlfaq8 - システム相互作用
VERSION
バージョン5.021009
DESCRIPTION
Perl FAQ のこのセクションでは、オペレーティング システムの相互作用に関する質問について説明します。
トピックには、プロセス間通信 (IPC)、ユーザー インターフェイスの制御が含まれます。
(キーボード、スクリーン、ポインティング デバイス)、およびデータに関係しないその他ほとんどすべて
操作。
お使いのオペレーティングシステムへの Perl の移植に関する FAQ とドキュメントをお読みください (例:
perlvms、perlplan9など)。これらには、変動に関するより詳細な情報が含まれているはずです。
あなたの perl の。
認定条件 do I find でる which オペレーティング アイム ランニング 下?
$^O変数(「英語」を使用する場合は$OSNAME)には、
Perl バイナリがビルドされたオペレーティング システム (リリース番号ではありません)。
認定条件 来ます exec() しない 戻る?
(ブライアン・ド・フォイによる寄稿)
「exec」関数の役割は、プロセスを別のコマンドに変換することであり、
戻ります。もしそうしたくないのであれば、「exec」は使わないでください。 :)
外部コマンドを実行してもPerlプロセスを継続したい場合は、
パイプされた "open"、"fork"、または "system"。
認定条件 do I do ファンシー スタッフ キーボード/画面/マウス?
キーボード、画面、ポインティングデバイス(マウス)へのアクセス/制御方法はシステムによって異なり、
依存します。次のモジュールを試してください。
キーボード
Term::Cap 標準 Perl ディストリビューション
Term::ReadKey CPAN
Term::ReadLine::Gnu CPAN
Term::ReadLine::Perl CPAN
Term::Screen CPAN
画面
Term::Cap 標準 Perl ディストリビューション
Curses CPAN
用語::ANSIColor CPAN
マウス
Tk CPAN
Wx CPAN
Gtk2 CPAN
Qt4 kdebindings4 パッケージ
これらの具体的な事例のいくつかは、このセクションの他の回答で例として示されています。
パールFAQ。
認定条件 do I 印刷 何か でる in 色?
一般的には、受信者が色認識機能を持っているかどうかわからないため、
ディスプレイデバイス。色を認識するANSI端末を持っていることがわかれば、
CPANからTerm::ANSIColorモジュールを使用することができます。
Term::ANSIColor を使用します。
print color("red"), "Stop!\n", color("reset");
print color("green"), "Go!\n", color("reset");
またはこのように:
Term::ANSIColor qw(:constants); を使用します。
RED、"Stop!\n"、RESET を印刷します。
緑色を印刷、「Go!\n」、リセット;
認定条件 do I read ただ XNUMXつ キー 無し 待ち望ん の a return キー?
入力バッファリングの制御はシステムに大きく依存します。多くのシステムでは、
使うだけで スティ perlfuncの「getc」で示されているコマンドですが、ご覧のとおり、
すでに携帯性の問題に陥っています。
開く(TTY, "+
システム「stty cbreak」 /dev/tty 2>&1";
$key = getc(TTY); # おそらくこれでうまくいくでしょう
# さもなければ
sysread(TTY, $key, 1); # おそらくこれで
システム "stty -cbreak /dev/tty 2>&1";
CPANのTerm::ReadKeyモジュールは、より使いやすいインターフェースを提供します。
お金を払うよりも効率的 スティ 各キーごとに限定的にサポートされています
ウィンドウズ。
Term::ReadKey を使用します。
読み取りモード('cbreak');
$キー = 読み取りキー(0);
読み取りモード('通常');
ただし、コードを使用するには、Cコンパイラが動作し、それを使用できることが必要です。
CPANモジュールをビルドしてインストールします。標準のPOSIXモジュールを使った解決策は次のとおりです。
すでにシステムにインストールされています (システムが POSIX をサポートしていると仮定します)。
ホットキーを使用します。
$key = readkey();
そして、ここには「ホットキー」モジュールがあり、これは操作するためのやや不可解な呼び出しを隠します
POSIX termios 構造体。
# ホットキー.pm
パッケージ HotKey;
厳格な使用;
警告を使用します。
親「Exporter」を使用します。
our @EXPORT = qw(cbreak cooked readkey);
POSIX qw(:termios_h) を使用します。
私の ($term、$oterm、$echo、$noecho、$fd_stdin);
$fd_stdin = ファイル番号(STDIN);
$term = POSIX::Termios->new();
$term->getattr($fd_stdin);
$oterm = $term->getlflag();
$エコー = エコー | エチョック | イカノン。
$noecho = $oterm & ~$echo;
サブブレーク {
$term->setlflag($noecho); # よし、エコーも不要だ
$term->setcc(VTIME, 1);
$term->setattr($fd_stdin, TCSANOW);
}
サブ調理済み{
$term->setlflag($oterm);
$term->setcc(VTIME, 0);
$term->setattr($fd_stdin, TCSANOW);
}
サブリードキー{
私の $key = '';
cbreak();
sysread(STDIN, $key, 1);
調理済み();
$key を返します。
}
END {調理済み() }
1;
認定条件 do I PowerSchoolで、緊急連絡先情報を定期的にチェックし、 かどうか is 準備 on キーボード?
これを行う最も簡単な方法は、Term::ReadKeyを使用して非ブロッキングモードでキーを読み取ることです。
CPAN からモジュールを取得し、ブロックしないことを示すために引数 -1 を渡します。
Term::ReadKey を使用します。
読み取りモード('cbreak');
もし(定義済み(私の$char = ReadKey(-1))){
# 入力が待機中であり、$charでした
場合} else {
# 入力待ちはありませんでした
}
ReadMode('normal'); # 通常のtty設定を復元する
認定条件 do I クリア 画面?
(ブライアン・ド・フォイによる寄稿)
画面をクリアするには、端末に伝える特別なシーケンスを出力するだけです。
画面をクリアします。このシーケンスを取得したら、画面をクリアしたいときに出力します。
を選択して、後処理画面に進みます。
特殊シーケンスを取得するには、Term::ANSIScreenモジュールを使用します。「cls」をインポートします。
関数(または「:screen」タグ):
Term::ANSIScreen qw(cls) を使用します。
私の$clear_screen = cls();
$clear_screen を印刷します。
Term::Capモジュールは、低レベルの処理をしたい場合に特別なシーケンスを取得することもできます。
端末制御の詳細レベル。「Tputs」メソッドは指定された文字列を返します。
容量:
Term::Cap; を使用します。
私の$terminal = Term::Cap->Tgetent( { OSPEED => 9600 } );
私の$clear_string = $terminal->Tputs('cl');
$clear_screen を印刷します。
Windowsでは、Win32::Consoleモジュールを使用できます。出力用のオブジェクトを作成した後、
影響を与えたいファイルハンドルを指定するには、「Cls」メソッドを呼び出します。
Win32::コンソール;
私の$OUT = Win32::Console->new(STD_OUTPUT_HANDLE);
私の$clear_string = $OUT->Cls;
$clear_screen を印刷します。
同じ機能を実行するコマンドラインプログラムがある場合は、バッククォートで呼び出して
出力されたものをキャプチャして、後で使用するようにします。
私の $clear_string = `clear`;
$clear_string を印刷します。
認定条件 do I 取得する screen サイズ?
CPANからTerm::ReadKeyモジュールをインストールしている場合は、それを使って幅を取得できます。
文字数とピクセル数での高さ:
Term::ReadKey を使用します。
私の ($wchar、$hchar、$wpixels、$hpixels) = GetTerminalSize();
これは生の「ioctl」よりも移植性に優れていますが、説明的ではありません。
「sys/ioctl.ph」が必要です。
&TIOCGWINSZ; が定義されていない限り、die "no TIOCGWINSZ "
開く(私の$tty_fh, "+
(ioctl($tty_fh, &TIOCGWINSZ, $winsize='') がない限り {
die sprintf "$0: ioctl TIOCGWINSZ (%08x: $!)\n", &TIOCGWINSZ;
}
私の ($row、$col、$xpixel、$ypixel) = unpack('S4'、$winsize);
"(row,col) = ($row,$col)" と出力します。
$xpixel || $ypixel の場合は " (xpixel,ypixel) = ($xpixel,$ypixel)" と出力します。
"\n" を印刷します。
認定条件 do I 頼む user の a パスワード?
(この質問は Web とは関係ありません。その点については別の FAQ を参照してください。)
この例はperlfuncの「crypt」にあります。まず、端末を「no」に設定します。
echoモードの場合は、通常通りパスワードを読み上げます。これは古い形式の
「ioctl()」関数、POSIX端末制御(POSIXまたはそのドキュメントCamelを参照)
予約、または スティ 移植性の程度がさまざまなプログラム。
CPANのTerm::ReadKeyモジュールを使えば、ほとんどのシステムでこれを行うことができます。
使いやすく、理論的にはよりポータブルになります。
Term::ReadKey を使用します。
読み取りモード('noecho');
私の$パスワード = 読み込まれた行(0);
認定条件 do I read 書きます シリアル ポート?
これは、プログラムがどのオペレーティングシステムで実行されているかによって異なります。Unixの場合、
シリアルポートは「/ dev"; 他のシステムでは、デバイス
名前は間違いなく異なるでしょう。すべてのデバイスインタラクションに共通するいくつかの問題領域は
以下
ロックファイル
システムは多重アクセスを制御するためにロックファイルを使用している可能性があります。
正しいプロトコル。複数のプロセスが読み取ると、予期しない動作が発生する可能性があります。
1 つのデバイスから。
オープンモード
デバイスで読み取りと書き込みの両方の操作を行う場合は、
更新のために開いてください(詳細はperlfuncの「open」を参照してください)。
「sysopen()」と「O_RDWR|O_NDELAY|O_NOCTTY」を使用するとブロックされるリスクがあります。
Fcntlモジュール(標準Perl配布物の一部)。perlfuncの「sysopen」を参照。
このアプローチの詳細については、こちらをご覧ください。
行末
一部のデバイスでは、各行の末尾に「\n」ではなく「\r」が期待されます。
Perlの一部のポートでは、「\r」と「\n」は通常の(Unix)ASCII値とは異なります
「\015」と「\012」のように、必要な数値を直接指定する必要があるかもしれません。
015 進数 ("\0")、0 進数 ("XNUMXxXNUMXD")、または制御文字指定 ("\cM") として指定します。
print DEV "atv1\012"; # 一部のデバイスでは間違っている
print DEV "atv1\015"; # 正しい、一部のデバイスの場合
通常のテキストファイルでは「\n」で十分ですが、統一された
Unix、DOS/Win、Macintosh間で移植可能な行の終端方法
終了する場合を除き 全て 行は「\015\012」で終わり、不要な部分を削除します。
出力。これは特にソケットI/Oと自動フラッシュに当てはまります(次で説明します)。
出力のフラッシュ
「print()」したときに文字がデバイスに届くことを期待する場合は、
そのファイルハンドルを自動フラッシュします。「select()」と$|変数を使って制御できます。
自動フラッシュ(perlvarの「$|」とperlfuncの「select」、またはperlfaq5の「
出力ファイルハンドルをフラッシュ/アンバッファリングしますか?なぜこれをしなければならないのですか?"):
私の$old_handle = select($dev_fh);
$| = 1;
$old_handle を選択します。
一時変数を使わずにこれを行うコードも見られます。
選択します((選択します($deb_handle), $| = 1)[0]);
あるいは、数千行のコードを取り込んでも構わないのであれば、
ちょっとした$|変数が怖い:
IO::ハンドルを使用します。
$dev_fh->自動フラッシュ(1);
前の項目で述べたように、ソケットI/Oを使用する場合、これはまだ機能しません。
UnixとMacintoshの間では、行末文字をハードコードする必要がある。
場合。
非ブロッキング入力
ブロッキングの「read()」または「sysread()」を実行する場合は、
タイムアウトを提供するアラームハンドラ(perlfuncの「alarm」を参照)。
ブロックオープンの場合は、非ブロック読み取りになる可能性が高いため、
4つの引数を持つ「select()」は、そのデバイスでI/Oが準備できているかどうかを判定します(「select」を参照)。
perlfunc。
悪名高いジェイミー・ザウィンスキーは、発信者番号ボックスから読み上げようとした際に
"<[メール保護]>、歯ぎしりしながら「sysread」、「sysopen」と格闘した後、
POSIXの「tcgetattr」機能や、夜中に発生する様々な他の関数、
最終的にこうなりました:
サブオープンモデム{
IPC::Open2 を使用します。
私の$stty = `/ bin / stty -g`;
open2( \*MODEM_IN, \*MODEM_OUT, "cu -l$modem_device -s2400 2>&1");
# cu は /dev/tty の stty 設定を、たとえ
# パイプ上で開かれました...
システム("/ bin / stty $stty");
$_ = ;
ムシャムシャ。
if ( !m/^接続済み/ ) {
STDERR を印刷します "$0: cu は `Connected' の代わりに `$_' を印刷しました\n";
}
}
認定条件 do I デコード では使用できません password ファイル?
専用のハードウェアに多額のお金を費やしても、これで
について話しました。
真面目な話、Unixのパスワードファイルの場合はそれは不可能です。Unixのパスワードシステムでは、
一方向暗号化です。暗号化というよりはハッシュ化に近いです。できる最善のことは確認することです。
他のハッシュが同じ文字列になるかどうか。ハッシュを元の文字列に戻すことはできない。
元の文字列。Crackのようなプログラムは強制的に(そして賢く)推測しようとする。
パスワードは役立ちますが、すぐに成功することは保証できません。
ユーザーが間違ったパスワードを選択するのではないかと心配な場合は、
パスワードを変更しようとする( passwd(例えば1)。
認定条件 do I start a プロセス in バックグラウンド?
(ブライアン・ド・フォイによる寄稿)
バックグラウンドでコードを実行する方法は一つもないので、
プログラムが他のタスクに移る前に終了する。プロセス管理は、
特定のオペレーティング システムでは、多くのテクニックが perlipc で説明されています。
IPC::Open2やIPC::Open3、IPC::Runなど、いくつかのCPANモジュールが役に立つかもしれません。
Parallel::Jobs、Parallel::ForkManager、POE、Proc::Background、Win32::Processがあります。
他にも使用できるモジュールは多数あるため、他のオプションについてはそれらの名前空間も確認してください。
Unix系システムの場合は、システムコールで回避できるかもしれません。
コマンドの最後に「&」を付けます。
システム("cmd &")
perlfuncで説明されているように、「fork」を使うこともできます(これは同じことですが
多くのモジュールでそれが実現できます。
STDIN、STDOUT、STDERRは共有されます
メインプロセスとバックグラウンドプロセス(「子」プロセス)の両方が同じ
STDIN、STDOUT、STDERRのファイルハンドル。両方が同時にアクセスしようとすると、奇妙な結果になる。
何かが起こる可能性があります。お子様のために、これらの項目を閉じたり、再度開いたりすることをお勧めします。
これをパイプの「open」で回避する(perlfuncの「open」を参照)が、一部のシステムでは
子プロセスが親プロセスより長く存続できないことを意味します。
シグナル
SIGCHLDシグナルをキャッチする必要があります。また、SIGPIPEもキャッチする必要があるかもしれません。SIGCHLDは送信されます。
バックグラウンドプロセスが終了したとき。SIGPIPEはファイルハンドルに書き込むときに送信されます。
子プロセスが閉じている(トラップされていないSIGPIPEによりプログラムが
静かに終了します)。これは、「system("cmd&")」の問題ではありません。
ゾンビ
子プロセスが終了したら、それを「刈り取る」準備をする必要があります。
$SIG{CHLD} = サブ { 待機 };
$SIG{CHLD} = '無視';
ダブルフォークを使うこともできます。最初の子をすぐに「wait()」し、
init デーモンは、終了すると孫プロセスを「wait()」します。
($pid = fork) でない限り{
(フォーク) {
「本当にやりたいこと」を実行する。
die "exec 失敗しました!";
}
0を終了します。
}
waitpid($pid, 0);
これを行うための他のコード例については、perlipcの「Signals」を参照してください。ゾンビは
「system("prog &")」の問題。
認定条件 do I トラップ コントロール 文字/信号?
制御文字を実際に「トラップ」するわけではありません。その代わりに、その文字はシグナルを生成します。
これは端末の現在フォアグラウンドのプロセスグループに送信され、その後トラップされます。
プロセス内でシグナルはperlipcの「シグナル」と
ラクダの「シグナル」。
%SIG ハッシュの値を、シグナルを処理する関数に設定できます。
perlがシグナルをキャッチした後、%SIG内で同じ名前のキーを探します。
シグナルを受信し、そのキーのサブルーチン値を呼び出します。
# 匿名サブルーチンとして
$SIG{INT} = sub { syswrite(STDERR, "ouch\n", 5 ) };
# または関数への参照
$SIG{INT} = \&ouch;
# または関数名を文字列として
$SIG{INT} = "痛い";
Perlバージョン5.8より前のバージョンでは、Cソースコードにシグナルハンドラがあり、
シグナルを送信し、%SIGに設定したPerl関数を実行する可能性があります。これはルール違反です。
そのレベルのシグナル処理では、Perlがコアダンプを出力します。バージョン5.8.0以降、Perlは
%SIGを見る After 信号がキャッチされている途中ではなく、キャッチされた直後です。
この回答の以前のバージョンは間違っていました。
認定条件 do I 修正する 影 password file on a Unixの システム?
Perlが正しくインストールされ、シャドウライブラリが適切に記述されている場合、
perlfuncで説明されている「getpw*()」関数は、理論上は(読み取り専用)アクセスを提供するはずです。
シャドウパスワードファイル内のエントリ。ファイルを変更するには、新しいシャドウパスワードファイルを作成します。
(フォーマットはシステムによって異なります。 passwd(1)具体的には pwd_mkdb(8)
インストールするには( pwd_mkdb詳細については (8) を参照してください)。
認定条件 do I セッションに 時間 日付?
十分な権限で実行している場合は、
システム全体の日付と時刻を変更するには、 date(1)プログラム。(時間を設定する方法はありません
このメカニズムはUnix、MS-DOS、Windows、および
NT では、VMS では「set time」に相当します。
しかし、タイムゾーンを変更するだけであれば、おそらく
環境変数の設定:
$ENV{TZ} = "MST7MDT"; # Unix風
$ENV{'SYS$TIMEZONE_DIFFERENTIAL'}="-5" # 仮想マシン
システム('trn'、'comp.lang.perl.misc')。
認定条件 できる I 睡眠() or 警報() の 下 a 2番目?
「sleep()」関数が提供する1秒よりも細かい粒度が必要な場合は、
最も簡単な方法は、perlfuncの「select」に記載されている「select()」関数を使うことです。
Time::HiRes と BSD::Itimer モジュール(CPAN から入手可能、Perl から開始)
5.8 Time::HiRes は標準配布の一部です。
認定条件 できる I だけど 時間 下 a 2番目?
(ブライアン・ド・フォイによる寄稿)
Time::HiResモジュール(Perl 5.8の標準配布の一部)は時間を測定します。
「gettimeofday()」システムコールは、
epoch。古いPerl用のTime::HiResをインストールできず、Unix系システムを使用している場合は、
電話をかけることができるかもしれません 今日の時間を取得する(2)直接呼び出します。perlfuncの「syscall」を参照してください。
認定条件 できる I do an atexit() or setjmp()/longjmp()? (例外 取り扱い)
「END」ブロックを使って「atexit()」をシミュレートすることができます。各パッケージの「END」ブロックは
プログラムまたはスレッドが終了するとき。「END」の詳細についてはperlmodのマニュアルページを参照してください。
ブロック。
例えば、これを使用して、フィルタプログラムが正常に完了したかどうかを確認できます。
ディスクをいっぱいにせずに出力します:
終わり {
close(STDOUT) || die "stdout のクローズに失敗しました: $!";
}
しかし、捕捉されていないシグナルがプログラムを終了させた場合には「END」ブロックは呼び出されないので、
「END」ブロックも使用してください
sigtrap qw(die normal-signals); を使用します。
Perlの例外処理機構は「eval()」演算子です。「eval()」は次のように使用できます。
「setjmp」と「die()」を「longjmp」として扱います。詳細については、シグナルに関するセクションを参照してください。
特に、perlipcの「Signals」のブロッキング「flock()」のタイムアウトハンドラや、
「信号」のセクション プログラミング パール.
例外処理だけに興味があるなら、CPANモジュールの1つを使用してください。
Try::Tiny などの例外を処理します。
「atexit()」構文(および「rmexit()」も)が必要な場合は、「AtExit」モジュールを試してください。
CPANから入手可能です。
Why しない my ソケット プログラム 下 システム V (ソラリス)? この試験は ありません エラー メッセージ
"プロトコル サポートされている" 平均?
Solaris 2.XなどのSys-Vベースのシステムでは、標準ソケットの一部が再定義されました。
定数。これらはすべてのアーキテクチャで一定であったため、ハードワイヤードされることが多かった。
Perlコードに挿入します。適切な対処法は「use Socket」を使って正しい値を取得することです。
値。
SunOS と Solaris はバイナリ互換性がありますが、これらの値は異なることに注意してください。
図を移動します。
認定条件 できる I コール my システムの ユニーク C 機能 from Perl?
ほとんどの場合、外部モジュールを作成して実行します。「どこで学習できますか?」の回答を参照してください。
CとPerlのリンクについて?[h2xs、xsubpp]"。ただし、関数がシステムコールの場合、
システムが「syscall()」をサポートしている場合は、「syscall」関数(
perlfunc)。
ディストリビューションに付属するモジュールとCPANも必ず確認してください。
すでにそれを実行するモジュールが書かれているかもしれません。WindowsではWin32::APIを試してください。Macでは
Mac::Carbon。C関数へのインターフェースを持つモジュールがない場合は、Cのコードを少しインライン化することができます。
Inline::C を使用した Perl ソース。
場所 do I 取得する include ファイル 〜へ do ioctl() or syscall()?
歴史的には、これらは標準のPerlの一部であるh2phツールによって生成されていました。
分布。このプログラムは cpp(1)Cヘッダーファイル内のファイルへのディレクティブ
引数として使用できる「SYS_getitimer()」のようなサブルーチン定義を含む
関数に追加してください。完璧に動作するわけではありませんが、大抵の場合、ほとんどの作業は完了します。
次のような単純なファイル エラー番号.h, システムコール.h, ソケット.h 大丈夫だったけど、難しいのは
ioctl.h ほとんどの場合、手動で編集する必要があります。*.phファイルのインストール方法は次のとおりです。
1. スーパーユーザーになる
2.cd / usr / include
3. h2ph *.h */*.h
システムが動的ロードをサポートしている場合、移植性と健全性のために
おそらくh2xs(これも標準Perlディストリビューションの一部)を使うべきでしょう。このツールは
CヘッダーファイルをPerl拡張モジュールに変換します。使い方についてはperlxstutを参照してください。
h2xs。
システムが動的ロードをサポートしていない場合でも、h2xsを使用する必要があるでしょう。
詳細についてはperlxstutとExtUtils::MakeMakerを参照してください(簡単に言うと、 make パール
平野の代わりに make 新しい静的拡張機能を使用して perl を再構築します。
Why do setuid パール スクリプト 文句を言う 自己紹介 kernel 問題?
一部のオペレーティングシステムではカーネルにバグがあり、setuidスクリプトが本質的に
安全ではありません。Perlは、このような状況を回避するためのいくつかのオプション(perlsecで説明)を提供しています。
システム。
認定条件 できる I 開いた a パイプ 両言語で 〜へ from a コマンド?
IPC::Open2モジュール(標準Perlディストリビューションの一部)は使いやすいアプローチです
内部的には「pipe()」「fork()」「exec()」を使って処理を実行します。
ただし、ドキュメントにはデッドロックの警告が記載されています(IPC::Open2を参照)。「双方向
perlipcの「他のプロセスとの通信」と「他のプロセスとの双方向通信」
perlipc の「Yourself」
IPC::Open3モジュール(標準Perlディストリビューションの一部)を使用することもできますが、
IPC::Open2 とは引数の順序が異なることを警告しました (IPC::Open3 を参照)。
Why することはできません I 取得する 出力 of a command システム()?
「system()」とバッククォート(``)の目的を混同しています。「system()」はコマンドを実行します
終了ステータス情報を返します(16ビット値:下位7ビットは
プロセスが終了した理由(ある場合)と、上位8ビットが実際の終了値です。バッククォート(``)
コマンドを実行し、STDOUT に送信された内容を返します。
私の $exit_status = system("mail-users");
私の$output_string = `ls`;
認定条件 できる I キャプチャー 標準 from an 外部 コマンド?
外部コマンドを実行する基本的な方法は 3 つあります。
system $cmd; # system() を使用する
my $output = `$cmd`; # バッククォート (``) を使用
open (my $pipe_fh, "$cmd |"); # open() を使用する
「system()」を使用すると、STDOUTとSTDERRの両方がスクリプトのSTDOUTと同じ場所に行き、
STDERR("system()"コマンドがリダイレクトしない限り)。バッククォートと"open()"は の
コマンドの STDOUT。
IPC::Open3の「open3()」関数も使用できます。Benjamin Goldbergがいくつかの例を提供しています。
サンプルコード:
プログラムの STDOUT をキャプチャし、STDERR を破棄するには:
IPC::Open3 を使用します。
ファイル::仕様を使用します。
私の$in = '';
open(NULL, ">", File::Spec->devnull);
私の$pid = open3($in, \*PH, ">&NULL", "cmd");
その間( ){}
waitpid($pid, 0);
プログラムの STDERR をキャプチャし、STDOUT を破棄するには:
IPC::Open3 を使用します。
ファイル::仕様を使用します。
私の$in = '';
open(NULL, ">", File::Spec->devnull);
私の$pid = open3($in, ">&NULL", \*PH, "cmd");
その間( ){}
waitpid($pid, 0);
プログラムの STDERR をキャプチャし、その STDOUT を独自の STDERR に送信するには、次のようにします。
IPC::Open3 を使用します。
私の$in = '';
私の$pid = open3($in, ">&STDERR", \*PH, "cmd");
その間( ){}
waitpid($pid, 0);
コマンドのSTDOUTとSTDERRの両方を別々に読み取るには、それらをtempにリダイレクトすることができます。
ファイルを開き、コマンドを実行してから一時ファイルを読み取ります。
IPC::Open3 を使用します。
IO::Fileを使用します。
私の$in = '';
ローカル *CATCHOUT = IO::File->new_tmpfile;
ローカル *CATCHERR = IO::File->new_tmpfile;
私の $pid = open3($in, ">&CATCHOUT", ">&CATCHERR", "cmd");
waitpid($pid, 0);
\*CATCHOUT、\*CATCHERR を $_、0、0 で検索します。
その間( ){}
その間( ){}
しかし、実際には 両言語で 一時ファイルになる...以下は同じように動作するはずです
デッドロックなしで:
IPC::Open3 を使用します。
私の$in = '';
IO::Fileを使用します。
ローカル *CATCHERR = IO::File->new_tmpfile;
私の$pid = open3($in、\*CATCHOUT、">&CATCHERR、"cmd");
その間( ){}
waitpid($pid, 0);
CATCHERR, 0, 0 をシークします。
その間( ){}
また、プログラムの標準出力をすぐに処理できるので、処理速度も速くなります。
プログラムが終了するまで待つのではなく。
いずれの場合も、呼び出し前にファイル記述子を変更できます。
open(STDOUT, ">ログファイル");
システム("ls");
または、Bourne シェルのファイル記述子リダイレクトを使用することもできます。
$output = `$cmd 2>some_file`;
開く (PIPE, "cmd 2>some_file |");
ファイル記述子のリダイレクトを使用して、STDERR を STDOUT の複製にすることもできます。
$output = `$cmd 2>&1`;
開く (PIPE, "cmd 2>&1 |");
あなたが PerlプログラムでSTDOUTの複製としてSTDERRを開き、
リダイレクトを行うためにシェルを呼び出すのは避けてください。これは機能しません。
オープン(STDERR、">&STDOUT)。
$alloutput = `cmd args`; # stderrはまだエスケープします
これは「open()」によってSTDERRがSTDOUTのあった場所に送られるため失敗します。
「open()」。バッククォートはSTDOUTに文字列を出力しますが、STDERRは変更しません。
(これは依然として古い STDOUT に送信されます)。
あなたが しなければなりません Bourneシェルを使用する(sh(1)バッククォート内のリダイレクト構文ではなく、 CSH(1)!
Perlの「system()」とバッククォートとパイプオープンがすべてBourneシェルを使用する理由の詳細は、
会場は vs.csh.whynot 「あなたが知りたかった以上のこと」コレクションの記事
のhttp://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz> 。コマンドのSTDERRをキャプチャし、
STDOUTを一緒に:
$output = `cmd 2>&1`; # バッククォート付き
$pid = open(PH, "cmd 2>&1 |"); # または開いているパイプの場合
その間 ( ) { } # 読み取りを追加
コマンドの STDOUT を取得し、その STDERR を破棄するには:
$output = `cmd 2>/dev/null`; # バッククォート付き
$pid = open(PH, "cmd 2>/dev/null |"); # または開いているパイプの場合
その間 ( ) { } # 読み取りを追加
コマンドの STDERR をキャプチャし、STDOUT を破棄するには:
$output = `cmd 2>&1 1>/dev/null`; # バッククォート付き
$pid = open(PH, "cmd 2>&1 1>/dev/null |"); # または開いているパイプの場合
その間 ( ) { } # 読み取りを追加
コマンドの STDOUT と STDERR を交換して、STDERR をキャプチャするが、そのコマンドはそのままにしておく
STDOUT は古い STDERR から出力されます:
$output = `cmd 3>&1 1>&2 2>&3 3>&-`; # バッククォート付き
$pid = open(PH, "cmd 3>&1 1>&2 2>&3 3>&-|");# またはオープンパイプの場合
その間 ( ) { } # 読み取りを追加
コマンドのSTDOUTとSTDERRの両方を別々に読み取るには、それらをリダイレクトするのが最も簡単です。
ファイルに個別に保存し、プログラムが終了したらそれらのファイルから読み取ります。
system("プログラム引数 1>program.stdout 2>program.stderr");
これらの例すべてにおいて順序は重要です。シェルはファイルを処理するからです。
記述子のリダイレクトは厳密に左から右の順序で行われます。
system("プログラム引数 1>tmpfile 2>&1");
システム("プログラム引数 2>&1 1>tmpfile");
最初のコマンドは標準出力と標準エラー出力の両方を一時ファイルに出力します。
2番目のコマンドは古い標準出力のみを送信し、古い標準エラーには
古い標準出力にアップします。
Why しない 開いた() return an エラー を特定いたします。 a パイプ 開いた 失敗しますか?
パイプされた「open()」の2番目の引数にシェルのメタ文字、Perlの「fork()」が含まれている場合、
次にシェルをexec()してメタ文字をデコードし、最終的に目的の
プログラムを実行できなかった場合、メッセージを受け取るのは Perl ではなくシェルです。
Perlプログラムで確認できるのは、シェル自体が正常に実行できるかどうかだけです。
開始されました。シェルのSTDERRをキャプチャしてエラーメッセージを確認することができます。
このドキュメントの他の箇所にある「外部コマンドからSTDERRをキャプチャするにはどうすればいいですか?」を参照するか、
IPC::Open3 モジュール。
「open()」の引数にシェルメタ文字がない場合、Perlはコマンドを実行します。
シェルを使用せずに直接実行し、コマンドが開始されたかどうかを正しく報告できます。
何 間違った バックティック in a ボイド コンテクスト?
厳密に言えば、何もない。文体的に言えば、それは良い書き方ではない。
保守しやすいコードです。Perlには外部コマンドを実行するための演算子がいくつかあります。バックティックは
1つ目は、プログラムで使用するためにコマンドの出力を収集するものです。「システム」
機能は別のもので、これは実行されません。
プログラムにバッククォートを書くと、コードを読む人に明確なメッセージを送ることができます。
コマンドの出力を収集したいのに、なぜ明確なメッセージを送信しないのでしょうか?
本当ですか?
次の行を考えてみましょう。
`cat /etc/termcap`;
プログラムが正しく実行されたかどうかを確認するために$?をチェックするのを忘れました。
`cat /etc/termcap` を印刷します。
このコードは次のように書くべきである。
system("cat /etc/termcap") == 0
または死ぬ「cat プログラムが失敗しました!」
これは、catコマンドの出力が生成されると同時にエコーし、
プログラムは出力を完了しました。戻り値も確認します。
「システム」は、シェルのワイルドカード処理が
バックティックではそうはなりませんが、
認定条件 できる I コール バックティック 無し shell 処理?
これは少し難しいです。単純にコマンドを次のように書くことはできません。
@ok = `grep @opts '$search_string' @filenames`;
Perl 5.8.0以降では、"open()"を複数の引数で使用できます。リスト形式と同様に
「system()」と「exec()」では、シェル エスケープは発生しません。
open( GREP, "-|", 'grep', @opts, $search_string, @filenames );
むしゃむしゃ食べる(@ok = );
GREP を閉じます。
次の操作も実行できます。
私の@ok = ();
if (open(GREP, "-|")) {
その間 ( ){
ムシャムシャ。
プッシュ(@ok, $_);
}
GREP を閉じます。
場合} else {
'grep'、@opts、$search_string、@filenames を実行します。
}
「system()」と同様に、リストを「exec()」してもシェルエスケープは発生しません。さらに
この例は、perlipc の「Safe Pipe Opens」に記載されています。
Windowsを使用している場合、この厄介な問題を解決することは不可能です。
Perlは「fork()」をエミュレートしますが、Windowsには
argc/argv スタイルの API。
Why することはできません my スクリプト read from 標準入力 After I 与えた it EOF (^D on ユニックス、 ^Z on MS-DOS ですか?
これは、perlがperlioではなくstdioを使用するようにコンパイルされている場合にのみ発生します。
デフォルト。一部の(おそらくすべての?)stdioはエラーフラグとeofフラグを設定するので、クリアする必要があるかもしれません。
POSIXモジュールは「clearerr()」を定義しており、これを使用できます。これは技術的に正しい方法です。
実行してください。以下に信頼性の低い回避策をいくつか示します。
1. 次のように、シークポインターの周囲を維持してそこへ移動してみます。
私の$where = tell($log_fh);
シーク($log_fh、$where、0);
2. それでも問題が解決しない場合は、ファイルの別の部分にシークしてから戻ってみてください。
3. それでもうまくいかない場合は、ファイルの別の部分を探して、何かを読み込んでみてください。
そして、後戻りしようとします。
4. それでもうまくいかない場合は、stdio パッケージを諦めて sysread を使用します。
認定条件 できる I 変換 my shell スクリプト 〜へ パール?
Perlを学んで書き直してください。本当に、簡単なコンバータなんてありません。
シェルでは扱いにくいことがPerlでは簡単にでき、この扱いにくさこそが
シェルからPerlへのコンバータを書くのはほぼ不可能になります。書き直すと、
実際に何をしようとしているのか、そしてシェルのパイプラインから抜け出すことができるかどうか
データストリーム パラダイムは、いくつかの点では便利ですが、多くの非効率性を引き起こします。
できる I つかいます パール 〜へ ラン a telnet or FTP セッション?
Net::FTP、TCP::Client、および Net::Telnet モジュール (CPAN から入手可能) を試してください。
<http://www.cpan.org/scripts/netstuff/telnet.emul.shar> は、
telnet プロトコルですが、Net::Telnet の方がおそらく使いやすいでしょう。
telnet を装うだけで、最初の telnet を必要としない場合は、
ハンドシェイクの場合は、標準的なデュアルプロセスアプローチで十分です。
IO::Socket を使用します。# 5.004 の新機能
私の$handle = IO::Socket::INET->new('www.perl.com:80')
または die "www.perl.com のポート 80 に接続できません $!";
$ハンドル->自動フラッシュ(1);
if (fork()) { # XXX: undefは失敗を意味する
($handle) を選択します。
印刷しながら; # stdin から socket までのすべて
場合} else {
print while <$handle>; # ソケットから標準出力へのすべて
}
$handleを閉じます。
出口;
認定条件 できる I 書きます 期待する in Perl?
昔々、図書館がありました チャット2.pl (標準のperlの一部
配布(ディストリビューション)は結局完成しませんでした。どこかで見つけたら、 しない つかいます it.
最近では、CPANから入手できるExpectモジュールを見るのが最善策です。これは
CPAN の他の 2 つのモジュール、IO::Pty と IO::Stty が必要です。
Is そこ a 方法 〜へ 隠す perlの command ライン from プログラム そのような as 「追伸」?
まず、セキュリティ上の理由(他人に見られないようにするため)でこれを行う場合は、
パスワードなど)重要な情報が
引数として与えられることはありません。引数を隠してもプログラムが完全に
安全です。
実際に表示されているコマンドラインを変更するには、変数$0に次のように代入します。
perlvarに文書化されています。ただし、すべてのオペレーティングシステムで動作するわけではありません。デーモンプログラム
sendmail と同様に、次のようにそこに状態を配置します。
$0 = "orcus [接続を受け入れています]";
I {変更されました ディレクトリ、 修正されました my 環境} in a パール スクリプト。 認定条件 来ます 変化する
消えた を特定いたします。 I 終了しました 脚本? 認定条件 do I 取得する my 変更 〜へ be 見える?
Unixの
厳密に言えば、それは不可能です。スクリプトは別のプロセスとして実行されます。
プロセスを起動したシェルから変更が反映されません。
親は変更後に作成された子にのみ適用されます。シェルマジックによって
シェル内でスクリプトの出力を「eval()」することで、それを偽装することができます。
詳細については、comp.unix.questions FAQ をご覧ください。
認定条件 do I 閉じる a プロセスの ファイルハンドル 無し 待ち望ん の it 〜へ 完了?
システムがそのような機能をサポートしていると仮定すると、プロセスに適切なシグナルを送信するだけです。
(perlfuncの「kill」を参照)。まずTERM信号を送り、少し待ってから
その後、KILL 信号を送信して終了します。
認定条件 do I フォーク a デーモン プロセス?
デーモンプロセスが分離(ttyから切り離された)プロセスを意味する場合、
以下の手順はほとんどのUnix系システムで動作することが報告されています。非Unix系ユーザーは以下を確認してください。
他のソリューションについては、Your_OS::Process モジュールを参照してください。
· /dev/tty を開き、TIOCNOTTY ioctl を使用します。 TTY(1)詳細については、
しかし、「POSIX::setsid()」関数を使用すればいいので、心配する必要はありません。
プロセス グループ。
· ディレクトリを / に変更します
· STDIN、STDOUT、および STDERR を再度開き、古い tty に接続されないようにします。
· 自分の背景を次のようにします:
フォーク && 終了;
CPANから入手可能なProc::Daemonモジュールは、これらのアクションを実行する関数を提供します。
あなたのために。
認定条件 do I find でる if アイム ランニング インタラクティブに or ありませんか?
(ブライアン・ド・フォイによる寄稿)
これは答えるのが難しい質問であり、最善の答えは推測に過ぎません。
本当に知りたいことは何ですか?ファイルハンドルの1つが
ターミナルに接続したら、「-t」ファイルテストを試すことができます。
if( -t STDOUT ) {
print "端末に接続しました!\n";
}
しかし、それが本物の人間が存在することを意味すると期待するなら、運が悪いかもしれません。
反対側。Expectモジュールを使えば、別のプログラムが人間のふりをすることができます。
プログラムはチューリングテストに合格する可能性さえあります。
IO::Interactiveモジュールは、できる限りの答えを提供します。
「is_interactive」関数は出力ファイルハンドルを返します。そのファイルハンドルは標準の
モジュールがセッションが対話的であると判断した場合に出力します。そうでない場合、ファイルハンドルは
出力を単に破棄する null ハンドル:
IO::Interactive を使用します。
print { is_interactive } "標準出力に出力される可能性があります!\n";
それでも、実際の人があなたの質問に答えたり、あなたのメッセージを読んでいることを保証するものではありません。
出力。
ディストリビューションの自動テストの扱い方を知りたい場合は、以下を確認してください。
環境。例えば、CPANテスターは「AUTOMATED_TESTING」の値を設定します。
( $ENV{AUTOMATED_TESTING} ) がない限り {
print "こんにちは、インタラクティブテスターさん!\n";
}
認定条件 do I タイムアウト a 遅く イベント?
ドキュメントに記載されているように、シグナルハンドラと組み合わせて「alarm()」関数を使用します。
perlipcの「Signals」とCamelの「Signals」セクションを参照してください。代わりに
より柔軟な Sys::AlarmCall モジュールが CPAN から入手可能です。
「alarm()」関数はWindowsのすべてのバージョンに実装されているわけではありません。
特定のバージョンの Perl に関するドキュメント。
認定条件 do I セッションに CPU 限界?
(Xho提供)
CPANのBSD::Resourceモジュールを使用してください。例:
BSD::Resourceを使用します。
setrlimit(RLIMIT_CPU,10,20) または die $!;
これにより、ソフト制限とハード制限がそれぞれ10秒と20秒に設定されます。10秒後に
CPUで実行された時間(「壁」時間ではない)が経過すると、プロセスにシグナルが送信されます。
(一部のシステムではXCPU)トラップされない場合は、プロセスは終了します。
信号が捕捉され、さらに10秒(合計20秒)後にプロセスは
トラップできないシグナルによって強制終了されました。
詳細については、BSD::Resource およびシステムのドキュメントを参照してください。
認定条件 do I 避ける ゾンビ on a Unixの システム?
SIGCHLDを受信したときに「wait()」を呼び出すには、perlipcの「Signals」にあるリーパーコードを使用します。
または、「プロセスを開始するにはどうすればいいですか?」で説明されているダブルフォークテクニックを使用してください。
perlfaq8 の「背景は?」を参照してください。
認定条件 do I つかいます an SQL データベース?
DBIモジュールは、ほとんどのデータベースサーバーと型への抽象インターフェースを提供します。
Oracle、DB2、Sybase、mysql、Postgresql、ODBC、フラットファイルなど。DBIモジュール
各データベースタイプは、データベースドライバ(DBD)を介してアクセスされます。完全なリストは以下をご覧ください。
CPANで利用可能なドライバー:http://www.cpan.org/modules/by-module/DBD/> 。読むことができます
DBIの詳細についてはhttp://dbi.perl.org/>。
他のモジュールはより具体的なアクセスを提供します: Win32::ODBC、Alzabo、「iodbc」、その他
CPAN検索:http://search.cpan.org/>。
認定条件 do I make a システム() 終了する on コントロール+C?
できません。"system()"呼び出しを模倣する必要があります(サンプルコードはperlipcを参照してください)。そして
INTシグナル用のシグナルハンドラを用意し、サブプロセスにシグナルを渡す。または
次のように確認できます:
$rc = システム($cmd);
if ($rc & 127) { die "シグナル死亡" }
認定条件 do I 開いた a file 無し ブロッキング?
幸運にも非ブロッキング読み取りをサポートするシステム(ほとんどのUnix系システム)を使用している場合は、
システムがそうするのであれば、"Fcntl" の "O_NDELAY" または "O_NONBLOCK" フラグを使用するだけで済みます。
"sysopen()" と組み合わせたモジュール:
Fcntlを使用します。
sysopen(my $fh, "/foo/somefile", O_WRONLY|O_NDELAY|O_CREAT, 0644)
さもなければ、「/foo/somefile を開けません: $!」:
認定条件 do I 言う 違い の間に エラー from shell パール?
(回答はブライアン・D・フォイ氏によるものです)
Perlスクリプトを実行すると、別の何かがスクリプトを実行し、
他の何かがエラーメッセージを出力する可能性があります。スクリプト自体が独自の警告やエラーを出力する可能性があります。
メッセージ。ほとんどの場合、誰が何を言ったかは分かりません。
Perlを実行するものを修正することはできないが、Perlの出力方法を変えることはできる。
カスタム警告および die 関数を定義して警告を出します。
すぐには気付かないかもしれないエラーがある次のスクリプトを検討してください。
#!/usr/locl/bin/perl
"Hello World\n" を印刷します。
これをシェル(たまたまbash)から実行するとエラーが発生します。
perl は "print()" 関数があることを忘れていましたが、私のシェバン行は perl へのパスではありません。
シェルがスクリプトを実行すると、エラーが発生します。
$ ./テスト
./test: 行 3: print: コマンドが見つかりません
簡単な修正には少しのコードが必要ですが、これで十分かもしれません
問題を理解する。
#!/ usr / bin / perl -w
ベギン {
$SIG{__WARN__} = sub{ print STDERR "Perl: ", @_; };
$SIG{__DIE__} = sub{ print STDERR "Perl: ", @_;出口 1};
}
$a = 1 + 未定義;
$x / 0;
__終わり__
Perlメッセージは先頭に「Perl」が付きます。「BEGIN」ブロックはコンパイル時に機能します。
したがって、すべてのコンパイル エラーと警告にも「Perl:」プレフィックスが付きます。
Perl: ./test の 9 行目の void コンテキストで除算 (/) が無駄に使用されています。
Perl: 名前「main::a」が 8 回だけ使用されています。./test の XNUMX 行目にタイプミスがある可能性があります。
Perl: 名前「main::x」が 9 回だけ使用されています。./test の XNUMX 行目にタイプミスがある可能性があります。
Perl: ./test の 8 行目の加算 (+) で初期化されていない値が使用されています。
Perl: ./test の 9 行目の除算 (/) で初期化されていない値が使用されています。
Perl: ./test の 9 行目でゼロによる不正な除算が行われました。
Perl: -e 行 3 でゼロによる不正な除算が行われました。
「Perl:」が表示されない場合は、perl からのものではありません。
Perlのエラーをすべて知っておくこともできますが、
全部知っている人は少ないでしょう。しかし、perldiag のマニュアルページには全部載っているはずです。
そこにエラーが見つからない場合は、おそらく Perl エラーではありません。
すべてのメッセージを調べるのは簡単ではないので、Perlに任せましょう。
診断プラグマは、Perl の通常のメッセージをトピックに関するより長い議論に変換します。
診断を使用します。
1、2段落の詳細な議論がない場合は、Perlではない可能性があります。
メッセージ。
認定条件 do I install a モジュール from CPAN?
(ブライアン・ド・フォイによる寄稿)
最も簡単な方法は、CPANという名前のモジュールを使用して「cpan」を使用することです。
Perlに付属のコマンドです。インストールするモジュールのリストを指定できます。
$ cpan IO::Interactive Getopt::Whatever
「CPANPLUS」をご希望の場合は、同様に簡単です。
$ cpanp i IO::Interactive Getopt::Whatever
現在のディレクトリからディストリビューションをインストールする場合は、「CPAN.pm」に次のように伝えます。
「.」(ピリオド)をインストールするには:
$ cpan 。
他に何ができるかを確認するには、いずれかのコマンドのドキュメントを参照してください。
自分でディストリビューションをインストールしたい場合は、すべての依存関係を解決して
独自のビルドを作成する場合は、2 つのビルド パスのいずれかを実行します。
使用するディストリビューションの場合 メイクファイル.PL:
$ perl Makefile.PL
$ テストインストール
使用するディストリビューションの場合 ビルド.PL:
$ perl ビルド.PL
$ ./ビルドテスト
$ ./ビルドインストール
一部のディストリビューションでは、ライブラリやその他のサードパーティのコードへのリンクとそのビルドが必要になる場合があります。
インストール手順が複雑になる場合があります。 README or INSTALL ファイル
あなたが見つけることができるかもしれません。
何 違い の間に 必要とする つかいます?
(ブライアン・ド・フォイによる寄稿)
Perlは実行時に「require」文を実行します。Perlがファイルをロード、コンパイル、実行すると、
他には何もしません。「use」文は「require」文と同じで、
コンパイル時に実行されますが、Perlはロードされたパッケージの「import」メソッドも呼び出します。これら2つの
同じです:
MODULE qw(import list) を使用します。
ベギン {
モジュールが必要です。
MODULE->import(インポートリスト);
}
ただし、明示的な空のインポートリストを使用することで、「インポート」を抑制することができます。
これらはコンパイル時にも発生します:
MODULE() を使用します。
ベギン {
モジュールが必要です。
}
「use」は「import」メソッドも呼び出すため、「MODULE」の実際の値は
ベアワード。つまり、「use」ではファイル名でファイルを読み込むことはできませんが、「require」では以下のことが可能です。
require "$ENV{HOME}/lib/Foo.pm"; # @INC 検索はありません!
詳細については、perlfunc の「use」のエントリを参照してください。
認定条件 do I 続ける my 自分の モジュール/ライブラリ ディレクトリ?
モジュールをビルドするときは、モジュールをインストールする場所を Perl に指示します。
自分専用のモジュールをインストールしたい場合、最も簡単な方法はlocal::libです。
CPANからダウンロードできます。様々なインストール設定を自動的に設定し、
プログラム内でも同じ設定が可能です。
より柔軟にしたい場合は、CPANクライアントを特定の用途に合わせて設定する必要があります。
状況。
「Makefile.PL」ベースのディストリビューションの場合は、生成時にINSTALL_BASEオプションを使用します。
メイクファイル:
perl Makefile.PL INSTALL_BASE=/mydir/perl
これを「CPAN.pm」設定で設定すると、モジュールが自動的にインストールされます。
CPAN.pm シェルを使用する場合のプライベート ライブラリ ディレクトリ:
% cpan
cpan> o conf makepl_arg INSTALL_BASE=/mydir/perl
cpan> o confコミット
「Build.PL」ベースのディストリビューションの場合は、--install_base オプションを使用します。
perl Build.PL --install_base /mydir/perl
このオプションを自動的に使用するように「CPAN.pm」を設定することもできます。
% cpan
cpan> o conf mbuild_arg "--install_base /mydir/perl"
cpan> o confコミット
INSTALL_BASEはこれらのツールにモジュールを配置するよう指示します。 /mydir/perl/lib/perl5. 「方法」を参照してください
実行時にインクルードパス(@INC)にディレクトリを追加しますか?
新しくインストールされたモジュール。
ただし、INSTALL_BASEにはPREFIXとは異なる動作をするため、注意点が1つあります。
および、古いバージョンのExtUtils::MakeMakerで推奨されていたLIB設定。INSTALL_BASEは
Perlの複数のバージョンや異なるアーキテクチャ用のモジュールのインストールをサポートしていません
同じディレクトリの下に。本当にそれが必要なのか、そして必要なら
古いPREFIXとLIB設定を使用してください。詳細については、ExtUtils::Makemakerのドキュメントを参照してください。
詳細。
認定条件 do I 加えます ディレクトリにジョブを開始します。 my プログラム 生活 in 〜へ モジュール/ライブラリ サーチ 道?
(ブライアン・ド・フォイによる寄稿)
すでにディレクトリがわかっている場合は、他のディレクトリと同様に@INCに追加できます。
ディレクトリ。コンパイル時にディレクトリがわかっている場合:
lib $directory を使用します。
このタスクの秘訣はディレクトリを見つけることです。スクリプトが他の処理を実行する前に
(「chdir」など)「Cwd」モジュールを使用して現在の作業ディレクトリを取得できます。
Perl に付属しています:
ベギン {
Cwd を使用します。
$directory = cwd;
}
lib $directory を使用します。
スクリプト名を保持する$0の値でも同様のことができます。
相対パスを保持していますが、「rel2abs」はそれを絶対パスに変換できます。
ベギン {
File::Spec::Functions qw(rel2abs); を使用します。
File::Basename qw(dirname) を使用します。
私の$path = rel2abs($0);
$directory = dirname( $path );
}
lib $directory を使用します。
Perlに付属のFindBinモジュールが使えるかもしれません。これは、
現在実行中のスクリプトを$Binに格納し、それを使って
正しいライブラリパス:
FindBin qw($Bin) を使用します。
local::libを使ってもほぼ同じことができます。モジュールをインストールするには、
local::lib の設定を変更して、プログラム内でモジュールを使用します。
use local::lib; # ローカルライブラリをセットアップする ~/perl5
詳細については、local::lib のドキュメントを参照してください。
認定条件 do I 加えます a ディレクトリにジョブを開始します。 〜へ my include path (@INC) at ランタイム?
環境を含むインクルードパスを変更する方法の提案は次のとおりです。
変数、実行時スイッチ、コード内ステートメント:
「PERLLIB」環境変数
$ エクスポート PERLLIB=/path/to/my/dir
$ perl プログラム.pl
「PERL5LIB」環境変数
$ エクスポート PERL5LIB=/path/to/my/dir
$ perl プログラム.pl
「perl -Idir」コマンドラインフラグ
$ perl -I/path/to/my/dir program.pl
「lib」プラグマ:
ライブラリ "$ENV{HOME}/myown_perllib" を使用します。
local::lib モジュール:
local::lib を使用します。
local::lib を使用する~/myown_perllib";
最後のものは、マシンに依存するアーキテクチャを認識しているため、特に便利です。
「lib.pm」プラグマティック モジュールは、Perl の 5.002 リリースで初めて組み込まれました。
場所 モジュール インストールされた?
モジュールはケースバイケースでインストールされます(
(前項参照)、およびオペレーティングシステムでも同様です。これらのパスはすべて@INCに格納されます。
ワンライナーで表示できる
perl -e 'print join("\n",@INC,"")'
コマンドの出力の最後にも同じ情報が表示されます。
パール -V
モジュールのソースコードがどこにあるかを調べるには、
perldoc -l エンコード
モジュールへのパスを表示します。場合によっては(例えば「AutoLoader」モジュール)、
このコマンドは別の「pod」ファイルへのパスを表示します。モジュール自体は
同じディレクトリに、「pm」ファイル拡張子が付きます。
この試験は is ソケット.ph コラボレー do I 取得する それ?
これはPerl 4スタイルのファイルで、システムネットワーク定数の値を定義します。
Perlがインストールされている場合はh2phを使ってビルドされますが、そうでない場合はそうではありません。現代のプログラムは
代わりに「use Socket;」を使用してください。
著者 そして COPYRIGHT
Copyright(c)1997-2010 Tom Christiansen、Nathan Torkington、およびその他の著者。
All rights reserved.
このドキュメントは無料です。 同じ条件で再配布および/または変更できます
Perl自体として。
配布に関係なく、このファイルのすべてのコード例はここに配置されます
パブリックドメイン。 あなたはあなた自身のプログラムでこのコードを使用することを許可され、奨励されています
あなたが適切だと思うように、楽しみのために、または利益のために。 クレジットを与えるコードの簡単なコメントは
礼儀正しく、必須ではありません。
onworks.netサービスを使用してperlfaq8をオンラインで使用する
