2016-04-13 7 views
0

Sayıları bir dizgede düzenlemeye ve daha önce olduğu gibi geri yerleştirmeye çalışıyorum.perl dizgeden ayıklamak, düzenlemek, orjinal pozisyonunda dize geri koymak

Örnek:

$string = "struct:{thin:[[75518103,75518217],[75518338,75518363],[75532810,75533910],],thick:[[75518363,75518424],[75521257,75521463],],}"; 

Rakamları düzenlemeniz gerekir, ama öyle de dize kalanını devam etmek istiyorum. Ek olarak parantez sayısı değişebilir.

Şimdiye kadar @array = split (',',$string); ile "" at dize bölmek ve çıkarılan sayılar şimdi dizede orijinal yerine geri numaralarını koymak istiyorum

foreach (@array) { 
      $_ =~ s/\D//g; 
      $_ = $number - $_; 
} 

ile düzenleme için, ama ben nasıl olduğunu bilmiyorum. Bir şekilde, dizideki sayıları bölmeden ve sayıları ayıklamadan düzenlemenin daha iyi bir yolu olduğunu umuyorum. Umarım bana yardımcı olabilirsiniz

+0

Bu JSON ya da bir çözümleyici içeren başka bir iyi bilinen bir biçim mi? – simbabque

+0

Ne yazık ki değil – Jule

+0

Yığın Taşma ve bu arada Perl etiketine hoş geldiniz. Çok iyi ilk mesaj! :) – simbabque

cevap

2

Düzenli ifade değiştirmeyi with the /e flag kullanabilir, uzun numaraları arayabilir ve değiştirme bölümünde Perl kodunu çalıştırabilirsiniz.

use strict; 
use warnings; 
use feature 'say'; 

my $number = 100_000_000; 
my $string = "struct:{thin:[[75518103,75518217],[75518338,75518363],[75532810,75533910],],thick:[[75518363,75518424],[75521257,75521463],],}"; 

$string =~ s/(\d+)/{$number - $1}/eg; 

say $string; 

__END__ 

struct:{thin:[[24481897,24481783],[24481662,24481637],[24467190,24466090],],thick:[[24481637,24481576],[24478743,24478537],],} 

Dizede başka numara yoksa, bu işe yarar. Eğer daha fazla mantık söz konusu ise, onu bir altprograma da taşıyabilir ve sadece ikamede bunu çağırabilirsiniz.

sub replace { 
    return $_ % 2 ? $_ * 2 : $_/4; 
} 

$string =~ s/(\d+)/{replace($1)}/eg; 

Ayrıca, arama modelini biraz daha hassas bir şekilde düzeltmeniz gerekebilir.

+1

çok teşekkür ederim! Mükemmel çalıştı! – Jule

1

Sadece regex için değerlendirme değiştiricisini buldum! Şimdi

$string =~ s/([0-9]+)/$number-$1/eg; 

ile yaptım ve işe yaradı!

+0

Dokümantasyon için zaman harcamam gerekirdi. : P – simbabque