/ / Проблем с съвпадение на regex в Perl - regex, perl

Издаване с регекс съвпадение в Perl - regex, perl

Аз съм нов в Perl и всяка помощ ще бъде оценена. Имам 2 променливи: $release и $env_type, Искам да проверя дали съдържа низ $release_$env_type, тогава направете нещо. Например,

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

Кодов фрагмент:

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

Това, ако условие не "т се решат. Моля да ме уведомите какъв е правилният синтаксис, за да направите тази проверка? Търсих в Google, но не получи никакъв добър пост ..

Моля, помогнете!

Имам файл със съдържание:

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

}

Отговори:

0 за отговор № 1

За да разберете какво се случва, можете да инжектирате кода преди теста. Например събирам първо и след това го отпечатайте.

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

Ако искате да се свържете изрично с регулярни изрази, използвайте променливи:

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

Иначе просто мач "контекстната променлива" ($_).

 if ( m/$regex/ ) {
}

Също така, USUW ще помогне да се забележат някои проблеми, проактивно:

# Before everything else
use strict;
use warnings;

6 за отговор № 2

Вашият код е добре. Проблемът е другаде. Следните разпечатки match.

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

$_ = "so string is beta_testing";

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

Забележка: /Q${release}_${env_type}/ би било по-добре. Той ще се увери, че специалните символи в интерполираните променливи съвпадат.


Най-вероятният проблем: Прочетете стойността на $release и / или $env_type от файл и е забравил chomp приключващия нов ред.


1 за отговор № 3

Ако използвате $_ тогава това ще работи.

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

Най- m// операторът за връзка автоматично се свързва с $_, Няма нужда да се обвързва изрично.