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 № 1Para 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.