Аз съм нов в 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//
операторът за връзка автоматично се свързва с $_
, Няма нужда да се обвързва изрично.