William Li wrote:
>
> Silly question, is there an equal but opposite function to chop in Perl?
> I'd like to remove the first and last character of a string and am looking
> for a simple way to do it. So far I have:
>
> # "1234567" -> "23456"
> chop($string); # "123456"
> $string = reverse($string); # "654321"
> chop($string); # "65432"
> $string = reverse($string); # "23456"
Hi.
To resolve the problem, I ran the benchmark below and got these results:
Benchmark: timing 10000000 iterations of Control, One Substitute, One Substring, Two
Substitutes, Two Substrings...
Control: 25 wallclock secs (25.43 usr + 0.00 sys = 25.43 CPU) @ 393236.34/s
(n=10000000)
One Substitute: 112 wallclock secs (111.50 usr + 0.00 sys = 111.50 CPU) @ 89686.10/s
(n=10000000)
One Substring: 54 wallclock secs (53.28 usr + 0.00 sys = 53.28 CPU) @ 187687.69/s
(n=10000000)
Two Substitutes: 62 wallclock secs (62.12 usr + 0.00 sys = 62.12 CPU) @ 160978.75/s
(n=10000000)
Two Substrings: 57 wallclock secs (57.57 usr + 0.00 sys = 57.57 CPU) @ 173701.58/s
(n=10000000)
Subtracting the control time from the four options gives
One Substitute: 87 secs
One Substring: 29 secs
Two Substitutes: 37 secs
Two Substrings: 32 secs
So the fastest by a nose is Tore's
$string = substr( $string, 1, (length($string) - 2) )
although the three fastest are remarkably similar. As predicted James'
single substitution
$string =~ s/^.(.*).$/$1/;
was by far the slowest, but by just three times rather than the 20+ times
that Rob H had predicted.
Cheers,
Rob
use strict;
use warnings;
use Benchmark;
timethese(10E6, {
'Control' => sub {
my $str = join '', 'A' .. 'Z';
},
'Two Substitutes' => sub {
my $str = join '', 'A' .. 'Z';
for ($str) {
s/^.//s;
s/.$//s;
}
},
'One Substitute' => sub {
my $str = join '', 'A' .. 'Z';
for ($str) {
s/^.(.*).$/$1/s;
}
},
'Two Substrings' => sub {
my $str = join '', 'A' .. 'Z';
for ($str) {
substr($_, 0, 1, '');
substr($_, -1, 1, '');
}
},
'One Substring' => sub {
my $str = join '', 'A' .. 'Z';
for ($str) {
$_ = substr ($_, 1, (length($str) - 2) );
}
},
});
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]