我以为这样做了......
$rowfetch = $DBS->{Row}->GetCharValue("meetdays");
$rowfetch = /[-]/gi;
printline($rowfetch);
Run Code Online (Sandbox Code Playgroud)
但似乎我错过了正则表达式语法中一个小而重要的部分.
$rowfetch
始终是这样的:
------S
-M-W---
--T-TF-
Run Code Online (Sandbox Code Playgroud)
等......代表会议发生的一周中的日子
use*_*650 12
$rowfetch =~ s/-//gi
Run Code Online (Sandbox Code Playgroud)
这就是你在那里的第二线所需要的.你只是找东西,而不是在没有"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);
Run Code Online (Sandbox Code Playgroud)
这相当于编写了以下代码:
$rowfetch = ( $_ =~ /[-]/ )
printline( $rowfetch );
Run Code Online (Sandbox Code Playgroud)
你正在寻找的魔力是
=~
Run Code Online (Sandbox Code Playgroud)
令牌而不是
=
Run Code Online (Sandbox Code Playgroud)
前者是Regex运算符,后者是赋值运算符.
还有许多不同的正则表达式运算符:
if( $subject =~ m/expression/ ){
}
Run Code Online (Sandbox Code Playgroud)
只有当$ subject与给定表达式匹配时,才会使给定的代码块执行
$subject =~ s/foo/bar/gi
Run Code Online (Sandbox Code Playgroud)
将s/
所有"foo"实例替换为"bar",case-insentitively(/i
),并/g
在变量上重复多次替换()$subject
.
小智 5
使用tr
运算符比使用s///
正则表达式替换要快。
$rowfetch =~ tr/-//d;
Run Code Online (Sandbox Code Playgroud)
基准测试:
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 },
});
Run Code Online (Sandbox Code Playgroud)
我系统上的结果:
Rate sub trd
sub 300754/s -- -79%
trd 1429005/s 375% --
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8960 次 |
最近记录: |