我使用readdir获取目录的文件,但我想删除。和..使用grep。输出显示它仍然包含。和..,但我无法弄清楚它有什么问题?
这是我的代码
#!/usr/bin/perl
opendir(Dir,$ARGV[0]);
@Dirs = readdir(Dir);
@Dirs = grep { $_ != /./ } @Dirs;
# @Dirs = grep { $_ =~ /^./ } @Dirs;
print join("\n",@Dirs);
由于
答案 0 :(得分:9)
我强烈建议您注意以下内容
总是 use strict
和use warnings
,即使是最微小的代码。他们会在
始终使用词法目录句柄和文件句柄。这样的全球手柄就是这样的 现在错误选择了十二年
始终检查文件和目录open
调用是否成功,并使用包含die
变量的$!
字符串来表示为什么开放失败
对局部变量名使用小写字母和下划线。对于全局项目(如包名称和内置变量
使用print "$_\n" for @array
代替print join "\n", @array
因为 a)使用join
生成数组中文本的第二个副本并浪费空间, b)使用join
省略了数组最后一行的换行符
请查看您的计划的替代方案,该方案适用上述建议。我已经排除了以点开头的所有目录条目,因为它成功删除了.
和..
以及以点开头的Linux“隐藏”条目。你可能需要不同的东西。
#!/usr/bin/perl
use strict;
use warnings;
opendir my $dh, $ARGV[0] or die $!;
my @dirs = grep { not /^\./ } readdir $dh;
print "$_\n" for @dirs;
答案 1 :(得分:5)
尝试转义.
:
@Dirs = grep { $_ !~ /^\.\.?$/ } @Dirs;
点是一个特殊的元字符,可以在未转义时匹配任何字符。
答案 2 :(得分:2)
.
表示“任何字符”,请尝试将其转义为:\.