Perl на самом деле не такой хороший инструмент для этого, потому что вам нужна сторонняя библиотека для генерации случайных номера надежно. Генератор случайных чисел по умолчанию ( rand
или что-либо еще, использующее тот же источник, например List :: Util :: shuffle
) не подходит для чего-либо, связанного с безопасностью. Если вы хотите использовать Perl, установите Math :: Random :: Secure (и его зависимости) ( perl -MCPAN -eshell
и запустите install Math :: Random :: Безопасность
).
perl -MMath::Random::Secure=rand -l -e '@words = <>; print map $words[rand(@words)], 1..4' words.txt
Вместо этого я предлагаю использовать Python. В наши дни он примерно так же распространен, как Perl, а его стандартная библиотека намного лучше округлена. Да, код длиннее, но короткий код сам по себе не является признаком качества.
python -c 'import random, sys; rng = random.SystemRandom(); words = sys.stdin.readlines(); print " ".join([words[rng.randrange(0, len(words))][:-1] for i in xrange(4)])'
В более удобочитаемой многострочной форме:
import random, sys
rng = random.SystemRandom()
words = sys.stdin.readlines()
print " ".join([words[rng.randrange(0, len(words))][:-1] for i in xrange(4)])
В качестве альтернативы, если у вас есть не-антикварные GNU coreutils, как в случае с невстроенным Linux и Cygwin, вы можете использовать утилиту shuf
. Вам необходимо передать безопасный генератор случайных чисел с опцией - random-source
.
shuf --random-source=/dev/urandom -r -n 4 words.txt