Вот решение, которое позволяет избежать изменения входной строки, создания новой строки той же длины, что и входная строка, или создания промежуточного массива в памяти.
Решение здесь превращает split
в циклнад оператором сопоставления.
#! /usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $a="KEY1|Value1|kEy2|Value2|KeY3|Value3";
sub normalize_alist_opt {
my ($input) = @_;
my %c;
my $last_key;
while ($input =~ m/([^|]*(\||\z)?)/g) {
my $s = $1;
next unless $s ne '';
$s =~ s/\|\z//g;
if (defined $last_key) {
$c{ lc($last_key) } = $s;
$last_key = undef;
} else {
$last_key = $s;
}
}
return \%c;
}
print Dumper(normalize_alist_opt($a));
Потенциальное решение, которое работает непосредственно над split
.Perl может распознавать и оптимизировать особый случай.Хотя на основании обсуждений здесь и здесь , я не уверен.
sub normalize_alist {
my ($input) = @_;
my %c;
my $last_key;
foreach my $s (split /\|/, $input) {
if (defined $last_key) {
$c{ lc($last_key) } = $s;
$last_key = undef;
} else {
$last_key = $s;
}
}
return \%c;
}