【问题标题】:Find if a directory exists using Template Toolkit使用 Template Toolkit 查找目录是否存在
【发布时间】:2015-02-06 06:24:06
【问题描述】:

我正在寻找一种使用模板工具包查找目录是否存在的方法。

为了查找目录是否存在,我使用 Template::Plugin::Directory

[% USE dir = Directory(dirpath) %]

如果目录不存在,会抛出异常,所以我将异常处理。

我想要类似的东西

isexists(dirpath)

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

模板工具包有没有办法找到我的脚本运行所在的驱动器号?

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

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

备注

我正在使用 Windows 7 和 ProcessTemplate v5.8.0 和 Template toolkit v2.22

【问题讨论】:

  • 正在执行的 Perl 脚本文件的路径保存在 $0 中。这有帮助吗?
  • 我只想检查该目录是否存在于您的 Perl 脚本中。如果是这样,则仅调用您的模板。
  • @Borodin,我不直接使用 perl。我只调用我的 template.tt
  • ProcessTemplate 是 TT 包中的 tpage 的 windows 等效项吗?如果是这样,您可以将驱动器号作为变量传递ProcessTemplate --define drive=C: template.tt

标签: perl template-toolkit


【解决方案1】:

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

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

[%- 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(见上文),当前工作目录@987654329 @ (见下文) 或传递给脚本的参数,例如--define drive=C: 正如 Ben Grimm 在另一条回复中提到的那样。

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

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

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

【讨论】:

  • 您的示例中的 c 是什么意思?
  • 在 Catalyst 和类似框架中,$c 是 Web 上下文。你还没有明确说明你的堆栈中还有什么,所以很难知道如何提供建议。
  • 是的,我知道。但是什么是TT渲染?网页?这个目录参数的来源是什么?
  • 我只是有一个带有 TT 语法和文本的文件 foo.tt2 ......目的是生成一个 xml 文件。在 xml 中是依赖给定文件的字段是否存在。我不直接在我的脚本中使用 perl,只使用带有 TT v2.22 的 ProcessTemplate v5.8
  • perl 解决方案返回我的 ProcessTemplate.exe 的路径而不是我的 tt2 文件...
【解决方案2】:

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

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

【讨论】:

  • 当然,假设模板文件与感兴趣的目录位于同一驱动器上。
  • 是的,很多假设...一个更好的问题会产生一个更好的答案。
  • @Ben Grimm,保证
  • 在我的测试中,[% template.name %] 只包含文件名,没有完整路径。
猜你喜欢
  • 2013-04-03
  • 2017-07-14
  • 2015-04-29
  • 1970-01-01
  • 2022-07-21
  • 2015-07-07
  • 2012-02-14
相关资源
最近更新 更多