2009-07-30 20 views
0

私のコードは正常に動作していましたが、今は壊れています。問題を軽減するには、次のようにします。セパレータでソース・ストリングを(データベースからは重要ですが)分割する必要があります。セパレータは固定されておらず、ユーザが文字列で指定します。私はこれをやりました:Perlでユーザー提供の文字列区切りに沿って文字列を分割するにはどうすればよいですか?

@results = split($splitString, $sourceStr); 

これは、ユーザーがセパレータとしてプラス記号(+)を入力すると壊れます。メッセージは少しわかりにくいです:

Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE 

スプリットは文字列は期待していませんが、正規表現は分かりません。しかし、私は$ splitStringを動作させる方法でエスケープする方法を見つけることはできません。ここに私のおもちゃの例があります:

my $s = 'string 1 + $splitChar + string 2'; 
    my $splitChar = "+"; 
    my @result = split(/\\$splitChar/, $s); 

    print "num of results ".scalar(@result)."\n"; 
    foreach my $value (@result) { 
    print "$value\n"; 
    } 

しかし、全く分裂しません。私はいくつかのバリエーションを試しましたが、どれも効果がありませんでした。ユーザー指定のセパレータはおそらく1文字に制限されていることに注意してください。ただし、複数文字の解決策が優れています。

(はい、独自の分割機能を作成することもできますが、それは重要ではありません)。

(一重引用符で囲まれた文字列の例では$splitCharは目的にかなっていますが、それは明らかです)。

答えて

15

splitへの最初の引数はパターンです:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $sep = '+'; 
my $source = 'one+two+three'; 

my @results = split /\Q$sep\E/, $source; 

use Data::Dumper; 
print Dumper \@results; 

perldoc -q "quote a variable"参照してください。

+0

偉大な、私は\ Qと\ Eについて知りませんでした。それが私の必要なものです。どうもありがとう –

6

問題は+が前各号の「一つ以上」を示すためにメタ文字として使用されていることである(そう、あなたがそれはあなたが望むあるものを指定せずに、一つ以上を求めている)

シナンの答えがあります良いものをチェックして、quotemetaの機能もチェックしてください。

関連する問題