如何将Perl的系统函数输出存储到变量中?

kar*_*_ms 26 perl system

我的系统功能有问题.我想将系统函数输出存储到变量中.

例如,

system("ls");
Run Code Online (Sandbox Code Playgroud)

在这里,我希望当前目录中的所有文件名都存储在变量中.我知道我可以通过将输出重定向到一个文件并从中读取并将其存储到变量来实现.但我想要一种有效的方法.有什么办法吗?

abu*_*ker 20

不,你不能存储ls输出的值,因为系统总是以子进程的形式执行命令,所以请尝试使用backtick`command`来执行当前进程本身的命令!

  • 反引号在子进程中执行命令并捕获其输出.如果要在同一进程中执行命令,则使用`exec` - 但它永远不会返回,因为在将进程转换为另一个命令后,原始的Perl代码不再运行. (5认同)
  • @abackacker - 反引号确实执行子进程. (4认同)

小智 16

最简单的方法是使用反引号或qx():

my $value = qx(ls);
print $value;
Run Code Online (Sandbox Code Playgroud)

输出类似于ls.


gho*_*g74 10

我的答案没有解决你的问题.但是,如果您真的想要进行目录列表,请不要ls像这样调用系统.使用opendir(),readdir()while循环.

例如,

while (<*>){
    print $_ ."\n";
}
Run Code Online (Sandbox Code Playgroud)

事实上,如果它不是第三方专有程序,总是尝试使用Perl自己的功能.


Eth*_*her 9

正如abubacker所说,你可以使用反引号将程序的输出捕获到变量中供以后使用.但是,如果你还需要检查是否有特殊的返回值,或旁路调用外壳,它的时间CPAN模块,在带来IPC ::系统::简单:

use IPC::System::Simple qw(capture);

# Capture output into $result and throw exception on failure
my $result = capture("some_command"); 
Run Code Online (Sandbox Code Playgroud)

该模块可在多种方式调用,并允许您自定义哪些错误返回值是"可以接受的",是否绕过外壳与否,以及如何处理的参数组.它还提供了一个直接替换system(),增加了更多的错误检查.


too*_*lic 7

内置系统功能的官方Perl文档说明:

这不是您想要用来捕获命令输出的内容,因为您应该只使用反引号或qx //,如STRINGperlop 中的" "所述.

有许多方法可以轻松访问文档:

  1. 在命令行: perldoc -f system
  2. 在线访问perldoc.perl.org.
  3. 使用谷歌搜索网络.

如果要将每个目录列表存储到单独的数组元素中,请使用:

my @entries = qx(ls);
Run Code Online (Sandbox Code Playgroud)