<div dir="ltr">Отлично. Картина прояснилась. Узнал немного нового )<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">22 мая 2014 г., 17:34 пользователь Victor Efimov <span dir="ltr"><<a href="mailto:victor@vsespb.ru" target="_blank">victor@vsespb.ru</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">22 мая 2014 г., 17:24 пользователь Алексей Мышкин <<a href="mailto:parserpro@gmail.com">parserpro@gmail.com</a>> написал:<br>

> Нормальный линуксовый терминал.<br>
<br>
Я не говорю что он плохой, у меня он так же себя ведёт. Просто это его<br>
поведение, а не perl.<br>
<div class=""><br>
> Я вот думаю что какой-то из байт может оказаться кодом волшебного символа<br>
> для регекспа - тогда может произойти что угодно.<br>
<br>
</div>Вряд ли, все волшебные символы - ASCII. Все байты из которых состоит<br>
UTF-8 код не-ASCII символа - не ASCII. Это свойство UTF-8<br>
называется "совместимо с ASCII", иначе, например, в именах файлов в ФС<br>
Linux, могли случайно оказаться байты "/" или всякие "*", но такого<br>
быть не может.<br>
<br>
Но может быть обратно - всякие волшебные символы \s \w \d будут<br>
совпадать с байтами, которые под них не должны подпадать (perl в<br>
данном случае считает что байты - это текст в latin1).<br>
Диапазоны и [] в таком виде тоже "не работают". Много чего не работает.<br>
Работать с UTF-8 данными в режиме не 'use utf8' (т.е. UTF-8 без флага)<br>
- нельзя. Можно только чтото простое делать типа $s =~ /привет\d+/ при<br>
этом это будет<br>
без багов, только если точно знаешь что происходит во всех нюансах, а их много.<br>
<div class="HOEnZb"><div class="h5"><br>
><br>
><br>
> 22 мая 2014 г., 17:11 пользователь Victor Efimov <<a href="mailto:victor@vsespb.ru">victor@vsespb.ru</a>> написал:<br>
><br>
>> например:<br>
>><br>
>> без use utf8, строка '№«».,' видится perl как отдельные байты.<br>
>> никакого отношения к символам, которые ты написал, не имеющие.<br>
>> какой-то символ может состоять из 2х и более байтов.<br>
>> они считаются отдельными. строка получается<br>
>> "\342\204\226\302\253\302\273.," (oct)<br>
>> quotemeta над этой строкой просто эскейпит ascii точки.<br>
>><br>
>> $str при этом "... \302\253\302\273\302\253\302\273" (в нём вместо 4х<br>
>> кавычек 8 "символов")<br>
>><br>
>> результирующая строка<br>
>><br>
>> ". \302"<br>
>><br>
>> что логично. точка 1 раз. пробел 1 раз. и символ \302 1 раз, т.к. все<br>
>> не-ascii символы из исходной $str входят<br>
>> в [] в регэкспе.<br>
>><br>
>> далее выводим эту строку не на экран а в файл (сделав редирект ">")<br>
>><br>
>> смотрим, получились байты 0x2E (точка) 0x20 (пробел) 0xC2 (это как раз<br>
>> \302 oct)<br>
>><br>
>> выводим на экран этот файл: cat file<br>
>> если последний символ обрезался (точно так же как если изначально<br>
>> запустить скрипт)- это проблемы твоего терминала.<br>
>> он ждёт UTF8 , а тут какие-то левые байты, не являющиеся валидным UTF8<br>
>> если к этой строке добавить ещё пару символов, будет нормально<br>
>> выводиться (вернее будет выводиться ромбик - "неизвестный символ").<br>
>><br>
>><br>
>> 22 мая 2014 г., 16:48 пользователь Victor Efimov <<a href="mailto:victor@vsespb.ru">victor@vsespb.ru</a>><br>
>> написал:<br>
>> > Я думаю смогу объяснить подробно что и почему, про все нюансы. Но я же<br>
>> > говорю - не понятно что должно происходить. Выводит в обоих случаях<br>
>> > что-то непонятное.<br>
>> ><br>
>> > 22 мая 2014 г., 16:41 пользователь Алексей Мышкин <<a href="mailto:parserpro@gmail.com">parserpro@gmail.com</a>><br>
>> > написал:<br>
>> >> Это не объяснение. Символ-то почему режется?<br>
>> >> Ладно бы на "широкий символ" ругнулось - это понятно. Но почему строка<br>
>> >> выводится не целиком - вот вопрос.<br>
>> >><br>
>> >><br>
>> >> 22 мая 2014 г., 16:26 пользователь <a href="mailto:devrow@gmail.com">devrow@gmail.com</a> <<a href="mailto:devrow@gmail.com">devrow@gmail.com</a>><br>
>> >> написал:<br>
>> >><br>
>> >>><br>
>> >>><br>
>> >>> <a href="http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/6163129#6163129" target="_blank">http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/6163129#6163129</a><br>

