Благодарю всех за помощь и прошу прощения за задержку. Наконец, я смог решить эту проблему, сначала удалив OpenSSL v1.0.1. @GracefulRestart -обновление yum не сработало. Я хотел поделиться этой информацией, чтобы она могла помочь другим.
Затем я установил только OpenSSL v1.0.2. Затем я смог выполнить остальные шаги с веб-сайта Python, чтобы установить 3.6, а также установить последнюю версию pip.
Большое спасибо.
Использование Perl и Алгоритма ::Permute библиотечного модуля:
#!/usr/bin/perl
use strict;
use Algorithm::Permute qw(permute);
my $string = 'hello';
my @array = split //, $string;
permute { print join("",@array), "\n" } @array;
$./permute.pl | head
hello
helol
heoll
hoell
ohell
hello
helol
heoll
hoell
ohell
Приведенная выше версия печатает только перестановки той же длины, что и оригинал.
Версия ниже делает все перестановки от длины 1 до той же длины:
#!/usr/bin/perl
use strict;
use Algorithm::Permute;
my $string = shift; # New & Improved! Now takes an argument!
# un-comment only ONE of the following two lines:
#for my $i (reverse 1.. length($string)) {
for my $i (1.. length($string)) {
my $p = Algorithm::Permute->new([split //, $string], $i);
while (my @res = $p->next) {
print join('',@res), "\n";
};
};
Сохранить как, например, permute.pl
. Сделайте исполняемый файл с chmod +x permute.pl
и запустите как:
$./permute.pl hello
Примечание 1. :Оказывается, существует известная ошибка. Исходный массив очищается при выполнении полных перестановок в модуле Algorithm ::Permute, который стирает массив, с которым он вызывается.
Это явно не -непершистское поведение, и, вероятно, потому, что модуль не является нативным Perl, это тонкая оболочка perl вокруг скомпилированной функции C... и функция C была написана таким образом, что разрушает массив.
В любом случае, именно поэтому я избавился от строки my @array = split //, $string
и использовал [split //, $string]
для создания анонимного массива для метода Algorithm::Permute->new()
. Это гарантирует, что массив воссоздается при каждом проходе цикла.
Обычно, если массив не (или не должен )изменяться внутри цикла, его следует создать только один раз вне цикла.
Примечание 2 :Если вы хотите изменить порядок вывода на обратный, либо направьте вывод сценария на tac
, либо измените цикл for в сценарии на:
for my $i (reverse 1.. length($string)) {
Именно это насторожило меня об ошибке. Обновленная версия выше теперь работает с reverse
или без нее.
Предположим, что пользовательский ввод находится в переменной userinput
, тогда следующий awk
код будет генерировать никогда не заканчивающуюся -случайную выборку этого ввода.
userinput=$userinput awk '
BEGIN {
s = ENVIRON["userinput"] "\n"
n = length(s)
while (1)
printf "%s", substr(s,int(1+rand()*n),1)
}'
Принимает значение $userinput
, добавляет символ новой строки в конец строки, а затем начинает записывать случайные символы из этой строки, пока вы не прервете код. Добавленный символ новой строки гарантирует, что мы время от времени получаем новые строки в выводе.
С помощью команды head
вы можете ограничить количество строк вывода. Если вам нужно 1000 строк, направьте вывод через head -n 1000
. Тестирование первых 10 строк вывода с помощьюuserinput='Hello World!'
:
$ userinput='Hello World!'
$ userinput=$userinput awk '
BEGIN {
s = ENVIRON["userinput"] "\n"
n = length(s)
while (1)
printf "%s", substr(s,int(1+rand()*n),1)
}' | head
ld l!lodd loWHe! o
H lolooel
o
eo !lll
WrlHellHod
rlll
o!Hddrd
l!lHelWloodWddeodldHHlo!d l ll oorordeoellrWHledW!!WrW W!l
l!od
Если вы хотите удалить пустые строки, то передайте вывод через sed '/./!d'
.
Вариант команды, которая берет входную строку из первой строки ввода:
awk '{
s = $0 "\n"
n = length(s)
while (1)
printf "%s", substr(s,int(1+rand()*n),1)
}'