为什么在调试器下Perl的quotemeta()函数表现不同?

时间:2010-07-28 14:11:34

标签: perl debugging

我被这个不一致的调试器行为所困扰。在quotemeta()

下调用时,perl -d函数的行为似乎有所不同

$ perl -e 'print quotemeta("/a/b/c"),"\n"'

输出为\/a\/b\/c,这是正确的,并在perldoc -f quotemeta中记录。

现在,在调试器下,输出变为\\/a\\/b\\/c。我认为我正在使用的一些核心模块正在重新定义函数,尽管经过测试,似乎行为只发生在调试器下。调用CORE::quotemeta()会返回相同的输出。

有人可以启发我吗?

谢谢!

2 个答案:

答案 0 :(得分:8)

quotemeta是一个霰弹枪,无论是否需要,都可以逃避所有非单词字符。调试器不那么笨重;仅引用需要它的那些字符。 (反斜杠,正斜杠不会。)更重要的是,它只在检查值时执行此操作,而不是在打印时执行此操作。比较:

  DB<1> x quotemeta('a/b/c')
0  'a\\/b\\/c'

  DB<2> p quotemeta('a/b/c')
a\/b\/c

答案 1 :(得分:3)

我找不到这方面的参考,但是当被要求输出任何字符串时,perl调试器会重新引用它,因此它可以粘贴到脚本中,这是一个安全的字面值。你的价值是正确的;它是添加反斜杠的调试器。 <{1}}中有一个quote选项,您可能会尝试弄乱它。