Mam ciąg jak poniżej:
$var = "123456d";
lub ewentualnie
$var = "123456"; # (no alpha char)
Będzie to mieć maksymalnie 6 cyfr, nie mniej niż 5, jeśli to ma znaczenie. Bez cyfr, spacji i znaków specjalnych w liczbach.
W moim skrypcie Perl muszę usunąć i zwrócić ostatni znak alfa ORAZ ciąg bez znaku alfa.
Przypuszczam, że można użyć D i przycinania? czy siekać? ale musi istnieć łatwy sposób, aby szybko zdobyć obie zmienne.
my $numbers =~ s/D+?$var//; #???
my $alpha = substr($var, 0, -1); ## but no alpha check.
lub
my $alpha = chop($var); ## but no alpha check.
to jeśli a-Z i tak dalej, aby sprawdzić, czy jest to znak alfa.
Lub limit mojego rozwiązania umiejętności:
$alpha = $var;
$alpha =~ s/[0-9]//ig;
$var =~ s/[a-Z]//ig;
$numbers = $var;
więc wynik:
($numbers == "123456")
($alpha eq "d") (or "" if nothing)
Wydaje mi się, że jest to zbyt trywialne, aby o to zapytać, ale po prostu nie mogę znaleźć ani napisać odpowiedniego rozwiązania.
Moje użycie = ~ s to tylko przypuszczenie, ale musi istnieć lepszy sposób lub nawet jedna linijka.
Dzięki za wszelką pomoc tutaj ...
SORRY po myśli! Po cyfrach mogą występować 2 znaki alfanumeryczne! Powinny być zwrócone razem jako pojedynczy var ($ alpha eq „dd”)
Znalazłem to też do0:
$var =~ s{^([0-9]+).*}{$1}i;
Odpowiedzi:
6 dla odpowiedzi № 1Za pomocą pL
pozwoli uniknąć przechwytywania liczb, a włączenie opcjonalnego ciągu zapewni, że dopasowanie nastąpi nawet dla liczb bez zakończonych liter.
my $var = "123456d";
my ($num, $letter) = $var =~ /^(d+)(pL)?$/;
Pamiętaj, że nie możesz użyć w
aby uchwycić możliwą literę końcową, ponieważ zawiera ona także cyfry. Jak zauważył tchrist, p{alpha}
można również użyć.
0 dla odpowiedzi nr 2
Może coś takiego:
my $numbers =~ s/(d+)(p{alpha}+)?/$1/;
my $alpha = $2;
The $1
odnosi się do pierwszego przechwytywania w nawiasach, $2
odnosi się do drugiego.
Edytowane: używane d
dla cyfry, p{alpha}
dla alfa.