например: без use utf8, строка '№«».,' видится perl как отдельные байты. никакого отношения к символам, которые ты написал, не имеющие. какой-то символ может состоять из 2х и более байтов. они считаются отдельными. строка получается "\342\204\226\302\253\302\273.," (oct) quotemeta над этой строкой просто эскейпит ascii точки.
$str при этом "... \302\253\302\273\302\253\302\273" (в нём вместо 4х кавычек 8 "символов") результирующая строка ". \302" что логично. точка 1 раз. пробел 1 раз. и символ \302 1 раз, т.к. все не-ascii символы из исходной $str входят в [] в регэкспе. далее выводим эту строку не на экран а в файл (сделав редирект ">") смотрим, получились байты 0x2E (точка) 0x20 (пробел) 0xC2 (это как раз \302 oct) выводим на экран этот файл: cat file если последний символ обрезался (точно так же как если изначально запустить скрипт)- это проблемы твоего терминала. он ждёт UTF8 , а тут какие-то левые байты, не являющиеся валидным UTF8 если к этой строке добавить ещё пару символов, будет нормально выводиться (вернее будет выводиться ромбик - "неизвестный символ"). 22 мая 2014 г., 16:48 пользователь Victor Efimov <[email protected]> написал: > Я думаю смогу объяснить подробно что и почему, про все нюансы. Но я же > говорю - не понятно что должно происходить. Выводит в обоих случаях > что-то непонятное. > > 22 мая 2014 г., 16:41 пользователь Алексей Мышкин <[email protected]> > написал: >> Это не объяснение. Символ-то почему режется? >> Ладно бы на "широкий символ" ругнулось - это понятно. Но почему строка >> выводится не целиком - вот вопрос. >> >> >> 22 мая 2014 г., 16:26 пользователь [email protected] <[email protected]> >> написал: >> >>> >>> http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/6163129#6163129 >>> >>> >>> On 22.05.2014 15:24, Алексей Мышкин wrote: >>>> >>>> А объяснить? >>>> >>>> >>>> 22 мая 2014 г., 15:16 пользователь Antonio Nikishaev <[email protected] >>>> <mailto:[email protected]>> написал: >>>> >>>> >>>> >>>> On 22 May 2014, at 14:58, Алексей Мышкин <[email protected] >>>> <mailto:[email protected]>> wrote: >>>> >>>> > Всем доброго дня. >>>> > Есть такой код: >>>> > #!/usr/bin/env perl >>>> > use strict; >>>> > #use utf8; >>>> > >>>> > my $BadChars = quotemeta '№«».,'; >>>> > >>>> > my $BadCharsRX = qr/$BadChars/u; >>>> > >>>> > my $str = '... «»«»'; >>>> > >>>> > $str =~ s/([$BadCharsRX])[$BadCharsRX]+/$1/g; >>>> > >>>> > print "$str\n"; >>>> > =====cut===== >>>> > >>>> > выдаёт ахинею >>>> > если сделать так: >>>> > >>>> > my $str = '... №№№ «»«»'; >>>> > то начинает работать. >>>> > >>>> > Что за чёрт? >>>> > >>>> > Perl v5.14.2 >>>> >>>> Писать надо нормально. Всё будет работать >>>> >>>> use utf8; >>>> use open qw<:std :utf8>; >>> >>> -- >>> Moscow.pm mailing list >>> [email protected] | http://moscow.pm.org >> >> >> >> >> -- >> С уважением, >> Мышкин Алексей. >> >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org >> -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
