Что Вы получаете, когда Вы делаете puts lines
? Это даст Вам ключ к разгадке.
значением по умолчанию File.open
открывает файл в текстовом режиме, таким образом, Ваш \r\n
символы будут автоматически преобразованы в \n
. Возможно, это - причина lines
, всегда равны lines2
. Чтобы препятствовать тому, чтобы Ruby анализировал концы строки, используют rb
режим:
C:\> copy con lala.txt a file with many lines ^Z C:\> irb irb(main):001:0> text = File.open('lala.txt').read => "a\nfile\nwith\nmany\nlines\n" irb(main):002:0> bin = File.open('lala.txt', 'rb').read => "a\r\nfile\r\nwith\r\nmany\r\nlines\r\n" irb(main):003:0>
, Но от Вашего вопроса и кода я вижу, что просто необходимо открыть файл с модификатором по умолчанию. Вы не нуждаетесь ни в каком преобразовании и можете использовать короче File.read
.
"шаблон \ n":)
$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';
Возможно, вы имели в виду /^pattern\z/.
eq
предназначен для проверки равенства строк, ==
- то же самое, но для численного равенства.
Оператор = ~
предназначен для применения регулярного выражения к скаляру.
Для получения подробных сведений о каждом операторе Perl и о том, для чего они нужны, см. perldoc perlop ] справочная страница
Как отмечали другие, ($ a = ~ / ^ pattern $ /)
использует механизм регулярных выражений для оценки идентичности строк, тогда как ( $ a eq 'pattern')
- это простой тест на равенство строк.
Если вы действительно хотите узнать, идентичны ли две строки, последнее предпочтительнее по следующим причинам:
\ Q
и \ E
. В строке, заключенной в одинарные кавычки, единственный символ, который вам нужно экранировать, - это одинарная кавычка. (Вы также должны избегать обратной косой черты , если за ними следует обратная косая черта или разделитель строк.) С другой стороны, форма регулярного выражения намного более гибкая, если вам нужно сделать что-то другое , чем простая строка проверка на равенство. См. perldoc perlre для получения дополнительной информации о регулярных выражениях.
РЕДАКТИРОВАТЬ: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и сразу обратились к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.
)С другой стороны, форма регулярного выражения намного более гибкая, если вам нужно сделать что-то другое , чем простая строка проверка на равенство. См. perldoc perlre для получения дополнительной информации о регулярных выражениях.
РЕДАКТИРОВАТЬ: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и пошел прямо к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.
)С другой стороны, форма регулярного выражения гораздо более гибкая, если вам нужно сделать что-то другое , чем простая строка проверка на равенство. См. perldoc perlre для получения дополнительной информации о регулярных выражениях.
РЕДАКТИРОВАТЬ: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и сразу обратились к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.
Если это происходит в вашей программе несколько миллионов раз, например, выгода заметна.С другой стороны, форма регулярного выражения намного более гибкая, если вам нужно сделать что-то другое , чем простая строка проверка на равенство. См. perldoc perlre для получения дополнительной информации о регулярных выражениях.
РЕДАКТИРОВАТЬ: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и сразу обратились к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.
Если это происходит в вашей программе несколько миллионов раз, например, выгода заметна.С другой стороны, форма регулярного выражения намного более гибкая, если вам нужно сделать что-то другое , чем простая строка проверка на равенство. См. perldoc perlre для получения дополнительной информации о регулярных выражениях.
РЕДАКТИРОВАТЬ: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и пошел прямо к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.
См. perldoc perlre для получения дополнительной информации о регулярных выражениях.РЕДАКТИРОВАТЬ: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и сразу обратились к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.
См. perldoc perlre для получения дополнительной информации о регулярных выражениях.РЕДАКТИРОВАТЬ: Как и большинство других до ysth , я пропустил очевидную функциональную разницу между ними и пошел прямо к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.
= ~
- оператор привязки. Он используется для привязки значения к совпадению с шаблоном ( m //
), подстановке ( s ///
) или транслитерации ( tr //
или y //
).
eq
- оператор равенства строк; он сравнивает два значения, чтобы определить, равны ли они, если рассматривать их как строки. Существует равноправный оператор ==
, который делает то же самое, только рассматривая значения как числа. (В Perl строки и числа в основном взаимозаменяемы, а преобразования происходят автоматически в зависимости от того, как используются значения. Из-за этого, когда вы хотите сравнить два значения, вы должны указать тип сравнения, которое нужно выполнить.)
В общем, $ var = ~ m / ... /
определяет, соответствует ли значение $ var
шаблону, а не то, равно ли оно конкретному значению. Однако в этом случае шаблон привязан к обоим концам и не содержит ничего, кроме буквальных символов, поэтому он эквивалентен сравнению строк. Здесь лучше использовать eq
, потому что он понятнее и быстрее.
eq
- Проверяет равенство строк.
= ~
- Связывает скалярное выражение с сопоставлением с образцом.
См. здесь ] для более подробного описания всех операторов.