gpt4 book ai didi

perl - 对单引号/双引号和\\关于拆分感到困惑

转载 作者:行者123 更新时间:2023-12-01 01:43:31 29 4
gpt4 key购买 nike

所以,我在另一篇文章中看到,要使用 \\ 作为分隔符进行拆分,您需要在 \\\\\\\\ 上进行拆分。这对我来说并没有真正的意义,但是当我尝试使用 \\\\ 进行拆分时,发生了这种情况:

my $string="a\\\\b\\\\c";
my @ra=split("\\\\",$string);

数组是:

a
<empty>
b
<empty>
c

正如其他海报所说,使用 \\\\\\\\ 效果很好。为什么会这样?

此外,我很好奇并开始弄乱 ''"" 并得到了意想不到的结果。我以为我明白了区别是什么,但我想我没有,至少在以下情况下没有:

my $string="a\.\.b\.\.c";
my @ra=split("\.\.",$string);

数组是:

<empty>
<empty>
<empty>
c

然而,

my $string="a\.\.b\.\.c";
my @ra=split('\.\.',$string);

数组是:

a
b
c

提前致谢。

最佳答案

哦,引用规则和正则表达式。

带不同引号的反斜杠规则

  • q() 和相关的中,所有反斜杠都保留在字符串中,除非它们转义了字符串定界符或另一个反斜杠:

    say '\a\\b\''; # »\a\b'«
  • qq() 和相关的中,所有不构成已知字符串转义序列的反斜杠都被静默删除:

    say "\d\\b\"\."; # »d\b."«
  • qr// 和正则表达式中也是如此,除了与双引号字符串相比有不同的转义。

如果使用字符串代替正则表达式,则在编译期间执行该类型字符串的转义规则。但是,当它用作正则表达式时会处理第二级转义,因此在最坏的情况下必须对反斜杠进行双重转义。正则表达式文字不会遇到这个问题;只有一层转义。

示例说明

因此,"a\\\\b\\\\c";a\\b\\c,而"\\\\"\\ 匹配 \ 作为正则表达式。所以它在每个反斜杠上拆分,从而在双反斜杠之间产生零长度字段。

您所指的另一个问题的 '\\\\\\\\'\\\\ 作为正则表达式匹配 \\.

"a\.\.b\.\.c"a..b..c"\.\.".. 作为正则表达式匹配两个非换行符。它首先匹配a.,然后是.b,然后是..。这会生成字符串片段 "", "", "", "c"

字符串 '\.\.'\.\.,作为正则表达式,它按顺序匹配两个文字句点。

解决方案是在需要正则表达式的地方使用正则表达式。 split 将正则表达式作为第一个参数,如 split/foo/,在其他情况下,正则表达式引用 qr/foo/ 很有用。这避免了令人费解的[1]双重转义。

[1]:对于较小的“mind bending”值,一旦你理解了规则。

关于perl - 对单引号/双引号和\\关于拆分感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16576087/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com