在我的perl程序中产生空白的原因是什么?

时间:2016-01-18 00:03:26

标签: perl whitespace

正如标题所说,我有一个程序或更好的两个函数来读取和写入一个数组或一个文件。但是现在我写这个的原因是:当我多次运行我的测试时,测试我的函数的测试程序会产生越来越多的空白区域。是否有人可以解释我的失败并纠正我?

我的代码

Helper.pm:

#!/usr/bin/env perl

package KconfCtl::Helper;


sub file_to_array($) {
    my $file = shift();
    my ( $filestream, $string );
    my @rray;

    open( $filestream, $file ) or die("cant open $file: $!");
    @rray = <$filestream>;
    close($filestream);
    return @rray;
 }


sub array_to_file($$;$) {
    my @rray = @{ shift() };
    my $file = shift();
    my $mode = shift();
    $mode='>' if not $mode;
    my $filestream;

    if ( not defined $file ) {
        $filestream = STDOUT;
    }
    else {
        open( $filestream, $mode, $file ) or die("cant open $file: $!");
     }
    my $l = @rray; print $l,"\n";
    foreach my $line (@rray) {
      print $filestream "$line\n";
    }
    close($filestream);
}



1;

test_helper.pl:

use KconfCtl::Helper;
use strict;
my @t;
@t= KconfCtl::Helper::file_to_array("kconf.test");
#print @t;
my $t_index=@t;
@t[$t_index]="n";
KconfCtl::Helper::array_to_file(\@t, "kconf.test", ">");

第一个结果后的结果:

n

和第二次运行:

n

n

2 个答案:

答案 0 :(得分:5)

当您从文件中读取数据时,数据包含每行末尾的换行符。您没有剥离它们,但是在再次输出数据时又添加了一个换行符。这意味着每次读取和写入时,您的文件都会获得额外的空行

此外,必须始终 use strictuse warnings 'all'位于每个 Perl脚本的顶部;你应该避免使用子程序原型;并且您应该尽可能晚地声明所有变量

这是一个更加惯用的模块代码版本,它使用chomp删除输入的换行符。请注意,模块文件中不需要#!行,因为它不会从命令行运行,但我想在程序文件中运行它。使用Exporter模块从模块中导出符号也更为常见,这样您就不必通过在子例程名称前加上完整的包名称来限定子例程名称

use strict;
use warnings 'all';

package KconfCtl::Helper;

sub file_to_array {
    my ($file) = @_;

    open my $fh, '<', $file or die qq{Can't open "$file" for input: $!};  #'
    chomp(my @array = <$fh>);

    return @array;
 }

sub array_to_file {
    my ($array, $file, $mode) = @_;
    $mode //= '>';

    my $fh;
    if ( $file ) {
        open $fh, $mode, $file or die qq{Can't open "$file" for output: $!};  #'
    }
    else {
        $fh = \*STDOUT;
    }

    print $fh $_, "\n" for @$array;
}

1;

你的测试程序就像这样

#!/usr/bin/env perl

use strict;
use warnings 'all';

use KconfCtl::Helper;

use constant FILE => 'kconf.test';

my @t = KconfCtl::Helper::file_to_array(FILE);

push @t, 'n';

KconfCtl::Helper::array_to_file(\@t, FILE);

答案 1 :(得分:3)

当您从文件中读入时,您需要选择()行,或者包含该行末尾的\n

试试这个,你就会看到发生了什么:

use Data::Dumper; ## add this line
sub file_to_array($) {
    my $file = shift();
    my ( $filestream, $string );
    my @rray;

    open( $filestream, '<', $file ) or die("cant open $file: $!");
    @rray = <$filestream>;
    close($filestream);
    print Dumper( \@rray ); ### add this line
    return @rray;
}

你可以添加

foreach(@rray){
  chomp();
}

进入你的模块以阻止这种情况发生。