Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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本身只包含一个变量?_Perl_Variables_Subroutine - Fatal编程技术网

为什么这行Perl本身只包含一个变量?

为什么这行Perl本身只包含一个变量?,perl,variables,subroutine,Perl,Variables,Subroutine,我越喜欢perl,但我有一个问题,关于我在模块中的一个子例程中看到的一行 my $var = 1; .... .... .... .... $var; 让我吃惊的是,$var在一行中单独出现。这只是返回1的一种迂回方式吗 非常感谢 Jane在perl中,块的值是块中最后一个表达式的值。这只是return$var的简写 编辑:纯粹主义者指出,块通常不返回值(例如,与Scala中的块一样),因此您无法编写: my $x = if (cond) { 7 } else { 8 }; # wrong!

我越喜欢perl,但我有一个问题,关于我在模块中的一个子例程中看到的一行

my $var = 1;
....
....
....
....
$var;
让我吃惊的是,
$var
在一行中单独出现。这只是返回
1
的一种迂回方式吗

非常感谢


Jane

在perl中,块的值是块中最后一个表达式的值。这只是
return$var
的简写

编辑:纯粹主义者指出,块通常不返回值(例如,与Scala中的块一样),因此您无法编写:

my $x = if (cond) { 7 } else { 8 };  # wrong!
子程序eval或do文件的隐式返回值是最后计算的表达式。最后一个表达式可以位于块内,但:

sub f {
    my $cond = shift;
    if ($cond) { 7 } else { 8 }  # successfully returns 7 or 8 from f()
}
if/else块返回值的外观很肤浅,尽管严格来说,它们不返回值。

引用以下最后一行:

如果没有显式的
返回
,子例程、eval或do文件会自动返回最后计算的表达式的值


它可能是计划返回更多的案件或东西,只是从来没有修改。要么是这样,要么就是为了安抚一些过分热心的标准,这可能是一个完整的文件。记住有语法
do$string\u with_filename
,它返回最后一个计算表达式的结果。最好指出,所有块,即使是
if(…){…}else{…}
块,都返回它们最后执行的表达式。在大多数情况下不使用它,但如果结构是子例程中的最后一个内容,或者封装在
do{…}
block中,则可以使用它。对不起,这个答案是错误的。在Perl中,块本身不返回任何内容。你只是看到一个
sub/do/eval
生成它最后一次求值的结果,这与块结构完全无关。感谢你的编辑,Ben。是的,或者说现在离右边更近了。裸块和所有其他形式的循环都没有返回值;如果他们这样做了,我们就不需要
map/grep
。最好只说
do
eval
,因为两者都有两种形式,但适用相同的规则。有些子例程有两个不同的返回值,一个用于声明
$fn=sub{…}和一个用于执行
$value=&$fn
。我宁愿认为自己不是一个纯粹主义者,而是一个精确主义者,尽管这只是对黑鬼的模糊拉丁语。☺