从长文件路径(regex) perl中提取id



我试图提取一个id(这里例如11894373690)从文件路径,我读到我的perl脚本-

/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ 
我将进一步使用它创建一个新的路径,如
/my/local/projects/Samplename/analysis/test/output/tool2/11894373690_NEW/

我不能从路径中提取id,谁能在perl中建议一个简单的方法。我一定要开始学习正则表达式!谢谢。我只能得到最后一个目录名

$file = "/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ ";
my ($id) = $file =~ /.(A1[^]+)/i;

更新-抱歉,我之前把"not"拼写成"now"!我无法提取id。谢谢!

一个简单的regex或split就可以了,但是有多个核心包可以处理路径。

使用File::Spec分割路径,然后加入新的路径。注意,这里没有转义之类的,没有/计数——实际上甚至不需要提到分隔符。

use warnings 'all';
use strict;
use File::Spec::Functions qw(splitdir catdir);
my $path_orig = '...';
my @path = splitdir $path_orig;
my ($mark, $dir);
foreach my $i (0..$#path) 
{ 
    if ($path[$i] =~ m/(d+)_cast/) 
    {
        $dir = $1;
        $mark = $i;
        last;
    }
}
my $path_new = catdir @path[0..$mark-1], $dir . '_NEW';

当然,你可以用其他方式操作@path数组——从它的后面剥离组件(pop @path while $path[-1] !~ /.../),或者迭代并复制到一个新数组中,等等。

上面的代码很简单,不需要额外的数据拷贝,也不需要多个正则表达式匹配。


显然新旧路径有另一个差异(tool1 vs tool2),请调整。主要的一点是,一旦路径被分割,遍历数组就很简单了。

对于获取id

的简单正则表达式
my ($id) = $path =~ m{/(d+)_cast/};

如果d+_cast 确定是非二义性的(只有一个dir在它的名字中),删除上面的/

你需要修复什么?什么是动态的?对于这个url,假设后缀总是被_cast,你可以使用表达式:

(d+)_cast

所以ID将在第一个选择组

我确实找到了一种方法来获得id -它可能不是很有效,但现在工作我做了

my $dir_path = "/my/local/projects/Samplename/analysis/test/output/tool1/11894373690_cast/A1/A1a/ ";
my @keys =(split(/[/_]+/,$dir_path));
print "Key is $keys3[9]n";

输出11894373690谢谢大家的建议!

最新更新