我正在尝试挑战自己在目录中获取dir或文件的名称,并将它们放入具有尽可能少代码的数组中。我得到了所有的东西,但不能把它们放在一起
perl glob:<path/to/dir/*>
正则表达式替换:s/.+\///
我蹩脚的尝试我认为它会起作用:
my @flist = <path/to/dir/*>
s/.+\/// for @flist;
但我猜不是。
perl大师的帮助不大?
格拉西亚斯!
编辑:我猜上面的代码只需要一个分号。 N00b错了。抱歉!虽然它在技术上仍然是两条线。
答案 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 = <*>;
您还可以使用opendir
和readdir
。请注意,这将返回比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);