2017-09-26 225 views
1

我試圖使用random.org計算真隨機數的GCD並從文本文件中獲取這些數字。這是一個使用我之前創建的PRNG來完成上述操作的程序。從文本文件讀取並將信息放入數組

#!/usr/bin/perl 
use strict; 
use warnings; 
my $range = 100; 
my $gcdcount = 0; 
sub gcd_iter($$) { 
    my ($u, $v) = @_; 
    while ($v) { 
     ($u, $v) = ($v, $u % $v); 
    } 
    return abs($u); 
} 
for (my $count=0; $count<=5000; $count++) { 
    my $random_numx = int(rand($range)); 
    my $random_numy = int(rand($range)); 
    my @pair = ($random_numx, $random_numy); 
    if (gcd_iter($random_numx, $random_numy) == 1) { 
     $gcdcount++; 
    } 
} 
print "The GCD Count for PRNG #1 is $gcdcount\n"; 

我幾乎做同樣的事情,但從文本文件中獲取數字。如何將這些數字對轉換成可以將它們分配給變量的格式,以便在分割線條後將它們通過公式?以下是我迄今爲止:

my $filename = 'xxxxx'; 
open(my $fh, $filename) 
or die "Could not open file '$filename' $!"; 
sub gcd_iter($$) { 
    my ($u, $v) = @_; 
    while ($v) { 
     ($u, $v) = ($v, $u % $v); 
    } 
    return abs($u); 
} 
for (my $count=0; $count<=5000; $count++) { 
    if (gcd_iter($) == 1) { 
     $gcdcount++; 
    } 
} 
while (my $row = <$fh>) { 
    chomp $row; 
    foreach ($row) { 
     my @pair = split('s+', $_);  
    } 
} 

回答

0

你在正確的軌道上,但可以通過鍵入受益

perldoc -f split 

Perl有出色的內置文檔。 我會改變你的臺詞:

foreach ($row) { 
    my @pair = split('s+', $_); 
} 

到:

my @pair = split(/\s+/, $row); 

,並設置$num1$num2$pair[0]$pair[1] ...或者簡單地使用:

my ($num1, $num2) = split(/\s+/, $row); 

得到兩直接感興趣的標量。
換句話說,您不需要foreach $row行(您已經有$row),並且它是\s,它是空白的速記模式匹配。 祝你好運,玩得開心!

+0

非常好的答案。不過,我想你錯過了一點點。 '@ pair'(或者'$ num1'和'$ num2')變量是詞法變量,沒有任何變化。 OP需要實際使用它,打印它或其他。 – simbabque