我试图在这个循环中获得正则表达式,
my $vmsn_file = $snapshots{$snapshot_num}{"filename"};
my @current_vmsn_files = $ssh->capture("find -name $vmsn_file");
foreach my $vmsn (@current_vmsn_files) {
$vmsn =~ /(.+\.vmsn)/xm;
print "$1\n";
}
从此行捕获文件名,
./vmfs/volumes/4cbcad5b-b51efa39-c3d8-001517585013/MX01/MX01-Snapshot9.vmsn
我想要的唯一部分是部分是实际的文件名,而不是路径。
我尝试使用$
锚定到行尾的表达式,但这似乎没有任何区别。我还尝试使用2个.+
输入,一个在捕获组之前,另一个在捕获组内。再一次没有运气,对我来说也觉得有点混乱,所以我不想那样做,除非我必须这样做。
我知道如何在最后/
到行尾之后只获取文件名吗?
可以根据需要添加更多内容,我不确定我需要发布什么来提供足够的信息。
- 更新 -
经过5分钟的修补,我似乎已经弄明白了。 (多么令人惊讶)
所以现在我离开了这个,(并且它有效)
my $vmsn_file = $snapshots{$snapshot_num}{"filename"};
my @current_vmsn_files = $ssh->capture("find -name $vmsn_file");
foreach my $vmsn (@current_vmsn_files) {
$vmsn =~ /.+\/(\w+\-Snapshot\d+\.vmsn)/xm;
print "$1\n";
}
反正是为了让这更好吗?
答案 0 :(得分:2)
可能最好的方法是使用核心模块File::Basename。这将使您的代码最便携。
如果您真的想使用正则表达式并且基于Unix,那么您可以使用:
$vmsn =~ m%.*/([^/]+)$%;
$file = $1;
答案 1 :(得分:1)
好吧,如果您打算从shell中使用find
命令,并且考虑到您声明只需要文件名,为什么不呢?
... $ssh->capture("find -name $vmsn_file -printf \"%f\n\" ");
如果没有,最简单的方法是split()
"/"
上的字符串,然后获取最后一个元素。不需要太长或太复杂的正则表达式。
有关使用情况的详情,请参阅perldoc -f split