命令输出和perl输出不同

cho*_*per 0 shell perl

我在尝试运行shell命令时检索正确的信息时遇到问题.当我在服务器上运行命令时,我得到了正确的输出,但是当它通过perl脚本运行时我得不到相同的结果.

$test = `pkginfo | grep TestPackage | awk '{print $2}'`;
print "$test\n";
Run Code Online (Sandbox Code Playgroud)

直接从shell运行时的输出是:

TestPackage
Run Code Online (Sandbox Code Playgroud)

虽然perl脚本的输出是:

application TestPackage       Description
Run Code Online (Sandbox Code Playgroud)

为什么会有所不同?

Wil*_*ell 5

$2是由Perl的使插值awk只看到字符串print.尝试:

$test = qx( pkginfo | awk '/TestPackage/{print \$2}' );
print "$test";
Run Code Online (Sandbox Code Playgroud)

您还可以使用单引号作为分隔符来阻止插值qx:

$test = qx' pkginfo | awk \'/TestPackage/{print $2}\' ';
Run Code Online (Sandbox Code Playgroud)

请注意,$test除非您具有尾随换行符chop.

但是,调用awk来自perl不是非常Perl.虽然使用awk感觉更清洁,但最好做以下事情:

@test = map { m/^\S+\s+(\S+)/; $_ = $1 } grep { /TestPackage/ } qx( pkginfo );
Run Code Online (Sandbox Code Playgroud)