2017-09-26 227 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