Perl正则表达式捕获分组

时间:2016-01-20 22:04:04

标签: arrays regex 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 个答案:

答案 0 :(得分:2)

当然,只需用以下内容替换循环内容:

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

答案 1 :(得分:1)

Recordings\

之后直接捕获文件夹
my ($brand) = $path =~ m{ Recordings \\ ( [^\\] + ) }x )

在正则表达式上使用x修饰符意味着忽略空格,这有助于使正则表达式更具可读性。

如果品牌文件夹总是排在第5位,您可以拆分路径并通过否定索引来抓取它。

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

但同样,这只有在品牌总是排在第5位才有效。我不知道你的数据集是什么。

此外,如果您使用路径,则有许多模块(例如Path::Tiny)可以更容易地获取父/子/绝对路径,基本名称等。