Как я получил число из подстановки на нечисловой строке? - PullRequest
2 голосов
/ 05 мая 2011

Я новичок в 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 ]

11 голосов
/ 05 мая 2011

У вас есть пробел между = и ~.Они должны быть вместе = ~.

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

То, что вы делали, устанавливало $ data_dir равным дополнению (то есть оператору ~) s/\\/\//g, что равно 4294967295.

3 голосов
/ 05 мая 2011

Это действительно "= ~" с пробелом в нем?

Это должно быть "= ~" без пробела. В настоящее время вы присваиваете $ data_dir побитовое отрицательное значение строки.

Вы используете следующее, не так ли?

использовать строгое; используйте предупреждения;

2 голосов
/ 05 мая 2011

Другие уже ответили, указав причину проблемы - пробел между = ~, который должен был быть =~ без пробела.

Ценный урок - всегда добавлять use strict к вашемускрипты;если бы вы сделали это, вы бы получили предупреждение вроде:

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

Это помогло бы вам выяснить, что оператор подстановки использовался на $_, а не на $data_dir -потому что вместо оператора привязки =~, связывающего его с $data_dir, у вас был = ~.

Итак, урок для изучения: всегда use strict - это поможет поймать такие вещи, где выможет иметь неправильный одиночный символ и сэкономить вам много времени.

Кстати, при работе с путями к файлам и желании переносимости между платформами, использование File :: Spec часто является хорошей идеей.

0 голосов
/ 05 мая 2011

Это потому, что вы применяете числовой оператор (~) к s /..../ g.Попробуйте следующее:

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