1

我对 Perl 真的很陌生,所以如果我错过了一个明显的答案,请原谅。我将感谢所有帮助。

我正在尝试读取位于子目录中的文件,因此我可以提取一些信息,并将信息打印到新文件中。

我知道如何读取当前目录中的文件(并打印到新文件中):

open IN, "$file_name" or die "No such file: !$";
open OUT, ">$new_file_name" or die " No such file: !$";

while (<IN>) {
print OUT $_;
}

但是如何对位于子目录中的文件执行此操作?

非常感谢,

尼卡

编辑:

非常非常非常感谢大家!我已经解决了这个问题!

4

5 回答 5

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;
}
于 2013-09-08T22:23:54.840 回答
3

有两种明显的方法:

  1. 通过文件的完整路径名访问文件,即 的值$file_name必须类似于directoryname/filename.txt或者您"directoryname/$filename"在第一行代码中编写。

  2. 更改工作目录。也就是说,chdir在访问文件之前使用 Perl 函数更改工作目录:chdir "directoryname";请记住,这会影响所有后续文件系统操作。如果要返回,请使用chdir "..";.

无论哪种情况,熟悉工作目录的概念、特殊目录名称(...)、路径分隔符/、相对路径和绝对路径以及文件系统的一般工作方式都是非常有帮助的。

于 2013-09-08T22:25:37.523 回答
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' $!";
}
于 2013-09-08T22:23:40.910 回答
0

您的变量(或字符串)可能包含文件的相对路径,所以简单地说

open IN, "foo/$file1"

哦,使用 3 参数 open

于 2013-09-08T22:24:56.863 回答
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;要求您声明变量,这可以为您节省很多麻烦。例如,您说$fooon place and $Foo(with a capital F ) in another。使用use strict;,Perl 将为您捕获这些错误。my你用or声明一个变量our。99% 的时间,您将使用my.
  • use warnings;打开各种警告。例如,您正试图对未定义的变量执行某些操作。
  • use autodie在许多情况下会自动终止您的 Perl 脚本。例如,您不能打开或关闭文件。或者,如果磁盘已满,而您的print语句无法打印到文件中怎么办?
  • use feature qw(say);允许您使用say而不是print. 该say命令会自动为您在行尾添加一个 NL,这比听起来方便得多。
  • 使用三个参数 openand 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命令将为您完成。

这些模块在 Perl 的标准安装中File::Copy可用。您需要了解它们,以便使用它们。这就是为什么你应该买一本好书并仔细阅读它的原因。

享受 Perl 的乐趣,请学习正确的做事方式。它使 Perl 成为一种更易于使用和学习的语言。

于 2013-09-09T00:32:05.377 回答