免费注册 查看新帖 |

Chinaunix

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

子程序参数传递问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-20 16:06 |只看该作者 |倒序浏览
1    #!/usr/bin/perl
2    use strict;
3
4    my @names = qw/a b c d e f g h/;
5    my $result= &search(@names,"e");
6    print "$result\n";
7
8    sub search
9    {
10     my(@name,$resu)=@_;
11     foreach (@name)
12    {
13       if($resu eq $_)
14       {return $_;}
15    }
16    undef;
17  }

为什么返回值为undef呢?我尝试过将第5行的“@name”、“e”交换位置,第10行的“@name”、“$resu”交换位置便可以正常返回“e”,新人希望大家可以指点一下。

论坛徽章:
3
2015亚冠之阿尔希拉尔
日期:2015-08-15 16:33:2215-16赛季CBA联赛之四川
日期:2016-01-03 13:37:0515-16赛季CBA联赛之四川
日期:2016-06-13 15:53:36
2 [报告]
发表于 2014-09-20 16:49 |只看该作者
本帖最后由 minirain 于 2014-09-20 16:50 编辑

第10行@name接收传递的值时是“贪婪”吸收,有多少吸收多少。因此第10行改为:
my @name =shift ;  my $result = pop @name ;
或者:my $result = shift ; my @name = shift ;

论坛徽章:
1
金牛座
日期:2014-08-10 21:59:41
3 [报告]
发表于 2014-09-20 16:58 |只看该作者
改为
my ($resu, @name) = (pop @_, @_);
必须先pop, 否则会被@name吸光

论坛徽章:
0
4 [报告]
发表于 2014-09-20 17:25 |只看该作者
多谢二位解答,还有一个问题恳请大家帮忙,就不开新帖了。
这是“小骆驼书”第四章的习题一的答案:

#!/usr/bin/perl

print "Enter some numbers on separate lines:\n";
my $user_total = &total(<STDIN>);
print "The total of those numbers is $user_total.\n";

sub total
{
  my $sum;
  foreach (@_)
  {
    $sum += $_;
#  print $sum;
  }
  $sum;
}

输入数字时我是输入一个数字加一个空格,应该没有问题吧?被注释掉的那一句是我加的,运行时只会打印第一个数,后面的数都没有进入循环,所以结果总是第一个数字,求解,不胜感激!

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2014-09-20 22:55 |只看该作者
这是“小骆驼书”第四章的习题一的答案:


从前,我从来就不知道 perl,每次睡觉只要关灯就会感觉头晕。

(⊙0⊙),说实话尼玛我好害怕。甚至整晚都没睡。

每天晚上,尼玛,不是睡一睡被邪灵压身,就是听到非常诡异的声音。

我自己对动物很感兴趣。一天我购买了一本讲述美洲驼这个动物的书。
我是文盲。所以我买的是英文版,英文版就是高端大气上档次。                       

总而言之,反复翻了上百次之后,我就跟别人一样每天都睡得很好了。
更夸张的是,居然还会写代码。闪闪放光芒,咒语一样牛逼的代码。
后来才我知道这个就是 perl。


你知道吗?我做开发几年,动辄一个项目代码也要超过百万行规模了。
每天晚上,还是会再翻一翻这本书,一遍又一遍。

不过没有人知道原因 ~ {:2_168:}

Exercises
  1. [12] Write a subroutine, called &total, which returns the total of a list of numbers. Hint: the subroutine should not perform any I/O; it should simply process its parameters and return a value to its caller. Try it out in this sample program, which merely exercises the subroutine to see that it works. The first group of numbers should add up to 25.


  2. my @fred       = qw{ 1 3 5 7 9 };
  3. my $fred_total = &total(@fred);
  4. print "The total of \@fred is $fred_total.\n";
  5. print "Enter some numbers on separate lines: ";
  6. my $user_total = &total(<STDIN>);
  7. print "The total of those numbers is $user_total.\n"



  8. [5] Using the subroutine from the previous problem, make a program to calculate the sum of the numbers from 1 to 1000.
  9.    
复制代码
LZ 这啥么意思?说实话尼玛我搞不清楚啊。

print "Enter some numbers on separate lines:\n";

翻译下 ~ {:2_168:}
  1. 打印"输入一些数字上单独行: \n";
复制代码
  1. 打印“在单独的行中输入一些数字:\ n”;
复制代码
separate:
  1. 形容词
  2. 1. 分开的;分离的 (from)。
  3. 2. 各别的;各自的;各个的;单独的;独立的,不相连的。
  4. 3. 分别开的;分居的。
  5. 4. 离开肉体的。
复制代码
line:
复制代码
lines: 也是行

复制代码
separate lines: 离开肉体的行

这样的习题;给人的感觉施瓦茨感情还是挺细腻的。这个习题足够斯文凄美。

怎么翻译都不会靠谱了。这一行的目的是啥?谁看得懂呢?

  • 在离开肉体的行中输入一些数字
  • 在分居的行中输入一些数字
  • 在不相连的行中输入一些数字
  • 在各别的行中输入一些数字
  • 在单独的行中输入一些数字



总而言之没办法。不应该纠结这个问题。其实纠结也没用。

应该装作什么都没发生 ~ {:2_168:}


回复 4# fhuifniieu


   

论坛徽章:
0
6 [报告]
发表于 2014-09-21 04:43 |只看该作者
回复 4# fhuifniieu

[输入一个数]->[Enter]->[输入一个数]->[Enter]-................-[输入一个数]->[Enter]->[Ctrl +D]
{:2_179:}     

论坛徽章:
0
7 [报告]
发表于 2014-09-21 07:38 |只看该作者
无比羞愧,总是想当然,自认为应当如此输入,却不知道去翻译一下这句话。谢谢你的指点,不胜感激!回复 5# pitonas


   

论坛徽章:
0
8 [报告]
发表于 2014-09-21 07:41 |只看该作者
回复 6# justshowshowcod

无比感谢!英语水平太差,还总是想当然认为应当如此输入,羞愧羞愧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP