如何使用perl获取最后一个目录?

时间:2019-06-06 05:32:54

标签: perl

我使用以下脚本来获取最后一个目录。

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。我究竟做错了什么?

1 个答案:

答案 0 :(得分:4)

一些有用的东西:

  • Perl具有内置的mkdir
  • File :: Path核心模块具有make_path来完成mkdir -vp的作用

对于$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再次进行检查。没什么大不了的,但这是您为其分配观察值的地方。

我没有针对您的特定修复程序,因为我不太清楚您要做什么。

相关问题