Это походит на лучший выбор мне:
val1, val2, ignored1, ignored2 = some_function()
Это не загадочно или ужасно (как func () [индекс] метод) и ясно формулирует Вашу цель.
Я протестировал это на PowerShell V2 CTP в Windows XP и увидел те же результаты, что и OP.
Проблема, по всей видимости, заключается в привычке PowerShell «сглаживать» коллекции, когда они передаются по конвейеру. Простое решение - заключить возвращаемое значение в коллекцию, поставив перед возвращаемым выражением оператор запятой, например:
return ,$factorPairs
См. Запись в блоге Кейта Хилла Эффективный элемент PowerShell 8: Мощность вывода - скаляры, коллекции и пустые множества - О боже! за подробностями.
Надеюсь, это поможет.
Вы близко. Проблема, с которой вы столкнулись, заключается в том, что PowerShell разворачивает (выравнивает) массив, когда он возвращается из функции. Используйте оператор запятой, чтобы вернуть массив как есть, не разворачивая его:
return ,$factorPairs
Когда в массиве есть только один элемент, что имеет место для входов 1,2,3 и других простых чисел, PowerShell разворачивает содержимое массива в вывод, чтобы каждый элемент (1,1) появлялся на выходе. Почему PowerShell разворачивает и внешний, и внутренний массив в этом случае - я точно не знаю. Я подозреваю, что они поступают так потому, что есть сценарии, в которых люди ожидают такого поведения от PowerShell.