Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用perl进行文件名和路径操作_Arrays_Regex_Linux_Perl_File - Fatal编程技术网

Arrays 使用perl进行文件名和路径操作

Arrays 使用perl进行文件名和路径操作,arrays,regex,linux,perl,file,Arrays,Regex,Linux,Perl,File,我有以下代码。它工作得很好,但我正在努力使它更通用 什么代码可以: 它通过从某处作为输入提供的数组进行循环。数组的值是指向文件的路径 例如:/path/to/file/location/ABC_XYZ12345678912_120215_010018654_PQR-HWL-Datafile.tar.gz 现在,它获取数组中的每个元素,并尝试删除文件名的第一部分“ABC_XYZ12345678912_120215_010018654_”,然后创建一个具有相同路径但文件名仅包含最后一部分的文件的新副

我有以下代码。它工作得很好,但我正在努力使它更通用

什么代码可以: 它通过从某处作为输入提供的数组进行循环。数组的值是指向文件的路径

例如:/path/to/file/location/ABC_XYZ12345678912_120215_010018654_PQR-HWL-Datafile.tar.gz

现在,它获取数组中的每个元素,并尝试删除文件名的第一部分“ABC_XYZ12345678912_120215_010018654_”,然后创建一个具有相同路径但文件名仅包含最后一部分的文件的新副本。例如: /路径/to/file/location/PQR-HWL-Datafile.tar.gz

文件名的起始部分将始终像上面那样(按模式),即ABC_14DigitAlphanumric_monthdateyearpatter(6位数)_9位数以上

代码运行良好

下面的代码我有两个问题

1> 如何使我提取文件名最后一部分的部分比做一些硬编码的事情更通用,比如:(使用一些正则表达式或类似的东西)

2> 其次,复制操作如下所示,或者可以避免创建副本:

复制($individualFile,$absPathToNewFile);=======>(变成类似这样或更少硬编码)

复制(文件名为原始文件名,文件名为新文件名

#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use File::Copy;

my @filePathArray =     
('/path/to/file/location/ABC_XYZ12345678912_120215_010018654_PQR-HWL-    
Datafile.tar.gz','/path/to/file/location/ABC_XYZ12345678912_120215_010018654_da ta_value_most_recent.bin.gz')

1) 如果您知道自己的模式,只需为其编写正则表达式并用空字符串替换,如下所示:

my $old_filename = "ABC_XYZ12345678912_120215_123456789_PQR-HWL-Datafile.tar.gz";

# pattern described in the question
my $pattern = qr/^ABC_[A-Za-z0-9]{14}_\d{6}_\d{9}_/;

( my $new_filename = $old_filename ) =~ s/$pattern//;

print "new_filename: $new_filename\n";
print "old_filename: $old_filename\n";

2) 我看不出复印件有什么问题。也许我没有回答这个问题。

正则表达式的例子应该同时处理两个名称的例子,否则使用正则表达式有什么意义呢。在这种情况下,硬编码的一个,如我上面所示,将工作良好,我刚才检查了你的解决方案工程的任何模式在最后。不管它是uu还是-。你应该删除else条件,然后我就可以接受你的回答。else条件令人困惑here@user1188611啊,错过了代码中的
elsif($file=~'data\u value\u most\u recent.bin.gz')
部分,以为它只是
else
。谢谢你提到那件事。
my $newFileName;
foreach my $individualFile (@filePathArray) {

  my ( $file, $dir ) = fileparse($individualFile);

  if ( $file =~ 'PQR-HWL-Datafile.tar.gz' ) {
     $newFileName = "PQR-HWL-Datafile.tar.gz";
  }elsif ( $file =~ 'data_value_most_recent.bin.gz' ){
     $newFileName = "data_value_most_recent.bin.gz";
  }

  my $absPathToNewFile = File::Spec->catfile( $dir, $newFileName );
  copy( $individualFile, $absPathToNewFile );
}
my $old_filename = "ABC_XYZ12345678912_120215_123456789_PQR-HWL-Datafile.tar.gz";

# pattern described in the question
my $pattern = qr/^ABC_[A-Za-z0-9]{14}_\d{6}_\d{9}_/;

( my $new_filename = $old_filename ) =~ s/$pattern//;

print "new_filename: $new_filename\n";
print "old_filename: $old_filename\n";