perl中的“更多”命令

时间:2012-07-24 09:05:12

标签: perl

有没有办法在perl脚本中使用more命令?有一个文件,我想打印其内容,但由于有很多行,我想用more打印它。我尝试将more放入反引号中,但它不起作用:

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

3 个答案:

答案 0 :(得分:6)

`more /opt/myfile`表示将more命令的输出捕获到一个字符串中,该字符串被丢弃(您通常将输出存储在变量中或将其传递给函数)。当其输出未连接到终端时,more相当于cat,它没有做任何有用的事情。

要在Perl中运行子进程而不捕获其输出,请使用system函数。

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

请注意,您应该传递包含命令及其参数的列表,而不仅仅是字符串。如果将单个字符串传递给system,则会将其传递给shell,后者将展开文件名中的任何特殊字符。例如,system('more /opt/myfile')可以使用,但system('more /opt/$(rm -rf ~)')会删除所有文件。如果传递多个参数,则不涉及shell:system('more', '/opt/$(rm -rf ~)')在该奇怪命名的文件上调用more

如果存在文件名以+-开头的风险,请在文件名前面传递--,以避免将其解释为选项。

您应该检查more环境变量,而不是调用PAGER,如果已定义,则调用它。 $PAGER是事实上的标准寻呼机。如果未定义变量,则在此千禧年,您应该默认为less(如果您是偏执狂,默认为less如果它存在,则more否则)。

my $pager = $ENV{PAGER};
if (!defined $pager || $pager eq '') {
    $pager = 'less';
}
system($pager, '--', '/opt/myfile');

答案 1 :(得分:4)

只需使用系统命令:

system('more thefile');

答案 2 :(得分: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;'