Почему Perl не позволяет мне связать постфиксный цикл из постфиксного сравнения?

Хорошо:

$foo++ if $condition;

И это нормально:

$foo++ for (1..10);

Но это не:

$foo++ if $condition for (1..10);

Я нахожу последний вполне читаемым, если не сложно, и он умещается в одну строку! Есть ли способ сделать это или я должен жить дальше?


person wes    schedule 07.07.2009    source источник
comment
Не могли бы вы использовать Perl в названии с большой буквы? знак равно   -  person Mark Canlas    schedule 07.07.2009


Ответы (3)


У вас может быть только одна постфиксная операция для каждого оператора. Но вы можете делать то, что хотите (сорта), используя блок do, например.

do { $foo++ if $condition } for ( 1..10 );

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

for( 1..10 ) { $foo++ if $condition }

ИМХО.

person friedo    schedule 07.07.2009
comment
Мне действительно все равно. Я просто не мог найти нигде, где это было прописано, и искал объяснение. Спасибо! - person wes; 07.07.2009

Другой способ добиться того же эффекта, что и оператор if, — использовать and, так что вы могли бы сказать

$condition and $foo++ for 1 .. 10;

Однако это не поощряется.

person Chas. Owens    schedule 07.07.2009

Насколько я понимаю, это было преднамеренное дизайнерское решение в самые ранние дни Perl, чтобы люди не писали трудный для чтения или трудный для понимания код. Perl 6 допускает по крайней мере некоторые комбинации (if/for и for/if, но не for/for или if/if возможно?), и я верю, что Perl 5 в какой-то момент последует их примеру.

Обновление: Perl 6 позволяет использовать условное выражение внутри цикла (например, EXPR if EXPR for LIST ); для чего-то большего требуются дополнительные скобки (например, ( EXPR for LIST ) if EXPR ).

person ysth    schedule 08.07.2009
comment
Иногда мне кажется, что последнее, о чем думали Ларри Уолл и его коллеги, — это предотвращение появления нечитаемого кода :D Однако это одна из радостей Perl — свобода делать то, что лучше всего подходит для данной ситуации. Я за больше свободы, даже если это дает мне шанс облажаться. - person wes; 09.07.2009