/ / Problem z dopasowaniem wyrażeń regularnych w Perlu - regex, perl

Problem z dopasowaniem wyrażenia regularnego w Perlu - regex, perl

Jestem nowy w Perlu i każda pomoc będzie mile widziana. Mam 2 zmienne: $release i $env_type. Chcę sprawdzić, czy ciąg zawiera $release_$env_type, potem zrób coś. Na przykład,

$release="beta";
$env_type="testing";
so string is beta_testing

Fragment kodu:

if ( $_ =~ /${release}_${env_type}/ ) {
#do Something
}

Ten warunek nie zostanie rozwiązany. Uprzejmie daj mi znać, jaka jest poprawna składnia, aby to sprawdzić? Szukałem w Google, ale nie dostałem żadnego dobrego wpisu.

Uprzejma pomoc!

Mam plik z zawartością:

admin_vh_c9_simv2_edg=/console,/consolehelp
idminternal_vh_c9_simv2_edg=/oim,/soa-infra
sso_vh_c9_simv2_edg=/oim,/soa-infra,/odsm

my $env_type = "edg";
my $release  = "c9_simv2";
#Input file containing contexts
my $idmInternal = "./IdmContexts.conf";
if ( !-e $idmInternal ) {
die "Unable to find the file $idmInternal!n";
}

open( MYFILE, $idmInternal );
while (<MYFILE>) {
chomp;
if ( $_ =~ /${release}_${env_type}/ ) {
push( @filtered, $_ );
}

}

Odpowiedzi:

0 dla odpowiedzi № 1

Aby naprawdę powiedzieć, co się dzieje, możesz wstrzyknąć kod przed testem. Na przykład skompilować najpierw wyrazy regularne, a następnie wydrukuj.

# compile the regex first
my $regex = qr/${release}_${env_type}/;

say qq{$regex="$regex"};

# then print your scanned text
say qq{$_="$_"};

if ( m/$regex/ ) {
# do something
}

Jeśli zamierzasz jawnie powiązać wyrażenie regularne, użyj zmiennych:

my $string = $_;
if ( $string =~ m/$regex/ ) {
}

W przeciwnym razie po prostu mecz „zmienna kontekstowa” ($_).

 if ( m/$regex/ ) {
}

Ponadto USUW pomógłby wykryć kilka problemów, proaktywnie:

# Before everything else
use strict;
use warnings;

6 dla odpowiedzi nr 2

Twój kod jest w porządku. Problem jest gdzie indziej. Następujące wydruki match.

my $release="beta";
my $env_type="testing";

$_ = "so string is beta_testing";

if ( $_ =~ /${release}_${env_type}/ ) {
print "matchn";
}

Uwaga: /Q${release}_${env_type}/ byłoby lepiej. Dopilnuje, aby znaki specjalne w interpolowanych zmiennych pasowały do ​​siebie.


Najbardziej prawdopodobny problem: czytasz wartość $release i / lub $env_type z pliku i zapomniałem chomp końcowy znak nowej linii.


1 dla odpowiedzi nr 3

Jeśli używasz $_ to zadziała.

if (m/${release}_${env_type}/)
{
# Do something
}

The m// operator dopasowania automatycznie łączy się z $_. Nie ma potrzeby jednoznacznego wiązania.