2009-04-15 11 views
4

は、私はPerlで、次のコードを持っている:Perlの正規表現内のすべてのASCII文字(正規表現の特殊文字を含む)はどのように処理しますか?

if (index ($retval, $_[2]) != -1) { 
    @fs = split ($_[2], $_[1]); 

$_[2]は、区切り文字変数であると$_[1]は、区切り文字が中に存在し得ることは文字列です($_[0]が他の場所で使用されている)あなたはこのコードがであることを推測している可能性があります。これらの変数名でサブルーチンを実行します。

とにかく、私の質問に、私の区切り文字が'a'または':'のような無害なものであれば、コードはうまくいくように動作します。しかし、それが'\'文字のように、Perlの正規表現によって解析されるものである場合、それは想定されているように動作しません。それはこれをしたいと思うので、全くそこには意味がありません

split (/\/, $_[1]); 

split (/\//, $_[1]); 

だから、心の私のそれのすべてとsplit関数でPerlのようなものを見ることになるので、これは理にかなっています質問:これは私が答えることができないことです: "私が$_[2]に入れた区切り文字、またはすべてのASCII文字が、それが他のものと解釈されていない文字として扱われるようにするにはどうすればいいですか?それはマングルされた取得せずに正規表現で動作しますので、事前に

おかげで、

ロバート

+1

可能重複どのように私はPerlの正規表現で特殊文字を処理するのですか?](http://stackoverflow.com/questions/576435/how-do-i-handle-special-characters-in-a-perl-regex) – daxim

答えて

13

あなたが適切に$_[2]を逃れるためにquotemetaを使用することができます。これを行う必要があります:

my $quoted = quotemeta $_[2]; 
@fs = split($quoted, $_[1]); 

また、正規表現で\ Qを使用してエスケープすることもできます。 perlreの「エスケープシーケンス」を参照してください。

+0

ありがとう、それはバットの右に働いていました。問題が解決しました。あなたのために1つのチック。 –

6
split /\Q$_[2]/, $_[1] 
+1

あなたはこれが正しい私はそれをすることができる方法の一つですが、彼のバットから完全に働いたので、私のダニは他の人に行く必要があります。これによりエラーが発生しました。 –

+0

「@fs =」とセミコロンはありませんか?それは私が考えることができるすべてのものです(PEBKAC以外)。そうでなければ、他の答えと同じくらい良い。 – runrig

+0

申し訳ありませんが、それは私のせいでした。しかし、フリードーはもっと多くの情報と説明を与えてくれました。私は受け入れられた答えとして彼を選ぶことについてあまり気にしません。申し訳ありませんが、私は私の選択をそのまま残します。 runrig:PEBKACと言う理由はありません。私は明らかに新しいです。 –

1

副題として、$_[1]$_[2]の変数が、自動的に@_のサブ配列の配列を参照していると思われます。

それは便利です - サブの先頭に次のようなものを使用し、一般的な方法 - かなり、ここで説明するあなたを保存し、それ自体であなたのコードはより理解しただろう:[の

sub mysub { 
    my ($param1, $string, $delim) = @_; 
    # ... 
} 
+0

ありがとう、私はこれについて考えなければならないが、私はPerlにはかなり新しく、私はCのように扱いすぎていることが分かっている。 –

関連する問題