что делает этот Perl foreach? - PullRequest
       0

что делает этот Perl foreach?

2 голосов
/ 26 апреля 2011

Я застрял, понимая, что делает этот foreach, я новичок в программировании на Perl

-e && print ("$_\n") foreach $base_name, "build/$base_name";

здесь сборка является каталогом. Спасибо

Ответы [ 4 ]

11 голосов
/ 26 апреля 2011

Не очень красивый код, который кто-то оставил вам там. :(

Любой из

for ($basename, "build/$basename") { say if -e }

или

for my $file ($basename, "build/$basename") {
     say $file if -e $file;
}

будет понятнее.

6 голосов
/ 26 апреля 2011

Проверяет, существует ли файл, и если он существует, печатает его имя.

Он может быть записан более понятным способом.

Он перебирает $ base_name и затем строит / $ base_nameпока имя файла в $ base_name

4 голосов
/ 26 апреля 2011

это по сути то же самое, что и:

foreach( $base_name, "build/$base_name" ){
  if( -e ){ 
    print ("$_\n");
  }
}
2 голосов
/ 26 апреля 2011

Надеюсь, тот, кто написал это, не является плодовитым.

Сколько способов сделать то же самое более понятным способом?

grep

grep фильтрует список иудаляет все, что возвращает false для условия проверки.Рассматриваемое текущее значение установлено на $_, поэтому очень удобно использовать операторы проверки файлов.

Поскольку say и print оба хорошо обрабатывают списки строк, имеет смысл фильтровать выводперед передачей его им.

say grep -e, $base_name, "build/$base_name";

В старых perls без say, map иногда используется для применения новых строк к выходу до его печати. ​​

print map "$_\n", grep -e, $base_name, "build/$base_name";

для

Здесь мы смело используем модификатор оператора if.ИМХО, формы модификаторов операторов могут быть очень удобны, если LHS сохраняется очень просто .

для моего $ dir ($ base_name, "build / $ base_name") {print "$dir \ n "if -e $ dir;}

пунктуация

Все еще безобразно, как грех, но разрыв строки и использование некоторых дополнительных скобок помогает определить, что зацикливается, и отделить его от кода зацикливания.

-e && print("$_\n")
    foreach( $base_name, "build/$base_name" );

Это лучше, но, пожалуйста, не делай этого.Если вы хотите сделать ($foo if $bar) for @baz; DON "T . Используйте полноразмерный блок. Я могу посчитать один раз в моей жизни, когда было нормально использовать такую ​​конструкцию $bar and $foo for @baz, как эта, - и этобыло , вероятно, неправильно его использовать .

sub

Тайный код OP лучше, если он просто заключен в сабвуфер с хорошим именем.

Я напишу это самым уродливым способом, который я знаю, как:

sub print_existing_files { -e && print ("$_\n") foreach @_; }

Тело сабвуфера остается загадкой, но по крайней мере в названии есть какая-то подсказка.

Заключение

Я уверен, что пропустил много вариантов того, как это можно сделать (у меня нет ничего, что использует until, и чертовски близко к тому, что не было намеренно запутано, было бы яснее).Но это не относится к делу.

Смысл этого в действительности состоит в том, чтобы сказать, что на любом языке есть много способов выполнить любую заданную задачу, поэтому важно, чтобы каждый программист, работающий в системе, оставалсяпомня о тех, кто следует.

Код существует для двух целей:общаться с будущими программистами и инструктировать компьютер, как работать - в таком порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...