Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > А можно ли короче...


Автор: Danissimo 11.12.2006, 15:13
Мне нужно, чтобы окончание строки было именно CR, LF (13, 10) в независимости от платформы (nix, win). Я добиваюсь этого таким вот образом:
Код

my $str = "xxx\nyyy\nzzz";
$str =~ s{\10}{\13\10}g;
$str =~ s{\13\13\10}{\13\10}g;

Можно ли как-нть проще?

Автор: DiverD 11.12.2006, 16:04
Код

$str =~ s{\10}{\13\10}g;
$str =~ s{\13(\13\10)}{\$1}g;


LF - \012
CR - \015

Еще глянь perldoc Socket и IO::Socket

Автор: Nab 11.12.2006, 16:18
Код

$str =~ s/[^\13]\10/\13\10/g;

Автор: Danissimo 11.12.2006, 16:36
Nab, а чем отличается твой вариант от вот этого

$str =~ s/[^\015]\012/\015\012/g;

И второй вопрос: твой вариант, по идее, должен работать и вот с такой строкой

$str = "xxx\10yyy\10zzz";

да? Вот, какой результат получается:

xx\x0B\x08yy\x0B\x08zzz

Видимо, символ \10 все равно вопринимается как закодированный в 8-чной системе.

Так что не работает.

Добавлено @ 16:43 
2DiverD: Спасибо. Я, правда, сначала не понял, что ты хочешь сказать, пока Nab'у не ответил. Ты бы уж попонятнее выражался, тем более что правильные вещи говоришь.

Автор: nitr 11.12.2006, 19:43
Danissimo, DiverD, 
вы вообще про что говорили? smile)

Nab, очепятался smile \x10 \x13, а могли бы и исправить сами...
\x.. шестнадцатиричное представление smile
Код

#!perl
print "\x6C\x6F\x6C\x20\x3A\x29";

Автор: Nab 11.12.2006, 20:25
Вообщето, тут символы не так важны, посмотрите на тему топика и сам вопрос...

Автор: DiverD 11.12.2006, 22:42
ну сорри =)

а что \x10 \x13 тож самое что в 8миричной \012 \015 ?

Автор: Danissimo 12.12.2006, 13:11
Цитата(nitr @ 11.12.2006,  19:43)
Nab, очепятался smile \x10 \x13, а могли бы и исправить сами... \x.. шестнадцатиричное представление smile

Хе-хе, эт я знаю, что \xYY -- 16-чное представление. Я вот тоже, как и Nab, думал, что можно использовать 10-чный коды. Более того, так, как ты, Nitr, предлагаешь, делать нельзя, ибо CR != \x13, так как CR == \x0D (про LF то же самое). И как, опять же, Nab верно заметил, символы тут не при чем. Вопрос -- в названии топика.

Автор: Danissimo 29.12.2006, 02:16
Придумал способ лучше =))
Код

s/(?<!\015)\012/\015\012/g;

И все! =))

Автор: amg 29.12.2006, 12:02
Цитата(Danissimo @ 29.12.2006,  02:16)
Придумал способ лучше =))
Код

s/(?<!\015)\012/\015\012/g;

Да, это хороший вариант!
В три раза быстрее, чем классический 
Код

s/\r?\n/\r\n/g;

Хотя более сложный вариант ala Nab еще быстрее (в полтора раза)
Код

s/([^\r])\n/$1\r\n/g;

Автор: Danissimo 30.12.2006, 18:33
О! Правильно я понимаю, что фактическое значение \n зависит от ОС? Другими словами на win* \n = \x0A\x0D, а на *nix \n = \x0A?

Я заметил, что chomp по разному работает на *nix и на win*. В первом случае он ест последний \x0D, а во втором -- пару \x0A\x0D.

Я вибираю свой, так как он мне кажется лучшим с точки зрения понятности. Но это не мешает мне сказать спасибо, amg, за интересную аналитику.

Автор: Materium 31.12.2006, 13:41
Цитата(Danissimo @  30.12.2006,  18:33 Найти цитируемый пост)
О! Правильно я понимаю, что фактическое значение \n зависит от ОС? Другими словами на win* \n = \x0A\x0D, а на *nix \n = \x0A?


Естесно. ))) Иначе Perl не был бы таким хорошо переносимым по платформам языком.  smile 

Автор: amg 3.1.2007, 13:28
Цитата(Danissimo @  30.12.2006,  18:33 Найти цитируемый пост)
О! Правильно я понимаю, что фактическое значение \n зависит от ОС? Другими словами на win* \n = \x0A\x0D, а на *nix \n = \x0A?

Не совсем так. Насколько я понимаю, "\cJ", "\012", "\x0A", chr(10) и "\n" - синонимы и обозначают один символ, который перл интерпретирует как логический конец строки. А физическое воплощение этого конца строки может быть разным и зависит уже не от перла, а от строковой библиотеки ОС, драйвера терминала, сетевых драйверов и т.д. Почитать об этом можно в "Perl Cookbook", во Введении к 8-й главе.

Автор: ZeeLax 4.1.2007, 09:53
Цитата(amg @  3.1.2007,  16:28 Найти цитируемый пост)
"\012", "\x0A", chr(10)

Вот насчёт этих - не знаю не знаю...

Автор: amg 4.1.2007, 10:25
Цитата(ZeeLax @  4.1.2007,  09:53 Найти цитируемый пост)
Вот насчёт этих - не знаю не знаю...
Я не смог придумать ситуацию, когда бы эти записи означали не один и тот же символ. По крайней мере, при выводе на терминал и при записи в файл как в linux, так и в winNT - это синонимы.
Код

foreach ("\cJ", "\012", "\x0A", chr(10), "\n") {
  print 'some text'."$_";
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)