![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| antananarivu |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Недавно работаю в Perl.
Возникла проблема, не знаю, как подступиться. С помощью Perl обрабатываю строку вида "=?koi8-r?B?7sHLzMHEzsHRIzU2mjc3NV/u5evz9Ozh6u4ueGxz?=" она находится в $arrayt[$xx].
В результате в $encoded_attname получаем строку следующего вида: "Накладная#56 775_НЕКСТЛАЙН.xls" А теперь мне необходимо избавится в строке от всех символов кроме букв, цифр, знаков препинания и пробела и я пишу регулярное выражение:
В результате, почемуто получаем строку такого вида: "Накладная#56�775_НЕКСТЛАЙН.xls". То есть по какой-то неведомой мне причине появляется некорректно отображаемый символ. Природу которого я не могу понять. Из-за него не получается ни корректно передать строку, не склеить ее с другой подстрокой. И собственно 2 вопроса: почему так происходит? Кто нибудь сталкивался с таким? И второй подвопрос: почему в регулярном выражении не работают корректно [А-Яа-я] Когда я попытался употребить их в таком виде получалась вообще какая-то каша. Половину букв удалялась, половина оставалась. Если это важно в программе использую use bytes; Заранее спасибо. |
||||
|
|||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -MData::Dumper -MMIME::Words=:all -le 'print Dumper decode_mimewords ($ARGV[0])' "=?koi8-r?B?7sHLzMHEzsHRIzU2mjc3NV/u5evz9Ozh6u4ueGxz?="
$VAR1 = [ 'Накладная#56 775_НЕКСТЛАЙН.xls', 'koi8-r' ]; # |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
А можно поподробнее?
Я не вижу, где здесь происходит удаление всех символов, кроме букв, цифр, знаков препинания и пробела. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perldoc MIME::Words
|
|||
|
||||
| antananarivu |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Спасибо. Использовал. Все получилось. Но проблема не исчезла.
Пример. Строка ($sp) - "По документу Снятие заказа № 10 146 от 07.06.2010 19:35:19 сняты следующие позиции.... ". Явным видом в utf-8.
Если вставить строку в WORD видно, что между 10 и 146 есть неразравный пробел. При попытке вот такого кода:
Строка перестает восприниматься корректно. Не конкатенируется, не выводится на экран. Очень нужна помощь. Более общий вопрос. Мне нужно строку (в ютф-8), корректно очистить от всех символов кроме букв (латинских русских, цифр, пробела и знаков . , ; : ( ) * & ^ % $ # @ ! + = _ - ? № Это сообщение отредактировал(а) antananarivu - 28.6.2010, 12:25 |
||||
|
|||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
для utf8 смотреть классы символов.
perldoc perlunicode etc. |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Я понимаю, что напрашиваюсь на грубость. Но в том то и дело что с английским у меня очень плохо. читал. много непонятных вещей. жаль тратить неделю а то больше на все тонкости, поэтому и обращаюсь к спецам. ведь в общем-то нужна всего 1 конкретная задача.
строку текста в ютэфной кодировке избавить от всех символов, кроме приведенных выше. 1 строка кода. заранее спасибо. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
дайте закодированную строку.
|
|||
|
||||
| antananarivu |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Строка($sp) - "=?utf-8?B?0J/QviDQtNC+0LrRg9C80LXQvdGC0YMg0KHQvdGP0YLQuNC1INC30LA=?=
=?utf-8?B?0LrQsNC30LAg4oSWIDEwwqAxMjUg0L7RgiAwNy4wNi4yMDEwIDE3OjEyOjIwINGB?= =?utf-8?B?0L3Rj9GC0Ysg0YHQu9C10LTRg9GO0YnQuNC1ICDQv9C+0LfQuNGG0LjQuC4uLi4=?= =?utf-8?B?ICA=?= " После
Получаем строку: "По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие позиции.... " Во избежании нахождения в строке всяких управляющих символов, возврата каретки, конца строки и т.д. пытаюсь сделать отчистку строки от всех символов не нужных мне:
После чего $sp не конкатенируется, на экран не выводится. То есть продолжать корректно работать со строкой становится невозможно! Если же вывести строку в файл то между "№ 10" и "125" видны некий нечитаемый символ (квадратик). Если же строку "По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие позиции.... " скопипастить в Word то на этом самом месте мы увидим символ неразравного пробела. Не знаю важно это или нет, говорю как понимаю ситуацию. Ну и собствено вопрос, почему регулярное выражение некорректно работает. Это сообщение отредактировал(а) antananarivu - 28.6.2010, 17:41 |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, возможно, проблема в use bytes. Попробуйте use Devel::Peek; и Dump($sp) до и после удаления лишних символов. Кстати, попробуйте еще
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| krypt3r |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 2 Всего: 16 |
use bytes уберите, в ней проблема. И добавьте use utf8
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
[^ \p{S}\p{L}\p{N}\p{P}]+ ?
|
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
делал
no bytes - тогда убивает и русские буквы тоже. use utf-8 или use Devel::Peek - кривой символ остается, строка не выводится на экран.
тот же результат - некий кривой символ остается. Это сообщение отредактировал(а) antananarivu - 29.6.2010, 11:37 |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Может быть я вообще не верно формулирую проблему.
после того как я отчистил переменную $sp я делаю следующее:
если я не отчищаю переменную $sp все корректно отрабатывает - если отчищаю строка $tt2 не выводится на печать и insert не срабатывает. Это сообщение отредактировал(а) antananarivu - 29.6.2010, 11:48 |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
А русские символы в регулярном выражении в скрипте у Вас в какой кодировке?
Что выводит Dump($sp)? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
А русские символы в регулярном выражении в скрипте у Вас в какой кодировке?
Вы меня переоцениваете. Не знаю. Учитывая, что в самом начале кода стоит 'use bytes' - не знаю. Dump($sp) - если на экране - пустоту. не отображает. |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, чтобы работало правильно, файл должен быть в кодировке utf8 (указывается в редакторе), и нужно использовать там-же, где no bytes; - use utf8;
"На экране" подразумевается в консоли? Команда perl -MDevel::Peek -e 'Dump(12)' у меня выводит
а у Вас? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Весь текст программы. Оставил, то что относится к $sp. Добавлено @ 12:20 Так... консоли у меня нет. Я сижу через pgAdmin и резалты вижу либо через 'return $sp' в результатах вывода. Либо записывая переменную в текстовый файл. как указать в редакторе что файл в utf8? uses bytes я оставил, потому что при конкатенации строк часто получались иероглифы. и этот рецепт я нашел где-то на форуме. Это сообщение отредактировал(а) antananarivu - 29.6.2010, 12:22 |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
пробовал. Это сообщение отредактировал(а) antananarivu - 29.6.2010, 12:35 |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, вот Вам вариант
Это сообщение отредактировал(а) ginnie - 29.6.2010, 12:50 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
странно, у меня работает:
$VAR1 = "\x{41f}\x{43e} \x{434}\x{43e}\x{43a}\x{443}\x{43c}\x{435}\x{43d}\x{442}\x{443} \x{421}\x{43d}\x{44f}\x{442}\x{438}\x{435} \x{437}\x{430}\x{43a}\x{430}\x{437}\x{430} \x{2116} 10\x{a0}125 \x{43e}\x{442} 07.06.2010 17:12:20 \x{441}\x{43d}\x{44f}\x{442}\x{44b} \x{441}\x{43b}\x{435}\x{434}\x{443}\x{44e}\x{449}\x{438}\x{435} \x{43f}\x{43e}\x{437}\x{438}\x{446}\x{438}\x{438}.... "; $VAR1 = "\x{41f}\x{43e} \x{434}\x{43e}\x{43a}\x{443}\x{43c}\x{435}\x{43d}\x{442}\x{443} \x{421}\x{43d}\x{44f}\x{442}\x{438}\x{435} \x{437}\x{430}\x{43a}\x{430}\x{437}\x{430} \x{2116} 10125 \x{43e}\x{442} 07.06.2010 17:12:20 \x{441}\x{43d}\x{44f}\x{442}\x{44b} \x{441}\x{43b}\x{435}\x{434}\x{443}\x{44e}\x{449}\x{438}\x{435} \x{43f}\x{43e}\x{437}\x{438}\x{446}\x{438}\x{438}.... "; первое -- до, второе -- после. \x{a0} удалено, \x{2116} осталось. |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
так? если так то ошибка такая: "ERROR: error from Perl function "saveattachments": Can't use string ("По документу Снят") as an ARRAY ref while "strict refs" in use at line 119." line 119 "my $utf8_str = decode($spasss->[1], $spasss->[0]);" |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu,
от того, что Вы написали отличается контекстом: в моем варианте контекст списочный, а не скалярный, как у Вас, из-за этого ошибка, т.к. decode_mimewords() в списочном и скалярном контекстах возвращает разные результаты. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
ладно. по-моему это безнадежно. то же самое
до этого $sp =~ s{[^ \p{S}\p{L}\p{N}\p{P}]}{}g; return $sp работает отлично после нет. Добавлено через 9 минут и 16 секунд при этом длина строки если брать length меняется на 2 байта. 139 - 137. то есть удалить то она символ удаляет |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, если не сложно, пишите, чтобы было понятно не только Вам, но и остальным. Что именно у Вас не работает?
У меня в тестовом примере в консоль выводит Накладная#56775_НЕКСТЛАЙН.xls и Dump() тоже никаких лишних символов не показывает:
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Что-то с русскими символами...
потому что если убрать русские буквы и оставить например:
то все корректно отображается (русские буквы конечно оказываются удалены, что очевидно). |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, где у Вас проблемы с русскими буквами? в базе? база какую кодировку использует?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| antananarivu |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Закроем тему. Не могу корректно объяснить. На том уровне, на котором я мог объяснить, я объяснил:
return $sp Вывод данных: "По документу Снятие заказа № 10 125 от 07.06.2010 17:12:20 сняты следующие позиции...."
return $sp Вывод данных: (визуально пустая строка) ТЕПЕРЬ!!! Убираем символ стоящий между 10 и 125 имеем:
return $sp Вывод данных: "По документу Снятие заказа № 10125 от 07.06.2010 17:12:20 сняты следующие позиции...."
return $sp Вывод данных: "По документу Снятие заказа № 10125 от 07.06.2010 17:12:20 сняты следующие позиции...." Это сообщение отредактировал(а) antananarivu - 29.6.2010, 14:17 |
||||||||
|
|||||||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, покажите еще вывод функции Dumper() для второго случая, когда выводится пустая строка
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
antananarivu,
|
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
error from Perl function "saveattachments": Undefined subroutine &main::dumper called at line 323.
если делаю return Dump($sp); - выкидывает с сервера. |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, вы Dumper() с большой буквы написали, а то в сообщении об ошибке с маленькой?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Dumper($sp);
return - визуально пустая строка вывел в файл: Это сообщение отредактировал(а) antananarivu - 29.6.2010, 15:22 Присоединённый файл ( Кол-во скачиваний: 7 )
VAR.JPG 60,45 Kb |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Как вообще получить строку вот в таком виде?
$VAR1 = "\x{41f}\x{43e} \x{434}\x{43e}\x{43a}\x{443}\x{43c}\x{435}\x{43d}\x{442}\x{443} \x{421}\x{43d}\x{44f}\x{442}\x{438}\x{435} \x{437}\x{430}\x{43a}\x{430}\x{437}\x{430} \x{2116} 10125 \x{43e}\x{442} 07.06.2010 17:12:20 \x{441}\x{43d}\x{44f}\x{442}\x{44b} \x{441}\x{43b}\x{435}\x{434}\x{443}\x{44e}\x{449}\x{438}\x{435} \x{43f}\x{43e}\x{437}\x{438}\x{446}\x{438}\x{438}.... |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
print Dumper \$str;
|
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
А если избавится от регулярного выражения вообще и написать что то типа:
|
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Вот так до и после. Вывел через return Dumper ($sp) - переменная типа bytea
"$VAR1 = '\320\237\320\276 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\203 \320\241\320\275\321\217\321\202\320\270\320\265 \320\267\320\260\320\272\320\260\320\267\320\260 \342\204\226 10\302\240125 \320\276\321\202 07.06.2010 17:12:20 \321\201\320\275\321\217\321\202\321\213 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\270\320\265 \320\277\320\276\320\267\320\270\321\206\320\270\320\270.... \012';\012" "$VAR1 = '\320\237\320\276 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\203 \320\241\320\275\321\217\321\202\320\270\320\265 \320\267\320\260\320\272\320\260\320\267\320\260 \342\204\226 10\240125 \320\276\321\202 07.06.2010 17:12:20 \321\201\320\275\321\217\321\202\321\213 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\270\320\265 \320\277\320\276\320\267\320\270\321\206\320\270\320\270.... ';\012" то есть честно удаляет \302 - видимо неразрывный пробел и \012 в конце. тогда я вообще не понимаю в чем причина Это сообщение отредактировал(а) antananarivu - 30.6.2010, 11:28 |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
antananarivu, обратите внимание, что у Вас строка в UTF8 и символ, который Вы хотите удалить \302\240, а удаляется только его часть \302.
Добавлено через 3 минуты и 7 секунд Покажите строчку после обработки этим регулярным выражением
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| antananarivu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 25.6.2010 Репутация: нет Всего: нет |
Проблема решена. Всем спасибо (особенно ginnie).
Честно говоря так и не понял, что делал неправильно.. но главное заработало. Помогло следующее:
Это сообщение отредактировал(а) antananarivu - 1.7.2010, 10:08 |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |