powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Только не смейтесь. Как сцепить строки? Туплю.
12 сообщений из 12, страница 1 из 1
Только не смейтесь. Как сцепить строки? Туплю.
    #39124871
Barsik72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читаю файл. В нем есть несколько строк, которые мне нужно сцепить в одну:

Object: FCS_HQ
Delay: 245 min
Search directory: /data/processed/hq/


ну и далее описание других объектов

Мне нужно каждый объект записать одной строкой:

FCS_HQ|245 min|/data/processed/hq/|

Блин, торможу, ничего не получается.. Пытаюсь вот так:

my $str1 = "";
my $str2 = "";

# начинаю читать массив
foreach(@msg_arr){

# ищу вхождение строки Object:, записываю значение в переменную
$str1 = substr @msg_arr[0],0,10,;
if ( $str1 eq " Object:") {
$str2 = (substr @msg_arr[0],29).'|';
}

# ищу вхождение строки Delay:, ДОБАВЛЯЮ ее значение в переменную
$str1 = substr @msg_arr[0],0,9;
f ( $str1 eq " Delay:") {
$str2 = $str2.(substr @msg_arr[0],29).'|';
}

# добавляю третью и в хвост дописываю ||| - это сигнал для меня что описание объекта кончилось
$str1 = substr @msg_arr[0],0,20;
if ( $str1 eq " Search directory:") {
$str2 = $str2.(substr @msg_arr[0],29).'|||';
}

# ловлю этот сигнал и пытаюсь напечатать описание объекта одной строкой
if (substr $str2,-3 eq "|||") {
print "$str2\n";
$str2 = ""; # очищаю, чтобы до тех пор, пока не встречу следующий объект ничего не печатать
}

нифига! print "$str2\n"; - печатается несколько строк.

ну т.е.

FCS_HQ|
245 min|
/data/processed/hq/|||

Где я обул лыжи????

PS: я на перле только только начал. Нужно переделать чужие программы, мучаюсь.
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125009
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это конечно адъ, а не код на Perl... ну да ладно.

Возможно, перед конкотенацией нужно отрезать переводы строк chomp()...
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125029
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barsik72Читаю файл.
файл открыть на чтение:
Код: php
1.
open FILE, "file.txt"  or die $!


Barsik72В нем есть несколько строк
построчное чтение:
Код: php
1.
2.
3.
4.
while my $stroka ( < FILE > ) {
    do_something ...

}


Barsik72которые мне нужно сцепить в одну:
чтобы сцепить, для начала надо расщепить; символ-разделитель :
Код: php
1.
my @parts = split ":", $stroka;


Barsik72которые мне нужно сцепить в одну:
символ-соединитель: |
Код: php
1.
my $stroka = join "|", @parts;



теперь всё вместе:
Код: php
1.
2.
3.
4.
5.
6.
open FILE, "file.txt"  or die $!;

while ( my $stroka = < FILE > ) {
   my @parts = split ':', $stroka;
   print join('|', @parts);
}



теперь оптимизация:
если не указать переменную для построчного чтения,
while будет читать в глобальную переменную $_
и её же будет расщеплять split(), если явно не указана другая.
переменная-массив @parts тоже не нужна, сразу подставляем результат split в join()
Код: php
1.
2.
3.
while ( <FILE> ) {
    print join("|", split ":" );
}



из-за одной строчки в теле цикла глупо держать трёхстрочный while,
поэтому заменим while с фигурными скобками на постфиксную однострочную форму без скобок;
да и круглые скобки всюду можно убрать, Pеrl сам разберётся
Код: php
1.
2.
3.
open F, 'file.txt'  or die $!;
print join '|', split ':' while <F>;
close F;
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125038
Barsik72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_A,

Код конечно АДЪ, я в синтаксис еще никак не въеду (до этого писал на С, Яве, да PL/SQL).

Тут какая-то фигня непонятная. Я для эксперименту добавил явно объявленную переменную:


Для первого прохода $str3 = '1';

для второго $str3 = $str3.'2';

для третьего соответственно $str3 = $str3.'3';

Вывод получил такой:


STF_HQ|
1
35 min|
2
/data/processed/nf/|||
3


ну и так далее...


ВООБЩЕ НИЧЕГО НЕ ПОНИМАЮ!!!

Печать происходит вот такой конструкцией (реагирую на ||| - пора печатать)

if (substr $str2,-3 eq "|||") {
print "$str2\n";
print "$str3\n";
$str2 = "";
$str3 = "";
}

ОНО ЧЕГО ПЕРЕМЕШИВАЕТСЯ-ТО ????

Да, забыл указать: на вход процедуры прилетает переменная, в которой одна длинющщая строка.
Эту переменную автор преобразовывает в массив my @msg_arr = split(/\n/, $msg);
Ну и далее foreach(@msg_arr){
Если его печатать print(@msg_arr[0]); как раз и получаются многострочные описания объектов. Строки идут по порядку, сначала имя объекта, потом его свойства.

Может тут собака какая...
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125063
Barsik72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661, спасибо!

Я неправильно сказал, прошу прощения. Я повнимательней порылся в коде, в эту функцию, которую мне нужно поправить, прилетает простая переменная, $msg_arg.

Эту переменную автор преобразовывает в массив my @msg_arr = split(/\n/, $msg);
Ну и далее foreach(@msg_arr){
идет обработка
}

Если его печатать print(@msg_arr[0]); как раз и получаются многострочные описания объектов. Строки идут по порядку, сначала имя объекта, потом его свойства. Мне нужно этот цикл переделать так, чтобы перехватывать названия объектов и их атрибуты, ну и выводить "один объект - одна строка".

В этом случае тоже надо расцеплять-сцеплять?
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125068
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Говорю же попробуй chomp()


Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
# добавляю третью и в хвост дописываю ||| - это сигнал для меня что описание объекта кончилось
$str1 = substr @msg_arr[0],0,20;

chomp($str1);

if ( $str1 eq " Search directory:") {

chomp($str2);


$str2 = $str2.(substr @msg_arr[0],29).'|||';
} 
}
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125113
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sorry, был пьян,
просили же разделённый на три строки об'ект сцепить в одну строку, а я-то ...
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
my @attributes =  ( 'Object', 'Delay', 'Search directory' );
мы %x=();
while ( my $line = <F> ) {
    my ($key, $val) = split ':', $line;
    next if not $key;
    $x{$key} = $val;
    if ( grep ( defined($x{$_}), @attributes) == 3 )
         print join '|', map $x{$_}, @attributes;
         %x = ();
   }
}
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125117
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опечатки ... но я пьян, вы же помните, да?

