我试图从我在perl脚本中读取的文件路径中提取id(例如11894373690) -
/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;
更新 - 抱歉所有我拼写错误"不是" as" now"早!我无法提取id。谢谢!
答案 0 :(得分:1)
你需要修理什么?什么是动态的?对于这个网址,假设posfix将远离_cast,你可以使用表达式:
(\d+)_cast
所以ID将出现在第一个选择组
中答案 1 :(得分:1)
一个简单的正则表达式或拆分很好,但有多个核心包用于处理路径。
这使用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/|; # Windows
如果\d+_cast
某些不明确(只有一个dir在其名称中出现),请将/
放在上面。
答案 2 :(得分:0)
我确实找到了获取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 谢谢大家的建议!