当我运行ls
命令时,运行正常。但是echo $PATH
并没有给我任何来自perl的输出。当我从shell提示符运行echo
时,它会给我输出。你能解释一下这种行为吗?
#!usr/bin/perl
$\="\n";
$out = `ls`;
print $out;
$out=`echo $PATH`;
print $out;
答案 0 :(得分:6)
反引号interpolate,如双引号,因此您需要转义$
。
$out=`echo \$PATH`;
答案 1 :(得分:6)
请注意,尽管问题的技术上正确答案是$
插值,但您还应注意,您不应将Perl视为shell脚本,并通过反引号调用外部命令,而不是使用内置的Perl或为此目的设计的库函数:
$out = join("\n", glob("*")); # same as `ls`
$out = $ENV{PATH}; # same as `echo $PATH`
这有几个显着的优点:
答案 2 :(得分:5)
$PATH
是shell变量,从perl你应该使用它作为perl变量$ENV{PATH}
仍尝试阅读一些基本文档,例如perldoc perlintro
。无需执行echo
。
答案 3 :(得分:1)
Perl在反引号中插入$ PATH作为Perl变量,并且你没有在脚本中的任何地方设置$ PATH,所以命令出现为
$out = `echo `
基本上是一个空操作。尝试
$out = `echo \$PATH`
相反,它会强制Perl忽略$并将其原封不动地传递给shell。
答案 4 :(得分:1)
您需要在$
中转义$PATH
,因为反引号运算符会插入任何变量。
$out=`echo \$PATH`;
您也可以将qx//
与单引号一起使用。来自perldoc perlop:
使用单引号作为分隔符 保护Perl的命令 传递它的双引号插值 转而使用shell:
- $ perl_info = qx(ps $$); #那是Perl的$$
- $ shell_info = qx'ps $$'; #这是新shell的$$
醇>
答案 5 :(得分:1)
其他人已经解释了原因 - 反引号内的变量是内插的,因此echo $PATH
实际上变为echo
,因为没有声明$PATH
变量。
但是,总是将use strict;
放在您编写的每个Perl脚本的顶部。
如果你这样做了,Perl就会告诉你发生了什么,例如:
Global symbol "$PATH" requires explicit package name at myscript.pl line 9
要停止插值变量,要么将它们转义(例如\$PATH
),要么更干净地使用例如qx'echo $PATH'
。
此外,正如其他人所指出的那样,呼叫echo $PATH
并不具有现实意义;如果您正在尝试获取PATH环境变量的内容,只需使用$ENV{PATH}
- 但是,您可能刚刚将其用作简单的简化演示案例。