免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 14932 | 回复: 40
打印 上一主题 下一主题

函数在返回数组的时候遇到了问题。。。大家都来看看:) [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-04 15:11 |只看该作者 |倒序浏览
我自认为这方面弄的挺明白的,没想今天出这么个问题。。。非想弄明白了这个foreach和shift操作上的差别。

当函数返回数组引用的时候foreach和shift操作起来是一样的:
  1. sub function {
  2.     my @temp = qw/a b c/;
  3.     return \@temp;
  4. }

  5. foreach my $var (@{&function}) {
  6.     print "$var\n";
  7. }

  8. my $one = shift (@{&function});
  9. print $one;
复制代码
当函数返回数组的时候shift就会出问题,提示:
Type of arg 1 to shift must be array (not subroutine entry)

代码:
  1. sub function {
  2.     my @temp = qw/a b c/;
  3.     return @temp;
  4. }

  5. foreach my $var (&function) {
  6.     print "$var\n";
  7. }

  8. my $one = shift (&function);
  9. print $one;
复制代码
从错误提示上看我需要做的应该是提示Perl传给shift的参数是一个数组。
我想了各种办法都没成功。。。

请大家给掌掌眼~~

论坛徽章:
0
2 [报告]
发表于 2010-08-04 15:30 |只看该作者
回复 1# py


    :emn1: 因为返回的是一个参数列表,而不是一个array.
  1. foreach my $var qw/1 2 3/ {

  2.     print "$var\n";

  3. }


  4. my $one = shift ( qw/1 2 3/);
复制代码

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
3 [报告]
发表于 2010-08-04 16:01 |只看该作者
看了下文档return返回的是列表,shift要的是real ARRAY

论坛徽章:
0
4 [报告]
发表于 2010-08-04 16:16 |只看该作者
可以这样:
shift( @{ [ &func ] } );

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-08-04 21:09 |只看该作者
回复 4# dugu072_cu


谢谢。

我试了好多这样的写法都没写对,你写的是对的。这正是我和自己较劲想得到的答案。

这样写就强制将一个匿名列表转换成了一个real array。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2010-08-04 21:21 |只看该作者
回复 2# toniz


恩,对,函数返回的的确是参数列表,比如,函数可以返回两个参数,第一个参数是一个数组,第二个是一个哈希表。

那foreach怎么就能正确处理函数的返回值呢?函数的返回值如果是一个数组的时候和真实的数组有什么差别?


。。。。我再研究研究,总结一下。

论坛徽章:
0
7 [报告]
发表于 2010-08-04 21:55 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-08-04 21:56 编辑

function 返回的是数组不是列表,shift那个报错发生在编译时,编译时,shift的短视,让它并不知道&function()能返回一个数组,所以报错。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2010-08-05 08:26 |只看该作者
说返回“列表”还是返回“数组”,这其实是一样的,但严格意义上说,我觉得应该说是返回了列表.
列表是数据,return @temp和return qw/a b c/无异。
文档中关于return部分也写到:“Evaluation of EXPR may be in list, scalar, or void context, depending on how the return value will be used”

shift实际是个函数,和map一样,在识别参数的时候都有局限性,我开始就是觉得是shift的问题,所以才想尽办法用类似“强制告诉shift我那function返回的是个数组”,其实我想要的就是这个写法“shift( @{ [ &func ] } )”
我本该想到的。。。以前对哈希表做过类似的事。

我再多说一句。@{ [ &function ] }的意思,里面的中括号就是强制数据为列表的形式,之后的大括号类似${abc},就是标识一下变量。前面再加上@也就真的成了一个数组了,这样shift函数就能认识了。
相应的,如果是强制数据以哈希表的形式出现,那就是%{ { &function } },这个我尝试过,是正确的。

论坛徽章:
0
9 [报告]
发表于 2010-08-05 08:58 |只看该作者
说返回“列表”还是返回“数组”,这其实是一样的,但严格意义上说,我觉得应该说是返回了列表.
列表是数据 ...
py 发表于 2010-08-05 08:26



   

#!/bin/env perl

use strict;
use warnings;

sub func_array
{
        my @temp = qw/a b c/;
        return @temp;
}

sub func_list
{
        return qw/a b c/;
}

my $s = scalar(func_array());
my $s2 = scalar(func_list());

warn $s;
warn $s2;


返回array或者list是有区别的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2010-08-05 09:13 |只看该作者
继续弄,我看大家都还没弄明白。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP