Страница 1 из 1
Perl. Не могу понять работу скрипта
Добавлено: 26 сен 2013, 14:00
pbezpal
Написал скрипт, который парсит файл xml, находит поля с числовыми значениями и увеличивает значение на единицу, записывает в новый файл
Код: Выделить всё
while ($i < $count)
{
if ($str[$i] =~ /$fields_int[$l]/g)
{
$str[$i] =~ /<$fields_int[$l]>(.*?)<\/$fields_int[$l]>/;
my $max = $1 + 1;
$str[$i] =~ s/$1/$max/;
print $fout $str[$i];
$i++;
}
print $fout $str[$i];
$i++;
}
Код отрабатывает нормально, но в строчке
<R100_reliable>1</R100_reliable>
Не увеличивает 1 между тегами, а вот что получается
<R200_reliable>1</R100_reliable>
Не могу понять почему?
Re: Perl. Не могу понять работу скрипта
Добавлено: 26 сен 2013, 14:19
Duncon
.*? значит любой символ 0 и более раз, я бы записал \d+ что означает цифра 1 и более раз. Возможно экранировать нужно что-то внутри выражения, на практике вывод нужно смотреть в данном месте что он выдерает..
Re: Perl. Не могу понять работу скрипта
Добавлено: 26 сен 2013, 14:59
pbezpal
Конкретно в данной строке выдерает 1
Если писать
Код: Выделить всё
$str[$i] =~ /<$fields_int[$l]>(\d+)<\/$fields_int[$l]>/;
результат тот же
Re: Perl. Не могу понять работу скрипта
Добавлено: 26 сен 2013, 15:12
Duncon
Выражение выдерает первую единицу, я не вижу исходной строки, если возможно я бы записал как />(\d+)</
Re: Perl. Не могу понять работу скрипта
Добавлено: 26 сен 2013, 18:28
pbezpal
Так тоже не работает. Причем если
<R100_reliable>0</R100_reliable>
то скрипт пропускает эту строку
Re: Perl. Не могу понять работу скрипта
Добавлено: 27 сен 2013, 18:07
Хыиуду
Я бы просто выдергивал значение регуляркой <.*?>(\d+)<\/.*?>. Ленивый поиск не позволит взять лишнее
Re: Perl. Не могу понять работу скрипта
Добавлено: 30 сен 2013, 10:54
pbezpal
Результат к сожалению тот же
Если поможет вот файл xml
Код: Выделить всё
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--MSG-1 configuration version 1.2-->
<Root>
<IP_config>
<Primary_IP>172.19.5.11</Primary_IP>
<Primary_mask>24</Primary_mask>
<Sup_IP>172.19.5.12</Sup_IP>
<Sup_mask>24</Sup_mask>
<RTP_IP>172.19.5.13</RTP_IP>
<RTP_mask>24</RTP_mask>
<Primary_GW>172.19.5.15</Primary_GW>
<Sup_GW>172.19.5.15</Sup_GW>
<RTP_GW>172.19.5.15</RTP_GW>
</IP_config>
<SIP_config>
<Transport_cfg>
<TranspId>254</TranspId>
<Port>65535</Port>
<Type>1</Type>
<QoS>3</QoS>
</Transport_cfg>
<SIP_route>
<Sip_ID>254</Sip_ID>
<Domain>DomainTest</Domain>
<Transp_ID>254</Transp_ID>
<R100_reliable>1</R100_reliable>
<Enable_Infotek_SS>1</Enable_Infotek_SS>
<MaxCalls>255</MaxCalls>
<SIP_proxy>
<Name_proxy>sip:ProxyTest</Name_proxy>
<Cred>
<Type>0</Type>
<Realm>RealmTest</Realm>
<Scheme>Digest</Scheme>
<User>UserTest</User>
<Data>PasswdTest</Data>
</Cred>
</SIP_proxy>
<RegURI>RegistrarTest</RegURI>
<LocalName>DX500-MSG-1-Test</LocalName>
</SIP_route>
</SIP_config>
<Group_cfg>
<Link_ID>254</Link_ID>
<ISDN_interface_cfg>
<IID>0</IID>
<PriBri>0</PriBri>
<Mode>1</Mode>
<TEI>0</TEI>
<SAPI>0</SAPI>
<T200>255</T200>
<T203>255</T203>
<N200>255</N200>
<N201>260</N201>
<Pd>0</Pd>
<Codec_type>1</Codec_type>
<T301>255</T301>
<T302>255</T302>
<T303>255</T303>
<T304>255</T304>
<T305>255</T305>
<T306>255</T306>
<T307>255</T307>
<T308>255</T308>
<T309>255</T309>
<T310>255</T310>
<T312>255</T312>
<T313>255</T313>
<T314>255</T314>
<T316>255</T316>
<T317>255</T317>
<T318>255</T318>
<T319>255</T319>
<T320>255</T320>
<T321>255</T321>
<T322>255</T322>
</ISDN_interface_cfg>
<Mg_config>
<Amount_of_channels>24</Amount_of_channels>
<Initial_port>65535</Initial_port>
<RTCP_support>0</RTCP_support>
<Qos>3</Qos>
<CNG_support>1</CNG_support>
<LEC_support>1</LEC_support>
<Ob_DTMF_support>1</Ob_DTMF_support>
<Fax_over_codec>255</Fax_over_codec>
</Mg_config>
<Framer_config>
<Sync_prio>1</Sync_prio>
</Framer_config>
</Group_cfg>
<Mgc_config>
<RtpTimeOut>255</RtpTimeOut>
<Codec_priority_PCMU>255</Codec_priority_PCMU>
<Codec_priority_PCMA>255</Codec_priority_PCMA>
<Codec_priority_G729>255</Codec_priority_G729>
<Codec_priority_G726_16>255</Codec_priority_G726_16>
<Codec_priority_G726_24>255</Codec_priority_G726_24>
<Codec_priority_G726_32>255</Codec_priority_G726_32>
<Codec_priority_G726_40>255</Codec_priority_G726_40>
</Mgc_config>
<Route_config>
<Rule>
<RouteId>254</RouteId>
<Kind>1</Kind>
<Rule_type>1</Rule_type>
<Reg_exp>abcdf</Reg_exp>
<Dst_ID>254</Dst_ID>
<Src_ID>254</Src_ID>
<Collect_number>255</Collect_number>
<Cut_before>255</Cut_before>
<Prefix>abcdf</Prefix>
<From_domain>abcdefg</From_domain>
<To_domain>abcdefg</To_domain>
<ProfileId>254</ProfileId>
<TrunkId>255</TrunkId>
<NumberPlan>1</NumberPlan>
<Note>Test from ISDN</Note>
</Rule>
</Route_config>
<Trunk_config>
<Trunk>
<Trunk_Id>254</Trunk_Id>
<IP_Addr>0.0.0.0</IP_Addr>
<Amount_of_channels_trunk>65535</Amount_of_channels_trunk>
<Initial_port_trunk>65535</Initial_port_trunk>
<Term_port_trunk>65535</Term_port_trunk>
<RTP_Timeout>255</RTP_Timeout>
</Trunk>
</Trunk_config>
<Filter_config>
<MAC_filter>
<MAC_node>
<MAC>11:11:11:11:11:11</MAC>
</MAC_node>
</MAC_filter>
<IP_filter>
<IP_node>
<IP>172.19.5.2</IP>
<Protocol>17</Protocol>
<PortFrom>65535</PortFrom>
<PortTo>65535</PortTo>
</IP_node>
</IP_filter>
</Filter_config>
</Root>
Re: Perl. Не могу понять работу скрипта
Добавлено: 30 сен 2013, 15:58
pbezpal
УРА! Заработало)
Код: Выделить всё
while ($i < $count)
{
if ($str[$i] =~ /$ff/g)
{
$str[$i] =~ /<.*?>(\d+)<\/.*?>/;
$max = $1 + 1;
$max = $1 + 7 if($ff eq "Primary_mask" || $ff eq "Sup_mask" || $ff eq "RTP_mask" || $ff eq "Amount_of_channels");
$str[$i] =~ s/(<.*?>)(\d+)(<\/.*?>)/$1$max$3/;
print $test "$str[$i]\n";
print $fout $str[$i];
$i++;
}
print $fout $str[$i];
$i++;
}
Спасибо большое!)
Re: Perl. Не могу понять работу скрипта
Добавлено: 24 мар 2014, 17:09
Ванеса
от меня тоже спасибо...