Perl,如何选择目录
Perl, how to choose a directory
我试图确定文件夹中的哪些内容是目录,哪些是文件,我写了以下内容但结果不是我所期望的:
opendir DH, $dir or die "Cannot open Dir: $!";
my @dirs = grep !/^\.\.?$/, readdir DH ;
foreach my $files (@dirs) {
print $files."<br>";
if ( -d $files )
{
print $files." is a directory<br>";
}
}
closedir DH;
结果如下图所示:
.file1
file.log
file3.zip
file4
file5.zip
dir1.name1.suffix1.yyyy.MM.dd.hh.mm.ss
file5.zip
file6.tar
dir2
dir3.name1.suffix1.yyyy.MM.dd.hh.mm.ss
以 dir 开头的项目是实际目录,所以我的问题是为什么 if 无法发现它们?
我做错了什么?
$dir
丢失...
if ( -d "$dir/$files" )
{
print $files." is a directory<br>";
}
chdir
到 $dir
最简单,这样您就不必在节点名称前加上路径前缀。如果您是 运行 Perl v5.10.1 或更高版本,您也可以 use autodie
。最后,如果您使用 $_
作为循环控制变量(file/directory 名称),您可以从 print
、-d
和正则表达式匹配 [=24= 的参数中省略它]
像这样
use strict;
use warnings;
use v5.10.1;
use autodie;
my ($dir) = @ARGV;
opendir my $dh, $dir;
chdir $dh;
while ( readdir $dh ) {
next if /\A\.\.?\z/;
print;
print " is a directory" if -d;
print "<br/>\n";
}
... # local expires. working directory returns to its original value
更新
鉴于ikegami's (deleted) comment about returning back to the original working directory, here's an example of using the File::chdir
模块做的很整齐。它导出一个绑定变量 $CWD
,如果您分配给它,它将更改您的工作目录。您还可以对其进行本地化,因此只需将上面的代码用大括号括起来并为 $CWD
添加一个新的本地值即可保持整洁。请注意,File::chdir
不是核心模块,因此您可能需要安装它
注意 然而,仍然有很小的可能性,该进程可能会使用它无法 chdir
到的当前工作目录启动。这个模块不会解决那个问题
use strict;
use warnings;
use v5.10.1;
use autodie;
use File::chdir;
my ($dir) = @ARGV;
{
opendir my $dh, $dir;
local $CWD = $dir;
while ( readdir $dh ) {
next if /\A\.\.?\z/;
print;
print " is a directory" if -d;
print "<br/>\n";
}
}
我试图确定文件夹中的哪些内容是目录,哪些是文件,我写了以下内容但结果不是我所期望的:
opendir DH, $dir or die "Cannot open Dir: $!";
my @dirs = grep !/^\.\.?$/, readdir DH ;
foreach my $files (@dirs) {
print $files."<br>";
if ( -d $files )
{
print $files." is a directory<br>";
}
}
closedir DH;
结果如下图所示:
.file1
file.log
file3.zip
file4
file5.zip
dir1.name1.suffix1.yyyy.MM.dd.hh.mm.ss
file5.zip
file6.tar
dir2
dir3.name1.suffix1.yyyy.MM.dd.hh.mm.ss
以 dir 开头的项目是实际目录,所以我的问题是为什么 if 无法发现它们? 我做错了什么?
$dir
丢失...
if ( -d "$dir/$files" )
{
print $files." is a directory<br>";
}
chdir
到 $dir
最简单,这样您就不必在节点名称前加上路径前缀。如果您是 运行 Perl v5.10.1 或更高版本,您也可以 use autodie
。最后,如果您使用 $_
作为循环控制变量(file/directory 名称),您可以从 print
、-d
和正则表达式匹配 [=24= 的参数中省略它]
像这样
use strict;
use warnings;
use v5.10.1;
use autodie;
my ($dir) = @ARGV;
opendir my $dh, $dir;
chdir $dh;
while ( readdir $dh ) {
next if /\A\.\.?\z/;
print;
print " is a directory" if -d;
print "<br/>\n";
}
... # local expires. working directory returns to its original value
更新
鉴于ikegami's (deleted) comment about returning back to the original working directory, here's an example of using the File::chdir
模块做的很整齐。它导出一个绑定变量 $CWD
,如果您分配给它,它将更改您的工作目录。您还可以对其进行本地化,因此只需将上面的代码用大括号括起来并为 $CWD
添加一个新的本地值即可保持整洁。请注意,File::chdir
不是核心模块,因此您可能需要安装它
注意 然而,仍然有很小的可能性,该进程可能会使用它无法 chdir
到的当前工作目录启动。这个模块不会解决那个问题
use strict;
use warnings;
use v5.10.1;
use autodie;
use File::chdir;
my ($dir) = @ARGV;
{
opendir my $dh, $dir;
local $CWD = $dir;
while ( readdir $dh ) {
next if /\A\.\.?\z/;
print;
print " is a directory" if -d;
print "<br/>\n";
}
}