在 Perl 中使用重复文件句柄语句的替代方法



在Perl中,为了避免重复代码,设计不,我尝试使用相同的文件句柄将相同的文本文件写入2个不同的目录。 根据执行我的代码,我发现这是不允许的,尽管我可能会错过一些东西。 您可以使用相同的文件句柄来写入文本文件并将它们存储在 2 个不同的目录中吗?

寻找更好的方法。 如何将相同的文本文件写入 2 个不同的目录而不重复和重复代码? 就像下面这两个语句中发生的重复一样:

open (my $fh_w1, ">$path1/$write_File");
open (my $fh_w2, ">$path2/$write_File");

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;

my $read_File = 'dataIn.txt';
my $path1 = 'C:Perltextfiles';
my $path2 = 'C:Perldatabases';
my $write_File = 'dataOut.txt';
#open file for reading
open my $fh_r, '<', $read_File or die qq{Unable to open "$read_File" for input: $!};
#open file for writing
open (my $fh_w1, ">$path1/$write_File");
open (my $fh_w2, ">$path2/$write_File");

当您打开文件时,该文件句柄附加到的任何其他内容都会首先关闭。从关闭

如果您要立即对 FILEHANDLE 进行另一次打开,则不必关闭它,因为打开会为您关闭它。

所以你可以做

open my $fh, '<', $file or die "Can't open $file: $!";
...
open $fh, '>', $out_file ...
...
open $fh, '>', $another_file ...

这确实剥夺了您检查close $fh错误的机会,这是自动关闭无法完成的。此外,线路计数器$.不会以这种方式重置。

但是,不能像所示代码那样重复声明文件句柄。作为一个普通的词法变量,在给定的范围内只能有一个my声明。

或者,您可以编写一个打开文件的子文件,或者将其完全写出。

最后,还有一些模块可以将代码减少到一行,例如 Path::Tiny

use Path::Tiny;
...
path($file)->spew(@data);

如果出现问题,它还可以很好地检查错误和呱呱声。

Perl 文件::复制模块能够提供复制和移动功能 我们可以将它们包装在子例程中以实现相同的目的

use File::Copy;
copy("sourcefile","destinationfile") or die "Copy failed: $!";
copy("Copy.pm",*STDOUT);
move("/dev1/sourcefile","/dev2/destinationfile");
use File::Copy "cp";
$n = FileHandle->new("/a/file","r");
cp($n,"x");

最新更新