1
$tasks->{t1}{cmdline} = "convert -f %FONT% %1%";
$tasks->{t1}{report} = "Launched as %CMD% by %USER%";
$tid = 't1';
foreach my $parm (keys %{$tasks->{$tid}}) {
    $tasks->{$tid}{$parm}=~s/%FONT%/$tasks->{$tid}{font}/g; # may evaluate if $parm == 'cmdline';
    $tasks->{$tid}{$parm}=~s/%CMD%/$tasks->{$tid}{cmdline}/g;
}

foreachの外部に別のループが必要であり(コピーされたすべての値が確実に置き換えられるようにするため)、テキストデータが多すぎるため、コードは不適切です。現在、書き直す最良の方法は次のようになります。

foreach my $parm (keys %{$tasks->{$tid}}) {
 &lookupValues(\$tasks->{$tid}{&parm}); # or ($parm) if strict refs?
}

ただし、優先度を検出するためにキーを並べ替える必要があります(%FONT%の前に%CMD%が置き換えられた場合、$ tasks-> {$ tid} {report}は間違っています)。

foreach my $parm ( &SORTME($tasks->{$tid}) ) {&lookupValuesFor($tid,$parm); }

指定された変数の数とそれらの関係に応じてソートするための最良の方法は何ですか?ネイティブのもの(多くのループとハッシュ)、またはexpat [関連する質問はどういうわけか私をexpatに向けています、それも調査します:ネストされたパターンの文字列の解析]または他のパーサー?

$ object-> value('cmdline')のOOPメソッドは現在好まれていません。

4

1 に答える 1

2

このコードは「機能します」-そして私にはきれいに見えます。それがあなたが求めていることをするかどうかはもっと議論の余地があります。

use strict;
use warnings;

my $tasks;

# Demonstration setup
$tasks->{t1}{cmdline} = "convert -f %FONT% %1%";
$tasks->{t1}{report}  = "Launched as %CMD% by %USER%";
$tasks->{t1}{maps} = {
    '%USER%'    => 'user-expansion',
    '%1%'       => 'one-expansion',
    '%FONT%'    => 'font-expansion',
    '%CMD%'     => 'cmd-expansion',
};

# Do the substitutions
foreach my $tid (keys %$tasks)
{
    my $task = $tasks->{$tid};
    my $maps = $task->{maps};
    foreach my $map (keys %$maps)
    {
        foreach my $key (keys %{$task})
        {
            next if ref $task->{$key};
            $task->{$key} =~ s/$map/$maps->{$map}/g;
        }
    }
}

# Demonstration printing
foreach my $tid (keys %$tasks)
{
    my $task = $tasks->{$tid};
    foreach my $key (keys %{$task})
    {
        next if ref $task->{$key};
        printf "%s: %-8s = %s\n", $tid, "$key:", $task->{$key};
    }
}

MacOS X(10.6.4)でPerl5.13.4を使用した場合の出力は次のとおりです。

t1: report:  = Launched as cmd-expansion by user-expansion
t1: cmdline: = convert -f font-expansion one-expansion

トリプルループは避けられないほどです。各タスクの各文字列に各マッピングを適用する必要があります。一般に、各タスクは独自のマッピングを持つことができます。

于 2010-09-26T20:17:37.947 に答える