我以为这样做了......
$rowfetch = $DBS->{Row}->GetCharValue("meetdays");
$rowfetch = /[-]/gi;
printline($rowfetch);
但似乎我错过了正则表达式语法中一个小而重要的部分。
$rowfetch
始终如下:
------S
-M-W---
--T-TF-
等......代表会议发生的一周中的日子
答案 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”是星期二还是星期四?