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