我是perl的新手,有一点问题:
perl代码的一部分:
print "${data_dir}\n";
#converting directory path to unix format (replacing all backslashes with slashes)
$data_dir = ~s/\\/\//g;
print "${data_dir}\n";
输出:
C:/dev/../data
4294967295
为什么结果会有所不同?我想$data_dir
变量中的问题,因为这适用于其他字符串,但可能是什么问题?
P.S。 $data_dir
我从其他模块中获取,并且不知道它是如何构建的。
答案 0 :(得分:11)
你和=之间有一个空格。他们应该在一起=〜。
$data_dir =~ s/\\/\//g;
你正在做的是设置$ data_dir等于s/\\/\//g
的补码(即〜运算符),等于4294967295。
答案 1 :(得分:3)
真的是“=〜”,里面有空格吗?
它应该是“=〜”,没有空格。您当前正在为$ data_dir分配字符串的按位否定值。
你使用以下不是吗?
使用严格; 使用警告;
答案 2 :(得分:2)
其他人已经回答了问题的原因 - = ~
之间的空格,=~
之间应该没有空格。
有价值的教训是始终将use strict
添加到您的脚本中;如果你这样做了,你会收到一个警告:
Use of uninitialized value $_ in substitution (s///) at (eval 11) line 4.
这会帮助你弄清楚替换运算符是在$_
而不是$data_dir
上使用的 - 因为而不是绑定运算符=~
将它绑定到{{1你有$data_dir
。
所以,要学习的经验:总是= ~
- 它会帮助捕捉这样的事情,你可能会遇到一个错误的角色,并为你节省很多时间。
顺便说一下,在处理文件路径并希望在平台之间实现可移植性时,使用File::Spec通常是一个好主意。
答案 3 :(得分:0)
这是因为你将数字运算符(〜)应用于s /.... / g。 请尝试以下方法:
$data_dir =~ s/...../g;