如何在双引号内将perl变量传递给反引号

Rav*_*mar 0 perl

我正在编写一个perl脚本,我需要将perl变量传递给反引号,并且该变量应该在双引号内声明为反引号.例如:我的$ variable =`df -Ph | grep -i"$ var1"`

Sch*_*ern 5

你所问的是你有一些包含shell元字符(如引号和斜杠)的东西.您希望在shell命令中使用它,但您不希望字面上对元字符进行处理.例如...

my $search = q[don't look now];
my @results = `df -Ph | grep -i $search`
Run Code Online (Sandbox Code Playgroud)

有几种方法可以解决这个问题.而不是摆弄shell引用,最简单的是逃避所有的元字符.Perl必须quotemeta这样做.

my $search = q[don't look now];
my $q_search = quotemeta($search);  # don\'t\ look\ now
my @results = `df -Ph | grep -i $q_search`
Run Code Online (Sandbox Code Playgroud)

或者你可以用\Q和做到\E.

my $search = q[don't look now];
my @results = `df -Ph | grep -i \Q$search\E`
Run Code Online (Sandbox Code Playgroud)

相反,我建议尽可能避免使用shell,它会引入不兼容性和安全漏洞.你需要df在shell中做,但在Perl中做grep.

my $search = q[don't look now];
my @results = grep /\Q$search\E/i, `df -Ph`;
Run Code Online (Sandbox Code Playgroud)