/ / Problema com correspondência de expressões regulares em Perl - regex, perl

Problema com correspondência de expressões regulares em Perl - regex, perl

Eu sou novo no Perl e qualquer ajuda será apreciada. Eu tenho 2 variáveis: $release e $env_type. Quero verificar se uma string contém $release_$env_type, então faça algo. Por exemplo,

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

Fragmento de código:

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

Isso se a condição não for resolvida. Por favor, deixe-me saber qual é a sintaxe correta para fazer essa verificação? Pesquisei no Google, mas não obtive uma boa postagem.

Por favor ajude!

Eu tenho um arquivo com conteúdo:

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, $_ );
}

}

Respostas:

0 para resposta № 1

Para realmente dizer o que está acontecendo, você pode injetar código antes do teste. Por exemplo compilar um regex primeiro e depois imprimi-lo.

# 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
}

Se você for vincular explicitamente a uma regex, use as variáveis:

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

Caso contrário, simplesmente partida a "variável de contexto" ($_).

 if ( m/$regex/ ) {
}

Além disso, o USUW ajudaria a identificar alguns problemas, de forma proativa:

# Before everything else
use strict;
use warnings;

6 para resposta № 2

Seu código está bom. O problema está em outro lugar. As seguintes impressões match.

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

$_ = "so string is beta_testing";

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

Nota: /Q${release}_${env_type}/ seria melhor. Isso garantirá que caracteres especiais nas variáveis ​​interpoladas correspondam a si mesmos.


Problema mais provável: você lê o valor de $release e / ou $env_type de um arquivo e esqueci de chomp a nova linha à direita.


1 para resposta № 3

Se você estiver usando $_ então isso vai funcionar.

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

o m// O operador de correspondência se liga automaticamente a $_. Não há necessidade de vinculá-lo explicitamente.