perl如何处理带有不同引号的模式?

perl如何处理带有不同引号的模式?,perl,sh,quotations,Perl,Sh,Quotations,如图所示 -F选项为-a指定要拆分的图案。该模式可能被//、“”或“”包围,否则它将被放在单引号中。您不能在模式中使用文字空白或NUL字符 我在文本上尝试了以下命令,但结果完全相同 那么,在下面的示例中,这些模式引用的区别是什么 $ perl -aF"\|" -lne 'print $F[0]' input Time 2018-01-11 00:00:00 2018-01-11 00:15:00 $ perl -aF'\|' -lne 'print $F[0]' input Time 2018

如图所示

-F选项为-a指定要拆分的图案。该模式可能被//、“”或“”包围,否则它将被放在单引号中。您不能在模式中使用文字空白或NUL字符

我在文本上尝试了以下命令,但结果完全相同

那么,在下面的示例中,这些模式引用的区别是什么

$ perl -aF"\|" -lne 'print $F[0]' input
Time
2018-01-11 00:00:00
2018-01-11 00:15:00

$ perl -aF'\|' -lne 'print $F[0]' input
Time
2018-01-11 00:00:00
2018-01-11 00:15:00

$ perl -aF/\|/ -lne 'print $F[0]' input
T
2
2

$ perl -aF"|" -lne 'print $F[0]' input
T
2
2

$ perl -aF'|' -lne 'print $F[0]' input
T
2
2


$ perl -aF/|/ -lne 'print $F[0]' input
bash: /: Is a directory

有三层解释需要考虑。

第一层是外壳。第二层是perl的字符串/正则表达式文本语法。第三层是perl的正则表达式语法

让我们逐一浏览您的示例:


“\\\;”
“\\\\\”
都将一个两个字符的字符串(
\\\\\\\\\
)传递给perl(
由shell解释)。这是第一层

\\\\\\
不被引号包围,因此perl在其周围添加了
'
,形成字符串
'\\\\\\\\'
(如
拆分'\\\\\\\\\\\\'',$\
)。perl的单引号字符串不特别处理反斜杠(除非后面跟有
\
'
),所以perl认为它仍然是一个两个字符的字符串,
\\124;
。这就是第二层

split
将其第一个参数解释为正则表达式。
\
在正则表达式中有一个特殊的含义:它转义以下字符。因此,正则表达式
\\\\\\\
匹配单个
(管道字符),这就是此代码在
上拆分其输入的原因。这就是第三层


/\\\\
将三个字符串
/\\\\
传递给perl(
\
由shell解释)。这是第一层

/|/
看起来像是被
/
包围的东西(
),所以perl不添加任何东西(
拆分/|/,$|
)。这被解析为正则表达式文本,这里没有什么特别的事情发生:只有一个
。这是第二层

在正则表达式中有一个特殊的含义(除非通过
\
转义):
a | B
表示“匹配a或B”。在这种情况下,a和B都是空的,与空字符串匹配。在匹配空字符串的模式上进行拆分,将生成输入字符串中所有字符的列表(实际上,输入字符串被拆分到所有位置(在每个字符边界)。这就是第三层


“|”
“|”
都将一个字符串(
|
)传递给perl(
由shell解释)

没有引号,因此perl在其周围添加了
'
,形成字符串
'.
(如
拆分'.'.'中,$.
)。这是一个简单的单字符字符串(仍然只是
)。这是第二层

split
将其第一个参数解释为正则表达式,与前面的例子一样,
|
有一个特殊的含义(“or”),导致一个单字符元素列表。这就是第三层


|
(在引号之外,不由
\
转义)是shell中的一个特殊字符:它创建一个管道

perl -aF/|/ -lne 'print $F[0]' input

perl -aF/ | / -lne 'print $F[0]' input

和的意思是:运行
perl-aF/
并将其输出导入命令
/-lne'print$F[0]'input
。这会导致错误,因为
/
不是有效的程序,它是一个目录。

设计模式
结束匹配模式是两个非常不同的概念。标记已删除。
在shell中是特殊的。您不能不带引号地使用它。
perl-aF\\\\\\\\\\\\\\\\\\\\\\\
也可以工作。
-F/
使shell将
-F/|/
传递到
perl