我正在尝试删除一些与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
答案 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位系统上可能会有所不同)。