次のスニペットは何をしますか?
if ($str =~ /^:(\w+)/) {
$hash{$1} = 1;
}
最初に成功したキャプチャをハッシュのキーとして使用します。に$strは 1 つ以上の単語が含まれている必要がありますが、その^:意味がわかりません
^:行頭の「:」記号を意味します。また、後に単一の「単語」のみをキャプチャします:
あなたが言った:
「そして、$str には 1 つ以上の単語が含まれている必要があります ...」
これが単なるタイプミスなのか、それともあなたの意図があなたの小さな例と異なるのかはわかりません。今(あなたの投稿によると)、あなたの正規表現は次のような文字列と一致します::Hello. Perl では、これは次のようにも記述できます。
my %hash = ();
my $str = ':Hello';
$hash{ $1 }++ if $str =~ /^:(\w+)/;
ここで^:、正規表現を に変更した場合[:^]、つまり、文字列内の単語の前に ' start of string '^またはコロンを付ける必要がある:場合、正規表現は次のような行に一致する可能性があります: 'Hello:World:Perl:Script';(おそらくこれが本当の意図でした)。
このような文字列は、while ループで分析できます。
$hash{ $1 }++ while $str =~ /[:^](\w+)/g;
キャプチャしたキーを出力print "@{[keys %hash]}";
すると、結果は次のようになりますPerl Script Hello World(キーの順序は定義されていません)。
これらの種類の文字列は UNIX の世界で広く使用されています。たとえば、環境変数PATH、LD_LIBRARY_PATH、およびファイルもその/etc/passwdように見えます。
ところで、これは単なるアイデアです - あなたのタイプミスが実際には 1 つではなかった場合 ;-)