2017-01-26 6 views
2

、:Perlはこの文字列を有効にする最良の方法は何Perlで

7705554200から7705554299

7705554200から4299

は、私が知っているどのように最初の6桁を取得しますが、ハイフンの後ろに挿入する方法はわかりません。

#!/usr/bin/perl 

use strict; 
use warnings; 

my $num = '7705554200-4299'; 

# Check to see number is a range 
if ($num =~ /-/) 
{ 
    # Pull area code and exchange 
    my $extract = substr($num, 0, 6); 
    print "Area code + exchange: $extract\n"; 
} 

答えて

2

はあなたが本当に正規表現パターンマッチングのフルパワーを必要としないので、すぐ後に一部の文字を挿入するためにindexsubstrの四番目のパラメータを使用することができます

#!/usr/bin/perl 

my $num = '7704814200-4299'; 

# Check to see if it is a range 
if ($num =~ /-/) 
{ 
    # Pull area code and exchange 
    my $extract = substr($num, 0, 6); 
    print "Extracted this: $extract\n"; 

    $num =~ s/-/-$extract/; 
    print $num; 

} 
+0

、あなたはデバッグ情報をプリントアウトすることができ解決策を見つけたし、おそらく保守が容易です。おめでとう!すべての解決策は正規表現で行うべきではありません! (時にはそれはやむを得ないが、今回はない) – Tanktalus

+0

Tanktalusによるコメントをサポートするために、これは素晴らしい解決策です。クリスタルで綺麗で素敵なメインテーブル。ほとんどの場合、複雑な正規表現に代わるものがあり、通常はより良いコードです。 – zdim

+0

Regexはここでは難しいことではありません(私はあなたがやった方が好きです)、そして参照のために:$ num =〜s /(\ d {6})\ d * - \ K/$ 1/'。唯一のやり方は '\ K'です。これは特定の形の冒険的なlookbehind_です。これらのパターンは、消費することなく何かがあることを_assert_するだけです。 '\ K'は、置換がそれに触れないように、前にマッチしたものをすべて '解放'します。だから我々はそれを再入力する必要はありません。 ['this in perlretut'](http://perldoc.perl.org/5.8.9/perlretut.html#Looking-ahead-and-looking-behind) – zdim

0

をそれを考え出しましたハイフン:

use strict; 
use warnings; 

my $num = '7705554200-4299'; 
substr($num, index($num, '-') + 1, 0, substr($num, 0, 6)); 
print "$num\n"; 

ます。また、左辺値としてsubstrを使用することができますが、個人的に、私はそのバージョンがよりobtuであることを見つけますSE:

substr($num, index($num, '-') + 1, 0) = substr($num, 0, 6); 

結果:あなたは正規表現でこれを行うことができますが

7705554200-7705554299 
関連する問題