На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > Странности с выводом в консоль
      ExpandedWrap disabled
        #много кода
        print $x."\n";
        4000
        print "1234567".$x."\n";
        4000567

      :o
      Хотя по идее должно быть 12345674000, чувствую что что-то не так в переменной $x, так как length($x) = 5, а не 4.
      Уже голову сломал, :wall: мож там какой хитрожопый непечатуемый символ? :-?
        Не понял.
        Переменная икс хватает что-то с консоли?
        Если нет, то ничего и не будет.

        ExpandedWrap disabled
          #!/usr/bin/perl
           
          my $x;
           
          $x=0;
           
          print "$x\n";
          print "1234567$x\n";


        Сей пример кода объясняет как этот код вижу я.
        И не вижу откуда во второй принт падает число 4000.
          Цитата Nadz Goldman @
          Переменная икс хватает что-то с консоли?

          Да, данные с коммутатора по телнету
            Цитата Mr. Gonarh @
            Чувствую что что-то не так в переменной $x, так как length($x) = 5,
            Чувствую, что там символ возврата каретки на первом месте, который после вывода 1234567 возвращает позицию вывода в начало строки и вывод 4000 просто затирает 1234
              угу, щяс сохранил значение переменной в файл, глянул хексом - 0D перед 4000 :angry:
              ЗЫ. Вопрос решён
                Цитата Mr. Gonarh @
                Цитата Nadz Goldman @
                Переменная икс хватает что-то с консоли?

                Да, данные с коммутатора по телнету

                О, а дашь поглядеть?
                  За код не пинать, я перл увидел первый раз в жизни неделю назад :crazy:
                  ExpandedWrap disabled
                    #!/usr/bin/perl
                     
                    use strict;
                    use Net::Ping;
                    use Net::Telnet;
                     
                    my (@commands, $conn);
                     
                    my $main_path = "/home/gonarh/admins/";
                    my $login = "admin";
                     
                    sub read_list {
                            my $fh;
                        my $f_hosts = $main_path.shift(@_);
                        my @result;
                            open($fh, $f_hosts) || die ("Cannot open file ".$f_hosts."\n");
                            flock($fh, 2) || die ("Cannot lock file ".$f_hosts."\n");
                            my $tmp = readline($fh);
                            while ($tmp)
                            {
                                    push(@result, $tmp);
                                    $tmp = readline($fh);
                            }
                            close($fh);
                        return @result;
                    }
                     
                    sub detect_all_macs
                    {
                        my $item;
                        my @hosts = read_list("switches_l2");
                            foreach $item (@hosts) {
                          my ( $host, $type, $switch ) = split / /, $item;
                          if (pingecho($host)) {        
                            echo("Get data from ".$host);  
                            connect_($host);
                            my @data = exec_conn("sh fbd");
                            disconnect();
                            my $index=0;
                            my $text;
                            my @array = split /\n/, $data[0];
                            foreach $text (@array) {
                              if (index($text, "----") > 0 ) {
                            $text = $array[$index];
                            my $len = length($text);
                            until ($len == 1) {
                              $index++;
                              $text = $array[$index];
                              $len = length($text);
                              if ($len > 1) {  
                                $text =~ tr/ /_/s;
                                $text =~ tr/\cM//s;
                                my ( $vlan, $tmp, $mac, $port, $iface ) = split /_/, $text;        
                                if ($iface == "Dynamic") {
                                  if ($port < 25) {
                                echo("mac:".$mac." vlan:".$vlan." port:".$port);    
                                  }
                                }
                              }
                              else { last;}
                            }
                            last;
                              }
                              $index++;
                            }
                              }
                              else { echo("WARNING $host DOWN!"); }
                        }
                    }
                     
                    #****************************************
                    #          Work with telnet     *
                    #****************************************
                    sub connect_
                    {
                        my $l2 = shift(@_);
                        my $passwd="password";
                        $passwd=~ s|\.||g;
                            $conn = new Net::Telnet( Timeout => 5 , Errmode => 'return');
                            $conn->open( Host=>$l2 );
                        $conn -> waitfor( '/ame[: ]*$/' );
                        $conn -> print( $login );
                        $conn -> waitfor( '/ord[: ]*$/' );
                        $conn -> print( $passwd );
                        $conn -> waitfor( '/#[: ]*$/' );
                    }
                     
                    sub conn_exec
                    {
                        my $cmd = shift(@_);
                        $conn -> print( $cmd );
                        my @data = $conn -> waitfor( '/#[: ]*$/' );
                        return @data;
                    }
                     
                    sub disconnect
                    {
                        $conn -> print( "logout" );
                        $conn -> close;
                        undef( $conn );
                    }
                     
                    sub echo
                    {
                            my $text = shift(@_);
                            print $text."\n";
                    }
                    Клева! =)
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0324 ]   [ 15 queries used ]   [ Generated: 2.05.24, 21:16 GMT ]