如何将两个数组分配给散列并在Perl中按名称关联它们

时间:2013-06-19 17:49:31

标签: arrays perl hash

我有两个数组,都包含一个文件名列表。除扩展名外,两个数组中的文件名都相同。

即。 filename.dwg filename.zip

现在,我已将每个文件列表分配给一个数组。

即。 @dwg_files @zip_files

最终,我要做的是检查不同数组中两个同名文件之间的最后修改日期,然后运行一个脚本,如果一个比其他更年轻。到目前为止,除了比较两个名称不同的文件外,我的工作似乎有效。我需要它来比较第一个数组中的文件和另一个数组中的相同文件。

即。 asdf1.dwg 应与 asdf1.zip

相关联
my $counter = 0 ;
while ( $counter < @dwg_files ) {
    print "$counter\n";
    my $dwg_file = $dwg_files[$counter];
    my $zip_file = $zip_files[$counter];


#check if zip exists
if (-e $zip_file) {

     #Checks last modification date
     if (-M $dwg_file < $zip_file) {
         *runs script to creat zip*

     } else { 
         *Print "Does not need update."*
     }

} else {
    *runs script to create zip*
}

$counter++;
}

做一些研究,我想我会尝试使用哈希来关联这两个数组。我似乎无法弄清楚如何按名称关联它们。

my %hash;
@hash{@dwg_files} = @zip_files;

我是一个完整的Perl noob(上周刚开始使用它)。我已经坚持了几天,任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:2)

您可以使用dwg文件名,将扩展名更改为zip,然后继续进行检查,

for my $dwg_file (@dwg_files) {

    my $zip_file = $dwg_file;
    print "dwg:$dwg_file\n";
    $zip_file =~ s/[.]dwg/.zip/i or next;


  #check if zip exists
  if (-e $zip_file) {

       #Checks last modification date
       if (-M $dwg_file < -M $zip_file) {
           #*runs script to creat zip*

       } else { 
           #*Print "Does not need update."*
       }

  } else {
      #*runs script to create zip*
  }

}

答案 1 :(得分:0)

要将所有文件名存储在哈希中,您可以执行以下操作:

#!/usr/bin/perl
use Data::Dumper;

# grab all dwg and zip files
my @dwg_files = glob("*.dwg");
my @zip_files = glob("*.zip");

sub hashify {
   my ($dwg_files, $zip_files) = @_;
   my %hash;

   # iterate through one of the arrays
   for my $dwg_file ( @$dwg_files ) {
        # parse filename out
        my ($name) = $dwg_file =~ /(.*)\.dwg/;

        # store an entry in the hash for both the zip
        # and dwg files
        # Entries of the form:
        # { "asdf1" => ["asdf1.dwg", "asdf1.zip"]
        $hash{$name} = ["$name.dwg", "$name.zip"];
   }

   # return a reference to your hash
   return \%hash;
}

# \ creates a reference to the arrays 
print Dumper ( hashify( \@dwg_files, \@zip_files ) );

这就是生成的哈希的样子:

{
  'asdf3' => [
               'asdf3.dwg',
               'asdf3.zip'
             ],
  'asdf5' => [
               'asdf5.dwg',
               'asdf5.zip'
             ],
  'asdf2' => [
               'asdf2.dwg',
               'asdf2.zip'
             ],
  'asdf4' => [
               'asdf4.dwg',
               'asdf4.zip'
             ],
  'asdf1' => [
               'asdf1.dwg',
               'asdf1.zip'
             ]
};