在独立例程中§

请参阅主要文档 上下文中的sub indir

sub indir(IO() $path&code:$d = True:$r:$w:$x)

获取 Callable &code 并执行它,在本地(到 &code)将 $*CWD 变量更改为基于 $pathIO::Path 对象后,可以选择确保新路径通过多个文件测试。如果 $path 是相对的,它将被转换为绝对路径,即使给出了 IO::Path 对象。注意:此例程不会更改进程的当前目录(请参阅 &*chdir)。&code 之外的 $*CWD 不会受到影响,即使 &code 明确为 $*CWD 分配了一个新值。请记住,延迟评估的内容最终可能不会在实际评估时让 indir 在其动态范围内设置 $*CWD。确保生成器设置了它们的 $*CWD,或在从 indir 返回结果之前急切地评估它们。

成功时返回 &code 调用返回的值。如果无法成功更改 $*CWD,则返回 Failure警告:请记住,延迟评估的内容最终可能不会在实际评估时让 indir 在其动态范围内设置 $*CWD。确保生成器设置了它们的 $*CWD,或在从 indir 返回结果之前急切地评估它们。

say indir("/tmp"{
    gather { take ".".IO }
}.CWD# OUTPUT: «(/home/camelia)␤» 
 
say indir("/tmp"{
    eager gather { take ".".IO }
}.CWD# OUTPUT: «(/tmp)␤» 
 
say indir("/tmp"{
    my $cwd = $*CWD;
    gather { temp $*CWD = $cwdtake ".".IO }
}.CWD# OUTPUT: «(/tmp)␤»

该例程的 $path 参数可以是任何具有返回 IO::Path 对象的 IO 方法的对象。可用的文件测试是

  • :d — 检查 .d 返回 True

  • :r — 检查 .r 返回 True

  • :w — 检查 .w 返回 True

  • :x — 检查 .x 返回 True

默认情况下,仅执行 :d 测试。

say $*CWD;                   # OUTPUT: «"/home/camelia".IO␤» 
indir '/tmp'{ say $*CWD }# OUTPUT: «"/tmp".IO␤» 
say $*CWD;                   # OUTPUT: «"/home/camelia".IO␤» 
 
indir '/not-there'{;};     # returns Failure; path does not exist