Perl打开文件但不读取内容

时间:2017-10-06 18:30:20

标签: perl greatest-common-divisor

我的Perl程序似乎成功打开了我希望它读取的文本文件,但它没有使用代码中文本文件中的信息。

#!/usr/bin/perl

use strict;
use warnings;

sub gcd_iter($$) {
    my ( $u, $v ) = @_;

    while ( $v ) {
        ( $u, $v ) = ( $v, $u % $v );
    }

    return abs( $u );
}

my $gcdcount = 0;
my $filename = "Integers1.txt";

open( my $fh, "<", $filename ) or die( "Can't open file $filename, $!" );

while ( my @integers = <$fh> ) {

    my $value1   = shift( @integers );
    my $value2   = shift( @integers );
    my @trngpair = ( $value1, $value2 );

    if ( gcd_iter( $value1, $value2 ) == 1 ) {
        $gcdcount++;
    }
}

print "$gcdcount\n";

close $fh;

程序没有打印配对数组或正确的gcdcount。我让程序做了两次类似的事情并且gcdcount计算得当,但对于这个,它不是。每次运行程序时,输出都会读取gcdcount为0。 gcd计算的子程序在代码中更进一步。

输入文件通常是2000行随机生成的整数,但可以使用以下方法生成问题:

83
399
2
343
267
120
893
33

1 个答案:

答案 0 :(得分:1)

列表上下文中的

<$fh>读取文件的其余部分并计算每行的标量。

这意味着my @integers = <$fh>;在第一次评估时会读取文件的其余部分。第二次循环,没有什么可读的。

替换

while (my @integers = <$fh>) {

chomp( my @integers = <$fh> );
while (@integers) {
#!/usr/bin/perl
use strict;
use warnings;
sub gcd_iter($$) {
    my ($u, $v) = @_;
    while ($v) {
    ($u, $v) = ($v, $u % $v);
    }
return abs($u);
}
my $gcdcount = 0;
my $filename = "Integers1.txt";
open (my $fh, "<", $filename) or die("Can't open file $filename, $!");
chomp( my @integers = <$fh> );
while (@integers) {
    my $value1 = shift(@integers);
    my $value2 = shift(@integers);
    my @trngpair = ($value1, $value2);
    if (gcd_iter($value1,$value2)==1) {
    $gcdcount++;
    }
}
print "$gcdcount\n";
close $fh;