Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在Perl中执行常规模式分配?_Regex_Perl - Fatal编程技术网

Regex 如何在Perl中执行常规模式分配?

Regex 如何在Perl中执行常规模式分配?,regex,perl,Regex,Perl,Perl代码: $ cat names projectname_flag_jantemp projectname_flag_febtemp projectname_flag_marchtemp projectname_flag_mondaytemp $ 分别 模式始终保持不变 jan feb march monday projectname\u flag\u temp 如何提取?while(){ projectname_flag_<>temp 咀嚼; s{projectnam

Perl代码:

$ cat names
projectname_flag_jantemp
projectname_flag_febtemp
projectname_flag_marchtemp
projectname_flag_mondaytemp
$
分别

模式始终保持不变

jan
feb
march
monday
projectname\u flag\u temp
如何提取?

while(){
projectname_flag_<>temp
咀嚼; s{projectname\u flag{(.*temp}{$1}; #$现在将有1月、2月。。。 }
while(){
咀嚼;
s{projectname\u flag{(.*temp}{$1};
#$现在将有1月、2月。。。
}
我想:

while (<$fpi>) {
        chomp;
        s{projectname_flag_(.*?)temp}{$1};
        # $_ will now have jan, feb, ...
}
我想:

while (<$fpi>) {
        chomp;
        s{projectname_flag_(.*?)temp}{$1};
        # $_ will now have jan, feb, ...
}
请注意,需要使用
$temp
周围的括号,以便模式匹配在列表上下文中运行。如果没有它们,
$temp
将只包含一个true或false值,指示匹配是否成功

更一般地说,列表上下文中的模式匹配返回捕获的子模式(如果匹配失败,则返回空列表)。例如:

my ($temp) = /^projectname_flag_(.+)temp$/;
请注意,需要使用
$temp
周围的括号,以便模式匹配在列表上下文中运行。如果没有它们,
$temp
将只包含一个true或false值,指示匹配是否成功

更一般地说,列表上下文中的模式匹配返回捕获的子模式(如果匹配失败,则返回空列表)。例如:

my ($temp) = /^projectname_flag_(.+)temp$/;
while(){
我的($temp)=($=~m/projectname\u flag.$temp/);
func($temp);
}
while(){
我的($temp)=($=~m/projectname\u flag.$temp/);
func($temp);
}

如果需要与较旧的
perl
s兼容,我会使用(只要通过检查
$month
是否已定义来确保匹配成功)

从5.10开始,您可以使用命名捕获:

while (<$fpi>) {
  my ($temp) =($_ =~ m/projectname_flag_(.*?)temp/);
  func($temp);
}
我的$month;
if(/^projectname flag_(?[a-z]+)temp\z/x){
$month=$+{month};
}

如果需要与较旧的
perl
s兼容,我会使用(只要通过检查
$month
是否已定义来确保匹配成功)

从5.10开始,您可以使用命名捕获:

while (<$fpi>) {
  my ($temp) =($_ =~ m/projectname_flag_(.*?)temp/);
  func($temp);
}
我的$month;
if(/^projectname flag_(?[a-z]+)temp\z/x){
$month=$+{month};
}

如何使其对变量而不是
$进行操作
?例如,输入是在
$inp
中而不是在
$\
中,输出也应该转到
$out
而不是
$\/code>?@Lazer:
($out=$inp)=~s{projectname\u标志(.*temp}{$1}如何使其对变量而不是
$进行操作?例如,输入是在
$inp
中而不是在
$\
中,输出也应该转到
$out
而不是
$\/code>?@Lazer:
($out=$inp)=~s{projectname\u标志(.*temp}{$1}只需记住检查匹配是否成功。只需记住检查匹配是否成功。-1用于在
+
时使用
*
(或更严格的模式)会更合适。-1用于在
+
时使用
*
(或更严格的模式)会更合适。谢谢,我不知道命名捕获。谢谢,我不知道命名捕获。
my $month;
if ( /^ projectname _flag_ (?<month> [a-z]+ ) temp \z/x ) {
    $month = $+{month};
}