使用Template Toolkit查找目录是否存在

时间:2015-02-04 18:19:26

标签: perl template-toolkit

我正在寻找一种使用Template Toolkit查找目录是否存在的方法。

对于findind目录是否存在,我使用 Template :: Plugin :: Directory

[% USE dir = Directory(dirpath) %]

如果目录不存在并且将抛出异常,那么我会发现异常。

我希望像

这样的东西
isexists(dirpath)

我的问题是 dirpath 请求驱动器号,这是不固定的。

有没有办法使用Template Toolkit查找我的脚本运行的驱动器号?

是否可以找到正在运行的脚本的路径?

我愿意接受其他可能是我的主要问题的想法,找出目录是否存在。

备注

我使用的是Windows 7和ProcessTemplate v5.8.0以及Template toolkit v2.22

2 个答案:

答案 0 :(得分:1)

source for Template::Plugin::File的快速扫描表明,如果传入的参数不是绝对路径,则假定路径相对于$config->{root},并且知道TT如何工作,这似乎是合理的事情去做。注意,即使这只是一条相对路径。

你还没有说过你在TT下面有什么框架,但如果是催化剂或者类似的,你可能会发现你可以从中得到你需要的东西

[%- c.path_to(c.config.root) -%]

......甚至(恐怖):

[%- PERL -%]
    $stash->set(drive => substr($0,0,3)); 
[%- END -%]
[%- SET dirpath = drive _ dirpath -%]

......但是说真的,不要这样做。如果您打开TT配置中的EVAL_PERL => 1(您必须为上述PERL块执行此操作),只需使用它来内省您的环境和配置,这样您就可以找到一个简单而干净的前置保存所需信息的现有变量。


根据评论记录更新

原始问题并没有真正解决问题的核心,如果我重申,我理解的是:

我使用TT处理的文件包含对其他文件/目录的引用。这些引用不包括Windows驱动器号,需要包含它们才能找到并处理这些文件/目录。

现在,如果我们以文字文件开头,则可以使用File::Spec将相对引用转换为绝对引用。但我们所拥有的只是文件的名称,因此驱动器号必须隐含在其他内容中:执行脚本的位置$0 (见上文),当前的工作目录$ENV{PWD} (见下文)或传递给脚本的参数,例如Ben Grimm在另一个回复中提到--define drive=C:

试试这个,这是我之前建议的,现在明确提出: NB未经测试

<pre>
[%- PERL -%]
foreach my $e (keys %ENV){
    printf "%s: %s\n", $e, $ENV{$e};
}
[%- END -%]
</pre>

这应该向您展示您的环境中可能对推断驱动器有用的内容。

答案 1 :(得分:0)

template.name中提供了当前模板的路径。所以我假设驱动器号(在Windows上)可以通过从第一个/向前移除来找到:

[% drive = template.name.remove('/.*') %]