📜  珀尔 |正则表达式中的“ee”修饰符

📅  最后修改于: 2022-05-13 01:55:25.484000             🧑  作者: Mango

珀尔 |正则表达式中的“ee”修饰符

在 Perl 中,正则表达式允许使用合适的运算符对给定的字符串执行各种操作。这些运算符可以执行诸如修改字符串、替换其他子字符串等操作。在给定字符串中的子字符串的替换是通过使用 's'(substitution)运算符完成的,它有两个操作数,一个是要被替换,另一个是替换字符串。

s/To_be_replaced/Replacement/

Perl 中的修饰符用于使用正则表达式将字符串与特定模式匹配。 Perl 中的 'ee' 修饰符类似于 '\e' 修饰符。它用于评估右侧的字符串,然后进一步评估结果。它基本上是 Perl 中的双 'eval'运算符。 '\e'运算符用于计算右侧的字符串。 '\ee' 是它旁边的一步。它对已应用 '\e' 的字符串应用 '\e'运算符。

s///ee;

就像 'e' 修饰符一样,'ee' 修饰符也可以与 'g'(全局)修饰符一起使用,以对给定字符串中所有可能的子字符串进行更改。

例子:

#!/usr/bin/perl
my $var = 'for';
  
# Defining the string 
my $String = 'Geeks $var Geeks is the best';
  
# String before using 'ee' modifier
print "Original String: $String\n";
  
# Applying 'ee' modifier using regex
$String =~ s/(\$\w+)/$1/ee;
print "Updated String: $String";
输出:
Original String: Geeks $var Geeks is the best
Updated String: Geeks for Geeks is the best

在上面的代码中, $var 在将正则表达式应用于字符串之前按原样打印,因为它被视为给定字符串的子字符串并且不被视为变量。但是在应用正则表达式之后,'ee' 修饰符评估 $var 的值并打印它。
如果我们在上面的代码中使用 'e' 修饰符,那么生成的字符串将与原始字符串相同:

#!/usr/bin/perl
my $var = 'for';
  
# Defining the string 
my $String = 'Geeks $var Geeks is the best';
  
# String before using 'e' modifier
print "Original String: $String\n";
  
# Applying 'e' modifier using regex
$String =~ s/(\$\w+)/$1/e;
print "Updated String: $String";
输出:
Original String: Geeks $var Geeks is the best
Updated String: Geeks $var Geeks is the best

这是因为当使用 'e' 修饰符时,正则表达式会将 RHS 视为要用作替换的评估字符串,这里 RHS 是 $1,它包含 $var,但不是它的值。因此,当我们使用 'ee' 修饰符时,它将再次评估 RHS,其中包含已经评估的值 $var。

使用带有数学运算的 'ee' 修饰符:

如果有一个数学表达式存储在一个字符串中,那么在打印字符串时,它的值不会被评估并按原样打印。这是因为它被视为字符串和要评估的表达式。

例子:

#!/usr/bin/perl
  
# Mathematical expression
# stored as a string
$String = "1 + 2";
  
# Regex to evaluate the sum
$String =~ s/(\d+ [+*\/-] \d+)/$1/ee;
  
print "The sum is $String";
输出:
The sum is 3

在上面的代码中,表达式是用正则表达式编写的,使用'\d+'运算符来写入一个或多个数字, [+*/-]字符类用于运算符符号,然后再次使用'\d+'来表示数字。 'ee' 修饰符计算字符串并返回表达式的总和,然后使用 $1运算符打印。
上面的正则表达式也可以存储在一个子程序中以评估各种其他表达式,而无需重写正则表达式。

例子:

#!/usr/bin/perl
  
# Subroutine to calculate regex
sub Regex
{
    $var = shift;
      
    # Regex to evaluate the sum
    $var =~ s/(\d+ [+*\/-] \d+)/$1/ee;
    return $var;
}
  
# Mathematical expression
# stored as a string
$String1 = "1 + 2";
  
$String1 = Regex($String1);
  
print "The sum is $String1\n";
  
# Calculating product
$String2 = "10 * 3";
$String2 = Regex($String2);
  
print "The product is $String2";
输出:
The sum is 3
The product is 30

在上面的代码中,单个正则表达式可用于使用子例程执行四个数学运算。