使用perl的文件名和路径操作

时间:2015-12-02 02:54:09

标签: arrays regex linux perl file

我有以下代码。它工作正常,但我试图使它更通用。

代码的作用是什么: 它循环通过某个地方提供的数组作为输入。 Array具有作为文件路径的值。

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

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

文件名的起始部分将始终如上(模式明智),即ABC_14DigitAlphanumric_monthdateyearpatter(6位数)_9digit more。

代码工作正常。

现在我对下面的代码有两个问题。

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

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

# how this part can be made more generic so that i can directly extract the name of last part of file as compared doing hard code comparison 
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 );

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

copy($ individualFile,$ absPathToNewFile); =======> (变得像这样或更少硬编码)

copy(File_with_original_name,File_with_new_file_name

#!/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');

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 );
}

1 个答案:

答案 0 :(得分:0)

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)我没有看到复制部分有任何问题。也许我没有得到这个问题。