Python-эквивалентное форматирование строки со словарем в Perl с хешами - PullRequest
4 голосов
/ 31 октября 2011

Мне нравится, как Python может форматировать строку со словарем:

print "%(key1)s and %(key2)s" % aDictObj

Я хочу добиться того же в Perl с помощью хэшей. Для этого есть какой-нибудь фрагмент или небольшая библиотека?

EDIT:

Спасибо за попытку ответа. Что касается меня, я вышел с коротким фрагментом кода:

sub dict_replace
{
    my ($tempStr, $tempHash) = @_;
    my $key;

    foreach $key (sort keys %$tempHash) {
        my $tmpTmp = $tempHash->{$key};
        $tempStr =~ s/%\($key\)s/$tmpTmp/g;
    }

    return $tempStr;
}

Это просто работает. Это не так полнофункционально, как форматирование строк Python со словарем, но я бы хотел улучшить это.

Ответы [ 3 ]

5 голосов
/ 31 октября 2011

Из документации по питону:

Эффект похож на использование sprintf () в языке C.

Так что это решение с использованием printf или sprintf

my @ordered_list_of_values_to_print = qw(key1 key2);
printf '%s and %s', @ordered_list_of_values_to_print;

Существует также новый модуль, который делает это, используя именованные параметры:

use Text::sprintfn;
my %dict = (key1 => 'foo', key2 => 'bar');
printfn '%(key1)s and %(key2)s', \%dict;
4 голосов
/ 31 октября 2011

Вы могли бы написать это как:

say format_map '{$key1} and {$key2}', \%aDictObj

Если вы определите:

sub format_map($$) {
 my ($s, $h) = @_;
 Text::Template::fill_in_string($s, HASH=>$h);
}

Это прямой эквивалент "{key1} and {key2}".format_map(aDictObj) в Python.

0 голосов
/ 31 октября 2011

Не совсем уверен, что не так с интерполяцией строк здесь.

print "$aDictObj{key1} and $aDictObj{key2}\n";
...