2016-01-20 169 views
1

有沒有更好的方法來使用正則表達式捕獲分組編寫下面的代碼?Perl正則表達式捕獲分組

我期待在錄製後立即獲取文件夾名稱。

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my $path1 = '\\server1\Recordings\AU-AR-Online\Outbound\20160120\52031\52031-14-07-16.wav'; 
my $path2 = '\\server2\e$\Recordings\SU-AC-Online\Outbound\20160120\52031\52031-14-07-16.wav'; 

my @paths = ($path1,$path2); 

foreach my $path (@paths) { 
    # Split path into fields 
    my @array = (split /\\/, $path); 

    # Get index of Recordings 
    my($index)= grep { $array[$_] eq "Recordings" } 0..$#array; 

    # Brand always follows Recordings 
    print $array[$index+1]; 

} 

回答

2

當然,只需更換你的循環與此內容:

my ($brand) = $path =~ m|\\Recordings\\([^\\]+)| or die "Not found"; 
print $brand; 
1

捕獲的文件夾後直接Recordings\

my ($brand) = $path =~ m{ Recordings \\ ([^\\] +) }x) 

使用的正則表達式的x修飾符意味着空格是忽略,這可以幫助使正則表達式更具可讀性。

如果品牌文件夾始終是倒數第五次,你可能分裂的路徑和負索引抓住它。

my $brand = (split /\\/, $path)[-5]; 

但是,只有當品牌總是倒數第五時纔有效。我不知道你的數據集是什麼。

另外,如果你有路徑的工作,有許多模塊(如Path::Tiny),使人們更容易獲得父/子/絕對路徑,基本名稱等