2013-05-10 2 views
0

Я пытаюсь написать скрипт на Perl, который преобразует входной сигналКак объединить 2 строки в PERL скрипт

(name 
    (type .... 
) 
) 

в выходной

(name (type ...)) 

Т.е. все эти строки, соответствующие (), объединены в одну строку, и я хочу обновить исходный файл.

Заранее спасибо

+1

Это 4 линии. похоже, что вы просто хотите преобразовать новые строки в пробелы. – jordanm

+0

Возможно, вы захотите посмотреть на основной модуль [Text :: Balanced] (http://perldoc.perl.org/Text/Balanced.html), хотя он может быть слишком переполнен для вашей текущей проблемы. –

+0

Я считаю, что мой ответ должен помочь вам. –

ответ

0

ли ((..)) гарантировано синтаксис? Если это так, я хотел бы предложить, сливая все это в одну линию, а затем разделив на основе) (с.

my $line = ""; 
while(<DATA>) 
{ 
$_ =~ s= +$==g; # remove end spaces. 
$line .= $_; 
} 
$line =~ s=\n==g; 
my @lines = split /\)\(/,$line; 
my $resulttext = join ")\n(", @lines; 
print $resulttext; 



__END__ 

(name 
(type ....  
) 
) 
(name2 
    (type2 .... 
) 
)  
(name3 
(type3 .... 
) 
) 
1
use strict; 
use warnings; 

my $file="t.txt"; #or shift (ARGV); for command line input 
my $new_format=undef; 

open READ, $file; 
local $/=undef; #says to read to end of file 

$new_format=<READ>; 
$new_format=~ s/\n//g; #replaces all newline characters with nothing, aka removes all \n 

close(READ); 

open WRITE, ">$file"; #open for writing (overwrites) 
print WRITE $new_format; 
close WRITE; 

Это работает, если предположить, что весь файл является одним большим выражением. Для справки, чтобы удалить все пустое пространство, используйте $new_format=~ s/\s//g; вместо $new_format=~ s/\n//g;. Его можно легко модифицировать для учета нескольких выражений. Все, что нужно было бы сделать, переопределить $/, чтобы быть тем, что вы используете для разделения выражений (например, если просто пустая строка: local $/ = /^\s+$/;) и бросать все в цикл while. Для каждой итерации нажмите строку в массив и после того, как файл будет полностью обработан, напишите содержимое массива на файл в том формате, который вам нужен.

0

Вот еще один вариант:

use strict; 
use warnings; 

while (<>) { 
    chomp unless /^\)/; 
    print; 
} 

Использование: perl script.pl inFile [>outFile]

Образец данных:

(name 
    (type .... 
) 
) 
(name_a 
    (type_a .... 
) 
) 
(name_b 
    (type_b .... 
) 
) 

Выход:

(name (type .... ) ) 
(name_a (type_a .... ) ) 
(name_b (type_b .... ) ) 

Скрипт удаляет входной ЗАП ord separator, если только строка не содержит последний закрывающий правый пар (совпадающий с первым символом на линии).

Надеюсь, это поможет!

Смежные вопросы