无法删除.和..使用grep?

use*_*116 3 perl

我使用readdir来获取目录的文件,但我想删除.和..使用grep.输出显示它仍然包含.和..,但我无法弄清楚它有什么问题?

这是我的代码

    #!/usr/bin/perl

    opendir(Dir,$ARGV[0]);
    @Dirs = readdir(Dir);
    @Dirs = grep { $_ != /./ } @Dirs;
#   @Dirs = grep { $_ =~ /^./ } @Dirs;
    print join("\n",@Dirs);
Run Code Online (Sandbox Code Playgroud)

谢谢

Bor*_*din 9

我强烈建议你注意以下几点

  • 始终 use strictuse warnings,甚至对代码的哪怕一丁点.他们会多次给你额外的打字时间

  • 始终使用词法目录句柄和文件句柄.像这样的全球手柄已经有超过12年的错误选择了

  • 务必检查的文件和目录的成功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;
Run Code Online (Sandbox Code Playgroud)


Adr*_*rth 5

尝试逃避.:

@Dirs = grep { $_ !~ /^\.\.?$/ } @Dirs;
Run Code Online (Sandbox Code Playgroud)

点是一个特殊的元字符,可以在未转义时匹配任何字符.