Я продолжаю сталкиваться с проблемами при разыменовании, особенно при возврате значений из функций.
Проблема, похоже, в том, что всякий раз, когда вы возвращаете что-либо, кроме скаляра, вы на самом деле возвращаете этот объект по ссылке, что меня устраивает, но скажем, когда мы передаем эти ссылки другим функциям, и нам снова нужен доступ к их внутренностям, как мы сделать это правильно?
Я продолжаю сталкиваться с такими ошибками, как: "ожидание получения ссылки на четное количество параметров" или что-то в этом роде.
Есть ли общее практическое правило, которое я могу использовать для упрощения всего этого процесса? Я почти хотел бы не беспокоиться о разыменовании!
Вот пример того, что я пытался сделать ранее сегодня, и столкнулся со всевозможными проблемами разыменования, которые я потратил пару часов, пытаясь разобраться, поэтому после прочтения, попыток и неудач я здесь, чтобы спросить вас для подлости.
Объект-человек
Person
has name [Str]
has madeby [Str]
has height [Num]
has id [Num]
Различные способы создания объекта Person
sub person_maker{
my($this,%options) = @_;
my $person = Person->new(%options);
return $person;
}
sub make_person_named_james{
my($this,$options) = @_;
my $default = { name => 'James', madeby => 'name' };
$options = ($options,$defaults); #merge default and options hash
return($this->person_maker($options));
}
sub make_person_from_id{
my($this,$id) = @_;
my $default = { name => 'nameless person', madeby => 'id' };
$default = ($default,{ id => $id });
return($this->person_maker($default);
}
sub make_person_from_person{
my($this,$person) = @_;
my $person_options = {
name => $person->name().'_twin',
height => $person->height(),
id => $person->id() + 1,
madeby => 'person'
};
return($this->person_make($person_options));
}
- Func возвращает объект хэш => фактически возвращает как ссылку на хэш.
- Func возвращает ссылку на хэш => фактически возвращает как скаляр.
- Func возвращает объект массив => фактически возвращает ссылку на массив
- Func возвращает ссылку на массив => на самом деле возвращает скаляр?
- Func возвращает скаляр => он действительно возвращает значение скаляра?
Поправьте меня, если я что-то не так понял.
Тогда еще одна проблема для меня заключается в потреблении аргументов функции.
В зависимости от того, что я верну назад, эти плохие парни будут вести себя по-разному!
sub myfunc{
my($self,$args) = @_ # list of arguments (what if the args are mixed?)
OR
my($self,$args) = $_ # scalar (this wont work here $args will by undef
OR
my $self = shift; # pop the first arg
my $args = shift; # pop the second arg
OR
my $self = $_[0]
my $args = $_[1]
Плюс! Там слишком много документов, многие из них устарели, поэтому трудно точно определить, что правильно или лучше всего делать в таких ситуациях.
Если у кого-то есть волшебная диаграмма, в которой указано, когда использовать эти различные настройки и как разыменовывать определенные сценарии, благословенные хэши, хэш-реф, скаляр и т. д., я был бы бесконечно благодарен, поскольку я потратил часы, пытаясь расшифровать это. .