Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> chomp проблемы, решения 
:(
    Опции темы
tolkien
Дата 26.5.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Проблема такая 

$var = "строка\r\n" 
chomp $var;
print $var;

Вывод:
строка\r

Естественно мне надо чтобы вывод был строка без \r. Посмотрел документацию, в гугле. Выяснил что chomp убирает только то что есть в волшебной переменной $/. Потом \n оказывается может иметь разные коды в разных системах

    LF  eq  \012  eq  \x0A  eq  \cJ  eq  chr(10)  eq  ASCII 10
    CR  eq  \015  eq  \x0D  eq  \cM  eq  chr(13)  eq  ASCII 13

             | Unix | DOS  | Mac  |
        ---------------------------
        \n   |  LF  |  LF  |  CR  |
        \r   |  CR  |  CR  |  LF  |
        \n * |  LF  | CRLF |  CR  |
        \r * |  CR  |  CR  |  LF  |
        ---------------------------
        * text-mode STDIO

Видно что это очень плохо. Так у меня вопрос какие есть пути решения проблемы. Пока я нашел только 
два способа

1. заменить chomp $var на $var =~ s/\s+$//;
2. преобразовать сами данные из "строка\r\n" в "строка\n" и дальше работать с chomp
$var =~ s/\r\n$/\n/;

Как еще можно решить данную проблему?
PM MAIL   Вверх
KSURi
Дата 26.5.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Честно говоря, не совсем понял проблему... Почему нельзя просто
Код

$var  =~ s/[\r\n]//g



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
nitr
Дата 26.5.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



я обычно использовал s/\s+$//

Добавлено через 1 минуту и 35 секунд
так же не понял вопроса smile
Вы хотите знать, как использовать chomp или другие способы независимо от ОС?


--------------------
PM   Вверх
GoDleSS
Дата 26.5.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: 2
Всего: 2



А
Код

chomp $var;
chop $var;

или
Код

chomp $var;
chomp $var;

не поможет?

Хотя на мой взгляд все же 
Код

$var =~ s/[\r\n]+$//s;

вариант наиболее удобный.

Это сообщение отредактировал(а) GoDleSS - 26.5.2008, 16:14
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
ginnie
Дата 26.5.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый tolkien, судя по описанию chop(), использование chomp() более эффективно, по сравнению с s/[\r\n]+$// (как по скорости так и по памяти). Я вижу только один вариант использования chomp() -  определяем разделитель строк для файла, сохраняем его в переменной $/, далее используем chomp().


GoDleSS, 
Код

chomp $var;
chomp $var;

не удалит \r в исходном вопросе.

Код

chomp $var;
chop $var;

может удалить последний значащий символ строки.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 26.5.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Цитата(ginnie @ 26.5.2008,  17:32)
Уважаемый tolkien, судя по описанию chop(), использование chomp() более эффективно, по сравнению с s/[\r\n]+$// (как по скорости так и по памяти). Я вижу только один вариант использования chomp() -  определяем разделитель строк для файла, сохраняем его в переменной $/, далее используем chomp().


GoDleSS, 
Код

chomp $var;
chomp $var;

не удалит \r в исходном вопросе.

Код

chomp $var;
chop $var;

может удалить последний значащий символ строки.

Строки приходят с разными разделителями одни с \n другие с \r\n. Т.е заранее неизвестно что это строка заканчивается \n, а слудующая будет заканчиватся \r\n.

Это сообщение отредактировал(а) tolkien - 26.5.2008, 18:12
PM MAIL   Вверх
ginnie
Дата 26.5.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



tolkien, разделитель строк внутри файла должен быть одинаковым. Для Вашего некорректного файла используйте вариант s/[\r\n]+$//


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 26.5.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Кто сказал что строки из файлов приходят? Они могут посети прийти через сокеты. Вобще о файлах речь не шла. Но меня посетила другая мысль. Вместо рег. выражения лучше написать собственную функцию chomp которая будет кушать все \n и \r\n.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.