【问题标题】:OneLiner to check if file exists in perlOneLiner 检查文件是否存在于 perl
【发布时间】:2022-01-20 00:30:48
【问题描述】:

在我的httpd.conf 文件中,如果文件tmp 不存在,我只想执行以下过滤器:

ExtFilterDefine htmlfilter mode=output intype=text/html cmd="/usr/bin/perl -pe 's|Mountainbike|BLUE|e unless q{\"\\Q/path/to/my.test.file/.tmp\E\"}'"

现在它不工作。我猜q{...} 部分是错误的。我需要改变什么?

【问题讨论】:

  • 好吧,q{} 是模拟单引号'' 的运算符,所以你说的是unless "string",这(几乎)总是正确的。我的猜测是您想要在字符串之前进行文件测试,即unless -e "...."。我猜你认为字符串是一个正则表达式,所以你可以去掉\Q .. \E转义序列,因为它实际上是一个字符串,它没有用处。

标签: perl


【解决方案1】:

Perl 使用-e-f 来测试文件是否存在。 q{} 只是写单引号的一种奇特方式。

此外,替换的/e 修饰符将替换评估为代码。您确定要运行 BLUE 子例程并将 Mountainbike 替换为其返回值吗?

cmd="/usr/bin/perl -pe 's/Mountainbike/BLUE/ unless -f q{/path/to/my.test.file/.tmp}'"

【讨论】:

  • 请注意,这会统计输入文件每一行的文件
  • @ikegami 这是一个很好的观察。也许应该是一次性检查,比如替换前的last if -f q{...}。或者一个 BEGIN 块。
  • 所以我这样做了:ExtFilterDefine jsonfilter mode=output intype=application/json cmd="/usr/bin/perl -pe 's|^|qq(\,\") . valid . qq(\"\: ) . qq(\") . time() . \\x0D . qq(\") . qq(\\n)|e if ($==eof) && unless (-f q{/tmp/md5_filter.tmp})'"。但我猜我的&& 操作员无效。这种方式是行不通的。怎么了?
  • 第一个条件只在请求文件的末尾添加时间戳。我还需要这个代码last if -f q{...}吗?
  • @TLP @ikegami - 我编辑我的代码并插入一个END block。这会阻止检查文件的每一行吗? cmd="/usr/bin/perl -pe 'END { unless (-f q{/tmp/md5_filter.tmp}) { print qq(\/*) . time() . qq(\*/) } }'"。还是应该将END block 更改为last 语句?
猜你喜欢
  • 2011-02-05
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多