在Perl SO 答案中,海报使用此代码来匹配空字符串:
$userword =~ /^$/; #start of string, followed immediately by end of string
Run Code Online (Sandbox Code Playgroud)
为了这布赖恩·d FOY评论:
你不能这么说,因为那将匹配一个特定的非空字符串.
问题:哪个非空字符串与此匹配?它只是一个由" \r" 组成的字符串吗?
use strict;
use warnings;
use Test::More;
ok("\n" =~ /^$/);
ok("\n" =~ /^\z/);
ok("\n" =~ /^\A\z/); # Better as per brian d. foy's suggestion
done_testing;
Run Code Online (Sandbox Code Playgroud)
如果你想测试一个字符串是否是空的,使用/^\z/或者看看长的$str是零(这是我喜欢的).
输出:
ok 1 not ok 2 not ok 3
我们来看看文档,为什么不呢?引用perlre,
$:匹配行的结尾(或在结尾处的换行符之前)
特定
\z:仅在字符串结尾处匹配
这意味着/^$/相当于/^\n?\z/.
$ perl -E'$_ = ""; say /^$/ ||0, /^\n?\z/ ||0, /^\z/ ||0;'
111
$ perl -E'$_ = "\n"; say /^$/ ||0, /^\n?\z/ ||0, /^\z/ ||0;'
110
Run Code Online (Sandbox Code Playgroud)
请注意,/m更改内容^并$匹配.在/m,^任何"行"的开头$匹配,并在任何换行之前和字符串末尾匹配.
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /^/g'
matched at 0
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /$/g'
matched at 7
matched at 8
Run Code Online (Sandbox Code Playgroud)
并使用/ m:
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /^/mg'
matched at 0
matched at 4 <-- new
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /$/mg'
matched at 3 <-- new
matched at 7
matched at 8
Run Code Online (Sandbox Code Playgroud)
\A,\Z并且\z不受以下因素的影响/m:
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\A/g'
matched at 0
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\z/g'
matched at 8
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\Z/g'
matched at 7
matched at 8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3126 次 |
| 最近记录: |