我以为这样做了......
$rowfetch = $DBS->{Row}->GetCharValue("meetdays"); $rowfetch = /[-]/gi; printline($rowfetch);
但似乎我错过了正则表达式语法中一个小而重要的部分.
$rowfetch
始终是这样的:
------S -M-W--- --T-TF-
等......代表会议发生的一周中的日子
$rowfetch =~ s/-//gi
这就是你在那里的第二线所需要的.你只是找东西,而不是在没有"s"前缀的情况下改变它.
您还需要使用正则表达式运算符"=〜".
以下是您的代码目前所做的事情:
# 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
将s/
所有"foo"实例替换为"bar",case-insentitively(/i
),并/g
在变量上重复多次替换()$subject
.
使用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% --