Perl代码给出了奇怪的错误

时间:2012-08-09 05:52:26

标签: perl

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”。

在两种情况下不会发生错误:

  1. 将变量声明为our
    例如:our object;

  2. 重命名其中一个功能名称:
    allthisallthis1

  3. 任何人都可以解释原因吗?

3 个答案:

答案 0 :(得分:2)

在Perl中,所有已命名的子例程都是全局范围的。您不能在两个不同的范围中存在两个具有相同名称的子例程。因此,allthis()的第二个定义优先于第一个定义。您永远不会使用第一个allthis()子。

此外,由于子程序可以访问定义它们的任何位置的词汇变量,因此第一次调用allthis()会尝试访问第二个$object;但是,这还没有确定。

答案 1 :(得分:1)

首先,use strictuse 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