Вы уже приняли ответ, но я подумал, что было бы полезно дать вам еще несколько деталей.
Как вы теперь знаете,
$line = ~s/\s+//;
полностью отличается от:
$line =~ s/\s+//;
Вы хотели второе, но вы набрали первое. Так что же вы получили в итоге?
~
- «оператор побитового отрицания». То есть он преобразует свой аргумент в двоичное число, а затем переворачивает это число - все нули становятся единицами, а все - нулями.
Итак, вы просите побитовое отрицание s/\s+//
. Это означает, что побитовое отрицание работает со значением, возвращаемым s/\s+//
. И значение, возвращаемое заменой, является числом выполненных замен.
Теперь мы можем проработать все детали.
s/\s+//
выполняет замену и возвращает количество выполненных замен (целое число).
~s/\s+//
возвращает побитовое отрицание целого числа, возвращаемого подстановкой (которая также является целым числом).
$line = ~s/\s+//
берет это второе целое число и присваивает его переменной $line
.
Вероятно, первый шаг возвращает 1 (вы не используете /g
на вашем s/.../.../
, поэтому будет сделана только одна замена). Достаточно просто получить побитовое отрицание 1.
$ perl -E'say ~1'
18446744073709551614
Так что это может быть целое число, которое вы видите (хотя оно может отличаться в 32-битной системе).