2

我试图挑战自己获取目录中的 dir 或文件的名称,并将它们放入尽可能少的代码的数组中。我得到了所有的碎片,但不能把它们放在一起

perl 全局:<path/to/dir/*>

正则表达式替换:s/.+\///

我对我认为它如何工作的蹩脚尝试:

my @flist = <path/to/dir/*>
s/.+\/// for @flist;

但我想不会。

来自 perl 大师的一点帮助?

格拉西亚斯!

编辑:我猜上面的代码只需要一个分号。N00b 错误。对不起!虽然它在技术上仍然是两条线。

4

5 回答 5

5
@flist = map basename($_), @flist;

或者

$_ = basename($_) for @flist;

由于行数对您很重要,因此以下是您询问的行和您已有的行的巧妙组合:

my @flist =  map basename($_), <path/to/dir/*>;
于 2012-04-19T17:27:18.807 回答
2

您的代码似乎是功能性的,虽然有点粗糙。您可能会考虑使用一个模块来剥离路径,例如File::Basename(核心模块)。更简单的方法是确保根本不包含路径。

您可以简单地移动到目录并在那里使用 glob。请记住,之后您的工作目录已更改。

chdir "/path/to/dir";
my @flist = <*>;

您也可以使用opendirreaddir。请注意,这将返回比 更多glob的文件,包括隐藏文件。

opendir my $dh, "/path/to/dir" or die $!;
my @flist = readdir $dh;
于 2012-04-19T17:15:41.950 回答
2

我认为所有必要的是

my @flist = map m|([^/]+)$|, <path/to/dir/*>;
于 2012-04-19T19:26:32.433 回答
1

如果您想要所有隐藏文件(包括点和点),您可以执行以下操作:

chdir /mypath or die "$!\n";
my @list = glob(".* *");

全局

由于您已更改为感兴趣的目录,因此仅报告文件名而不报告路径。要跳过报告 dot 和 dot-dot 文件,但要查看其他隐藏(dot)文件,您可以执行以下操作:

for (@list) {
    next if m{^\.\.?$};
    print "$_\n";
}
于 2012-04-19T17:27:22.330 回答
0
my @flist=glob('/usr/include/*.h');
s/.*\///g for @flist;
print join ("\n",@flist);
于 2012-04-20T18:17:01.120 回答