Perl 第二次执行else块时的条件
您好,我正在根据样式在标记中生成编号 例如Perl 第二次执行else块时的条件,perl,Perl,您好,我正在根据样式在标记中生成编号 例如 使用Microsoft Windows辅助功能 放大显示器 更改文本和图标的大小 转换显示的文本 改变对比度 文本和图标 Microsoft辅助功能 上面的例子是我的输入。我想根据样式(bull、simple、num)生成数字,在第一次出现时(任何类型),我必须在标记内生成一(1),然后为第二个样式生成2,依此类推 我想在下面的格式输出 <list-bull> <P_list-bull(1)>Use Microsoft
使用Microsoft Windows辅助功能
放大显示器
更改文本和图标的大小
转换显示的文本
改变对比度
文本和图标
Microsoft辅助功能
上面的例子是我的输入。我想根据样式(bull、simple、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>
使用Microsoft Windows辅助功能
放大显示器
更改文本和图标的大小
转换显示的文本
改变对比度
文本和图标
Microsoft辅助功能
我尝试下面的代码,但我不知道在哪里修复该条件
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";
}
}
while($str=~/不知道为什么不使用一些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
包含您的全部输入为什么不使用适当的XML解析器?…并让它生成有效的XML…有没有可能在没有XML解析器的情况下生成数字?有没有理由不能使用数字?您试图解决的实际问题是什么?您正在创建无效的XML,这看起来很糟糕设计。
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;
}