Помогите разобраться со скриптом

 
0
 
Perl
ava
NZero | 25.09.2013, 17:22
Есть файл
compiler_test.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>16</Primary_mask>
    <Sup_IP>172.19.5.12</Sup_IP>
    <Sup_mask>16</Sup_mask>
    <RTP_IP>172.19.5.13</RTP_IP>
    <RTP_mask>16</RTP_mask>
    <Primary_GW>172.19.5.1</Primary_GW>
    <Sup_GW>172.19.5.1</Sup_GW>
    <RTP_GW>172.19.5.1</RTP_GW>
  </IP_config>
  <SIP_config>
    <Transport_cfg>
      <TranspId>0</TranspId>
      <Port>5060</Port>
      <Type>0</Type>
      <QoS>0</QoS>
    </Transport_cfg>
    <SIP_route>
      <Sip_ID>0</Sip_ID>
      <Domain>DomainTest</Domain>
      <Transp_ID>0</Transp_ID>
      <R100_reliable>1</R100_reliable>
      <Enable_Infotek_SS>0</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>0</Link_ID>
    <ISDN_interface_cfg>
      <IID>0</IID>
      <PriBri>0</PriBri>
      <Mode>0</Mode>
      <TEI>0</TEI>
      <SAPI>0</SAPI>
      <T200>1</T200>
      <T203>5</T203>
      <N200>2</N200>
      <N201>260</N201>
      <Pd>0</Pd>
      <Codec_type>0</Codec_type>
      <T301>1</T301>
      <T302>1</T302>
      <T303>1</T303>
      <T304>1</T304>
      <T305>1</T305>
      <T306>1</T306>
      <T307>1</T307>
      <T308>1</T308>
      <T309>1</T309>
      <T310>1</T310>
      <T312>1</T312>
      <T313>1</T313>
      <T314>1</T314>
      <T316>1</T316>
      <T317>1</T317>
      <T318>1</T318>
      <T319>1</T319>
      <T320>1</T320>
      <T321>1</T321>
      <T322>1</T322>
    </ISDN_interface_cfg>
    <Mg_config>
      <Amount_of_channels>30</Amount_of_channels>
      <Initial_port>4000</Initial_port>
      <RTCP_support>0</RTCP_support>
      <Qos>0</Qos>
      <CNG_support>1</CNG_support>
      <LEC_support>1</LEC_support>
      <Ob_DTMF_support>1</Ob_DTMF_support>
      <Fax_over_codec>1</Fax_over_codec>
    </Mg_config>
    <Framer_config>
      <Sync_prio>1</Sync_prio>
    </Framer_config>
  </Group_cfg>
  <Mgc_config>
    <RtpTimeOut>90</RtpTimeOut>
    <Codec_priority_PCMU>0</Codec_priority_PCMU>
    <Codec_priority_PCMA>90</Codec_priority_PCMA>
    <Codec_priority_G729>100</Codec_priority_G729>
    <Codec_priority_G726_16>0</Codec_priority_G726_16>
    <Codec_priority_G726_24>0</Codec_priority_G726_24>
    <Codec_priority_G726_32>0</Codec_priority_G726_32>
    <Codec_priority_G726_40>0</Codec_priority_G726_40>
  </Mgc_config>
  <Route_config>
    <Rule>
      <RouteId>0</RouteId>
      <Kind>0</Kind>
      <Rule_type>1</Rule_type>
      <Reg_exp>abcdf</Reg_exp>
      <Dst_ID>0</Dst_ID>
      <Src_ID>0</Src_ID>
      <Collect_number>5</Collect_number>
      <Cut_before>0</Cut_before>
      <Prefix>abcdf</Prefix>
      <From_domain>abcdefg</From_domain>
      <To_domain>abcdefg</To_domain>
      <ProfileId>0</ProfileId>
      <TrunkId>255</TrunkId>
      <NumberPlan>1</NumberPlan>
      <Note>Test from ISDN</Note>
    </Rule>
  </Route_config>
  <Trunk_config>
    <Trunk>
      <Trunk_Id>0</Trunk_Id>
      <IP_Addr>0.0.0.0</IP_Addr>
      <Amount_of_channels_trunk>30</Amount_of_channels_trunk>
      <Initial_port_trunk>4000</Initial_port_trunk>
      <Term_port_trunk>4059</Term_port_trunk>
      <RTP_Timeout>60</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>1</Protocol>
        <PortFrom>0</PortFrom>
        <PortTo>0</PortTo>
      </IP_node>
    </IP_filter>
  </Filter_config>
</Root>


Написал код, который выцепляет поля с числовыми значениями и подставляет в них поочереди новые значения, но в некоторых полях заполняются значения неправильно, например в поле
<T200>1</T200>
должно быть
<T200>256</T200>
а получается
<T25600>1</T256>
Не пойму почему, как так происходит замена? Пока не могу найти ошибку? Спасибо!


