2010-07-28 58 views
4

我被这个有点不一致的调试器行为咬住了。该quotemeta()功能似乎当perl -d为什么在调试器下,Perl的quotemeta()函数的行为有所不同?

$ perl -e 'print quotemeta("https://stackoverflow.com/a/b/c"),"\n"'

输出是\/a\/b\/c,这是正确的下调用,并在perldoc -f quotemeta文件,以不同的表现。

现在,在调试器下,输出变为\\/a\\/b\\/c。我认为我正在使用的一些核心模块是通过重新定义函数来测试的,但似乎只有在调试器下才会出现这种情况。拨打CORE::quotemeta()将返回相同的输出。

有人可以启发我吗?

谢谢!

+0

“输出成”?你是说印刷实际上输出不同的东西? – ysth 2010-07-28 16:32:15

+0

“输出变成”表示'x'命令的输出,也就是说,与调试器中的'p'命令相反。 – 2010-07-29 04:05:29

回答

8

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

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

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

我一直在使用'x'命令,因为感谢您指出'p'命令 – 2010-07-29 04:03:01

3

我找不到这个参考,但是perl调试器在被要求输出任何字符串时会重新引用它,所以它是一个安全的文字值,可以粘贴到脚本中。你的价值是正确的;它是添加反斜杠的调试器。 perldoc perldebug中有quote选项,你可以试试这个。

相关问题