perl如何处理带有不同引号的模式?
如图所示 -F选项为-a指定要拆分的图案。该模式可能被//、“”或“”包围,否则它将被放在单引号中。您不能在模式中使用文字空白或NUL字符 我在文本上尝试了以下命令,但结果完全相同 那么,在下面的示例中,这些模式引用的区别是什么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
$ 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
。