#Открываем файл compiler_test.xml в переменную fh_in
open($temp,"../compiler_test.xml") || die("Error open compiler_test.xml\n");
my @tmp = <$temp>;
my $l_tmp = @tmp;

for($n=0; $n<$l_tmp; $n++)
{
    $tmp[$n] =~ /[A-Za-z0-9]>(.*)?<\/[A-Za-z0-9]/;
    if($1 && $1 !~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ && $1 !~ /^\d{1,2}\:\d{1,2}\:\d{1,2}\:\d{1,2}\:\d{1,2}\:\d{1,2}$/ && $1 !~ /[A-Za-z]/)
    {
    $tmp[$n] =~ /<(.*)?>[0-9]/i;
    push @fields_int, $1;
    }
    elsif($1 && $1 eq 0)
    {
    $tmp[$n] =~ /<(.*)?>[0-9]/i;
    push @fields_int, $1;
    }
}

close $temp;

my $len_t = @fields_int;

for($l = 0; $l < $len_t; $l++)
{
    my $binfile = "test.bin";
    #Проверяем есть ли бинарный файл
    if ( -e "$binfile" )
    { system("rm -f $binfile"); }

    #Открываем файл compiler_test.xml в переменную fh_in
    open($fin,"../compiler_test.xml") || die("Error open compiler_test.xml\n");
    
    my $xfile = "$fields_int[$l].xml";
    
    if ( -e $xfile )
    {
    system("rm -f $xfile");
    #Открываем файл no_primary_mask.xml на запись
    open($fout,"> $xfile");
    }
    else
    {
    open($fout,"> $xfile");
    }

    if ($fields_int[$l] eq "Primary_mask" || $fields_int[$l] eq "Sup_mask" || $fields_int[$l] eq "RTP_mask" || $fields_int[$l] eq "Amount_of_channels")
    {
    $max = 31;
    }
    elsif($fields_int[$l] eq "TranspID" || $fields_int[$l] eq "Sip_ID" || $fields_int[$l] eq "Transp_ID" || $fields_int[$l] eq "Link_ID" || $fields_int[$l] eq "Trunk_ID" || $fields_int[$l] eq "RouteID" || $fields_int[$l] eq "Dst_ID" || $fields_int[$l] eq "Src_ID" || $fields_int[$l] eq "ProfileID")
    {
    $max = 255;
    }
    elsif($fields_int[$l] eq "QoS" || $fields_int[$l] eq "Qos")
    {
    $max = 4;
    }
    elsif($fields_int[$l] eq "R100_reliable" || $fields_int[$l] eq "Enable_Infotek_SS" || $fields_int[$l] eq "IID" || $fields_int[$l] eq "PriBri" || $fields_int[$l] eq "Mode" || $fields_int[$l] eq "TEI" || $fields_int[$l] eq "SAPI" || $fields_int[$l] eq "Pd" || $fields_int[$l] eq "Codec_type" || $fields_int[$l] eq "Sync_prio" || $fields_int[$l] eq "RTCP_support" || $fields_int[$l] eq "CNG_support" || $fields_int[$l] eq "LEC_support" || $fields_int[$l] eq "Ob_DTMF__support" || $fields_int[$l] eq "Kind" || $fields_int[$l] eq "Rule_type" || $fields_int[$l] eq "NumberPlan" || $fields_int[$l] eq "Type")
    {
    $max = 2;
    }
    elsif($fields_int[$l] eq "MaxCalls" || $fields_int[$l] eq "T200" || $fields_int[$l] eq "T203" || $fields_int[$l] eq "N200" || $fields_int[$l] eq "T301" || $fields_int[$l] eq "T302" || $fields_int[$l] eq "T303" || $fields_int[$l] eq "T304" || $fields_int[$l] eq "T305" || $fields_int[$l] eq "T306" || $fields_int[$l] eq "T307" || $fields_int[$l] eq "T308" || $fields_int[$l] eq "T309" || $fields_int[$l] eq "T310" || $fields_int[$l] eq "T312" || $fields_int[$l] eq "T313" || $fields_int[$l] eq "T314" || $fields_int[$l] eq "T316" || $fields_int[$l] eq "T317" || $fields_int[$l] eq "T318" || $fields_int[$l] eq "T319" || $fields_int[$l] eq "T320" || $fields_int[$l] eq "T321" || $fields_int[$l] eq "T322" || $fields_int[$l] eq "Fax_over_codec" || $fields_int[$l] eq "RtpTimeOut" || $fields_int[$l] eq "Codec_priority_PCMU" || $fields_int[$l] eq "Codec_priority_PCMA" || $fields_int[$l] eq "Codec_priority_G729" || $fields_int[$l] eq "Codec_priority_G726_16" || $fields_int[$l] eq "Codec_priority_G726_24" || $fields_int[$l] eq "Codec_priority_G726_32" || $fields_int[$l] eq "Codec_priority_G726_40" || $fields_int[$l] eq "RTP_Timeout" || $fields_int[$l] eq "Collect_number" || $fields_int[$l] eq "Cut_before" || $fields_int[$l] eq "TrunkID")
    {
    $max = 256;
    }
    elsif($fields_int[$l] eq "N201")
    {
    $max = 261;
    }
    elsif($fields_int[$l] eq "Protocol")
    {
    $max = 18;
    }
    else
    {
    $max = 65536;
    }

    #Записываем строки файла в масив
    my @str = <$fin>;

    #Подсчитываем количество строк в файле
    my $count = @str;

    my $i = 0;

    while ($i < $count)
    {
    if ($str[$i] =~ /$fields_int[$l]/g)
    {
        $str[$i] =~ /<$fields_int[$l]>(.*)?<\/$fields_int[$l]>/;
        my $in = $1;
        $str[$i] =~ s/$in/$max/;
        print $fout $str[$i];
        $i++;
    }
    print $fout $str[$i];
    $i++;
    }

    #Закрываем файлы
    close($fin);
    close($fout);

    system("../cfgcomp.elf tobinary test.bin $xfile");

    system("rm -f $xfile");

    if ( -e $binfile)
    {
    system("echo $fields_int[$l]': FAIL' >> $r");
    }
    else
    {
    system("echo  $fields_int[$l]': success' >> $r");
    }
}
Comments (2)
ava
NZero | 26.09.2013, 12:01 #
С этим разобрались. нужно было писать так


