Perl 超临界子程序原型
当我运行Perlcritic时,出现以下错误: 第xx行第x列使用的子程序原型。见PBP第194页。 (严重程度:5) 子程序是: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)
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不报告错误,但您的代码无论如何都不会运行
您可能希望在以下两种情况之一中使用子例程原型:
你想用你的功能表演一些“魔法”吗