我想从文件路径中获取日期部分,以便在文件名中使用它们。例如,文件的格式可以为:
$file1 = "/mypath/sd-urt7-dfc-adfj345h-d0-79week48a-DFC-lk-my.text"
$file2 = "/mypath/sd-urt7-afd-parent-79week46d-AFD-lk-my.text"
$file3 = "/mypath/sd-urt7-ert-parent-79week50c-ERT-lk-my.text"
不管上面的文件名格式如何,都有一部分的格式为“ 79weekxxX”,其中xx是星期数,X是字母。我想从每个这些字符串名称中获取“ weekxxX”部分,以便仅使用此字符串创建最终文件名。例如,如果我的文件是$file1
,那么我想将其存储在另一个变量中,例如包含week48a
的week,并创建另一个名为$filename="$week.txt"
的变量。
我正在考虑使用正则表达式匹配来执行此操作,但我不确定如何执行。请让我知道我的问题的任何部分仍然不清楚,以便我进一步阐述。谢谢。
编辑: “ 79week”始终存在。确切地说,我不会将它们作为具有文件名的变量来访问。路径是其自身对应键的嵌套哈希值。所以这样做是可行的:
my %hash = (
"rev" => {
"first" => "$filepath1",
"second" => "$filepath2",
"third" => "$filepath3"
},
"for" => {
"first" => "$filepath1_2",
"second" => "$filepath2_2",
"third" => "$filepath3_2"
}
);
foreach my $inner (keys %{$hash{$outer}}){
my $file = basename($inner); //only takes the file name, and ignores the rest of the path
my ($week) = $file =~ /79week(\d\d)([a-zA-Z])/;
$filename = "$week.txt";
}
答案 0 :(得分:1)
一般观察:
如果$file
包含一个字符串,例如:
/mypath/sd-urt7-dfc-adfj345h-d0-79week48a-DFC-lk-my.text
,
然后执行:
$file =~ /79(week\d+[a-z])/i;
变量$1
(根据上述正则表达式设置为组1匹配项)将包含(在上面的示例中):
week48a
然后您可以分配my $week = $1;
我希望能回答有关Regex的问题。
您的声明:
my ($week) = $file =~ /79week(\d\d)([a-zA-Z])/;
将仅将$week
设置为组1或48
。因此,另一种选择是:
my ($week) = $file =~ /79(week\d\d[a-zA-Z])/;
答案 1 :(得分:0)
my ( $week ) = $file1 =~ m{ ( week \d\d [A-Za-z] ) }x;
在这里,x
标志是为了提高可读性,并导致忽略空白和注释。如果星期数可以是一位或两位数,请使用\d{1,2}
。
我还建议使用比$fileN
更多的描述性变量,或使用@file_names
之类的数组。