![Perl - 右大括号位于左大括号之前。它是如何工作的?](https://linux22.com/image/196954/Perl%20-%20%E5%8F%B3%E5%A4%A7%E6%8B%AC%E5%8F%B7%E4%BD%8D%E4%BA%8E%E5%B7%A6%E5%A4%A7%E6%8B%AC%E5%8F%B7%E4%B9%8B%E5%89%8D%E3%80%82%E5%AE%83%E6%98%AF%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%E7%9A%84%EF%BC%9F.png)
我碰到这个解决方案反转文件的内容:
$ cat f1
abc
def
ghi
jkl
$ perl -ne 'push @arr,$_;}{print reverse @arr;' f1
jkl
ghi
def
abc
有人可以解释一下大括号是如何工作的吗?我很困惑,右括号在左括号之前。
答案1
这是因为该-n
开关实际上在源代码周围添加了大括号。作为手动的说:
-n
导致 Perl 假设您的程序周围有以下循环,这使得它像sed -n
或一样迭代文件名参数awk
:LINE: while (<>) { ... # your program goes here }
这不仅仅意味着 Perl 将围绕程序运行等效的循环。它实际上添加了此处显示的前缀和后缀(具有不同的间距)。引用源码(toke.c
):
if (PL_minus_n || PL_minus_p) {
sv_catpvs(PL_linestr, "LINE: while (<>) {"/*}*/);
和
} else if (!PL_in_eval && PL_minus_n) {
sv_catpvs(linestr, /*{*/";}");
该函数sv_catpvs
将指定的字符串附加到包含要解析的源代码的中间缓冲区。我认为之前也插入了换行符;}
(因为#
在-e
字符串中没有将它们注释掉)。在这两个调用之间的某个位置,-e
还附加了的内容。
其他开关如-p
、-F
、-E
等的工作原理类似。
因此你的代码示例运行
LINE: while (<>) {push @arr,$_;}{print reverse @arr;;}
在适当的间距下,是。
LINE: while (<>) {
push @arr,$_;
}
{
print reverse @arr;
;
}
消除未使用的标签、第二组大括号(分组不需要)和空指令(lone ;
),即:
while (<>) {
push @arr,$_;
}
print reverse @arr;
循环按@arr
顺序添加行,循环后的指令以相反的顺序打印它们。