【问题标题】:What is the difference when calling subroutine with and without & in Perl?在 Perl 中使用和不使用 & 调用子例程有什么区别?
【发布时间】:2015-07-27 13:06:55
【问题描述】:

在我的家庭作业中,有人告诉我在 Perl 中创建一个子例程,当在其中调用参数时,它会打印参数。我这样做了,我作业的第二部分是在第二个子程序中调用第一个子程序。所以我做了所有这一切,但问题是:尝试在调用第一个子程序时使用“&”运行第二个子程序,没有它并写下这两个不同调用的区别是什么。所以子程序似乎在两种情况下都可以完美地工作,无论有没有,但我只是不知道它真正改变了什么,因此我不知道该写什么。 题外话,我的代码看起来不错吗?第一次用这个 Perl 编码。

这是代码:

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

show_args('fred','barney','betty');

show_args_again();

sub show_args{
    my ($broj1, $broj2, $broj3) = @_;
    print "The arguments are: " . "$broj1, " . "$broj2, " . "$broj3.\n";
}
sub show_args_again{
    &show_args('fred','barney','betty');
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!这是一个公平的问题。关于您的代码,它看起来不错。你有strictwarnings。名字很清楚。我怀疑$broj1 指的是您母语中的argument。你应该决定是否要坚持使用英语,并坚持这个决定。 print 行最好写成print "foo: ", join(',', $broj1, $broj2, $broj3), "\n";。请注意,say 不在 Perl 5.10 中。
  • 代码看起来不错,但我建议一次只做一件事stackoverflow.com/questions/8912049/…
  • @simbabque: say 在 Perl v5.10 中引入
  • @Borodin: perldoc.perl.org/5.10.0/search.html?q=say 没有找到它。但是perldoc.perl.org/5.10.0/functions/say.html 存在。奇怪的。我站得更正了。 :)
  • @simbabque:在perl5100delta

标签: perl subroutine


【解决方案1】:

赋值语句是否说明show_args_again 是否应该使用参数调用?

我能想到的唯一要发现的就是这段代码。试试看

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

show_args('fred', 'barney', 'betty');
print "---\n";
show_args_again('fred', 'barney', 'betty');

sub show_args{
    my ($broj1, $broj2, $broj3) = @_;
    no warnings 'uninitialized';
    print "The arguments are: $broj1, $broj2, $broj3.\n";
}

sub show_args_again {
    show_args(@_);
    &show_args(@_);
    show_args();
    &show_args();
    show_args;
    &show_args;
}

【讨论】:

  • 不,它只针对第一个子例程说,并被告知第二个应该只调用第一个,但是感谢该代码,我现在正在尝试它
  • @AsapCancel: 好吧,你的show_args 没有(也不应该)有原型,所以用 & 号调用的唯一区别是当你完全不带参数调用它时,比如&show_args;。也许关键是没有任何区别。无论哪种方式,您都应该永远在现代生产代码中调用子例程,除非您需要它提供的深奥特性。即使这样,您也可能想要goto &show_args
【解决方案2】:

我认为我找到了应该做的方式,并最终意识到他们真正希望我在这份作业中展示什么。所以这是我的代码:

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;


show_args("fred","barney","betty",);

show_args_again("fred","barney","betty");

sub show_args{ 
    print "The arguments are: ", join(', ', @_), ".\n"; 
}

sub show_args_again{
     &show_args; 
}

所以当我不放“&”符号时,它不会向我显示参数,正如我之前在某处看到的那样,当你使用不带尾括号的“&”时,你会忽略原型并使用当前值@_ 参数列表。所以在没有那个符号的情况下调用它只是我想的整个事情的反效果。是的,第二个子程序应该和第一个子程序做同样的事情,他们并没有真正说明它是否应该有参数,只是说它必须调用它。

【讨论】:

    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2020-11-18
    • 2021-09-27
    相关资源
    最近更新 更多