>> >>><br>
>> >>><br>
>> >>> On 22.05.2014 15:24, Алексей Мышкин wrote:<br>
>> >>>><br>
>> >>>> А объяснить?<br>
>> >>>><br>
>> >>>><br>
>> >>>> 22 мая 2014 г., 15:16 пользователь Antonio Nikishaev <<a href="mailto:a@lelf.me">a@lelf.me</a><br>
>> >>>> <mailto:<a href="mailto:a@lelf.me">a@lelf.me</a>>> написал:<br>
>> >>>><br>
>> >>>><br>
>> >>>><br>
>> >>>>     On 22 May 2014, at 14:58, Алексей Мышкин <<a href="mailto:parserpro@gmail.com">parserpro@gmail.com</a><br>
>> >>>>     <mailto:<a href="mailto:parserpro@gmail.com">parserpro@gmail.com</a>>> wrote:<br>
>> >>>><br>
>> >>>>      > Всем доброго дня.<br>
>> >>>>      > Есть такой код:<br>
>> >>>>      > #!/usr/bin/env perl<br>
>> >>>>      > use strict;<br>
>> >>>>      > #use utf8;<br>
>> >>>>      ><br>
>> >>>>      > my $BadChars = quotemeta '№«».,';<br>
>> >>>>      ><br>
>> >>>>      > my $BadCharsRX = qr/$BadChars/u;<br>
>> >>>>      ><br>
>> >>>>      > my $str = '... «»«»';<br>
>> >>>>      ><br>
>> >>>>      > $str =~ s/([$BadCharsRX])[$BadCharsRX]+/$1/g;<br>
>> >>>>      ><br>
>> >>>>      > print "$str\n";<br>
>> >>>>      > =====cut=====<br>
>> >>>>      ><br>
>> >>>>      > выдаёт ахинею<br>
>> >>>>      > если сделать так:<br>
>> >>>>      ><br>
>> >>>>      > my $str = '... №№№ «»«»';<br>
>> >>>>      > то начинает работать.<br>
>> >>>>      ><br>
>> >>>>      > Что за чёрт?<br>
>> >>>>      ><br>
>> >>>>      > Perl v5.14.2<br>
>> >>>><br>
>> >>>>     Писать надо нормально. Всё будет работать<br>
>> >>>><br>
>> >>>>     use utf8;<br>
>> >>>>     use open qw<:std :utf8>;<br>
>> >>><br>
>> >>> --<br>
>> >>> Moscow.pm mailing list<br>
>> >>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
>> >><br>
>> >><br>
>> >><br>
>> >><br>
>> >> --<br>
>> >> С уважением,<br>
>> >> Мышкин Алексей.<br>
>> >><br>
>> >> --<br>
>> >> Moscow.pm mailing list<br>
>> >> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
>> >><br>
>> --<br>
>> Moscow.pm mailing list<br>
>> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
><br>
><br>
><br>
><br>
> --<br>
> С уважением,<br>
> Мышкин Алексей.<br>
><br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>С уважением,<br>Мышкин Алексей.
</div>