Тема
|
Match - може ли да се оптимизира
|
|
Автор |
bira_more (бира) |
Публикувано | 20.07.07 23:35 |
|
Имам променлива $keep (една буква)
Имам променлива $buf
Целта е да разбера дали $buf се състои само от $keep
Кода по долу - върши работа.
Опитах няколко неща с match ама нещо не мога да получа каквото искам.
@all=split(//,$buf);
$L=@all;
for($j=0;$j<$L;$j++){
$p=$all[$j];
if($p!=$keep){
$Same=0;
last;
}
}
Например
if($buf =~m/$keep{length($buf)}/)
Не работи - поне не така както бих искал аз.
Bеer? Mоre?
|
|
Тема
|
Re: Match - може ли да се оптимизира
[re: bira_more]
|
|
Автор | errata (Нерегистриран) |
Публикувано | 24.07.07 07:21 |
|
To i az sum edin pishman programist, no sled kato vsichki specove sa otishli na more ...
Ta znachi, ako $keep e bukva (t.e. string s dulzhina 1), kakvo ti prechi da izpolzvash operatora eq (za sravniavane na strings) ili zadulzhitelno triabva da e s match?
if ($buf eq $keep) {...}
|
|
Тема
|
Re: Match - може ли да се оптимизира
[re: bira_more]
|
|
Автор | perlmonk (Нерегистриран) |
Публикувано | 24.07.07 12:31 |
|
нещо от сорта би следвало да е поне толкова ефективно колкото и "eq".
use strict;
my @ar1 = qw(a a a);
my @ar2 = qw(a a b);
my $buf = 'a';
print "Array 'ar1' contains only '$buf' chars\n" if _eqls(\@ar1, $buf);
print "Array 'ar2' contains only '$buf' chars\n" if _eqls(\@ar2, $buf);
sub _eqls {
my $arr = shift;
my $buf = shift;
my $h = {};
for my $el (@$arr) {
$h->{$el}++;
last if keys %$h > 1;
}
return 'true' if $h->{$arr->[0]} == scalar @$arr;
return undef;
}
|
|
Тема
|
Re: Match - може ли да се оптимизира
[re: bira_more]
|
|
Автор | perlmonk (Нерегистриран) |
Публикувано | 24.07.07 12:43 |
|
или защо не компилиран регулярен израз?
my $buf = 'a';
my $keep = 'aaa';
my $regex = qr{^\Q$buf\E+$};
$keep =~ /$regex/;
|
|
|
$keep="8";
$buf="8889";
$buf1="8888888";
няма поне според мен нещо което директно да казва
$keep == $buf1;
$keep != $buf;
Bеer? Mоre?
|
|
|
Мерси много - точно това търсех.
Сега ще огледам какво прави с надеждата и да разбера повече за Perl / regexp
Някой ден ако се видим - имаш ена бира :)
Bеer? Mоre?
|
|
|
if($keep =~ /^$buf+$/)
е достатъчно.
Много мерси за идеята - така де принтнах $regex да видя какво става :)
Bеer? Mоre?
|
|
Тема
|
Re: В същност
[re: bira_more]
|
|
Автор | novobranec (Нерегистриран) |
Публикувано | 24.07.07 21:01 |
|
Ако ти трябва за това което си мисля (мачване на префикси) ще береш ядове, този regex не е достатъчен.
|
|
|
Ще го обясня на C че ми е по лесно.
Имам
char S[x];
char C;
ако всички букви на S са равни на C Same=1
else Same = 0;
Пример
S="88888888888";
C='8';
Same = 1;
S="888898888888";
C='8';
Same = 0;
Bеer? Mоre?
|
|
Тема
|
Re: В същност
[re: novobranec]
|
|
Автор | perlmonk (Нерегистриран) |
Публикувано | 25.07.07 10:52 |
|
novobranec, нищо лошо няма да се разчита на толкова добре оптимизирана машина като тази за регулярните изрази в Perl. Пример с 'eq' и regex:
use strict;
use Benchmark qw(:all);
$main::string = 'aaaaaaaaaa';
$main::buffer = 'a';
@main::array = split '', $main::string;
#my $results =
timethese(10_000_000, {
'equal' => '$main::buffer eq $_ or last for @main::array',
'regex' => '$main::string =~ /^\Q$main::buffer\E+$/o',
});
#cmpthese( $results );
__END__
output:
Benchmark: timing 10000000 iterations of equal, regex...
equal: 31 wallclock secs (27.16 usr + 0.01 sys = 27.17 CPU) @ 368053.00/s (n=10000000)
regex: 7 wallclock secs ( 7.23 usr + 0.00 sys = 7.23 CPU) @ 1383125.86/s (n=10000000)
|
|