$stuff = "d:/learning/perl/tmp.txt";
open STUFF, $stuff or die "Cannot open $stuff for read :$!";
while (<STUFF>) {
my($line) = $_; # Good practice to always strip the trailing
chomp($line);
my @values = split(' ', $line);
foreach my $val (@values) {
if ($val == 1){
print "1 found";
}
elsif ($val =~ /hello/){
print "hello found";
}
elsif ($val =~ /"/*"/){ # I don't know how to handle here.
print "/* found";
}
print "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
我的tmp.txt:
/* CheerStone ColdStunner
1 Cheer Rock
hello Boo Pedigree
Run Code Online (Sandbox Code Playgroud)
如何处理/*代码中的字符序列?
Ala*_*avi 16
这*是一个特殊的角色.所以,你必须逃脱它:
m{/\*}
Run Code Online (Sandbox Code Playgroud)
正如Adam Bellaire建议的那样,这里有一个简短的解释:
最好避免使用栅栏.为此,有时除了/必须使用之外的分隔符.m在使用这样的分隔符时,应该在第一个分隔符之前.如果任何括号用作第一个分隔符,则必须使用相应的右括号作为结束分隔符.
bri*_*foy 12
un-meta正则表达式元字符有多种方法.在您的情况下,您需要处理作为默认分隔符的字符以及元字符.
对于你想成为文字字符的分隔符,你可以使用\来转义该字符,尽管你可以得到倾斜的牙签综合征:
m/\/usr\/local\/perls/;
Run Code Online (Sandbox Code Playgroud)您可以更改分隔符:
m(/usr/local/perl);
Run Code Online (Sandbox Code Playgroud)您可以以相同的方式转义元字符:
m(/usr/local/perl\*);
Run Code Online (Sandbox Code Playgroud)如果您希望模式的某个部分只是文字字符,则可以使用\Q它为您自动转义它们:
m(\Q/usr/local/perl*);
Run Code Online (Sandbox Code Playgroud)如果您希望模式的较小部分仅为文字字符,则可以使用,\Q 然后将其关闭\E:
m(/usr/local/perl\Q*+?\E/);
Run Code Online (Sandbox Code Playgroud)这\Q与quotemeta完全相同.将模式放入变量然后在匹配运算符中进行插值也可以解决分隔符问题:
my $pattern = quotemeta( '/usr/local/perl*+?/' );
m/$pattern/;
Run Code Online (Sandbox Code Playgroud)这两个字符在Perl正则表达式中都有特殊含义,因此您必须使用反斜杠转义它们:
$val =~ /\/\*/
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你应该^在所有的正则表达式之前添加,因为你似乎只想在行的开头处理文本.