use Person;
print(" object creation ");
my $object = new Person( "Mohammad", "Saleem", 23234345);
print (" here after");
allthis();
sub allthis()
{
print( $object->getFirstName() );
}
if(1)
{
print(" object creation ");
my $object = new Person( "Mohammad", "Saleem", 23234345);
allthis();
sub allthis()
{
print($object->getFirstName());
}
}
此处定义了人:
package Person;
sub new
{
my $class = shift;
my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
print "First Name is $self->{_firstName}\n";
print "Last Name is $self->{_lastName}\n";
print "SSN is $self->{_ssn}\n";
bless $self, $class;
return $self;
}
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName);
return $self->{_firstName};
}
sub getFirstName {
my( $self ) = @_;
return $self->{_firstName};
}
1;
这导致
错误: 无法在check2.pl第22行的未定义值上调用方法“getFirstName”。
在两种情况下不会发生错误:
将变量声明为our
。
例如:our object;
重命名其中一个功能名称:
allthis
至allthis1
任何人都可以解释原因吗?
答案 0 :(得分:2)
在Perl中,所有已命名的子例程都是全局范围的。您不能在两个不同的范围中存在两个具有相同名称的子例程。因此,allthis()
的第二个定义优先于第一个定义。您永远不会使用第一个allthis()
子。
此外,由于子程序可以访问定义它们的任何位置的词汇变量,因此第一次调用allthis()
会尝试访问第二个$object
;但是,这还没有确定。
答案 1 :(得分:1)
首先,use strict
和use warnings
。总是。每一次。
因为如果你有,你会收到警告,你正在重新定义main::allthis()
。所以,不要这样做。
此代码可以满足您的需求:
use strict;
use warnings;
use Person;
print(" object creation ");
my $object = new Person( "Mohammad", "Saleem", 23234345);
sub allthis() #have to define after $object is created
{
print($object->getFirstName());
}
print (" here after");
allthis();
print(" object creation ");
$object = new Person( "Mohammad", "Saleem", 23234345);
allthis();
但是,我会考虑是否有必要使用$object
作为全局变量(相对于allthis()
,而是让您的子例程采用参数:
sub allthis
{
my $object = shift;
print $object->getFirstName();
}
然后,您可以通过allthis($object);
调用它。
答案 2 :(得分:0)
下面:
use strict;
use warnings;
use Person;
print(" object creation\n");
my $object = new Person( "Mohammad", "Saleem", 23234345 );
sub allthis() {
print( $object->getFirstName() . "\n");
}
print(" here after\n");
allthis();
print(" object creation\n");
$object = new Person( "Mohammad", "Saleem", 23234345 );
allthis();
<强>输出:强>
object creation First Name is Mohammad
Last Name is Saleem
SSN is 23234345
here afterMohammad
object creation First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Mohammad