кондиционирование, когда блок else выполняется во второй раз - PullRequest
0 голосов
/ 13 января 2012

Привет, я генерирую числа внутри тегов на основе стиля

Например

 <list-bull>
 <P_list-bull>Use Microsoft Windows accessibility  </P_list-bull>
 <P_list-bull>   Magnify the display </P_list-bull>
 <P_list-simple>   Change the size of text and icons </P_list-simple>
 <P_list-simple>   Convert the text displayed  </P_list-simple>
 <P_list-num>   Change the contrast </P_list-num>
 <P_list-simple>text and icons </P_list-simple>
 <P_list-bull>Microsoft accessibility </P_list-bull>
 </list-bull>

В приведенном выше примере мой ввод.Я хочу сгенерировать числа на основе стиля (бык, простой, num), в первом случае (любой тип) я должен сгенерировать один (1) внутри тега, затем 2 для второго стиля и так далее ....

Я хочу вывод в следующем формате

 <list-bull>
 <P_list-bull(1)>Use Microsoft Windows accessibility  </P_list-bull(1)>
 <P_list-bull(1)>   Magnify the display </P_list-bull(1)>
 <P_list-simple(2)>   Change the size of text and icons </P_list-simple(2)>
 <P_list-simple(2)>   Convert the text displayed  </P_list-simple(2)>
 <P_list-num(3)>   Change the contrast </P_list-num(3)>
 <P_list-simple(2)>text and icons </P_list-simple(2)>
 <P_list-bull(1)>Microsoft accessibility </P_list-bull(1)>
 </list-bull>

Я пробую этот код ниже, но я не знаю, где исправить условие

 while($str =~ /<list-(bull|num|alpha|roman|simple)(?:(?:(?!<\/list-\1>).)*)<\/list-\1>/sgi){
$str =~ s#<list-(bull|num|alpha|roman|simple)(?:(?:(?!<\/list-\1>).)*)<\/list-\1>#&List_find($&,$1)#sgei;
  }
 sub List_find
 {
 my ($line,$type) = @_;
 my $currentlevel = 0;
 my $line1;
 while($line =~ s/<P_list-(bull|num|alpha|roman|simple)(?:(?:(?!<\/P_list-\1>).)*)    <\/P_list-\1>/&Listnum($&)/sgie){}



sub Listnum
{
my $line2 = @_[0];

my ($style,$cont);
if($line2 =~ /<P_list-(.*?)>(.*?)<\/P_list-\1>/sgi)
{
$style = $1;
$cont = $2;
my $id =1;
if($type eq $style){
$line2 = "<P_list-$style($id)>$cont</P_list-$style($id)>";

}
else{

    $line2 =~ /<P_list-(.*?)>(.*?)<\/P_list-\1>/s;
    my $temp = $1;

    if($style eq $temp)
        {

    $id++;
    $line2 = "<P_list-$style($id)>$cont</P_list-$style($id)>";
        }
    else
        {
    $id = $id+2;        

    $line2 = "<P_list-$style($id)>$cont</P_list-$style($id)>";          
        }
    }
    return "$line2";
}
}   

Я сравниваю первыйтег элемента списка с первым типом списка (бык), если он правильный, он сгенерирует один, иначе два, в другой части я хочу проверить второй и третий тип

плз дать некоторые предложения

1 Ответ

1 голос
/ 17 января 2012

Не знаю, почему бы не использовать какой-нибудь xml-анализатор, но в любом случае ..

получить все стили в качестве ключей хеша, что-то вроде этого:

my %styles=();
my $i=1;
while($text=~/P_list-([a-zA-Z]+)/gsm) {
    $styles{$1}=$i++ if !$styles{$1};
}

, а затем просто подставить их все

foreach my $k (keys %styles) {
    my $what_you_have="P_list-$k";
    my $what_you_want="P_list-$k($styles{$k})";
    $text=~s/$what_you_have/$what_you_want/gsm;
}

при условии, что $text содержит весь ваш ввод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...