2

morePerlスクリプトでコマンドを使用する方法はありますか?ファイルがあり、その内容を印刷したいのですが、行が多いので、で印刷したいと思いますmore。バックティックを入れてみmoreましたが、うまくいきませんでした。

open(FILE,'/opt/myfile' ) or die("Could not open  file.");
`more /opt/myfile`;
4

3 に答える 3

6

`more /opt/myfile`コマンドの出力を文字列にキャプチャすることを意味しmoreます。文字列は破棄されます(通常、出力を変数に格納するか、関数に渡します)。その出力が端子に接続されていない場合は、moreと同等でcatあり、何の役にも立ちません。

出力をキャプチャせずにPerlでサブプロセスを実行するには、system関数を使用します。

system('more', '/opt/myfile');

単なる文字列ではなく、コマンドとその引数を含むリストを渡す必要があることに注意してください。に単一の文字列をsystem渡すと、シェルに渡され、ファイル名の特殊文字が展開されます。たとえば、機能しますsystem('more /opt/myfile')system('more /opt/$(rm -rf ~)')、すべてのファイルが削除されます。複数の引数を渡す場合、シェルは関与しません。その奇妙な名前のファイルをsystem('more', '/opt/$(rm -rf ~)')呼び出します。more

+ファイル名がまたはで始まるリスクがある場合は、ファイル名の前-に渡し--て、オプションとして解釈されないようにします。

を呼び出すのではなく、環境変数moreを確認し、定義されている場合はそれを呼び出す必要があります。デファクトスタンダードのポケットベルです。変数が定義されていない場合、このミレニアムでは、デフォルトで設定する必要があります(妄想的な場合は、デフォルトで存在する場合など)。PAGER$PAGERlesslessmore

my $pager = $ENV{PAGER};
if (!defined $pager || $pager eq '') {
    $pager = 'less';
}
system($pager, '--', '/opt/myfile');
于 2012-07-25T00:16:43.423 に答える
4

システムコマンドを使用するだけです。

system('more thefile');
于 2012-07-24T09:17:57.587 に答える
0

私はおそらく次のようなポケットベルへのパイプを開くでしょう:

open(FILE, "/opt/myfile") or die("Could not open file.");
open(PIPE, "| more") or die("Could not open pipe"); 

while(<FILE>) {
  print PIPE;
}

close P;    
close FILE;'
于 2012-07-24T09:25:23.503 に答える