如何在另一个Perl文件中重复使用Perl文件

时间:2012-09-22 04:08:42

标签: perl

我正在执行以下步骤:

  • 读取目录中的所有文本文件并将其存储在名为 @files
  • 的数组中
  • 在每个文本文件上运行foreach循环。 使用拆分操作提取文件名(剥离.txt)并创建该特定文件名的文件夹。 将该文件重命名为 Test.txt (以便作为另一个perl可执行文件的输入) 通过添加行 require“test.pl”;
  • 为每个文件执行test.pl

它只适用于一个文件,但不再适用。 这是我的代码:

opendir DIR, ".";
my @files = grep {/\.txt/} readdir DIR;

foreach my $files (@files) {

    @fn = split '\.', $files;
    mkdir "$fn[0]" 
        or die "Unable to create $fn[0] directory <$!>\n";

    rename "$files", "Test.txt";
    require "test3.pl";

    rename "Test.txt", "$files";
    system "move $files $fn[0]";
}

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:6)

require函数是智能的,只有在尚未加载时才加载代码。为什么这很棒? (1.)我们没有条件包含的C的预处理器地狱,(2)我们节省时间。

要执行另一个perl脚本,我们有一个种类的可能性。您可能想要的那个是do脚本。 do FILENAME语法与eval类似,只是您的范围对do ne文件不可见。

您还可以通过system "./test3.pl"启动另一位口译员。

您可以将test3.pl作为一个模块,例如使用package test3;,将内容打包到sub。您可能会将当前文件名作为参数传递,而不是对文件名进行硬编码。这不仅是更好的编码实践,还允许您更轻松地扩展应用程序,例如多线程。

以下是我实现该代码段的方法:

use test3; # load the file once

foreach my $file (glob "*.txt") {   # use `glob` to get a list of matching filenames

    (my $newdir) = $file =~ m/^ (.+) \.txt $/x;  # what you probably wanted
    mkdir $newdir 
        or die "Unable to create $newdir directory <$!>\n";

    test3::the_sub($file); # do the action on $file, without renaming circus.
    system "move $file $newdir"; # rather use File::Copy
}
有趣的一点:

glob非常棒,就像在shell中一样。

除非您有充分的理由,否则请始终将my用于变量。

我进一步假设文件text.en.txt不应创建目录text,而应创建text.en,并且文件.txt不存在。

这是否有效还取决于您正在调用的脚本。

答案 1 :(得分:0)

使用do代替requirerequire仅加载并运行文件一次。