Regex 如何在Perl中执行常规模式分配?
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
$ 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};
}