1

次のスクリプトでは、なぜ がif評価されtrue、なぜHas space!印刷されるのでしょうか?

物件p{Space}ですUnicodeよね?ただし、 に$_は Unicode 文ではなく ASCII 文が含まれています。このスクリプトはどのように機能しますか?

#!/usr/bin/perl

use strict;
use warnings;

$_ = "yabba dabba doo";

if(/\p{Space}/){
    print "Has space!\n";
}
4

1 に答える 1

0

true文字列内にスペース ( ) があるため、 と評価され\sます。次のように書くこともできます。

if ( $_ =~ /\s/ ) { .. }

ポイントは、文字列全体をチェックしないことです。文字列全体がスペースかどうかを確認したい場合は、次のように記述します。

if ( $_ =~ /^\s+$/ ) { .. } 

またはユニコードで:

if ( $_ =~ /^\p{PosixSpace}$/ ) { .. } 

あなたの場合、ASCII 範囲を使用せず、POSIX 範囲と の同義語を使用しますPosixSpace。また、大文字と小文字が区別されないため、元のスペースがあなたのスペースになります ;)

同義語のリストは、\p{} および \P{} からアクセスできるプロパティにあります(ポイント 3239 を参照)。POSIX 文字クラスとそれに相当する Unicode および Perl のリスト (3 番目のブロックは興味深いものです) はCharacter classesにあります。

\p{PerlSpace}を使いたかったのかもしれません。

于 2013-08-06T06:26:54.117 に答える