Perl 超临界子程序原型

Perl 超临界子程序原型,perl,Perl,当我运行Perlcritic时,出现以下错误: 第xx行第x列使用的子程序原型。见PBP第194页。 (严重程度:5) 子程序是: sub zFormatDate() { my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = shift; return sprintf("%04d%02d%02d%02d%02d%02d", $year + 1900, $mon+1, $mday, $hour, $min, $sec)

当我运行Perlcritic时,出现以下错误:

第xx行第x列使用的子程序原型。见PBP第194页。 (严重程度:5)

子程序是:

sub zFormatDate() {
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = shift;
  return sprintf("%04d%02d%02d%02d%02d%02d",
    $year + 1900, $mon+1, $mday, $hour, $min, $sec);
}
如果我从函数中删除关键字“sub”,它将消失


这样可以吗,或者我应该考虑另一种解决方案吗?

如消息所示,您已经使用了。你很可能不需要它们

当前,您的子例程定义可能类似于:

sub foo()
将其更改为:

sub foo

请注意删除
以及介于两者之间的任何内容。

如消息所示,您已使用。你很可能不需要它们

当前,您的子例程定义可能类似于:

sub foo()
将其更改为:

sub foo

请注意删除
以及介于两者之间的任何内容。

否,删除
子关键字绝对不是解决方案。如果您更改此选项:

sub func($@) {
    # ...
}
为此:

func($@) {
    # ...
}
perlcritic停止抱怨原型——但我认为这只是perlcritic的一个小故障。如果没有
sub
关键字,则不再是子例程定义;这是一个语法错误,如果您尝试运行它或使用
perl-cw
检查它,就会看到这一点。perlcritic的工作并不是检查您的代码是否是有效的Perl;它显然假设是这样,然后警告您样式问题。如果您向它输入无效的Perl,那么所有的赌注都没有了

现在的普遍看法是,使用Perl原型通常不是一个好主意

《Perlcritic》以达米安·康威的书为基础。从第194页开始的部分标题为“不要使用子程序原型”

这本书不是公开的,所以我不能引用或链接到这里的部分,但Coloric有一个“原型的问题”,其中包括:

原型的主要问题是,它们的行为与原型不同 大多数人在第一次遇到他们时都会期待。原型可以改变 解析后续代码,它们可以强制 论据。它们不作为文档来记录数据的数量或类型 参数子例程期望,也不会将参数映射到命名的 参数

很容易假设Perl的原型与C的原型相似,C的原型声明函数所期望的参数的数量和类型(以及可选的名称)。事实上,它们完全不同。它们的主要目的是编写模拟内置函数行为的Perl子例程,例如不将数组展平为列表

另见:

当然,这是非常强大的,应该只用于 适度使世界变得更美好


不,删除
sub
关键字绝对不是解决方案。如果您更改此选项:

sub func($@) {
    # ...
}
为此:

func($@) {
    # ...
}
perlcritic停止抱怨原型——但我认为这只是perlcritic的一个小故障。如果没有
sub
关键字,则不再是子例程定义;这是一个语法错误,如果您尝试运行它或使用
perl-cw
检查它,就会看到这一点。perlcritic的工作并不是检查您的代码是否是有效的Perl;它显然假设是这样,然后警告您样式问题。如果您向它输入无效的Perl,那么所有的赌注都没有了

现在的普遍看法是,使用Perl原型通常不是一个好主意

《Perlcritic》以达米安·康威的书为基础。从第194页开始的部分标题为“不要使用子程序原型”

这本书不是公开的,所以我不能引用或链接到这里的部分,但Coloric有一个“原型的问题”,其中包括:

原型的主要问题是,它们的行为与原型不同 大多数人在第一次遇到他们时都会期待。原型可以改变 解析后续代码,它们可以强制 论据。它们不作为文档来记录数据的数量或类型 参数子例程期望,也不会将参数映射到命名的 参数

很容易假设Perl的原型与C的原型相似,C的原型声明函数所期望的参数的数量和类型(以及可选的名称)。事实上,它们完全不同。它们的主要目的是编写模拟内置函数行为的Perl子例程,例如不将数组展平为列表

另见:

当然,这是非常强大的,应该只用于 适度使世界变得更美好


批评家认为子例程原型很糟糕。这不是关于“sub”关键字,而是函数参数定义。删除“sub”将诱使Perl::Critic不报告错误,但您的代码无论如何都不会运行

您可能希望在以下两种情况之一中使用子例程原型:

  • 您希望对函数参数执行一些“魔术”,例如:

    次fun1(\@){ 我的($ar_ref)=@_ }

  • 那么一个像这样的电话

    fun1(@args)  
    
    不会将@args悄悄地传递到@中,但会将@args作为数组引用传递到@中[0]

  • 您希望清楚地说明函数签名

    子fun2($$\%){}

  • fun2参数是一个标量、另一个标量和一个散列引用

    Perl最佳实践手册为这两种情况提供了使用场景,您很容易就被自己的代码搞砸了。 PBP给出的解决方案是:不要使用原型

    如果仍要使用它们,可以告诉Perl::Critic不要报告原型的使用情况:

    ## no critic
    # Perl::Critic will ignore any problems it sees with your code
    sub func_With_prototypes ($$$)
    {
    return undef
    }
    ## use critic
    # Perl::Critic will report any problems it sees within your code
    

    批评家认为子例程原型很糟糕。这不是关于“sub”关键字,而是函数参数定义。删除“sub”将诱使Perl::Critic不报告错误,但您的代码无论如何都不会运行

    您可能希望在以下两种情况之一中使用子例程原型:

  • 你想用你的功能表演一些“魔法”吗