-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());
  }
}

Person is defined here:

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;

This leads to

Error : Can't call method "getFirstName" on an undefined value at check2.pl line 22.

The error won't occur in two cases:

  1. declare the variables as our.
    example: our object;

  2. rename one of the function names:
    allthis to allthis1

Can any one explain the reason?

4

3 に答える 3

2

Perl では、名前付きサブルーチンはすべてグローバル スコープです。このように、2 つの異なるスコープに同じ名前の 2 つのサブルーチンを存在させることはできません。したがって、 の 2 番目の定義はallthis()最初の定義をオーバーライドします。最初のallthis()サブを使用することはありません。

さらに、サブルーチンは定義された場所のレキシカル変数にアクセスできるため、最初の への呼び出しallthis()は 2 番目の にアクセスしようとします$object。ただし、これはまだ定義されていません。

于 2012-08-09T13:41:07.657 に答える
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);

于 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 に答える