Как-то я уже спрашивал как перевести слова в текстовом файле в нижний регистр, но к сожалению не нашел свой топик (в поиске доступны только 10 последних). Поэтому извиняюсь, если опять...
Когда мне подкинули скрипт на Perl, который это делал, я решил осваивать понемногу этот ацкий язык. Вопрос следующий. Почему этот скрипт на консоль выводит слово ВАСЯ, если я от него ожидаю слово вася?
greengroon
Встречный вопрос номер раз: а почему вы пытаетесь заставить скрипт обработать строку на не понятном ему языке? Если использовать латиницу, то все работает:
И встречный вопрос номер два: почему вы не хотите читать документацию? Вот выдержка из perldoc perlfunc:
lc EXPR
lc Returns a lowercased version of EXPR. This is the internal function implementing the "\L" escape in
double‐quoted strings. Respects current LC_CTYPE locale if "use locale" in force. See perllocale
and perlunicode for more details about locale and Unicode support.
If EXPR is omitted, uses $_.
В общем, читайте perldoc perllocale и perldoc perlunicode. Если после прочтения, усвоения и апробирования полученных знаний на практике проблемы и вопросы не исчезнут, пишите.
Использование прагмы use locale результата не дало. После беглого просмотра perldoc perlunicode (у меня локаль utf-8), написал use utf-8. После этого большой ВАСЯ стал маленьким вася, правда, при этом перл вывел на кансоль
Wide character in print at hello1.pl line 6 (#1)
(W utf8) Perl met a wide character (>255) when it wasn't expecting
one. This warning is by default on for I/O (like print). The easiest
way to quiet this warning is simply to add the :utf8 layer to the
output, e.g. binmode STDOUT, ':utf8'. Another way to turn off the
warning is to add no warnings 'utf8'; but that is often closer to
cheating. In general, you are supposed to explicitly mark the
filehandle with an encoding, see open and perlfunc/binmode.
Окончательный вариант прагмы стал use encoding utf-8.
Это еще не все. Все это я неспроста тут спрашивал ). Я захотел разобраться в этой записи, любезно мне предоставленной однажды одним пользователем форума (явно мастер перла)).
У меня был файл file. А в нем списки имен и фамилий, набранных в верхнем регистре. (типа ВАСЯ ВАСЬКИН) Нужно было переформатировать их в нижний регистр и при этом оставить первую букву заглавной. Команда, которая выше с этим справилась. Но я подумал, что может можно проще написать, например используя функции lc и ucfirst. Пока не получается. Подскажите, почему. Вот мой вариант.
Это я типа хочу заменить все слова в файле (\w+) на нижний регистр а потом первую букву на верхний, но чего то не получается - выдает Substitution replacement not terminated at -e line 1.
Да, уж... Пойду дальше читать, надеюсь я еще не совсем безнадежен.
Объясните пожалуйста, почему file1 получается пустым, если команда выглядит так
host@user
cat /file | perl -w -e -p 'use encoding "utf-8"; s/\s+(\w)\s+/lc$1/;' > file1
Use of uninitialized value $_ in -p at -e line 1.
У меня тут так
найти любые слова \w+
перед которыми или после которых есть пробел или пробелы \s+
заменить найденые слова на то же самое только в нижнем регистре lc$1
поиск и замена происходит глобально (многократно) g
perl -w -p -e 'command'
в любом случае, перловое выражение должно следовать за -e.
Спасибо. Честно говоря, не знаю зачем нужна опция -e. Оставил ее еще с вашей команды ;-). Теперь слова выдает, правда все так же, как в file в верхнем регистре.
perl -w -p -e 'command'
в любом случае, перловое выражение должно следовать за -e.
Спасибо. Честно говоря, не знаю зачем нужна опция -e. Оставил ее еще с вашей команды ;-). Теперь слова выдает, правда все так же, как в file в верхнем регистре.