Как удалить все дефисы с помощью регулярного выражения Perl? - PullRequest
2 голосов
/ 03 февраля 2009

Я думал, что это сделало бы ...

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

Но, похоже, мне не хватает небольшого, но важного фрагмента синтаксиса регулярных выражений.

$rowfetch всегда что-то вроде:

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

и т. Д. ... для обозначения дней недели, когда происходит собрание

Ответы [ 4 ]

12 голосов
/ 03 февраля 2009
$rowfetch =~ s/-//gi

Это то, что вам нужно для вашей второй линии там. Вы просто находите вещи, а не меняете их без префикса "s".

Для этого вам также необходимо использовать оператор регулярного выражения "= ~".

7 голосов
/ 03 февраля 2009

Вот что сейчас делает ваш код:

# 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», без учета регистра (/i) и повторяет замену более одного раза (/g) для переменной $subject.

4 голосов
/ 08 февраля 2009

Использование оператора tr быстрее, чем использование замены s/// регулярное выражение.

$rowfetch =~ tr/-//d;

Benchmark:

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%   --
1 голос
/ 08 февраля 2009

Не по теме, но без дефисов, как вы узнаете, является ли буква "T" вторником или четвергом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...