У вас должен быть параметризованный конструктор для вашего класса Access, который принимает объект Movie.
Только, чтобы быть Perlish (TMTOWTDI) можно использовать логическое замыкание накоротко:
-f or die "Not a file: $_" foreach @files;
Протестированный на OS X и работах.
Как примечание стороны, -f or die
похож на большое количество общих open() or die
конструкции, которые я вижу в Perl, и все еще (я думаю) показывают намерение строки (к die
при определенных условиях).
Ну, Вы не можете намереваться написать запутываемый код, но я сказал бы, что Вы, конечно, пытаетесь.
Был бы две строки (или даже блок на одной строке, как Brent. Лонгборо предлагает) вместо одного, так плохи? Честно, это - причина, я обычно очень не хочу пытаться отлаживать/редактировать код жемчуга других народов, большое количество людей, которые пишут в жемчуге, кажется, одержимо выполнением почти всего самым "умным" возможным способом, вместо того, чтобы делать его способом это легко понять для кого-то еще чтение.
Вы могли или использовать @Brent. Ответ Longborough, или если Вы действительно хотите постфикс, делает:
do { die("Not a file: $_") unless -f $_ } foreach(@files);
Однако я соглашаюсь с другими, просто потому что это - "неважная часть", не означает, что краткий лучше. Количества удобочитаемости.
Если Вы не пытаетесь написать запутываемый код, то Вы не должны пытаться записать это как это. Вы берете что-то, что должно быть простым и мешать понять.
Если ошибочный тест является основной точкой этого кода, могло бы иметь смысл для него иметь лучшее расположение в начале строки. Небольшое улучшение должно было бы использовать grep
:
die("Not a file: $_") for grep {!-f} @files;
Но если бы Вы планируете цикличное выполнение через файлы по некоторой другой причине в той части кода, было бы лучше добавить его к телу цикла.
Чертовски, Jon просто победил меня к grep
.
Но у меня есть больший вопрос: как не важно, если Вы на самом деле собираетесь прыгнуть с парашютом при нахождении некоторых нефайлов в массиве? (В противоположность, скажем, удалению тех объектов, предупреждению пользователя и затем обработке остальной части списка.) Я думал бы, что уничтожение целой хижины является довольно важной частью программы.
В любом случае Вы не можете сделать точно, что Вы хотите с постфиксными модификаторами, так как у Вас может только быть одна вещь по обе стороны от них. Таким образом, у Вас не может быть обоих unless
и foreach
. От вершины соответствующего бита perldoc perlsyn
:
Любой простой оператор может дополнительно сопровождаться ЕДИНСТВЕННЫМ модификатором, незадолго до завершающейся точки с запятой (или окончание блока).
Ты слишком много думаешь. Вот он на одной строчке без акробатики:
foreach ( @files ) { die( "Not a file!" ) unless -f }
Вы можете поиграть с предметами внутри блока, чтобы разбить его, но удаление скобок и скобок вам не поможет, и, вероятно, запутает следующий программист, который должен на это взглянуть.
Возможно, у вас есть что-то более сложное, и это только пример. В реальном мире это становится еще проще:
not_a_file_die_die_die( \@files );
Вы переносите все сложные вещи в подпрограмму. Настоящая уловка состоит в том, чтобы кратко изложить идею и намерение , а не код, реализующий эту идею. Во многих случаях механика действительно не имеет значения; вы больше заботитесь о результате. В таких случаях не переживайте по поводу механики.