我尝试在Perl中调用子例程,但是我得到了这个错误"主要"的格式错误的原型。我有一个子程序比较,我必须传递给它两个整数。
#!/usr/bin/perl
@ListA=(1,2,3);
@ListB=(2,3,4);
@ListResult;
#AND
sub Compare($p1,$p2){
if($p1 > sizeof(ListA) or $p2 > sizeof(ListB))
{
return;}
if(ListA($p1) = ListB($p2)){
push (@ListResult, ListA($p1));
Compare($p1+1,$p2+1);
return;
}
if(ListA($p1) > ListB($p2)){
Compare($p1,$p2+1);
return;
}
else {
Compare($p1+1,$p2);
return;
}
return;
}
Compare(1,1);
请帮助我并解释如何更正此程序。
答案 0 :(得分:5)
这是错误的:
sub Compare($p1,$p2){
Perl并不这样做。这将是您报告的错误的来源。 (从技术上讲,它是原型,这是一个你不应该使用的perl功能,因为它不会做你想象的那样)。
你可能想要:
sub Compare{
my ( $p1, $p2 ) = @_;
#etc.
另外:开启use strict;
和use warnings;
。他们一开始很讨厌,但是当涉及到编程问题时,他们确实做了很多很多。
喜欢:
sizeof(ListA)
无效,因为ListA
是一个单词。或者是一个字符串。但不是@ListA
的大小。这比你想象的要简单 - 标量上下文中的列表返回它的长度。因此,您只需执行$p1 > @ListA
即可。
和
if(ListA($p1) = ListB($p2)){
时:
@ListA
)。 ()
时应使用[]
。 (访问数组索引为$arrayname[0]
)=
这是一个分配,而不是==
(或eq
代表字符串),这是一个比较。 答案 1 :(得分:4)
这段代码看起来真的不像Perl。
#!/usr/bin/perl
# You should always have "use strict" and "use warnings"
# at the top of your Perl programs.
# When you have "use strict", then you need to declare your
# variables, most commonly using "my".
@ListA=(1,2,3);
@ListB=(2,3,4);
@ListResult;
#AND
# Perl subroutines aren't defined like this
sub Compare($p1,$p2){
# You need to use the @ at the start of the array name
# whenever you are referring to the whole array.
# And Perl doesn't have a "sizeof" function.
# Also, your indentation style is *horrible* here :-)
if($p1 > sizeof(ListA) or $p2 > sizeof(ListB))
{
return;}
# I think you're trying to look up individual array elements
# here. That's $array[$index], not array(index).
# And in Perl, '=' is always an assignment operator. Here,
# You probably want '==' which is a comparison operator.
if(ListA($p1) = ListB($p2)){
push (@ListResult, ListA($p1));
Compare($p1+1,$p2+1);
return;
}
if(ListA($p1) > ListB($p2)){
Compare($p1,$p2+1);
return;
}
else {
Compare($p1+1,$p2);
return;
}
return;
}
Compare(1,1);
你的程序应该是这样的:
#!/usr/bin/perl
use strict;
use warnings;
# I've changed the names of these variables, because in Perl
# arrays and lists are different things. These are arrays.
my @ArrayA = (1,2,3);
my @ArrayB = (2,3,4);
my @ArrayResult;
#AND
sub Compare {
my ($p1, $p2) = @_;
return if $p1 > @ArrayA or $p2 > @ArrayB;
if ($ArrayA[$p1] == $ArrayB[$p2]) {
push (@ArrayResult, $ArrayA[$p1]);
Compare($p1+1, $p2+1);
return;
}
if ($ArrayA[$p1] > $ArrayB[$p2]){
Compare($p1, $p2+1);
return;
} else {
Compare($p1+1, $p2);
return;
}
return;
}
Compare(1,1);
那至少会编译。但我不知道它是否有效,因为我不知道它应该做什么。