如何从字符串中获取具有最大ascii值的char?
$str = 'abcb'
# extract biggest char somehow
# as a result $char contains "c"
答案 0 :(得分:9)
use List::Util 'maxstr';
my $maxChar = maxstr split //, 'abcb'; # 'c'
答案 1 :(得分:7)
这些事情的诀窍是知道你的其他限制。您需要多久在程序中执行此操作以及字符串有多大?使用单发短弦,您可以摆脱浪费。如果你不得不重复或大字符串,那么浪费就更重要了。
我测试了5秒CPU(Mac Pro,OS X.6.8,Perl 5.14.1),以增加字符串长度的数量级:
+-------------------------------------------------+
| Iterations |
+-----------------+---------+---------+---------+---------+---------+
| Sub name | 10**1 | 10**2 | 10**3 | 10**4 | 10**5 |
+-----------------+---------+---------+---------+---------+---------+
| iterate_foreach | 983840 | 141997 | 16333 | 1686 | 168 |
| iterate_for | 1041713 | 146608 | 15370 | 1538 | 155 |
| sorter | 1194656 | 120608 | 10490 | 888 | 82 |
| maxstr | 1505280 | 180923 | 19764 | 2120 | 202 |
| control | 8019246 | 8019246 | 7719377 | 5041132 | 710027 |
+-----------------+---------+---------+---------+---------+---------+
List :: Util的maxstr
在所有情况下都占主导地位。对于第一个订单,一个10个字符的字符串,sorter
可以。在此之后,sorter
变得越来越糟,正如您所期望的那样。 iterate_foreach
和iterate_for
降级得更好。
代码:
use 5.010;
use strict;
use warnings;
use Benchmark;
use List::Util;
my $count = -5;
foreach my $order ( 1 .. 5 ) {
say "-" x 50, "\nTiming for order $order";
my $string = make_string( $order );
timethese( $count, {
'sorter' => sub { my $c = sorter( $string ) },
'maxstr' => sub { my $c = maxstr( $string ) },
'iterate_for' => sub { my $c = iterate_for( $string ) },
'iterate_foreach' => sub { my $c = iterate_foreach( $string ) },
'control' => sub { my $c = control( $string ) },
});
}
sub make_string {
my $order = shift;
my $string;
for( my $i = 0; $i < 10**$order; $i++ ) {
$string .= chr int rand 256;
}
$string;
}
sub sorter {
my $str = shift;
my $char = (sort split //, $str)[-1];
}
sub maxstr {
my $str = shift;
my $char = List::Util::maxstr( split //, $str );
}
sub iterate_for {
my $str = shift;
my $length = length $str;
my $max = '';
for( my $i = 0; $i < $length; $i++ ){
my $chr = substr( $str, $i, 1 );
$max = $chr if $chr gt $max;
}
return $max;
}
sub iterate_foreach {
my $str = shift;
my $max = '';
foreach ( split //, $str ){
$max = $_ if $_ gt $max;
}
return $max;
}
sub control {
my $str = shift;
return 'a';
}
答案 2 :(得分:5)
$str = 'abcb';
@a = sort split(//, $str);
$char = pop(@a);