在Perl中,readline如何在循环条件中分配给$而不是在其他地方?
readline是如何在Perl中实现的 问题是,如果readline用于循环条件,例如:在Perl中,readline如何在循环条件中分配给$而不是在其他地方?,perl,Perl,readline是如何在Perl中实现的 问题是,如果readline用于循环条件,例如: while(<>) { #here $_ is set print; } while(){ #这里设置了$ 印刷品; } 相反,如果我们这样做 <>; print; #$_ is not set here ; 打印;#$\u这里没有设置 它不会打印任何东西吗 这是如何实现的?函数如何知道它在循环条件语句中使用?或者它只是这样设计的一种内置行为?,而是分配给$的一种
while(<>) {
#here $_ is set
print;
}
while(){
#这里设置了$
印刷品;
}
相反,如果我们这样做
<>;
print; #$_ is not set here
;
打印;#$\u这里没有设置
它不会打印任何东西吗
这是如何实现的?函数如何知道它在循环条件语句中使用?或者它只是这样设计的一种内置行为?
,而
是分配给$的一种特殊情况。在第二种情况下,您只需阅读命令行上的所有内容,然后立即将其丢弃。有关更多详细信息,请阅读文档:Perl函数在不同的环境中可以有不同的行为
第一个示例是标量上下文。第二个例子是一个空上下文
您可以使用内置函数来确定函数的调用上下文
声明所有修改或使用$\uuu
的位置:
以下是Perl将假定的位置,即使您不使用它:
以下函数使用$\uuu
作为默认参数:
abs、alarm、chomp、chop、chr、chroot、cos、defined、eval、evalbytes、exp、fc、glob、hex、int、lc、lcfirst、length、log、lstat、mkdir、oct、ord、pos、print、printf、quotemeta、readlink、readpipe、ref、require、reverse(仅在标量上下文中)、rmdir、say、sin、split(第二个参数)、sqrt、stat、study、uc、uc、uc、unlink、unlink、unpack、unpack
所有文件测试(-f
,-d
)除了默认为STDIN的-t
。见-X
模式匹配操作m/
、s//
和tr//
(又称y///
)在没有=~
运算符的情况下使用
如果未提供其他变量,则foreach
循环中的默认迭代器变量
grep()和map()函数中的隐式迭代器变量
given()
的隐式变量
当
、readline
、readdir
或每个操作的结果作为while
测试的唯一标准进行测试时,放置下一个值或输入记录的默认位置。在测试之外,
测试不会发生这种情况
在这种情况下,readline
的实现没有什么特别之处。它从不设置$\uu
。相反,Perl编译器中有一个特例,它检查while
循环的条件,并在内部重写某些条件
例如,while(){}
被重写为
while (defined($_ = <ARGV>)) {
();
}
while(已定义($):
通常必须将返回值赋给变量,但有一种情况会发生自动赋值。当且仅当输入符号是while
语句的条件内的唯一内容(即使伪装为for(;;)
循环),该值将自动分配给全局变量$\uuz
,从而销毁以前存在的任何内容
它也在中提到。中描述了这种行为:“通常必须将返回值赋给变量,但有一种情况会发生自动赋值。当且仅当输入符号是while
语句的条件内的唯一内容时(即使伪装为for(;;)
循环),该值将自动分配给全局变量$\uucode>,从而销毁以前存在的任何内容。(这对您来说可能是件奇怪的事情,但您将在编写的几乎每一个Perl脚本中使用该构造。)“投票人愿意评论原因吗?(许多文章中有一篇被否决,但没有对此发表评论)这是正确的,但与此无关。while()
是编译器中的一种特殊情况。第二种情况不会读取命令行中的所有内容并将其丢弃,只有第一个参数:echo foo>foo;echo bar>bar;perl-we';print'foo bar
printsbar