nixp.ru v3.0

30 мая 2017,
вторник,
16:06:23 MSK

DevOps с компанией «Флант»
Аватар пользователя metal
metal написал 25 января 2008 года в 15:20 (512 просмотра) Ведет себя как мужчина; открыл 31 тему в форуме, оставил 1547 комментариев на сайте.

Есть такой скрипт:

#!/usr/bin/perl
  my $max_users_count = 1000000;
  my $users_count = 500000;
  my $perception = 1000;
  my $min_ok =0;
  my $max_fail = $max_users_count;
  open(CONFIG, "
  my @temp = ;
  close( CONFIG );
  while($max_fail - $min_ok > $perception)
  {
    my  $config_name = "test.xml.$users_count";
    open( NEWCONFIG, "> $config_name" ) ||  die "can\'t open $config_name";
    foreach $line (@temp)
    {
      $line =~ s/count="\d+"/count="$users_count"/;
      print NEWCONFIG $line;
    }
    close( NEWCONFIG );
    $result = system("TestChannelFrontend $config_name >out.text.$users_count 2>&1");
    if( $result ==0)
    {
      print "test is successed for $user_count\n";
      $min_ok = $users_count;
    }
    else
    {
      print "test is failed for $user_count\n";
      $max_fail = $users_count;
    }
    $users_count = int(($max_fail - $min_ok)/2);
  }
  print "max users is", $min_ok;

Perl я толком не знаю, поэтому мне интересны замечания по его оптимизации. Может кто-нибудь указать явно не эффективные(или не правильные) конструкции?

myst

Я бы где-то так переписал.

—-8<—-8<—-8<—-

#!/usr/bin/perl

use warnings;

use strict;

my $max_users_count = 1000000;

my $users_count = 500000;

my $perception = 1000;

my $min_ok =0;

my $max_fail = $max_users_count;

open(CONFIG, «< test.xml») or die «Can\’t open test.xml»;

my $conf = join(«», );

close(CONFIG);

while ($max_fail — $min_ok > $perception) {

my $config_name = «test.xml.$users_count»;

open(NEWCONFIG, «> $config_name» ) or die «Can\’t open $config_name»;

$conf ~= s/count=«\d+»/count=«$users_count»/gm;

print NEWCONFIG $conf;

close(NEWCONFIG);

$result = system(«TestChannelFrontend $config_name >out.text.$users_count 2>&1»);

if ($result == 0) {

print «Test is passed for $user_count users\n»;

$min_ok = $users_count;

}

else {

print «Test is failed for $user_count users\n»;

$max_fail = $users_count;

}

$users_count = int(($max_fail — $min_ok) / 2);

}

print «Max user count is», $min_ok;

metal

Да вот именно этот цикл по строкам мне не нравился, но не нашел лучшего способа, буду изучать как работает join.

myst

Не забывай, что читает строки и не chomp’ает их, т.е. «\n» в конце строк остаётся. Поэтому для join используется пустая «прокладка».

metal

ага, спасибо. Наконец дошли руки до этого скрипта снова:)