如何使用Perl正则表达式删除所有连字符?

时间:2009-02-02 21:05:06

标签: regex perl

我以为这样做了......

$rowfetch = $DBS->{Row}->GetCharValue("meetdays");
$rowfetch = /[-]/gi;
printline($rowfetch);

但似乎我错过了正则表达式语法中一个小而重要的部分。

$rowfetch始终如下:

------S
-M-W---
--T-TF-

等......代表会议发生的一周中的日子

4 个答案:

答案 0 :(得分:12)

$rowfetch =~ s/-//gi

这就是你在那里的第二线所需要的。你只是找东西,而不是在没有“s”前缀的情况下改变它。

您还需要使用正则表达式运算符“=〜”。

答案 1 :(得分:7)

以下是您的代码目前所做的事情:

# Assign 'rowfetch' to the value fetched from:
#      The function 'GetCharValue' which is a method of: 
#         An Value in A Hash Identified by the key "Row" in:
#          Either a Hash-Ref or a Blessed Hash-Ref
#      Where 'GetCharValue' is given the parameter "meetdays"
$rowfetch = $DBS->{Row}->GetCharValue("meetdays");
# Assign $rowfetch to the number of times 
#  the default variable ( $_ ) matched the expression /[-]/ 
$rowfetch = /[-]/gi;
#  Print the number of times. 
printline($rowfetch);

这相当于编写了以下代码:

$rowfetch = ( $_ =~ /[-]/ ) 
printline( $rowfetch ); 

你正在寻找的魔力是

=~ 

令牌代替

=

前者是Regex运算符,后者是赋值运算符。

还有许多不同的正则表达式运算符:

if( $subject =~ m/expression/  ){
}

只有当$ subject与给定表达式匹配时才会执行给定的代码块,并且

$subject =~ s/foo/bar/gi 

用“bar”替换(s/)“foo”的所有实例,代表性地(/i),并且多次重复替换(/g),变量$subject

答案 2 :(得分:4)

使用tr运算符比使用s///正则表达式替换要快。

$rowfetch =~ tr/-//d;

基准:

use Benchmark qw(cmpthese);

my $s = 'foo-bar-baz-blee-goo-glab-blech';

cmpthese(-5, {
  trd => sub { (my $a = $s) =~ tr/-//d },
  sub => sub { (my $a = $s) =~ s/-//g },
});

我的系统上的结果:

         Rate  sub  trd
sub  300754/s   -- -79%
trd 1429005/s 375%   --

答案 3 :(得分:1)

偏离主题,但没有连字符,你怎么知道“T”是星期二还是星期四?