我是Perl的新手,所以如果我错过了一个明显的答案,请原谅。我将非常感谢你的帮助。
我正在尝试读取位于子目录中的文件,因此我可以提取一些信息,并将信息打印到新文件中。
我知道如何读取当前目录中的文件(并打印到新文件中):
open IN, "$file_name" or die "No such file: !$";
open OUT, ">$new_file_name" or die " No such file: !$";
while (<IN>) {
print OUT $_;
}
但是如何对位于子目录中的文件执行此操作?
非常感谢,
尼卡
编辑:
非常感谢你们!我已经解决了这个问题!
答案 0 :(得分:3)
open
采用路径,所以
my $file_name = 'subdir/file.ext';
这是您的代码,有许多改进:
open my $IN, '<', $in_qfn
or die "Can't open \"$in_qfn\": $!\n";
open my $OUT, '>', $out_qfn
or die "Can't create \"$out_qfn\": $!\n";
while (<$IN>) {
print $OUT $_;
}
如果可能的话,我实际上会使用ARGV和STDOUT来获得最大的灵活性。
while (<>) {
print;
}
答案 1 :(得分:3)
有两种显而易见的方法:
按文件的完整路径名访问该文件,即$file_name
的值必须类似于directoryname/filename.txt
,或者您在第一行代码中编写"directoryname/$filename"
。
更改工作目录。也就是说,在访问文件之前使用Perl chdir
函数更改工作目录:chdir "directoryname";
请记住,这会影响所有后续文件系统操作。如果您想返回,请使用chdir "..";
。
在任何一种情况下,熟悉工作目录,特殊目录名称(.
和..
),路径分隔符/
,相对和绝对的概念是非常有帮助的。路径以及文件系统的工作方式。
答案 2 :(得分:1)
只需给它一个完整的目录路径。如果您位于文件所在的目录中,则可以使用pwd命令获取完整路径。请注意,您应始终使用文件的限定/完整路径,因为您永远不知道可以从哪里调用脚本。 (这只是很好的编程习惯)
use strict;
use warnings;
my $filename = 'your_full/path/sub_dir/data.txt';
if (open(my $fh, '<:encoding(UTF-8)', $filename)) {
while (my $row = <$fh>) {
chomp $row;
print "$row\n";
}
} else {
warn "Could not open file '$filename' $!";
}
答案 3 :(得分:0)
答案 4 :(得分:0)
您只需在子目录中指定文件的名称即可。使用正斜杠将目录与子目录分开。
这是你的程序以更现代的方式编写:
use strict;
use warnings;
use autodie;
use feature qw(say);
my $file_name = "path/to/file";
my $new_file_name = "path/to/new/file";
open my $in_fh, "<" $file_name;
open my $out_fh, ">", $new_file_name;
while my $line ( <$in_fh> ) {
print {$out_fh} $line;
}
close $in_fh;
close $out_fh;
use strict;
要求您声明可以为您节省大量麻烦的变量。例如,您在另一个位置$foo
和$Foo
(大写 F )。使用use strict;
,Perl会为您捕获这些错误。您使用my
或our
声明变量。 99%的情况下,您将使用my
。use warnings;
会打开各种警告。例如,您正在尝试使用未定义的变量执行某些操作。use autodie
会自动终止你的Perl脚本。例如,您无法打开或关闭文件。或者,如果磁盘已满,并且您的print
语句无法打印到文件,该怎么办?use feature qw(say);
允许您使用say
代替print
。 say
命令会自动为你的行尾添加一个NL,这比听起来要方便得多。open
和close
,并为文件句柄使用变量名称。这使得传递文件句柄更容易用于子例程。$_
。使用它有很多问题(我现在不打算进入。它确实不会增加程序的清晰度,并且会多次让你陷入困境。close
。你应该在Modern Perl上找到一本好书。例如,在你的程序中,我本可以这样做:
use strict;
use warnings;
use autodie;
use feature qw(say);
use File::Copy; # Adds a `copy` command to Perl
use constant { # Adds the concept of a constant to Perl
IN_FILE => 'path/to/file',
OUT_FILE => '/paht/to/new/file',
};
copy IN_FILE, OUT_FILE; # That's it!
无需打开文件。无需使用循环。 copy
命令将为您完成。
这些模块(如File::Copy
在Perl的标准安装中可用。您需要了解它们,以便使用它们。这就是为什么你应该得到一本好书并完成它。
与Perl玩得开心,请学习正确的做事方式。它使Perl成为一种更容易使用和学习的语言。