Perl SO answerでは、投稿者がこのコードを使用して空の文字列を照合しました。
$userword =~ /^$/; #start of string, followed immediately by end of string
ブライアン・ド・フォイは次のようにコメントしています。
それは特定の空でない文字列に一致するため、実際にはそうは言えません。
質問: これに一致する空でない文字列はどれですか? \r
「 」のみからなる文字列ですか?
Perl SO answerでは、投稿者がこのコードを使用して空の文字列を照合しました。
$userword =~ /^$/; #start of string, followed immediately by end of string
ブライアン・ド・フォイは次のようにコメントしています。
それは特定の空でない文字列に一致するため、実際にはそうは言えません。
質問: これに一致する空でない文字列はどれですか? \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;
文字列が空かどうかをテストしたい場合は、 length ofがゼロ/^\z/
かどうかを使用または確認します (これが私の好みです)。$str
出力:
わかりました 1 大丈夫じゃない 2 大丈夫じゃない 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
whatとmatchが/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
/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
\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
正規表現/^$/
は、空でない文字列と一致します"\n"
。
デフォルトでは、Perl の正規表現マッチングは、文字列に 1 つの「行」のテキストが含まれていると想定します。
^
行の先頭に一致します。修飾子がない場合/m
、これは文字列の先頭と同じです。
$
行の終わり、または最後の改行の前のいずれかに一致します (これが、/^$/
空でない string に一致させるもの"\n"
です)。
引用perldoc perlre
:
デフォルトでは、"^" 文字は文字列の先頭のみ、"$" 文字は末尾 (または末尾の改行の前) のみに一致することが保証されており、Perl は文字列が1行。埋め込まれた改行は、"^" または "$" と一致しません。ただし、「^」が文字列内の改行の後に一致し (改行が文字列の最後の文字である場合を除く)、「$」が一致するように、文字列を複数行のバッファーとして扱いたい場合があります。改行の前に一致します。オーバーヘッドが少し増えますが、パターン マッチ演算子で /m 修飾子を使用してこれを行うことができます。
脚本:
my $str = "\n";
my $test1 = ($str =~ /^$/) ? 1 : 0;
my $test2 = ($str =~ /\A\z/) ? 1 : 0;
print "$test1, $test2\n";
出力:
1, 0