如何比较Perl中的两个字符串?

如何比较Perl中的两个字符串?

我正在学习Perl,我有这个基本的问题在StackOverflow上查找,没有找到好的答案,所以我想我会问。

453224 次浏览

看到perldoc perlop。使用ltgteqnecmp进行字符串比较:

Binary eq如果左实参按字符串方式等于右实参,则返回true。

Binary ne如果左参数按字符串顺序不等于右参数,则返回true。

Binary cmp返回-1、0或1,这取决于左参数是否字符串小于、等于或大于右参数。

二进制~~在其参数. ...之间进行智能匹配

ltlegegtcmp使用当前语言环境指定的排序顺序,如果一个遗留的使用语言环境(但不是use locale ':not_characters')生效。看到perllocale。不要将它们与Unicode混合使用,只与遗留的二进制编码混合使用。标准的Unicode:整理Unicode:整理::语言环境模块为排序问题提供了更强大的解决方案。

print "Matched!\n" if ($str1 eq $str2)

Perl有单独的字符串比较和数字比较操作符,以帮助处理语言中的松散类型。你应该为所有不同的操作符读取perlop

  • < p > cmp比较

    'a' cmp 'b' # -1
    'b' cmp 'a' #  1
    'a' cmp 'a' #  0
    
  • eq Equal to

    'a' eq  'b' #  0
    'b' eq  'a' #  0
    'a' eq  'a' #  1
    
  • ne Not-Equal to

    'a' ne  'b' #  1
    'b' ne  'a' #  1
    'a' ne  'a' #  0
    
  • lt Less than

    'a' lt  'b' #  1
    'b' lt  'a' #  0
    'a' lt  'a' #  0
    
  • le Less than or equal to

    'a' le  'b' #  1
    'b' le  'a' #  0
    'a' le  'a' #  1
    
  • gt Greater than

    'a' gt  'b' #  0
    'b' gt  'a' #  1
    'a' gt  'a' #  0
    
  • ge Greater than or equal to

    'a' ge  'b' #  0
    'b' ge  'a' #  1
    'a' ge  'a' #  1
    

See perldoc perlop for more information.

( I'm simplifying this a little bit as all but cmp return a value that is both an empty string, and a numerically zero value instead of 0, and a value that is both the string '1' and the numeric value 1. These are the same values you will always get from boolean operators in Perl. You should really only be using the return values for boolean or numeric operations, in which case the difference doesn't really matter. )

除了Sinan Ünür字符串比较运算符的综合列表之外,Perl 5.10还添加了智能匹配运算符。

智能匹配操作符根据两个项的类型进行比较。下面的图表是5.10的行为(我相信这个行为在5.10.1中会有轻微的改变):

perldoc perlsyn“智能匹配的详细信息”:

< blockquote > < p > 智能匹配的行为取决于它的参数是什么类型。它总是可交换的,即$a ~~ $b的行为与$b ~~ $a相同。行为由下表决定:应用的第一行,以任意一种顺序决定匹配行为。

$a      $b        Type of Match Implied    Matching Code
======  =====     =====================    =============
(overloading trumps everything)


Code[+] Code[+]   referential equality     $a == $b
Any     Code[+]   scalar sub truth         $b−>($a)


Hash    Hash      hash keys identical      [sort keys %$a]~~[sort keys %$b]
Hash    Array     hash slice existence     grep {exists $a−>{$_}} @$b
Hash    Regex     hash key grep            grep /$b/, keys %$a
Hash    Any       hash entry existence     exists $a−>{$b}


Array   Array     arrays are identical[*]
Array   Regex     array grep               grep /$b/, @$a
Array   Num       array contains number    grep $_ == $b, @$a
Array   Any       array contains string    grep $_ eq $b, @$a


Any     undef     undefined                !defined $a
Any     Regex     pattern match            $a =~ /$b/
Code()  Code()    results are equal        $a−>() eq $b−>()
Any     Code()    simple closure truth     $b−>() # ignoring $a
Num     numish[!] numeric equality         $a == $b
Any     Str       string equality          $a eq $b
Any     Num       numeric equality         $a == $b


Any     Any       string equality          $a eq $b


+ − this must be a code reference whose prototype (if present) is not ""
(subs with a "" prototype are dealt with by the 'Code()' entry lower down)
* − that is, each element matches the element of same index in the other
array. If a circular reference is found, we fall back to referential
equality.
! − either a real number, or a string that looks like a number

当然,“匹配代码”并不代表真正的匹配代码:它只是用来解释预期的含义。与grep不同,智能匹配操作符将在任何可能的时候短路。

通过重载自定义匹配 你可以通过重载~~操作符来改变对象匹配的方式。这胜过通常的智能匹配语义。看到overload

如果你想提取两个字符串之间的差异,你可以使用字符串:Diff

这个问题的潜台词是:

为什么不能直接使用==来检查两个字符串是否相同?< / >

Perl对于文本和数字没有不同的数据类型。它们都由类型“标量”表示。换句话说,字符串数字如果你这样使用它们

if ( 4 == "4" ) { print "true"; } else { print "false"; }
true


if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true


print "3"+4
7

由于文本和数字不是由语言区分的,我们不能简单地重载==操作符来对这两种情况都做正确的事情。因此,Perl提供了eq来比较作为文本的值:

if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false


if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true

简而言之:

  • Perl没有专门用于文本字符串的数据类型
  • 使用==!=将两个操作数作为数字进行比较
  • 使用eqne将两个操作数作为文本进行比较

还有许多其他函数和运算符可用于比较标量值,但了解这两种形式之间的区别是重要的第一步。

我来寻找一个解决方案,在perl中,我可以比较如果a >B或Z <AA。这里的任何东西都不适合我,所以我想出了自己的解决方案。诀窍是为每个字母分配一个数字

例如

A=1
B=2
C=3 and so on

然后当时间来比较如果A >B,你得到相应的数字,并在这种情况下进行比较,1 >2

这里是perl代码。

# header
use warnings;
use strict;


#create a hash of letters
my %my_hash_lookup;
my $letter_counter=0;
foreach my $letters ('A'..'ZZ')
{
#print "$letters \n";
    

$letter_counter++;
my $key = $letters;
my $keyValue = $letter_counter;
$my_hash_lookup{$key}=$keyValue;
}




my $size = keys %my_hash_lookup;
print "hash size: $size ...\n";


#get number value of string letters
my $my_hash_value1 = $my_hash_lookup{"A"};
my $my_hash_value2 = $my_hash_lookup{"B"};
        

if  ( (defined $my_hash_value1) && (defined $my_hash_value2))
{


if ($my_hash_value1 == $my_hash_value2)
{
#equal
}
elsif ($my_hash_value1 > $my_hash_value2)
{
#greater than
                

}
elsif ($my_hash_value1 < $my_hash_value2)
{
#less than
}
            

}