Perl one-liner:从数组中删除路径,只获取路径中的姓氏,如basename

时间:2012-04-19 17:07:54

标签: regex perl

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

perl glob:<path/to/dir/*>

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

我蹩脚的尝试我认为它会起作用:

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

但我猜不是。

perl大师的帮助不大?

格拉西亚斯!

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

5 个答案:

答案 0 :(得分:5)

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

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

由于行数对您很重要,因此以下是您询问的行与您已有行的简洁组合:

my @flist =  map basename($_), <path/to/dir/*>;

答案 1 :(得分:2)

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

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

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

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

opendir my $dh, "/path/to/dir" or die $!;
my @flist = readdir $dh;

答案 2 :(得分:2)

我认为所有必要的是

my @flist = map m|([^/]+)$|, <path/to/dir/*>;

答案 3 :(得分:1)

如果您想要所有隐藏文件(包括点和点),您可以这样做:

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

请参阅glob

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

for (@list) {
    next if m{^\.\.?$};
    print "$_\n";
}

答案 4 :(得分:0)

my @flist=glob('/usr/include/*.h');
s/.*\///g for @flist;
print join ("\n",@flist);