Я склонен писать что-то вроде этого:
while( my( $first, $second ) = map { ... } 1..2 ) {
...
}
Вам может не понравиться этот синтаксис, потому что вы не привыкли делать что-то подобное, но он следует парам правил, которые, я думаю, делают код проще:
- Я не набираю одно и то же дважды
- Я назначаю всем переменным одновременно
- Я использую карту для генерации списка, когда мне нужно запустить что-то более одного раза.
- Я не использую логические операторы безвозмездно.
Однако есть еще одна проблема. Вы должны выяснить, что вы действительно тестируете в условии while
, и сделать это очевидным для следующего программиста. Я не уверен, почему у вас есть две вещи в таком состоянии. Можно ли читать итератор, если есть только одна вещь (то есть, что происходит с необработанным нечетным человеком)?
Гораздо лучшим решением было бы показать, что вы пытаетесь сделать, не показывая механики. Ничего не зная о вашем итераторе, я могу предложить вам украсить его другим методом, который возвращает два элемента (или, может быть, пустой список, если он в конце):
while( my( $first, $second ) = $iterator->read_two ) {
...;
}
Если это не прояснит ситуацию, украсьте ее методом, чтобы задать конкретный вопрос:
while( $iterator->two_things_left ) {
my( $first, $second ) = $iterator->read_two;
...;
}