-2
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

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

4

3 回答 3

2

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

此外,由于子例程可以访问定义它们的地方的词法变量,因此您的第一次调用allthis()尝试访问第二个$object;但是,这还没有定义。

于 2012-08-09T13:41:07.657 回答
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);.

于 2012-08-09T06:14:56.117 回答
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
于 2012-08-09T06:29:24.737 回答