Каково различие между 'eq' и '= ~' в Perl?

Что Вы получаете, когда Вы делаете 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.

15
задан Adam Bellaire 19 September 2009 в 11:51
поделиться

5 ответов

"шаблон \ n":)

$a = "pattern\n";
print "ok 1\n" if $a =~ /^pattern$/;
print "ok 2\n" if $a eq 'pattern';

Возможно, вы имели в виду /^pattern\z/.

4
ответ дан 1 December 2019 в 00:02
поделиться

eq предназначен для проверки равенства строк, == - то же самое, но для численного равенства.

Оператор = ~ предназначен для применения регулярного выражения к скаляру.

Для получения подробных сведений о каждом операторе Perl и о том, для чего они нужны, см. perldoc perlop ] справочная страница

29
ответ дан 1 December 2019 в 00:02
поделиться

Как отмечали другие, ($ 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 , я пропустил очевидную функциональную разницу между ними и пошел прямо к более абстрактным различиям. Я прояснил вопрос, но оставлю ответ в качестве (надеюсь) полезной ссылки.

    18
    ответ дан 1 December 2019 в 00:02
    поделиться

    = ~ - оператор привязки. Он используется для привязки значения к совпадению с шаблоном ( m // ), подстановке ( s /// ) или транслитерации ( tr // или y // ).

    eq - оператор равенства строк; он сравнивает два значения, чтобы определить, равны ли они, если рассматривать их как строки. Существует равноправный оператор == , который делает то же самое, только рассматривая значения как числа. (В Perl строки и числа в основном взаимозаменяемы, а преобразования происходят автоматически в зависимости от того, как используются значения. Из-за этого, когда вы хотите сравнить два значения, вы должны указать тип сравнения, которое нужно выполнить.)

    В общем, $ var = ~ m / ... / определяет, соответствует ли значение $ var шаблону, а не то, равно ли оно конкретному значению. Однако в этом случае шаблон привязан к обоим концам и не содержит ничего, кроме буквальных символов, поэтому он эквивалентен сравнению строк. Здесь лучше использовать eq , потому что он понятнее и быстрее.

    3
    ответ дан 1 December 2019 в 00:02
    поделиться

    eq - Проверяет равенство строк.

    = ~ - Связывает скалярное выражение с сопоставлением с образцом.

    См. здесь ] для более подробного описания всех операторов.

    6
    ответ дан 1 December 2019 в 00:02
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: