應該如何進行檢查,以便檔案中沒有重復的行
open ( FILE, ">newfile");
for( $a = 1; $a < 20; $a = $a 1 ) {
my $random_number = 1 int rand(10);;
# check to avoid inserting the line if the line is already present in the file
print FILE "Random number is $random_number \n";
}
close(FILE);
uj5u.com熱心網友回復:
!$seen{$_} 是識別重復項的常用習語。
my %seen;
for (1..19) {
my $random_number = 1 int rand(10);
say "Random number is $random_number" if !$seen{$random_number} ;
}
但這并不能保證您會以隨機順序獲得從 1 到 10 的所有數字。如果這就是您要實作的目標,那么以下是一個更好的解決方案:
use List::Util qw( shuffle );
say "Random number is $_" for shuffle 1..10;
uj5u.com熱心網友回復:
似乎您要問的是如何隨機化數字 1 到 20 的順序。即沒有重復,隨機順序。這可以通過Schwartzian 變換輕松完成。例如:
perl -le'print for map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [$_, rand()] } 1..20'
6
7
16
14
5
20
3
13
19
17
4
8
15
10
9
11
18
1
2
12
在這種情況下,從末尾和向后讀取,我們創建了一個數字 1 .. 20 的串列,我們將其輸入到一個map陳述句中,該陳述句將每個數字轉換為一個陣列參考,其中包含該數字和一個亂數。然后我們將該陣列 refs 串列提供給排序,在那里我們對陣列 ref 中的第二個引數進行數字排序:亂數(因此創建一個隨機順序)。然后我們用另一個map陳述句將陣列 ref 轉換回一個簡單的數字。最后,我們使用for回圈列印串列。
所以在你的情況下,代碼看起來像:
print "Random number is: $_\n" for # print each number
map { $_>[0] } # restore to a number
sort { $a->[1] <=> $b->[1] } # sort the list on the random number
map { [ $_, rand() ] } # create array ref with random number as index
1 .. 20; # create list of numbers to randomize order of
然后您可以使用如下所示的程式將輸出重定向到檔案:
$ perl numbers.pl > newfile.txt
uj5u.com熱心網友回復:
將每一行也輸入一個散列,這使得以后檢查它變得容易和高效
use warnings;
use strict;
use feature 'say';
my $filename = shift or die "Usage: $0 filename\n";
open my $fh, '>', $filename or die "Can't open $filename: $!";
my %existing_lines;
for my $i (1..19)
{
my $random_number = 1 int rand(10);
# Check to avoid inserting the line if it is already in the file
if (not exists $existing_lines{$random_number}) {
say $fh "Random number is $random_number";
$existing_lines{$random_number} = 1;
}
}
close $fh;
這假設問題中的意圖是不重復該數字(象征性地存盤內容而不重復)。
但是,如果確實要避免整行(句子),其中該亂數僅用于使每一行不同,則使用整行作為關鍵
for my $i (1..19)
{
my $random_number = 1 int rand(10);
my $line = "Random number is $random_number";
# Check to avoid inserting the line if it is already in the file
if (not exists $existing_lines{$line}) {
say $fh $line;
$existing_lines{$line} = 1;
}
}
筆記和文獻
詞法檔案句柄 (
my $fh) 比 globs (FILE)好得多,三引數open更好。查看quide perlpentut和參考open始終檢查
open呼叫(or die...如上)。它可以而且確實會失敗 -悄悄地。在該檢查中始終列印失敗的錯誤,$!C 風格的
for回圈很少需要,而通常的foreach(帶有同義詞for)使用起來要好得多;在 perlsyn 中看到它。的..是范圍操作者始終使用my宣告變數,并使用嚴格的編譯指示強制執行;總是使用警告
如果檔案句柄指的是管道打開(這里不是這種情況)總是檢查它的關閉
有關一般概述和哈希值,請參閱perlintro;有關 Perl 資料型別的更多資訊,請參閱perldata。請記住稍后復雜資料結構的概念,perldsc
uj5u.com熱心網友回復:
return false 會做的伎倆。
因為您不能在 [1, 10] 范圍內生成 20 個不同的數字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376623.html