my @attributes = ( 'Object', 'Delay', 'Search directory' );
my %x=();
while ( my $line = <F> ) {
my ($key, $val) = split ':', $line;
next if not $key;
$x{$key} = $val;
if ( grep ( defined($x{$_}), @attributes) == 3 ) {
print join '|', map $x{$_}, @attributes;
%x = ();
}
}
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125120
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
my @attributes =  ( 'Object', 'Delay', 'Search directory' );
my %x=();
while ( my $line = <F> ) {
    my ($key, $val) = split ':', $line;
    next if not $key;
    $x{$key} = $val;
    if ( grep ( defined($x{$_}), @attributes) == 3 ) {
         print join '|', map $x{$_}, @attributes;
         %x = ();
    }
}
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125559
Barsik72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661,

Ругается... Чего ему надо?

Scalar found where operator expected at /home/usnmp/scripts/sdi/bin/sdi_env.pm line 179, near "':' $str1"
(Missing operator before $str1?)

179 строка это вот: my ($key, $val) = split ':' $str1;

Код такой:

my @msg_arr = split(/\n/, $msg);

my $str1 = "";
my @attributes = ( 'Object', 'Delay', 'Search directory' );
my %x=();

foreach(@msg_arr){
my $tmp = $_;
#print $tmp;

# Print to standart output
$str1 = @msg_arr[0];
my ($key, $val) = split ':' $str1;
next if not $key;
$x{$key} = $val;
if ( grep ( defined($x{$_}), @attributes) == 3 ) {

if ( grep ( defined($x{$_})), @attributes) == 3 ) {
print join '|', map $x{$_}, @attributes;
%x = ();
}
}

прошу обратить внимание: я не читаю файл в этой процедуре, мне приходит строка, которую превращают в массив @msg_arr. И если его нулевые элементы печатать в цикле, получим файл, где объекты распечатаны многострочно.
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125563
Barsik72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, запятую не заметил.

Теперь не ругается, но и ничего не выдает. Наверное, дело в $_
Что нужно указать явно?
...
Рейтинг: 0 / 0
Только не смейтесь. Как сцепить строки? Туплю.
    #39125638
Barsik72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О, начало получаться, всем СПАСИБО!!!!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Только не смейтесь. Как сцепить строки? Туплю.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]