Использование new Some::Class
называется «косвенным» вызовом метода, и это плохо, поскольку вносит некоторую двусмысленность в синтаксис.
Одна из причин, по которой он может потерпеть неудачу, заключается в том, что у вас есть массив или хэш объектов. Вы можете ожидать
dosomethingwith $hashref->{obj}
будет равно
$hashref->{obj}->dosomethingwith();
но на самом деле он анализируется как:
$hashref->dosomethingwith->{obj}
что, вероятно, не то, что вы хотели.
Другая проблема заключается в том, что в вашем пакете есть функция с тем же именем, что и метод, который вы пытаетесь вызвать. Например, что если какой-то модуль, который вы use
экспортировали в функцию с именем dosomethingwith
? В этом случае dosomethingwith $object
является неоднозначным и может привести к удивительным ошибкам.
Использование синтаксиса ->
исключительно устраняет эти проблемы, потому что метод и то, над чем вы хотите, чтобы метод работал, всегда понятны компилятору.