Regex Perl one liner:从数组中剥离路径,以仅获取路径中的姓氏,如basename

Regex Perl one liner:从数组中剥离路径,以仅获取路径中的姓氏,如basename,regex,perl,Regex,Perl,我试图挑战自己,获取目录中目录或文件的名称,并用尽可能少的代码将它们放入数组中。我得到了所有的碎片,但不能把它们放在一起 perl glob: 正则表达式替换:s/+\// 我的蹩脚尝试是想知道它是如何工作的: my @flist = <path/to/dir/*> s/.+\/// for @flist; my@flist= s/+\///表示@flist; 但我想不是 perl大师的小小帮助 格雷西亚斯 编辑:我猜上面的代码只需要一个分号。N00b错误。很抱歉虽然从技术上讲,

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

perl glob:

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

我的蹩脚尝试是想知道它是如何工作的:

my @flist = <path/to/dir/*>
s/.+\/// for @flist;
my@flist=
s/+\///表示@flist;
但我想不是

perl大师的小小帮助

格雷西亚斯


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

您的代码似乎很实用,尽管有点粗糙。您可能会考虑使用一个模块来剥离路径,例如(核心模块)。更简单的方法是确保根本不包括路径

您只需移动到dir并在那里使用glob。请记住,之后您的工作目录将更改

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


由于行数对您很重要,以下是您要求的行数与您已有的行数的巧妙组合:

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

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

chdir /mypath or die "$!\n";
my @list = glob(".* *");
for (@list) {
    next if m{^\.\.?$};
    print "$_\n";
}

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

chdir /mypath or die "$!\n";
my @list = glob(".* *");
for (@list) {
    next if m{^\.\.?$};
    print "$_\n";
}

我认为所有必要的是

my @flist = map m|([^/]+)$|, <path/to/dir/*>;
my@flist=map m |([^/]+)$|;
my@flist=glob('/usr/include/*.h');
s/*\///g表示@flist;
打印连接(“\n”,@flist);

你得到了什么你不想要的?我正试图挑战自己。。。通过让别人做这件事?:>@TLP I get语法错误。@dlite922嗯,您确实缺少一个分号。。是这样吗?我只能猜测,因为“语法错误”是对错误的模糊描述。您正在使用
使用strict;使用警告对吗?@dlite922下次,请立即包含错误。我选择您作为答案,因为它是最干净的一行,尽管从技术上讲,如果包含“use File::basename”,它是两行,为什么您会在意它是两行而不是一行呢?@dlite922,您可以将
use File::basename(和
使用严格;
使用警告;
)在同一行上,如果您认为使用一行代码有任何价值。@dlite922,更新了答案以显示如何组合两行代码。谢谢。看起来很干净!顺便说一下,我是一名Java/PHP-OOP开发人员。Perl正在颠覆我的世界!将答案更改为最佳答案,因为这正是我要寻找的。谢谢
my @flist = map m|([^/]+)$|, <path/to/dir/*>;