Объявление переменных в функциях Perl - PullRequest
0 голосов
/ 23 ноября 2011

В этом руководстве есть код для класса Person. Вы можете объяснить мне цель строки 21/27? Я понимаю такие понятия, как $ _ и @_, и знаю, что my используется для объявления локальных ссылок, но я не понимаю эти строки в этом контексте кода.

1  #!/usr/bin/perl 
2  
3  package Person;
4 
5  sub new
6  {
7     my $class = shift;
8     my $self = {
9         _firstName => shift,
10        _lastName  => shift,
11        _ssn       => shift,
12    };
13    # Print all the values just for clarification.
14    print "First Name is $self->{_firstName}\n";
15    print "Last Name is $self->{_lastName}\n";
16    print "SSN is $self->{_ssn}\n";
17    bless $self, $class;
18    return $self;
19 }
20 sub setFirstName {
21    my ( $self, $firstName ) = @_;
22    $self->{_firstName} = $firstName if defined($firstName);
23    return $self->{_firstName};
24 }
25
26 sub getFirstName {
27    my( $self ) = @_;
28    return $self->{_firstName};
29 }
30 1;

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011
20 sub setFirstName {
21    my ( $self, $firstName ) = @_;

На самом базовом уровне эта строка принимает первые два аргумента в подпрограмму и присваивает их локальным переменным $self и $firstName.

$person->setFirstName('jeeves');

В контексте объектно-ориентированного Perl первый параметр, передаваемый методу (потому что это то, чем стала подпрограмма), является ссылкой на экземпляр, в котором вызывается метод ($person является приведенным выше примером) , Вам нужна эта ссылка, чтобы получить доступ к другим методам и состоянию экземпляра. Это принято называть $self. В других языках в язык будет встроено что-то вроде this, поэтому вам не придется извлекать его вручную.

После этого первого специального параметра - остальные («нормальные») аргументы метода.

1 голос
/ 23 ноября 2011

Поскольку вы понимаете концепцию @_, вы поймете, что можете просто получить к ним доступ, используя shift или $_[0] по мере необходимости.Причиной наличия этих строк является скорее лучшая практика.Поскольку в Perl нет формальных параметров, мы обычно присваиваем им именованные переменные в начале подпрограммы, прежде чем делать что-либо еще.Таким образом, код ясно показывает, что ожидает подпрограмма и каков каждый параметр.(Причиной, по которой вы можете не делать этого, является эффективность кода, но обычно сначала следует выбрать ясность кода.)

Обратите внимание на круглые скобки вокруг переменных.Это делается для назначения массива @_ списку, содержащему ($self, $firstname).Если у вас нет скобок, он не будет работать, потому что он пытается назначить массив нескольким скалярам.Обратите внимание, что если @_ содержит больше параметров, они будут игнорироваться.

Список объявляется с использованием my.Это означает, что эти скаляры будут существовать только внутри этой подпрограммы.Это для безопасности, так что если вы используете скаляр с тем же именем где-то еще, вы не получите конфликта с неожиданными результатами.Обратите внимание, что вам нужно иметь строку с use strict в верхней части вашего файла для применения my.

$self используется для объектно-ориентированного Perl.Это всегда будет первым параметром метода.Таким образом, при вызове типа $obj->firstname($foo), $obj будет назначен на $self внутри вашего метода, а $foo будет назначен на $firstname.

1 голос
/ 23 ноября 2011

Это стандартный установщик, он устанавливает переменную _firstName для объекта person. Сейчас идет строка за строкой

 my ( $self, $firstName ) = @_;

Это присваивание первых двух аргументов, с которыми setFirstName вызывается для $ self и $ firstName соответственно, это то же самое, что и

 $self = $_[0]; $firstName = $_[1];

Далее

 $self->{_firstName} = $firstName if defined($firstName);

Это присваивает переменную _firstName объекта $ self person для $ firstName, которое было определено в предыдущей строке, и делает это, только если определено $ firstName

 $self->{_firstName} = $firstName if defined($firstName);

Возвращает новое _firstName объекта self, оно не обязательно может быть изменено

...