Для перестановок я использую следующий скрипт perl для генерации перестановок:
#!/usr/bin/perl
use strict;
use Algorithm::Permute;
my $q=shift or die("usage permgen n word-set\n");
my $p = new Algorithm::Permute([@ARGV],$q);
while (my @res = $p->next) {
print @res,"\n"; }
Это можно использовать для создания перестановок из очень разных наборов. Пример unicode dices:
permgen 2 ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ | shuf -n 2
⚅⚄
⚅⚁
Чтобы сгенерировать ваш (ОГРОМНЫЙ) пример, нам нужно написать: permgen 5 {a..z} {0..9}
На моей старой машине для генерации 1_000_000 перестановок требуется 2с
time permgen 5 {a..z} {1..9}| head -1000000| wc
Результат арифметического расширения без кавычек подвергается подстановке имени файла (расширению с подстановочными знаками )и разбиению поля слова (), как и любому другому расширению без кавычек . Это довольно бесполезно, и несколько оболочек не делают этого, но это то, что делали исторические оболочки (, потому что это было легче реализовать ), и поэтому это то, что стандартизировал POSIX.
Результатом арифметического расширения является просто строка из -
и цифр, поэтому она никогда не может содержать подстановочный знак. (Некоторые оболочки имеют числа с плавающей запятой и могут также включать .
, +
и буквы. )Поскольку он не может содержать пробелы, он также обычно не подлежит разделению полей. Однако разделение полей можно настроить с помощью IFS
:, разделителями полей являются символы IFS
. Включение цифр в IFS
крайне редко и довольно глупо,но если вы хотите написать полностью надежный код, вам необходимо защититься от этого. Это имеет большее значение, если результат может быть отрицательным, потому что включение тире в IFS
не так глупо.
POSIX указывает, что при запуске оболочка должна установить для IFS
значение по умолчанию, чтобы на сценарии не влияло значение IFS
, которое может быть в среде. (Экспортировать IFS
не принято, но кто-то может это сделать. )Однако некоторые широко распространенные оболочки (dash, Busybox sh )сохраняют любое значение IFS
в среде, поэтому надежный сценарий оболочки должен явно устанавливать IFS
на значение по умолчанию (или сбрасывать это, что имеет тот же эффект ), если оно содержит какое-либо расширение без кавычек.