$str[$i] =~ /<$fields_int[$l]>(.*?)<\/$fields_int[$l]>/;


Теперь осталось понять, почему вместо
<R100_reliable>2</R100_reliable>
получается
<R200_reliable>1</R100_reliable>
ava
NZero | 30.09.2013, 15:03 #
Не без помощи добрых программистов получилось победить эту проблему. В итоге вот, что получилось


open($temp,"../compiler_test.xml") || die("Error open compiler_test.xml\n");

my @tmp = <$temp>;
my $l_tmp = @tmp;

for($n=0; $n<$l_tmp; $n++)
{
    $tmp[$n] =~ /<.*?>(\d+)<\/.*?>/;
    my $num = $1;
    if($num && $num !~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ && $num !~ /^\d{1,2}\:\d{1,2}\:\d{1,2}\:\d{1,2}\:\d{1,2}\:\d{1,2}$/ && $num !~ /[A-Za-z]/)
    {
    push @fields_int, $tmp[$n];
    }
    elsif($num && $num eq 0)
    {
    push @fields_int, $tmp[$n];
    }
}

close $temp;

my $len_t = @fields_int;


for($l = 0; $l < $len_t; $l++)
{
    my $binfile = "test.bin";
    #Проверяем есть ли бинарный файл
    if ( -e "$binfile" )
    { system("rm -f $binfile"); }

    
    #Открываем файл compiler_test.xml в переменную fh_in
    open($fin,"../compiler_test.xml") || die("Error open compiler_test.xml\n");

    $fields_int[$l] =~ /<(.*?)>[0-9]/;
    my $ff = $1;

    my $xfile = "$ff.xml";
    
    if ( -e $xfile )
    {
    system("rm -f $xfile");
    #Открываем файл xml на запись
    open($fout,"> $xfile");
    }
    else
    {
    open($fout,"> $xfile");
    }

    #Записываем строки файла в масив
    my @str = <$fin>;

    #Подсчитываем количество строк в файле
    my $count = @str;

    my $i = 0;

    while ($i < $count)
    {
    $ff = "<Port>" if($ff eq "Port");
    $ff = "<Amount_of_channels>" if($ff eq "Amount_of_channels");
    $ff = "<Initial_port>" if($ff eq "Initial_port");
    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 $fout $str[$i];
        $i++;
    }
    print $fout $str[$i];
    $i++;
    
    }

    #Закрываем файлы
    close($fin);
    close($fout);

    system("../cfgcomp.elf tobinary test.bin $xfile");

    
    system("rm -f $xfile");

    
    $ff = "Port" if($ff eq "<Port>");
    $ff = "Amount_of_channels" if($ff eq "<Amount_of_channels>");
    $ff = "Initial_port" if($ff eq "<Initial_port>");
    if ( -e $binfile)
    {
    system("echo $ff': FAIL' >> $r");
    }
    else
    {
    system("echo  $ff': success' >> $r");
    }
}
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  NZero
advanced
Submit