2012-08-01 11 views
6

chciałbym wstawić numer pomiędzy dwoma wzorami:

$s = 'id="" value="div"'; 
$s =~ s/(id=")(".*)/$1123$2/; 

Oczywiście mam błąd i „value =” div” w wyniku . Oczekiwany wynik to id = "123" value = "div".

W wymianie Chodziło mi $ 1, to numer 123, a następnie $ 2, ale nie $ 1123, a następnie 2 $. Jaki jest poprawny zamiennik w regex? Chciałbym to zrobić w jednym pojedynczym wyrażeniu regularnym.

Dzięki.

Odpowiedz

16
$s =~ s/(id=")(".*)/$1123$2/; # Use of uninitialized value $1123 in concatenation (.) or string 

Chociaż oczekiwano go zastąpić $1, Perl widzi go jako zmiennej $1123. Perl nie może wiedzieć, że masz na myśli $1. Więc trzeba ograniczyć variablisation do $1 określając go jako ${1}:

$s =~ s/(id=")(".*)/${1}123$2/; 

To jest zawsze dobry pomysł, aby zawierać następujące elementy w górnej części skryptu. Zaoszczą ci dużo czasu i wysiłku.

use strict; 
use warnings; 

Na przykład, uruchamiając skrypt z powyższych modułów zawartych rezultaty w komunikat o błędzie:

Use of uninitialized value $1123 in concatenation (.) or string at /tmp/test.pl line 7. 

(lekceważyć zgłoszoną nazwę skryptu oraz numery linii.) Wyraźnie stwierdza, co perl oczekiwano. twierdzenia

Innym podejściem użyciu look-tył i antycypowana:

$s =~ s/(?<=id=")(?=")/123/; 
+0

dzięki. Szukałem składni $ {1}. –

+0

Wolę wygląd za i przed siebie – justintime

+0

@justintime, Bonus: Wersja z lookarounds jest szybsza, ponieważ nie ma żadnych przechwytów. – ikegami

1

Inny wariant: przykład

$s =~ s/(id=")(".*)/$1."123".$2/e; 

Zastosowanie:

$ cat 1.pl 
$s = 'id="" value="div"'; 
$s =~ s/(id=")(".*)/$1."123".$2/e; 
print $s,"\n"; 

$ perl 1.pl 
id="123" value="div" 
+0

To jest nieprawidłowy wariant. Wynik będzie id = "." 1 "." value = "div" –

+0

Dodałem przykład użycia. Jak widać wariant nie jest zły –

+0

@AlexBroitman prawdopodobnie spóźnił się na '/ e' na końcu. – stevesliva

Powiązane problemy