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

Arrays 在Perl中,如何将两个数组分配给一个散列并按名称将它们关联起来,arrays,perl,hash,Arrays,Perl,Hash,我有两个数组,都由文件名列表组成。除扩展名外,两个数组中的文件名相同 i、 e.filename.dwg和filename.zip 现在,我已将每个文件列表分配给一个数组 i、 e.@dwg_文件和@zip_文件 最后,我要做的是检查不同数组中同名的两个文件之间的最后修改日期,然后运行一个脚本(如果一个文件比另一个文件年轻)。到目前为止,除了比较两个不同名称的文件外,我所做的似乎都是有效的。我需要它将第一个数组中的文件与另一个数组中的相同文件进行比较 i、 e.asdf1.dwg应与asdf1.

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

i、 e.filename.dwg和filename.zip

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

i、 e.@dwg_文件和@zip_文件

最后,我要做的是检查不同数组中同名的两个文件之间的最后修改日期,然后运行一个脚本(如果一个文件比另一个文件年轻)。到目前为止,除了比较两个不同名称的文件外,我所做的似乎都是有效的。我需要它将第一个数组中的文件与另一个数组中的相同文件进行比较

i、 e.asdf1.dwg应与asdf1.zip相关联


我是一个完全的Perl noob(上周才开始使用它)。我已经被困在这几天了,任何帮助都会非常感谢

您可以使用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*
  }

}
用于我的$dwg\u文件(@dwg\u文件){
my$zip_文件=$dwg_文件;
打印“dwg:$dwg\u文件\n”;
$zip_file=~s/[.]dwg/.zip/i或下一个;
#检查zip是否存在
如果(-e$zip_文件){
#检查上次修改日期
如果(-M$dwg_文件<-M$zip_文件){
#*运行脚本以创建zip*
}否则{
#*打印“不需要更新”*
}
}否则{
#*运行脚本以创建zip*
}
}

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

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

打印dwg文件以检查跳过了哪一个。更好的是,将my$counter(0..$#dwg_文件)的
替换为my$dwg_文件(@dwg_文件)的
并跳过下面的
$dwg\u文件的初始化。@mzedeler OP打印
$counter
,因此它看起来是需要的
$counter
用于
,而
用于问题中的循环控制,因此不一定需要它(打印它似乎是为了调试目的)@doubleDown现在没有计数器了。
@zip\u文件发生了什么事?它正在被创建,但没有被使用。@mzedeler他们可以使用任意一个数组,我将这两个数组都传递给他们来说明这一点。我猜也可能有这样一种情况,你在两个列表中循环,只将存在的zip文件添加到哈希中。嗨,谢谢你的帮助。我有一个简单的问题:当你使用我的@/dwg_files=glob(“.dwg”);my@/zip_files=glob(“.zip”);您可以基于同一目录中的文件填充阵列。如何使用来自不同目录(在本例中为子文件夹)的文件填充数组。只需在glob函数中指定目录,
print glob(“$base_directory/*.zip”)
#!/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'
             ]
};