Если у вас есть две строки Unicode (то есть строки кодовых точек Unicode), то вы наверняка сохранили файл в кодировке UTF-8, и вы на самом деле были
use utf8; # Tell Perl source code is UTF-8.
my $a = 'µ╫P[┐╬♣3▀═<+·1╪מ└╖"ª';
my $b = 'µ╫P[┐╬♣3▀═<+·1╪מ└╖"ª';
if ($a eq $b) {
print("They're equal.\n");
} else {
print("They're not equal.\n");
}
И это работает прекрасно. eq
и ne
будут сравнивать кодовую точку строки по кодовой точке.
Некоторые графемы (например, «& eacute;») могут быть созданы несколькими различными способами, поэтому вам может потребоваться сначала их представление normalize.
use utf8; # Tell Perl source code is UTF-8.
use charnames qw(:full); # For \N{}
use Unicode::Normalize qw(NFC);
my $a = NFC("\N{LATIN SMALL LETTER E WITH ACUTE}");
my $b = NFC("e\N{COMBINING ACUTE ACCENT}");
if ($a eq $b) {
print("They're equal.\n");
} else {
print("They're not equal.\n");
}
Наконец, Unicode считает некоторые символы почти эквивалентны, и их можно считать равными, используя различные формы нормализации.
use utf8; # Tell Perl source code is UTF-8.
use charnames qw(:full); # For \N{}
use Unicode::Normalize qw(NFKC);
my $a = NFKC("2");
my $b = NFKC("\N{SUPERSCRIPT TWO}");
if ($a eq $b) {
print("They're equal.\n");
} else {
print("They're not equal.\n");
}
Зачем вам нужен другой способ? Есть ли что-то, что вы ищете, что встроенные сравнения строк ('eq',' ne', 'gt',' lt', 'ge' и' le') не предоставляют? –
Если строки равны (как они кажутся), я бы ожидал, что что-то здесь, блок здесь не будет введен. –
Чтобы Perl мог видеть файл так, как вы, он должен был быть закодирован как UTF-8, и вам нужно было использовать 'use utf8; 'Предполагая, что вы это сделали, Perl будет делать кодовую точку путем сравнения строк кода , Какие у вас проблемы? Вам сначала нужно [нормализовать] (http://search.cpan.org/perldoc?Unicode::Normalize) их? – ikegami