正如标题所说,我有一个程序或更好的两个函数来读取和写入一个数组或一个文件.但是现在我写这个的原因是:当我多次运行我的测试时,测试我的函数的测试程序会产生越来越多的空白区域.是否有人可以解释我的失败并纠正我?
我的代码
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;
Run Code Online (Sandbox Code Playgroud)
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", ">");
Run Code Online (Sandbox Code Playgroud)
结果在第一个之后:
n
Run Code Online (Sandbox Code Playgroud)
和第二轮:
n
n
Run Code Online (Sandbox Code Playgroud)
从文件读取时,数据包括每行末尾的换行符.您没有剥离它们,但是在再次输出数据时又添加了一个换行符.这意味着每次读取和写入时,您的文件都会获得额外的空白行
此外,你必须始终 use strict和use 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;
Run Code Online (Sandbox Code Playgroud)
你的测试程序会是这样的
#!/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);
Run Code Online (Sandbox Code Playgroud)