PERL中的子程序原型

时间:2013-10-25 08:18:39

标签: perl

sub joins($ @);
print "\nEnter a letter \n\n";
$l = <STDIN>;
chomp $l;
print "\n Enter Five String \n\n";
@arr;

for($i=0;$i<5;$i++) {
    $arr[$i] = <STDIN>;
    chomp $arr[$i];
}  
@ar = joins($l, @arr);
print "\nCombined Stirng is :-  @ar\n";
sub joins {
    ($x, @str)=@_;
    @j = ($x, @str);
    return @j;
}

我遇到原型不匹配错误。我该如何解决?

2 个答案:

答案 0 :(得分:5)

问题是您已使用joins的原型预先声明了$@,然后在没有任何原型的情况下实现了它。正如其他人所说,你没有利用原型。你也没有利用sub preclared(没有括号调用的能力)所以删除这一行:

sub joins($ @);

关于原型的主题,Perl :: Critic认为它们是严重性为5(最差)的违规行为:

  

Contrary to common belief, subroutine prototypes do not enable compile-time checks for proper arguments. Don't use them.

答案 1 :(得分:4)

嗯,实际上,您需要做的是更改连接函数定义。 您可以将“子连接”更改为“子连接($ @)以同意连接函数的声明。代码如下所示。

1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4
5 sub joins($@);
6
7 print "\nEnter a letter \n\n";
8 my $l=<STDIN>;
9 chomp $l;
10 print "\n Enter Five String \n\n";
11 our @arr;
12
13 for(my $i=0;$i<5;$i++)
14 {
15     $arr[$i]=<STDIN>;
16     chomp $arr[$i];
17 }
18
19 my @ar=joins($l,@arr);
20 print "\nCombined Stirng is :-  @ar\n";
21
22 sub joins($@)
23 {
24     my ($x, @str)=@_;
25     my @j=($x,@str);
26     return @j;
27 }
顺便说一下,你可以在这里阅读关于原型(http://perldoc.perl.org/perlsub.html#Prototypes)的文档。此外,我还建议您使用严格和警告,但在演示代码中。