我试图提取一个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谢谢大家的建议!