有没有更好的方法通过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.";} 

谢谢!

+4

'if($ input =〜m/^“[^”] {3,15}“$ /){say”Yes。“;} else {say”No.“;}' –

+0

请注意'use 5.26.0'隐式启用'strict',因此技术上'use strict'在那里是多余的。 – melpomene

您对两个部分相同的正则表达式匹配相同的字符串。这可以很容易为一个一次全部:

$_ = <>; 
say /"[^"]{3,15}"/ ? "Yes." : "No."; 

还要注意使用了第三操作?:的,避免了必须写一个if/else构建体,其中每个块只是打印单个小字。 你甚至可以浓缩成一条线:

say <> =~ /"[^"]{3,15}"/ ? "Yes." : "No."; 

,但我不认为任何赢得可读性价格。

还请注意您的原始解决方案是错误的。第一种模式只是确定该行包含两个双引号,第二个模式表示该行有两个双引号,其间有3到15个非换行符。一个只包含10个双引号的字符串将匹配两种模式,但不符合标准。