注: 文章中的示例代码都在 Linux 平台下运行。
在 Perl 中,可以通过 `` 或 qx// 函数方便的执行一些外部命令,并获取到命令的执行结果,例如下面的 Perl 代码片段可以获取到当前的时间:
#!/usr/bin/perl
use strict;
use warnings;
my $now = `date`;
print "now: $now";
输出结果示例:
now: 2022年 04月 09日 星期六 09:09:00 CST
有时候,要执行的外部命令参数比较多,都写在一行的话,可读性会比较差;在 Bash 中,我们可以通过在行尾使用反斜杠的方法,把命令拆分为多行,增加可读性:
#!/bin/bash
echo line1 \
line2 \
line3
# 输出结果: line1 line2 line3
但是这样的方法,直接用在 Perl 中会有报错,例如下面的代码:
#!/usr/bin/perl
use strict;
use warnings;
my $res = `echo line1 \
line2 \
line3`;
print "$res";
在执行后,会有如下报错信息:
sh: 2: line2: not found
sh: 3: line3: not found
line1
这是因为 `` 操作符就像是双引号一样,其中的变量、\t 、\n 等会在执行命令前被展开或转义,因此要想写入一个反斜杠 \,就要在代码中写两个反斜杠 \\。示例如下:
#!/usr/bin/perl
use strict;
use warnings;
my $res = `echo line1 \\
line2 \\
line3`;
print "$res";
上面的代码执行时就会得到正确的输出:
line1 line2 line3
一种更简单的方法
当你要执行的命令中不需要包含变量或转义字符时,有一种更简单的方法可以将命令拆分为多行,就是使用 q'',参考 qx 的帮助手册:
Using single-quote as a delimiter protects the command from Perl's
double-quote interpolation, passing it on to the shell instead:
$perl_info = qx(ps $$); # that's Perl's $$
$shell_info = qx'ps $$'; # that's the new shell's $$
perldoc -f qx
当使用 q'' 来执行外部命令时,将命令拆分为多行,只需要写一个反斜杠就可以了。示例如下:
#!/usr/bin/perl
use strict;
use warnings;
my $res = qx'echo line1 \
line2 \
line3';
print "$res";
# 输出结果: line1 line2 line3
一如既往,如果你对文章中的内容有任何疑问,或者是发现文章中有任何错误,都可以通过留言告诉我;如果你喜欢我的文章,欢迎关注我的微信公众号。