有没有更好的方法通过perl匹配这个正则表达式?
问题描述:
只是一个关于这个Perl代码的简单问题;我的任务是获取STDIN标量,并将其与包含引号之间的至少3至15个字符的行(匹配引号内没有另外的引号)进行匹配。如果是这样,我的程序应该打印出“是”,如果不是,“否”我只是想知道,是否有更雄辩的方式来实现这一目标?我使用这段代码:有没有更好的方法通过perl匹配这个正则表达式?
#!/usr/bin/perl
use strict;
use warnings;
use 5.26.0;
#2. Match a line that contains in it at least 3 - 15 characters between
# quotes (without another quote inside the quotes).
say "Enter your input.";
chomp(my $input = <STDIN>);
if ($input =~ m/^"([^"])*"$/){
if ($input =~ m/^".{3,15}"$/){
say "Yes.";
}
else{ say "No.";}
}
else{ say "No.";}
谢谢!
答
您对两个部分相同的正则表达式匹配相同的字符串。这可以很容易为一个一次全部:
$_ = <>;
say /"[^"]{3,15}"/ ? "Yes." : "No.";
还要注意使用了第三操作?:
的,避免了必须写一个if
/else
构建体,其中每个块只是打印单个小字。 你甚至可以浓缩成一条线:
say <> =~ /"[^"]{3,15}"/ ? "Yes." : "No.";
,但我不认为任何赢得可读性价格。
还请注意您的原始解决方案是错误的。第一种模式只是确定该行包含两个双引号,第二个模式表示该行有两个双引号,其间有3到15个非换行符。一个只包含10个双引号的字符串将匹配两种模式,但不符合标准。
'if($ input =〜m/^“[^”] {3,15}“$ /){say”Yes。“;} else {say”No.“;}' –
请注意'use 5.26.0'隐式启用'strict',因此技术上'use strict'在那里是多余的。 – melpomene