Perl -M标志,未初始化的值?

时间:2013-11-07 16:52:15

标签: perl powershell initialization comparison numeric

我编写了一个PowerShell脚本,可生成带有随机时间戳的100个文件:

$date_min   =   get-date -year 1989 -month 7 -day 4
$date_max   =   get-date

for( $i = 0;  $i -le 100;  $i++ )
{
    $file   =   $i.ToString() + ".txt"
    echo ">=|" > $file

    $a  =   get-item $file
    $time = new-object datetime( get-random -min $date_min.ticks -max $date_max.ticks)

    $a.CreationTime     =   $time
    $a.LastWriteTime    =   $time
    $a.LastAccessTime   =   $time
}

使用Perl,我正在尝试根据上次修改时间对这些文件进行排序,如下所示:

use strict;
use warnings;

my $dir     =   "TEST_DIR";
my @files;     

opendir( DIR , $dir ) or die $!;

# Grab all the files in a directory
while( my $file = readdir(DIR) )
{   
    next if(-d $file);  # If the "file" is actually a directory, skip it
    push( @files , $file );        
}

my @sorted_files    =   sort { -M $b <=> -M $a } @files;    # Sort files from oldest to newest

然而,当我运行我的代码时,我得到:

  

在。\ dir.pl第31行的数字比较(&lt; =&gt;)中使用未初始化的值。

现在,如果我对使用我的powershell脚本无法随机生成的文件尝试此代码,它可以正常工作。我很难搞清楚为什么它不适用于这些随机生成的文件。我做错了吗?

1 个答案:

答案 0 :(得分:5)

您的问题是readdir(DIR)。这将生成相对于指定目录的文件列表。首先尝试将$dir添加到文件中:

sort { -M $b <=> -M $a } map { "$dir\\$_" } @files

这也意味着您尝试过滤目录是错误的。您可以将所有调用组合在一起,如下所示:

my @sorted_files = sort { -M $b <=> -M $a }
    grep { ! -d $_ }        # Removes directories
        map { "$dir\\$_" }  # Adds full path
            readdir(DIR);   # Read entire directory content at once