Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,readline如何在循环条件中分配给$而不是在其他地方?_Perl - Fatal编程技术网

在Perl中,readline如何在循环条件中分配给$而不是在其他地方?

在Perl中,readline如何在循环条件中分配给$而不是在其他地方?,perl,Perl,readline是如何在Perl中实现的 问题是,如果readline用于循环条件,例如: while(<>) { #here $_ is set print; } while(){ #这里设置了$ 印刷品; } 相反,如果我们这样做 <>; print; #$_ is not set here ; 打印;#$\u这里没有设置 它不会打印任何东西吗 这是如何实现的?函数如何知道它在循环条件语句中使用?或者它只是这样设计的一种内置行为?,而是分配给$的一种

readline是如何在Perl中实现的

问题是,如果readline用于循环条件,例如:

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
prints
bar