2

我编写了一个 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 行的数值比较 (<=>) 中使用未初始化的值。

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

4

1 回答 1

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
于 2013-11-07T16:57:19.527 回答