我想跳到包含“include”的第一行。
<> until /include/;
为什么这不起作用?
match 运算符默认为 using $_
,但默认情况下该<>
运算符不会存储到$_
其中,除非它在 while 循环中使用,因此没有任何内容存储在$_
.
来自perldoc perlop
:
I/O 操作符 ... 通常你必须将返回的值赋给一个变量,但是 是发生自动分配的一种情况。当且仅当 输入符号是“while”条件内的唯一内容 语句(即使伪装成“for(;;)”循环),值是自动的 自动分配给全局变量 $_,销毁所有 以前有。(这对你来说可能看起来很奇怪,但你会 几乎在您编写的每个 Perl 脚本中都使用该结构。) $_ 变量 能够不是隐式本地化的。您必须输入“本地 $_;” 如果您希望发生这种情况,请在循环之前。 以下几行是等效的: 而 (定义($_ = )) { 打印; } 而 ($_ = ) { 打印; } while () { 打印;} 对于 (;;) { 打印; } 定义时打印($_ = ); 打印而 ($_ = ); 打印而; 这也表现类似,但避免了 $_ : 而 (我的 $line = ) { 打印 $line }
<>
只是while(<>)
构造中的魔法。否则它不会分配给$_
,因此/include/
正则表达式没有可匹配的内容。如果你用-w
Perl 运行它会告诉你:
Use of uninitialized value in pattern match (m//) at ....
您可以使用以下方法解决此问题:
$_ = <> until /include/;
为了避免警告:
while(<>)
{
last if /include/;
}