5

我想跳到包含“include”的第一行。

<> until /include/;

为什么这不起作用?

4

2 回答 2

10

match 运算符默认为 using $_,但默认情况下该<>运算符不会存储到$_其中,除非它在 ​​while 循环中使用,因此没有任何内容存储在$_.

来自perldoc perlop

   I/O 操作符
   ...

   通常你必须将返回的值赋给一个变量,但是
   是发生自动分配的一种情况。当且仅当
   输入符号是“while”条件内的唯一内容
   语句(即使伪装成“for(;;)”循环),值是自动的
   自动分配给全局变量 $_,销毁所有
   以前有。(这对你来说可能看起来很奇怪,但你会
   几乎在您编写的每个 Perl 脚本中都使用该结构。) $_ 变量
   能够不是隐式本地化的。您必须输入“本地 $_;”
   如果您希望发生这种情况,请在循环之前。

   以下几行是等效的:

       而 (定义($_ = )) { 打印; }
       而 ($_ = ) { 打印; }
       while () { 打印;}
       对于 (;;) { 打印; }
       定义时打印($_ = );
       打印而 ($_ = );
       打印而;

   这也表现类似,但避免了 $_ :

       而 (我的 $line = ) { 打印 $line }
于 2008-12-11T17:46:28.520 回答
4

<>只是while(<>)构造中的魔法。否则它不会分配给$_,因此/include/正则表达式没有可匹配的内容。如果你用-wPerl 运行它会告诉你:

Use of uninitialized value in pattern match (m//) at ....

您可以使用以下方法解决此问题:

$_ = <> until /include/;

为了避免警告:

while(<>)
{
    last if /include/;
}
于 2008-12-11T17:51:41.817 回答