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

如何在另一个Perl文件中重复使用Perl文件,perl,Perl,我正在执行以下步骤: 读取目录中的所有文本文件,并将其存储在名为@files的数组中 在每个文本文件上运行foreach循环。 使用拆分操作提取文件名(剥离.txt)并创建该特定文件名的文件夹。 将该文件重命名为Test.txt(以便作为另一个perl可执行文件的输入) 通过添加行require“test.pl”为每个文件执行test.pl 它只适用于一个文件,但不再适用。 这是我的密码: opendir DIR, "."; my @files = grep {/\.txt/} readdi

我正在执行以下步骤:

  • 读取目录中的所有文本文件,并将其存储在名为@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]";
}
opendir目录,”;
my@files=grep{/\.txt/}readdir;
foreach my$文件(@files){
@fn=拆分“\”,$files;
mkdir“$fn[0]”
或“无法创建$fn[0]目录\n”;
重命名“$files”、“Test.txt”;
需要“test3.pl”;
重命名“Test.txt”、“$files”;
系统“移动$files$fn[0]”;
}

任何帮助都将不胜感激。

使用
do
而不是
require
require
仅加载并运行文件一次。

使用
do
而不是
require
require
仅加载并运行文件一次。

require功能尝试智能化,仅在尚未加载代码时加载代码。为什么这么好?(1.)我们没有C的带条件包含的预处理器地狱,(2.)我们节省了时间

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

您还可以通过
系统“/test3.pl”
启动另一个解释器

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

下面是我将如何实现该代码段:

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
}
使用test3;#加载文件一次
foreach my$file(glob“*.txt”){#使用'glob'获取匹配文件名的列表
(my$newdir)=$file=~m/^(+)\.txt$/x;#您可能想要的
mkdir$newdir
或“无法创建$newdir目录\n”;
test3:_子($file)#对$file执行操作,而不重命名circus。
系统“move$file$newdir”#而是使用file::Copy
}
有趣的侧重点:
glob
很棒,就像在shell中一样工作

除非您有很好的理由,否则始终对变量使用
my

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


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

require
函数尝试智能化,仅当尚未加载代码时才加载代码。为什么这么好?(1.)我们没有C的带条件包含的预处理器地狱,(2.)我们节省了时间

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

您还可以通过
系统“/test3.pl”
启动另一个解释器

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

下面是我将如何实现该代码段:

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
}
使用test3;#加载文件一次
foreach my$file(glob“*.txt”){#使用'glob'获取匹配文件名的列表
(my$newdir)=$file=~m/^(+)\.txt$/x;#您可能想要的
mkdir$newdir
或“无法创建$newdir目录\n”;
test3:_子($file)#对$file执行操作,而不重命名circus。
系统“move$file$newdir”#而是使用file::Copy
}
有趣的侧重点:
glob
很棒,就像在shell中一样工作

除非您有很好的理由,否则始终对变量使用
my

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


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

当然,乌托邦式的实现假设OP可以控制test3.pl的内容+1 for
system
向您致敬for system(“perl test3.pl”):-D我的程序现在运行良好!由于我不知道如何创建包和使用“use test3”语句,我的下一步将按照您的建议修改我的程序,以避免重命名马戏团。当然,乌托邦式的实现假设OP可以控制test3.pl的内容+1 for
system
向您致敬for system(“perl test3.pl”):-D我的程序现在运行良好!由于我不知道如何创建包和使用“UseTest3”语句,我的下一步将按照您的建议修改我的程序,以避免重命名马戏团。