微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何有条件地定义一个Perl子例程?

我想定义一个依赖于命令行参数的Perl函数(称之为“差异”).以下代码不起作用:
if ("square" eq $ARGV[0]) {sub difference {return ($_[0] - $_[1]) ** 2}}
elsif ("constant" eq $ARGV[0]) {sub difference {return 1}}

看起来条件被忽略,因此“差异”函数得到第二个定义,而不管$ARGV [0]的值如何.

我可以通过将条件放入函数来使代码工作:

sub difference {
  if ("square" eq $ARGV[0]) {return ($_[0] - $_[1]) ** 2}
  elsif ("constant" eq $ARGV[0]) {return 1}
}

但这并不是我的意图 – 我不需要在执行期间每次评估的条件.我只需要一种影响功能定义的方法.

我的问题是:

>为什么第一个建筑不行?
>为什么它不给出错误,或者其他一些迹象表明有什么问题?
>有没有办法有条件地定义Perl中的函数

解决方法

其他人已经呈现了您请求的语法,但是我建议为此使用更明确的子例程引用,以便您可以在不操作定义的情况下自由地操作引用.例如:
sub square_difference { return ($_[0] - $_[1]) ** 2 }
sub constant_difference { return 1 }

my %lookup = (
    'square' => \&square_difference,'constant' => \&constant_difference,);

my $difference = $lookup{$ARGV[0]} || die "USAGE: $0 square|constant\n";
print &$difference(4,1),"\n";

这是同样的基本方法,但是我认为这种语法将让您将参数更方便地映射到子例程,因为您添加更多的参数.注意这是Strategy Pattern一个变化,如果你是这样的事情.

原文地址:https://www.jb51.cc/Perl/171467.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