Perl. Не могу понять работу скрипта

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

Ответить
pbezpal
Сообщения: 5
Зарегистрирован: 26 сен 2013, 13:50

26 сен 2013, 14:00

Написал скрипт, который парсит файл 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>
Не могу понять почему?
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

26 сен 2013, 14:19

.*? значит любой символ 0 и более раз, я бы записал \d+ что означает цифра 1 и более раз. Возможно экранировать нужно что-то внутри выражения, на практике вывод нужно смотреть в данном месте что он выдерает..
[syntax=Delphi] [/syntax]
pbezpal
Сообщения: 5
Зарегистрирован: 26 сен 2013, 13:50

26 сен 2013, 14:59

Конкретно в данной строке выдерает 1
Если писать

Код: Выделить всё

$str[$i] =~ /<$fields_int[$l]>(\d+)<\/$fields_int[$l]>/;
результат тот же
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

26 сен 2013, 15:12

Выражение выдерает первую единицу, я не вижу исходной строки, если возможно я бы записал как />(\d+)</
[syntax=Delphi] [/syntax]
pbezpal
Сообщения: 5
Зарегистрирован: 26 сен 2013, 13:50

26 сен 2013, 18:28

Так тоже не работает. Причем если
<R100_reliable>0</R100_reliable>
то скрипт пропускает эту строку
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

27 сен 2013, 18:07

Я бы просто выдергивал значение регуляркой <.*?>(\d+)<\/.*?>. Ленивый поиск не позволит взять лишнее
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
pbezpal
Сообщения: 5
Зарегистрирован: 26 сен 2013, 13:50

30 сен 2013, 10:54

Результат к сожалению тот же

Если поможет вот файл 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>
pbezpal
Сообщения: 5
Зарегистрирован: 26 сен 2013, 13:50

30 сен 2013, 15:58

УРА! Заработало)

Код: Выделить всё

    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++;
	
    }
Спасибо большое!)
Ванеса
Сообщения: 7
Зарегистрирован: 26 фев 2014, 22:37

24 мар 2014, 17:09

от меня тоже спасибо...
Ответить