Perl:全局符号"%s"需要显式包名

Max*_*ime 0 variables perl global explicit

我是Perl的新手,但我认为我已经记住了变量定义和范围等基础知识......但似乎并非如此.我的问题是我不断碰到错误:

Global symbol "$save_from_date" requires explicit package name at myMover.pl line 40

我有一个函数,我打算将文件日期与另一个日期(默认或参数)进行比较,但它失败了.

这是麻烦的代码,提取:

# Process source directory
sub ParseSource {
    my $file = $_;
    my $filedate = localtime( ( stat $file )[9] )->ymd('');
    if ( $filedate >= $save_from_date ) {
        print "[To Archive] $file";
    }
}

#   Default Values
my $source_directory      = 'C:\Users\Public\Documents';
my $destination_directory = 'C:\Users\Public\Documents\Archive';
my $save_from_date        = strftime "%Y%m%d", localtime;
my ( $verboseornotverbose, $display_help ) = undef;

GetOptions(
    "verbose!"            => \$verboseornotverbose,
    "help|h!"             => \$display_help,
    "source_dir|s:s"      => \$source_directory,
    "destination_dir|d:s" => \$destination_directory,
    "date|t:i"            => \$save_from_date
);

usage() if $display_help;

# Basic checks
unless ( -d $source_directory ) { die "ERROR -- Source directory [$source_directory] does not exists" }
unless ( -d $destination_directory ) {
    unless ( mkdir $destination_directory ) {
        die "ERROR -- Destination directory $destination_directory does not exists and couldn't be created'";
    }
}
unless ( $save_from_date <= strftime "%Y%m%d", localtime ) {
    die "ERROR -- Wrong or unknown date format [$save_from_date] should be before or equal today\'s' date'";
}
print $save_from_date ;

# Here we parse the source directory
find( \&parseSource, $source_directory );
Run Code Online (Sandbox Code Playgroud)

这是失败的比较: if ($filedate >= $save_from_date)

你能解释一下我在那个潜艇里错过了什么吗?

我已经阅读了很多其他帖子和一些变量定义教程,但我无法得到我的问题的线索......

谢谢 !

cho*_*oba 6

解析sub时不声明变量.在sub之前移动变量声明,或者将变量作为参数传递给sub.

更新:您无法直接将参数传递给File :: Find中wanted子参数.但是,你可以将它包装在一个匿名子:

sub parseSource {
    my $save_from_date = shift;
    # ...
}

# ...

find( sub { parseSource($save_from_date) }, $source_directory );
Run Code Online (Sandbox Code Playgroud)

  • 如果你关闭`strict`和`warnings`,你可以做各种各样的脏东西,这些东西大部分都会起作用.除非他们不这样做,你将有一个可怕的工作追踪它并弄清楚原因. (4认同)