经过一些研究后,我仍然无法完全理解下面的Perl代码。根据我对该行的理解
if ($fileName =~ /^.*\.gz\z/si)
如果$fileName
等于任何.gz
,则该计划会执行,$fileName
将等于$inputname
。我是对的吗?
if ($fileName =~ /^.*\.gz\z/si) {
$filename = $inputname;
}
/^.
- 这是否意味着?
*\
- 这是否意味着所有?
\z
- z
在Perl正则表达式中有意义吗?
/si
- 我不知道这个
=~
- 这是什么意思?
我认为我的问题也是错的?这个问题对你来说可能很简单,但对我来说很难。我希望你明白。
答案 0 :(得分:5)
正则表达式本身是//
之间的部分。
^
表示:字符串的开头(所以之前没有字符)。
.*
表示:一定数量的任何字符(.
表示任何字符,*是量词,表示介于0和无穷大之间。)
\.gz
表示:字面点,后跟gz(.
需要转义,即前面加一个反斜杠\
表示一个字面点。 / p>
\z
表示:“字符串结束”。
选项位于结束斜杠之后。(修饰符)
i
表示不区分大小写。
s
启用DOTALL模式。也就是说,它使.
匹配任何字符,甚至是换行符,通常它不匹配。
最后:
=~
表示它将正则表达式与变量$filename
匹配。
总之,它检查变量$filename
以查看它是否包含具有.gz
(不区分大小写)扩展名的文件的名称。
参考链接:
答案 1 :(得分:3)
基本上,正则表达式^.*\.gz\z/si
匹配任何以.gz
结尾的字符串(不区分大小写)...即使字符串长达数行!
(我建议删除s
标志 - 请参阅下面的含义。)
正则表达式由/
分隔。您可以使用其他分隔符,例如!
。
=~
测试正则表达式是否能够匹配字符串。
用令牌解释正则表达式
^
.*
*
\.
gz
\z
i
标志使其不区分大小写。 s
标志激活DOTALL
模式,允许点跨线匹配。