写入"内存文件"的Perl会播放模式匹配技巧

jwd*_*jwd 11 regex perl

当我运行此代码时,我打印出"否":

my $memory_file;
my $fh;
open ($fh, '>', \$memory_file);
print $fh "abc";
if( $memory_file =~ m/^.*$/ )
{ print "yes\n" }
else
{ print "no\n" }
Run Code Online (Sandbox Code Playgroud)

如果我打印出来$memory_file,内容确实如此"abc".

如果我将模式更改为.*(no ^$)它按预期工作.

如果我$memory_file = "abc"在比赛前放线,我会打印出"是"(按照最初的预期).

这到底是怎么回事?

(这是perl 5.14.1)

更新:关于PerlMonks的更多讨论.它看起来像一个bug,我会记录它.

更新2:优秀的Perl开发人员修复了这个错误:https://rt.perl.org/rt3//Public/Bug/Display.html?id = 108398

TLP*_*TLP 5

这是行尾的角色,搞乱了.虽然常规作业有效:

my $str = "abc";
print "Works" if $str =~ /^.*$/;
Run Code Online (Sandbox Code Playgroud)

......问题中的代码没有.此正则表达式应匹配任何字符串,因为它也匹配空字符串.即使未定义的值也会匹配(尽管它会引起警告).此外,^.*确实匹配.

唯一合理的解释是,由于某种原因,无论执行什么检查以匹配字符串的结尾,它都找不到它.字符串的结尾丢失了.

奇怪的是,取而代之的$\z作品.但不是\Z.

添加换行也有效.这有点意义,因为添加换行符意味着在非多线正则表达式意义上也会添加字符串的结尾.

我不知道为什么会发生这种情况的内部工作原理,但我怀疑当使用这种特殊形式的"赋值"时,字符串结尾的标记永远不会放在字符串上.一种"原始"赋值,它将正则表达式中字符串结尾的检查混淆.

感觉就像一个bug.也许这个特殊功能尚未得到妥善维护.