Perl中字符串的替换将字符串更改为整数值

时间:2019-04-23 23:28:02

标签: perl

我正在尝试删除一些与perl中的正则表达式匹配的字符,当我这样做时,它将返回一个整数值。

我尝试用空字符串替换字符串中的多个空格,或者基本上删除空格。

#! /usr/intel/bin/perl

my $line = "foo/\\bar car"; 
print "$line\n";
#$line = ~s/(\\|(\s)+)+//; <--Ultimately need this, where backslash and space needs to be deleted. Tried this, returns integer value
$line = ~s/\s+//; <-- tried this, returns integer value
print "$line\n"; 

预期结果:
第一次打印:foo/\bar car
第二次印刷:foo/barcar

实际结果:
第一次打印:foo/\\bar car
第二次印刷:18913234908

2 个答案:

答案 0 :(得分:3)

正确的解决方法是

$line =~ s/[\s\\]+//g;

注意:

  • g标志来替换所有出现的情况
  • =~之间没有空格

=~是单个运算符,它将替换运算符s绑定到目标变量$line

插入一个空格(如您的代码中所示)意味着s绑定到默认目标$_,因为没有显式目标,然后返回值(即进行替换的次数) )的所有位都取反(一元~是按位补码),并分配给$line

换句话说,

$line = ~ s/...//

解析为

$line = ~(s/...//)

等效于

$line = ~($_ =~ s/...//)

如果启用了use warnings,则会收到以下消息:

Use of uninitialized value $_ in substitution (s///) at prog.pl line 6.

答案 1 :(得分:0)

您已经接受了答案,但我认为为您提供更多详细信息将很有用。

您现在知道的

$line = ~s/\s+//;

完全不同于:

$line =~ s/\s+//;

您想要第二个,但是您键入了第一个。那你最后得到了什么?

~是“按位取反运算符”。也就是说,它将参数转换为二进制数,然后对该数字进行位翻转-所有的零都变成1,而所有的零都变成0。

因此,您需要对s/\s+//进行按位取反。这意味着按位取反对s/\s+//返回的值起作用。替换返回的值是进行替换的次数。

我们现在可以计算出所有细节。

  • s/\s+//执行您的替换并返回替换的次数(整数)。
  • ~s/\s+//返回替换所返回的整数(也是整数)的按位取反。
  • $line = ~s/\s+//接受第二个整数,并将其分配给变量$line

可能,第一步返回1(您没有在/g上使用s/.../.../,因此只会进行一次替换)。得到1的按位求反很容易。

$ perl -E'say ~1'
18446744073709551614

所以这很可能是您所看到的整数(尽管在32位系统上可能会有所不同)。