为啥从 ' 更改为 " 会影响此单线的行为?
Posted
技术标签:
【中文标题】为啥从 \' 更改为 " 会影响此单线的行为?【英文标题】:why does changing from ' to " affect the behavior of this one-liner?为什么从 ' 更改为 " 会影响此单线的行为? 【发布时间】:2017-05-11 21:46:38 【问题描述】:为什么简单地从使用'
而不是"
封闭我的单行代码会影响代码的行为?第一行代码产生了预期的结果,第二行代码给出了(对我来说!)一个意想不到的结果,打印出一个意想不到的数组引用。
$ echo "puke|1|2|3|puke2" | perl -lne 'chomp;@a=split(/\|/,$_);print $a[4];'
puke2
$ echo "puke|1|2|3|puke2" | perl -lne "chomp;@a=split(/\|/,$_);print $a[4];"
这是 Perl 版本:
$ perl -v
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
ARRAY(0x1f79b98)
【问题讨论】:
尝试:echo "chomp;@a=split(/\|/,$_);print $a[4];",不涉及 Perl,你会看到你在传递什么在第二种情况下使用 Perl。 @martinclayton 不错。一件事-问题中的管道会影响$_
,因此该部分将不准确。 (当然,在实际问题中,数据可能根本没有通过管道传输。)
@martinclayton 反复执行这个很有趣:)
【参考方案1】:
使用双引号可以让 shell 先插入变量。
如您所见,$_
和 $a
在父 shell 为管道分叉的子 shell 中未设置。请参阅下面对$_
的评论。
所以双引号的版本是有效的
echo "puke|1|2|3|puke2" | perl -lne 'chomp;@a=split(/\|/);print [4];'
什么打印arrayref [4]
。
关于将$_
暴露于 Bash 的影响的评论。感谢 Borodin 提出这个问题。
$_
是 Bash 中为数不多的 special shell parameters 之一。它包含上一个命令的最后一个参数,或者调用 shell 或命令的路径名(通过_
环境变量)。有关完整说明,请参阅链接。
然而,这里它在一个子shell 中被解释为运行perl
命令,这是它的第一个。显然它甚至没有设置,如
echo hi; echo hi | echo $_
打印一个空行(在第一个hi
之后)。原因可能是_
环境变量没有设置为管道的子shell,但我不明白为什么会这样。例如,
echo hi; (echo $_)
使用hi
打印两行,即使( )
启动了一个子shell。
无论如何,给定管道中的$_
未设置。
split
部分是 split(/\|/)
,因此默认为 split(/\|/, $_)
-- 没有可拆分的内容。随着-w
添加,这确实会打印出使用未初始化$_
的警告。
请注意,此行为取决于 shell。 tcsh
根本不会用双引号运行它。在ksh
和zsh
中,管道的最后一部分在主shell 中运行,而不是在子shell 中,所以$_
在那里。
【讨论】:
实际上,$_
在许多 shell 中是最新命令的最后一个参数,但如果它未分配,Perl 代码看起来像 split(/\|/,)
,无论如何默认为 split(/\|/, $_)
。正如您所说,真正的问题是$a[4]
被简化为[4]
。
@Borodin 我认为它最终是空的,因为管道。 (在我的简短测试中确实如此。)但是,我应该并且会更好地解释它,非常感谢。【参考方案2】:
这实际上是一个 shell 主题,而不是 perl 主题。
在外壳中:
单引号保留其包含的所有字符的字面值,包括 $ 和反斜杠。但是,使用双引号时,$、反引号和反斜杠字符具有特殊含义。
例如:
'\"'
计算结果为 \"
而
"\'"
仅计算为 '
由于使用双引号,反斜杠作为转义字符具有特殊含义。
【讨论】:
以上是关于为啥从 ' 更改为 " 会影响此单线的行为?的主要内容,如果未能解决你的问题,请参考以下文章
如何将所有行的 MS Word 2010 表行高属性从“完全”更改为“至少”,同时保持指定的行高值不变
为啥从 Spring Boot 版本 2.1.4 更改为 2.1.5 会出现未知配置 Maven 错误?