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

      Вопрос в следующем.
      Есть строка вида:

      | 2| 458/2 | 07.06.2010 |900 | 5.087 | 565 | 2 | 565 |ААКА454АА|454564564 |абракадабра |ВЫАВАЫВАВВЫ | |


      Как видно, каждый столбец разделен символом |. Необходимо данные из каждого столбца каким-то образом вытащить и запись в каждый элемент массива.
      Как такое можно сделать?

      Заранее спасибо.
      Сообщение отредактировано: requiroverus -
        http://perldoc.perl.org/functions/split.html
        Сообщение отредактировано: sweetemmure -
          Эмм...
          Примерно вот так:

          ExpandedWrap disabled
            open( myFile , 'MyMegaFile' );
            while( <myFile> )
            {
             chomp;
             ( $field_1 , $field_2 , $field_3 , $field_4 , $field_5 , $field_N  ) = split( /|/ );
            }
            Прежде чем написать на форум, я пробовал использовать split.
            split(/|/) не правильно делит строку.
            Он делит каждый символ, т.е. это выглядит примерно так.

            Есть строка
            | 2| 458/2 | 07.06.2010 |900 | 5.087 | 565 | 2 | 565 |ААКА454АА|454564564 |абракадабра |ВЫАВАЫВАВВЫ | |
            Он ее поделит как
            |

            2
            |

            и так далее, в том числе проблемы.
              split(/\|/)
                Да, простите.
                Как-то совсем забыл экран поставить.

                Добавлено
                Хотя с другой стороны, написал же:
                Цитата
                Примерно вот так
                  Ребят, спасибо вам большое.
                  Еще один вопрос есть, к примеру есть строка

                  "string"
                  Как из данной строки удалить символы " (кавычки)
                    ExpandedWrap disabled
                      $string=~s/["']//g;

                    или
                    ExpandedWrap disabled
                      $string=~s/^\s*"\s*//;
                      $string=~s/\s*"\s*$//;
                    Сообщение отредактировано: Vspeaker -
                      2Vspeaker, в цикле применяю данный код к каждому элементу массива.
                      На выходе получаю мусор.

                      К примеру.

                      ExpandedWrap disabled
                        foreach $arg(@ar)
                        {
                          $arg = ~s/["']//g;
                        }


                      заведомо знаем, что например @ar[0] = "0.466"
                      на выходе получаем @ar[0] = 18446744073709551615

                      Так для каждого элемента массива. Чему бы не было равно первоначальное значение элемента, после применения регулярного выражения всегда будет 18446744073709551615


                      В чем может быть проблема.
                        Цитата requiroverus @
                        $arg = ~s
                        а зачем тут пробел между "=" и "~"? ;)
                        это же совершенно разные операторы получаются :)
                          И еще такой вопрос.

                          ExpandedWrap disabled
                            foreach $arg(@ar)
                            {
                               print OUTPUT "43002708\t01.03.2010\tF402\t$number1\t$number3\t$arg\t\$empty\$\n" if $number2 >= "2";
                            }


                          Последняя строка которая будет выводится в цикле, будет такой(к примеру):

                          43002708 01.03.2010 ...........
                          $empty$

                          Так как предыдущие выводятся в одну строку, т.е.

                          43002708 01.03.2010 ........... $empty$

                          В чем может быть проблема?
                          Если смотреть в mc на все это дело, то видно что в последней строке в ее конце "43002708 01.03.2010 ..........." стоит знак "^"
                            Ниче не понял.
                            В чем вопрос?
                              2Nadz Goldman, в цикле формируются строки и выводятся на экран

                              foreach $arg(@ar)
                              {
                              print "one\ttwo\t$arg\n";
                              }

                              Предположим что @ar состоит из двух элементов.
                              @ar[0] = "1"
                              @ar[1] = "2"

                              Первая строка будет такого вида

                              one two 1

                              Вторая строка будет вида
                              one two
                              2

                              После two откуда-то берется перенос строки, понять не могу откуда.
                              Если смотреть на это в линуксовом MC, видно символ ^, который и означает перенос строки.

                              Избавление от этого есть какое-нибудь?
                                Извините, но вот только что запустил сей скрипт:

                                ExpandedWrap disabled
                                  #!/usr/bin/perl
                                   
                                   
                                  @ar[0] = "1";
                                  @ar[1] = "2";
                                  @ar[2] = "3";
                                  @ar[3] = "4";
                                   
                                   
                                  foreach $arg(@ar)
                                  {
                                  print "one\ttwo\t$arg\n";
                                  }


                                Вот вывод в консоль:

                                ExpandedWrap disabled
                                  one     two     1
                                  one     two     2
                                  one     two     3
                                  one     two     4


                                Добавлено
                                Цитата requiroverus @
                                Если смотреть на это в линуксовом MC, видно символ ^, который и означает перенос строки.

                                Этот символ не означает перенос строки.
                                Просто разность конца строки (UNIX/DOS)
                                  Ну тот, код который я привел, он самом деле выводит в консоль все так, как нужно.

                                  Но в моем скрипте, в массиве хранятся строки, которые был вытащены из файла. Может в строках есть какие-то символы, по вине которых происходит перенос строки. Если это так, может можно как-то все экранировать?
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,1008 ]   [ 15 queries used ]   [ Generated: 15.05.24, 02:08 GMT ]