2015-04-28 5 views
-4

я пытаюсь изменить несколько строк в файл с помощью Perl, используя приведенную ниже логику ..Perl разбор вставки новой строки и^М

open FILE1, "< /tmp/sam.dsl" //In read mode 
open FILE2, "> /tmp/sam2.dsl" // Open in write mode 

while(<FILE1>) 
if($_=s/string/found/g) 
push FILE2, $_... 

Я могу изменить содержание, однако, когда я читал файл имеет^M в нем ..

мой файл данных в формате ниже

name 'SAMPLE' 

я хотел бы изменить это

name 'SAMPLE2' 

в настоящее время с моим кодом она меняется

name 'SAMPLE2 
' 

, который создает новую строку, а затем делает замену.

Нужно ли мне использовать любой режим, чтобы открыть файл для записи ..?

+0

В настоящее время мой код вставляет новую строку после чтения, а затем толкает^M – user2189668

+3

Можете ли вы показать больше реального кода? Этот псевдо-код, который вы там написали, не имеет особого смысла. Вы забыли «chomp», вы забыли «~», что вы делаете, когда вы что-то заменили? Вы используете 'strict' и' warnings'? Если не включить это. О, и, может быть, актуально для этого вопроса: на какой операционной системе вы работаете? –

+0

'code' open TEMPLATEFILE, '<: encoding (UTF-8)'," /tmp/TemplateDSL.dsl "или die" Не удалось открыть файл $! "; open JOBFILE, '>: encoding (UTF-8)', "/ tmp/sam.глубинный рассеивающий слой»или умереть "Не удалось открыть файл в режиме записи"; в то время () { если (/ $ templateJobName /) { $ _ = ~ s/$ templateJobName/$ Projectname /; } , если (/ $ templatePathName /) { # $ _ = ~ s/$ templatePathName/$ PathName /; } печати JOBFILE $ _; } Клоса e TEMPLATEFILE; закрыть JOBFILE; – user2189668

ответ

0

Я предполагаю, что вы работаете с файлом linux на некоторых окнах. Perl автоматически преобразует \n в \r\n на совместимые с dos машины после чтения и перед записью. Чтобы избавиться от этого поведения, вы можете использовать binmode <FILE> в ваших дескрипторах файлов, но он устанавливает ваш дескриптор файла в «сырой двоичный режим». Если вы хотите использовать некоторые другие слои (например, :utf8 или :encoding(utf-8)), они не включены, и вы можете настроить их самостоятельно, если вы обрабатываете символьные данные. Вы также можете использовать модуль PerlIO::eol от CPAN.

Рассмотрим глядя на этих страницах документации:

  • PerlIO для общего понимания как работает Perl-IO.
  • open прагма (не функция) для установки слоев для одной программы.
  • binmode функция, которую вы, возможно, захотите рассмотреть.

Мое предложение, но я не могу проверить его (не Windows, вокруг), будет использовать следующее:

open my $outfile, '<:encoding(utf-8)', "filename" or die "error opening: $!"; 
binmode $outfile, join '', grep {$_ ne ':crlf'} PerlIO::get_layers($outfile) 
    or die "error setting output:\n $!" 

while(<$infile>){ 
    s/match/replacement/g; 
    print $outfile $_; 
} 
+0

Спасибо Патрику. Это система linux ... и я создал этот файл в системе. Я пробовал с кодировкой utf-8 .. не повезло с этим .. Мне нужно попробовать с binmode .. – user2189668

+0

вы уверены, что у файла нет '^ M's в первую очередь? вы получаете свой '$ projectname' из, уверены ли вы, что он не содержит каких-либо новых строк? Вы действительно должны отредактировать свой вопрос, возможно, достаточно людей отменит их downvote, а кто-то попытается вам помочь. –

+0

ok .. вот фактический реализация, которую я искал. Мне пришлось прочитать последнюю строку из файла, а затем на основе разделителя (;,: .. и т. д.) мне нужно получить второй и 3-е поля. Затем замените эти поля в другом файле. Вы правы, Патрик, по-видимому, источник, предоставленный другой командой, не является правильным на сервере. Я проверил это с помощью подстановочной подстановки ... однако..и взял другой подход используя сценарий оболочки, используя хвост, чтобы прочитать последнюю строку, а затем проанализировать эту строку и использовать эхо, чтобы подтолкнуть операторы к другому сценарию. У меня теперь есть 2 решения проблемы: Thank U – user2189668

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