2013-07-11 6 views
1

Этот скрипт Perl имеет , работающий на Win7, изменяя спецификацию конфигурации Clearcase, которая будет , прочитанная на машине Linux. Clearcase очень суетливый по поводу окончаний строки, они должны быть точно и только \ n (0x0A), однако, как бы то ни было, я не могу заставить Perl выплевывать только \ n окончаниях, они обычно выходят \ r \ n (0x0D 0x0A)Использование Perl Win7 для записи файла для Linux и наличия только окончаний строки Linux

Вот фрагмент Perl, работающий над массивом элементов конфигурации конфигурации и преобразование element /somevob/... бит в element /vobs/somevob/... и печать в дескриптор файла.

 $fh = new FileHandle; 
    foreach my $line (@cs_array) 
     { 
     $line =~ s/([element|load])(\s+\/)(.+)/$1$2vobs\/$3/g; 
     $line =~ s/[\r\n]/\n/g; # tried many things here 
     $fh->print($line); 
     } 
    $fh->close(); 

Иногда элементы в массиве являются многострочными и разделена \ п

element /vob1/path\nelement\n/vob2/path\nload /vob1/path\n element\n 
/vob3/path 
load /vob3/path 

Когда я смотрю в файл написано на Win7 в двоичном зрителе всегда есть последовательность новой строки 0x0D 0x0A о чем жалуется Clearcase на Linux. Это похоже на печать.

Любые предложения? Я думал, что это было бы 10 минут работы ...

+0

Вы пытались явно указывать '\ x0A' вместо' \ n'? IIRC, '\ n' является логической строкой. – amon

+1

@amon, насколько я мог сказать, это неправда в Perl. '\ r' is' \ x0d', '\ n' is' \ x0a', и это только слои IO, которые переводят между '\ r \ n' и' \ n' на границах. Если кто-то может доказать, что я неправ, я бы хотел это увидеть. – hobbs

+0

@hobbs Это имеет смысл (прошло некоторое время с тех пор, как я написал что-то для Windows). – amon

ответ

3

Попробуйте

$fh->binmode; 

В противном случае вы, вероятно, в текстовом режиме, так и для Windows, это означает, что \n переводится на \r\n.

+0

Это сделало трюк, большое спасибо. – 0xDEADBEEF

1

Вы используете aflo для слоя IO :crlf, который по умолчанию используется для Perl в Windows. Вы можете использовать binmode после факта удаления этого слоя, или вы можете открыть дескриптор файла с помощью :raw (слой по умолчанию для * nix) или другого подходящего слоя ввода-вывода в 1-м месте.

Пример:

$fh = FileHandle->new($FileName, '>:raw') 

Проверить perldoc open для получения более подробной информации о IO слоев.