gpt4 book ai didi

Perl glob、qq() 和方括号 []

转载 作者:行者123 更新时间:2023-12-01 09:12:10 28 4
gpt4 key购买 nike

我有两个目录,每个目录都有一个文件:

$ ls -l "test dir["
-rw-r--r-- 1 root media 0B 11 Dec 16:53 .ignoreme

$ ls -l "test [dir]"
-rw-r--r-- 1 root media 0B 11 Dec 16:34 .ignoreme

我正在使用 Perl 来测试“.ignoreme”文件是否存在:

$ perl -e '$d="test dir["; print -e glob qq("$d"/.ignore*); print "\n";'
1

哪个有效,并且

$ perl -e '$d="test [dir]"; print -e glob qq("$d"/.ignore*); print "\n";'

没有。

我猜它与 [] 对有关,但我不确定交互。有人可以启发我。对于匹配任何包含 []$d 的修复程序,我将不胜感激。

最佳答案

glob[] 对解释为 字符类 的元字符。 这是通过一个简单的实验很容易确认

mkdir zZ
touch zZ/f.txt
perl -wE'say for glob qq([az][bZ]/*)'

这会正确列出文件。

然后在问题的第二种情况下, glob 根本不查找名称中包含文字 [] 的目录,而是查找包含d,i,r 字符之一在其名称中的 test␣ 之后。

然后一个解决方法是使用 \Q...\E (参见 quotemeta )来转义那些 []

say for glob qq(\Q$d\E/.ignore*);

这也会根据需要转义空格 - 但它也会转义其他内容,因此您不能将通配符(用于一个)用于序列内的内容。这不应该成为问题,因为目录名称不会包含用作通配符的字符,但最好记住这一点。

另一种选择是在形成目录名称变量时转义特殊字符

 perl -wE'$d = quotemeta "test [dir]"; say for glob qq($d/*)'

现在照常工作。

由于 quotemeta 也处理空格,因此不需要双引号。


glob页面说

This operator is implemented using the standard File::Glob extension.

File::Glob文档专门将 [] 列为元字符,用于 字符类

关于Perl glob、qq() 和方括号 [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59280617/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com