輸入的隨機輸出
相關問題:如何根據使用者輸入創建隨機輸出
我想從使用者那裡獲取一個輸入(只有一個參數),就像
Hello
. 而且,我想給出類似的輸出olleho llohe he llo lo
就像上面一樣。而且,我想從那個單一的輸入中製作數百萬個樣本。我想將這些文本保存在 txt 格式的文件中。怎麼做?
假設,我將我的電子郵件地址作為參數
Istiakshovon0@gmail.com
。所以,現在我想用這個帳戶設置相關密碼。下面給出了一些範例輸出:Istiakshovon0@gmail.com Istiakshovon Istiak Ishovon Ishovon0 Iksgc gmail moc
我想盡可能地創建範例密碼。
我添加了awk標籤,因為我注意到很多人都在使用
awk
來格式化文本。我不熟悉它(我只是一個初學者 Linux 使用者)。這就是我添加它的原因。
使用 perl 和Algorithm::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 模組中執行完整排列時,原始數組被清空,這會擦除呼叫它的數組。
這絕對是非 perlish 行為,可能是因為該模組不是本機 perl,它是一個圍繞已編譯 C 函式的薄 perl 包裝器……並且 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) }'