我使用以下脚本来获取最后一个目录。
my $bsnap = bla_path
my $numbsnaps = defaultstr(some_file);
my (%snapshotdirs, $lastsnap);
if ($numbsnaps > 0) {
system(@mkdir, '-vp', "$backupsnap/$bserver");
exit 1 if checkrc("mkdir $backupsnap/$bserver:", $?, $!);
unless(opendir($fh, "$backupsnap/$bserver")) {
print STDERR "error: failed to open snapshot dir: $!\n";
goto snapshot_end;
}
foreach $lastsnap (sort(grep({$_ !~ /^\.\.?$/ and -d "$backupsnap/$bserver/$_";} readdir($fh)))) {
my $day = $lastsnap;
$day =~ s/-\d+$//;
push(@{$snapshotdirs{$day}}, $lastsnap);
}
if ($lastsnap) {
$lastsnap = "$backupsnap/$bserver/$lastsnap";
} else {
$lastsnap = "$backupstore/$bserver" unless $lastsnap;
}
system(@mkdir, '-vp', "$bsnap");
exit 1 if checkrc("mkdir $bsnap:", $?, $!);
}
但是当我打印$lastsnap
时,我只会得到$backupstore/$bserver
。我想得到$backupsnap/$bserver/$lastsnap
。我究竟做错了什么?
答案 0 :(得分:4)
一些有用的东西:
对于$lastsnap
,您可以在if
之外声明它,但不分配任何内容。在循环内部,您可以将其用作foreach
的控制变量,但是请稍后尝试访问它。那是行不通的,因为控制变量是该foreach循环专用的。它会暂时屏蔽具有相同名称的变量,直到循环完成。
my $lastsnap;
print "1. \$lastsnap is $lastsnap\n";
foreach $lastsnap ( 0..2 ) {
print "$lastsnap is $lastsnap\n";
}
print "2. \$lastsnap is $lastsnap\n";
即使循环中的最后一个值为2,它也以循环后的undef
结尾:
1. $lastsnap is
0 is 0
1 is 1
2 is 2
2. $lastsnap is
尝试使用初始值:
my $lastsnap = 'foo';
print "1. \$lastsnap is $lastsnap\n";
foreach $lastsnap ( 0..2 ) {
print "$lastsnap is $lastsnap\n";
}
print "2. \$lastsnap is $lastsnap\n";
由于循环foreach
的控制变量不再掩盖它,因此它在循环结束时以原始值结束:
1. $lastsnap is foo
0 is 0
1 is 1
2 is 2
2. $lastsnap is foo
当您用$lastsnap
来检查if
时,它是错误的,因此会进行else
分支:
if ($lastsnap) {
$lastsnap = "$backupsnap/$bserver/$lastsnap";
} else {
$lastsnap = "$backupstore/$bserver" unless $lastsnap;
}
在else
分支中,您已经知道$lastsnap
为假,但是您可以使用unless
再次进行检查。没什么大不了的,但这是您为其分配观察值的地方。
我没有针对您的特定修复程序,因为我不太清楚您要做什么。