为啥从 ' 更改为 " 会影响此单线的行为?

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 根本不会用双引号运行它。在kshzsh 中,管道的最后一部分在主shell 中运行,而不是在子shell 中,所以$_ 在那里。

【讨论】:

实际上,$_ 在许多 shell 中是最新命令的最后一个参数,但如果它未分配,Perl 代码看起来像 split(/\|/,),无论如何默认为 split(/\|/, $_)。正如您所说,真正的问题是$a[4] 被简化为[4] @Borodin 我认为它最终是空的,因为管道。 (在我的简短测试中确实如此。)但是,我应该并且会更好地解释它,非常感谢。【参考方案2】:

这实际上是一个 shell 主题,而不是 perl 主题。

在外壳中:

单引号保留其包含的所有字符的字面值,包括 $ 和反斜杠。但是,使用双引号时,$、反引号和反斜杠字符具有特殊含义。

例如:

'\"' 计算结果为 \"

"\'" 仅计算为 '

由于使用双引号,反斜杠作为转义字符具有特殊含义。

【讨论】:

以上是关于为啥从 ' 更改为 " 会影响此单线的行为?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的查询结果将预期结果从“300”更改为上标“L”?

如何将所有行的 MS Word 2010 表行高属性从“完全”更改为“至少”,同时保持指定的行高值不变

当我将滚动方向从垂直更改为水平时,为啥集合视图会崩溃?

为啥从 Spring Boot 版本 2.1.4 更改为 2.1.5 会出现未知配置 Maven 错误?

将 ColdFusion 生成的 WSDL Web 服务从 RPC 编码更改为文档文字会有啥影响?

如何将此正则表达式替换从替换单个单词更改为替换单词数组?