Да while в данном примере делает свое дело, я тут скорее к тому, что foreach не решает проблему отсутствия итераторов, например есть какая-то сложная структура, и вот есть у тебя алгоритм её обхода, при наличии итераторов возвращается итератор, который можно вставлять во все места где ожидается итерируемая сущность, а в случае перла или делать как ты сказал с while (тогда неполучится использовать результат в map grep и т.д. ) или возвращать список что влечёт дополнительные расходы по памяти