我如何从非数字字符串的替换中获取数字?

时间:2011-05-05 12:27:06

标签: perl activeperl

我是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我从其他模块中获取,并且不知道它是如何构建的。

4 个答案:

答案 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;