wantarray
根据函数被赋值的类型(是列表还是标量),返回不同的值
- 当不对定义的函数的返回值赋值时,wantarray返回undef;
- 当把定义的函数的返回值进行赋值,赋值给标量的时候,wantarray返回空字符串(空字串与undef不同);
- 当把定义的函数的返回值进行赋值,赋值给列表的时候,wantarray返回1;
其实文字表述不方便,而且直接看该命令的名字wantarray,就是“想要?想要列表”?有点不好理解,那么直接上例子。
#!perl
# 定义函数
sub wantarray_example{
# defined wantarray 判断函数的返回值是否进行赋值了
if(defined wantarray){
print "assignment!\n";
}else{
print "no assignment!\n";
}
# wantarray 判断函数的返回值赋值给变量的类型,如果是列表,则返回1,否则返回undef
if(wantarray){
print "It is List!\n";
return qw/1 2 3 4/;
}else{
print "It is Scalar!\n";
return "A";
}
}
# 调用函数
# 不对函数的返回值进行赋值
print "======example1======\n";
wantarray_example();
# 对函数的返回值进行赋值,但是赋值给一个列表
print "======example2======\n";
my @list = wantarray_example();
# 对函数的返回值进行赋值,但是赋值给一个标量
print "======example3======\n";
my $scalar = wantarray_example();
# 将存贮在变量中的值打印出来
print "======print value======\n";
print "LIST : @list\n";
print "SCALAR: $scalar\n";
最后运行结果为
======example1======
no assignment!
It is Scalar!
======example2======
assignment!
It is List!
======example3======
assignment!
It is Scalar!
======print value======
LIST : 1 2 3 4
SCALAR: A
从结果中可以得到把函数结果进行赋值给列表,wantarray返回1,否则(赋值给标量或者不赋值),wantarray返回undef。可是在defined那里,发现当赋值给标量的时候,defined wantarray好像返回的是1。
======example3======
assignment!
It is Scalar!
就是这里
为了证实 wantarray 和 defined wantarray 的返回值,再运行下列代码
#!perl
# 定义函数
sub wantarray_example{
print "*",wantarray,"*","\n";
print "*",defined wantarray,"*","\n";
}
print "====NO ASSIGN====\n";
wantarray_example();
print "====SCALAR====\n";
my $scalar = wantarray_example();
print "====LIST====\n";
my @list = wantarray_example();
结果为
====NO ASSIGN====
**
**
====SCALAR====
**
*1*
====LIST====
*1*
*1*
可以看到在将函数的返回值赋值给标量那里,wantarray的值和defined wantarray不对应。说明当把函数的结果赋值给标量的时候wantarray的返回值不是undef,也不是0,而是空字符串。何以见得呢?
再次运行下列代码
#!perl
my $value1 = undef; # undef
my $value2 = 0; # 0
my $value3 = ""; # 空字符串
# 先打印出对应的defined的值
print "======defined======\n";
print "*",defined $value1,"*","\n";
print "*",defined $value2,"*","\n";
print "*",defined $value3,"*","\n";
# 再打印出变量本身的值
print "======self======\n";
print "*",$value1,"*","\n";
print "*",$value2,"*","\n";
print "*",$value3,"*","\n";
结果为
======defined======
**
*1*
*1*
======self======
**
*0*
**
得到结论
#!perl
# 定义函数
sub wantarray_example{
# 判断函数的返回值是否进行赋值了
if(defined wantarray){
print "assignment!\n";
}else{
print "no assignment!\n";
}
# 判断函数的返回值赋值的类型
if(wantarray){
print "It is List!\n";
return qw/1 2 3 4/;
}elsif(defined wantarray){
print "It is Scalar!\n";
return "A";
}else{
print "It is BLANK!\n";
}
}
# 调用函数
# 不对函数的返回值进行赋值
print "======example1======\n";
wantarray_example();
# 对函数的返回值进行赋值,但是赋值给一个列表
print "======example2======\n";
my @list = wantarray_example();
# 对函数的返回值进行赋值,但是赋值给一个标量
print "======example3======\n";
my $scalar = wantarray_example();
# 将存贮在变量中的值打印出来
print "======print value======\n";
print "LIST : @list\n";
print "SCALAR: $scalar\n";
结果为
======example1======
no assignment!
It is BLANK!
======example2======
assignment!
It is List!
======example3======
assignment!
It is Scalar!
======print value======
LIST : 1 2 3 4
SCALAR: A
那么这个函数就变得灵活多变了,可以根据上下给出不同的返回值!酷!
我学编程没有多久,文章中间可能会有问题,请多多指教!
参考:
http://blog.chinaunix.net/uid-13703776-id-67803.html
https://blog.csdn.net/frt007/article/details/42681089