2

我是 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变量的问题,因为这适用于其他字符串,但可能是什么问题?

PS$data_dir我是从其他模块得到的,不知道它是如何构造的。

4

4 回答 4

11

= 和 ~ 之间有一个空格。他们应该在一起=~。

$data_dir =~ s/\\/\//g;

您所做的是将 $data_dir 设置为s/\\/\//g等于 4294967295 的补码(即 ~ 运算符)。

于 2011-05-05T12:29:15.377 回答
3

那真的是“=〜”里面有空格吗?

它应该是“=~”,没有空格。您当前正在为 $data_dir 分配字符串的按位否定值。

您正在使用以下内容,不是吗?

使用严格;使用警告;

于 2011-05-05T12:32:28.077 回答
2

其他人已经回答了问题的原因 - 之间的空格= ~,应该=~没有空格。

一个宝贵的教训是始终添加use strict到您的脚本中;如果你这样做了,你会收到如下警告:

Use of uninitialized value $_ in substitution (s///) at (eval 11) line 4.

这将帮助您找出替换运算符正在使用 on$_而不是 on $data_dir- 因为您使用的是绑定运算符而不是=~绑定运算符。$data_dir= ~

所以,要吸取的教训:总是use strict——它会帮助你抓住这样的事情,你可能会错一个字符,并为你节省很多时间。

顺便说一句,当使用文件路径并希望在平台之间具有可移植性时,使用File::Spec通常是一个好主意。

于 2011-05-05T17:54:21.610 回答
0

这是因为您将数字运算符 (~) 应用于 s/..../g。尝试以下操作:

$data_dir =~  s/...../g;
于 2011-05-05T12:30:48.373 回答