3

I use readdir to get the files of a directory , but I want to remove . and .. using grep . The output shows it still contain the . and .. , but I can't figure out what's wrong with it ?

here is my code

    #!/usr/bin/perl

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

Thanks

4

3 回答 3

9

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

  • 总是 use strictand use warnings,即使是最微小的代码。他们会多次回报你额外的打字时间

  • 始终使用词法目录句柄和文件句柄。十二年来,像这样的全球手柄一直是错误的选择

  • 始终检查文件和目录open调用是否成功,并使用die包含$!变量的字符串来说明打开失败的原因

  • 局部变量名使用小写字母和下划线。大写按约定保留用于包名称和内置变量等全局项目

  • 使用print "$_\n" for @array而不是print join "\n", @array因为a) usingjoin会在数组中生成第二个文本副本并浪费空间,并且b) usingjoin会省略数组最后一行的换行符

看看你的程序的这个替代方案,它应用了上面的建议。我已经排除了所有以点开头的目录条目,因为它成功删除了以点开头的.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;
于 2013-06-07T13:47:47.560 回答
5

尝试转义.

@Dirs = grep { $_ !~ /^\.\.?$/ } @Dirs;

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

于 2013-06-07T12:35:37.470 回答
2

.在正则表达式中表示“任何字符”,尝试像这样转义它:\.

于 2013-06-07T12:33:26.040 回答