如何使用perl删除目录及其内容?

如何使用perl删除目录及其内容?,perl,Perl,我在主文件夹中有几个子文件夹。每个子文件夹中都有一个.txt文件。首先,代码将在主文件夹中创建“结果”文件夹。它将在每个.txt文件中搜索“Frequencies”单词,并将前三列(包括“Frequencies”单词)打印到一个新文件(在results文件夹中)。 当我第二次运行代码时,它应该删除结果文件。但是当我第二次运行它时,我得到了以下错误。如何删除此目录(结果)及其内容?(当您首先运行它时,它将工作) 错误: Undefined subroutine &main::rmtree

我在主文件夹中有几个子文件夹。每个子文件夹中都有一个.txt文件。首先,代码将在主文件夹中创建“结果”文件夹。它将在每个.txt文件中搜索“Frequencies”单词,并将前三列(包括“Frequencies”单词)打印到一个新文件(在results文件夹中)。 当我第二次运行代码时,它应该删除结果文件。但是当我第二次运行它时,我得到了以下错误。如何删除此目录(结果)及其内容?(当您首先运行它时,它将工作)

错误:

Undefined subroutine &main::rmtree called at xxx.pl line 9.
守则:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Path qw/make_path/;
use Cwd;

my $dir = cwd();
my $check_result_file = "$dir/results/";
rmtree($check_result_file);

您缺少
use
行末尾的分号:

use File::Path;
              ^ add this

有两件事,首先,正如jwodder所提到的,在使用行末尾缺少一个分号:

use File::Path; <--
或unix变体(假设您首先对文件夹是否存在进行了正确的检查)

告诉File::Path导出
make_Path
,覆盖正常导出的子文件列表(
mkpath
rmtree
)。如果还希望导出
rmtree
,则需要指定它

use File::Path qw( make_path rmtree ); 

从技术上讲,您还可以使用以下内容:

use File::Path; 
use File::Path qw( make_path ); 
<>但是,我认为明确列出所有子i导入是一个很好的做法,所以我非常赞成我提供的第一个解决方案。

顺便说一下,具有
make\u Path
的File::Path版本也具有
remove\u tree
<对于没有“rm”的windows,您可以在系统上执行代码>删除树,而有利于
rmtree

$dir = "C:/somepath/path";
$del_directory = "\@RD /S /Q \"$dir\"";
$exec_del = `$del_directory`;
  • @RD,是删除目录
  • /S、 删除中的所有目录和文件 目录,包括子目录
  • /Q、 相当模式

它会产生什么错误?它是代码的顶部。最好尝试
rmtree
并检查它是否成功。有人可能会在您测试目录是否存在后创建或删除该目录。这就是为什么您应该始终将实际运行的代码复制并粘贴到您的问题中,而不是编造实际运行的代码片段<代码>使用文件::路径qw/make_Path/仅导出
生成路径
;如果还要导出
rmtree
,请将
use
语句更改为
use File::Path qw/make_Path rmtree/@perlselami这是一个完全不同的问题。您是否尝试过通过添加
print
语句来调试脚本,以确认变量具有您期望的值?从这里开始,试着缩小问题的范围,如果你仍然不能弄清楚,问另一个问题。这是一个打字错误。我编辑了它。但问题不是这样,事实上是这样。
my$check_folder=“$dir/work”的结果被传递到
文件::路径->导入
,覆盖默认导出列表。通过添加分号,使用默认的导出列表,导出
mkpath
rmtree
。如果没有分号,他不会得到语法错误吗?@Barmar,No.
use
的语法之一是
use Module list
LIST
是由零个或多个表达式组成的逗号分隔的列表,
my$check\u folder=“$dir/work”
是一个表达式。这与修复未定义的函数错误有什么关系?jwodder提到的第一个修复程序应该已经修复了该错误。我是否应该忽略这样一个事实,即他的代码在他试图做的事情中是不正确的?如果他先验地知道,如果它存在,它将始终是一个目录,那么
-e
-d
之间没有区别。他说,“如果它存在,那意味着它不是空的”。对我来说,这也意味着它是一个已知的目录。问题是你认为有一个问题,并因此建议不必要的更改。
use File::Path qw( make_path rmtree ); 
use File::Path; 
use File::Path qw( make_path ); 
$dir = "C:/somepath/path";
$del_directory = "\@RD /S /Q \"$dir\"";
$exec_del = `$del_directory`;