2016-11-21 2 views
0

Здравствуйте Я работаю с Perl-скрипт, и я иметь следующую переменную:Как получить следующие подстроки, используя perl?

$string1="ZZ:DPHTEST1ZZ"; 

Я хотел бы построить две дополнительные переменные, получая подстроку $ string1 с помощью «:» в качестве разделителя, я хотел бы добавить два отпечатка в моем сценарии со следующими выходами:

print $fragment1; 
print $fragment2; 

, чтобы получить следующий вывод:

ZZ 
DPHTEST1ZZ 

Я попытался с:

$fragment1 = substr $string1, index($string1, ':'); 
print $fragment1; 

, но я получаю:

:DPHTEST1ZZ 

Поэтому я хотел бы, чтобы оценить, чтобы получить эти строки, используя разделитель, я был немного, и я только что нашел методу Perl, которые используют исследование позиция, спасибо за поддержку,

+5

Почему бы не использовать 'split'? '($ fragment1, $ fragment2) = split (/: /, $ string1, 2);' –

+1

@ Mr.Llama, большое спасибо за предложение, о котором я не знал, что этот метод доступен, если вы публикуете полный ответ то я соглашусь на это, мое единственное условие - разделить мой первоначальный раскол на две нужные части, – neo33

+0

Проблема, похоже, в том, что вы не потратили времени на изучение языка Perl. Кажется, вы не сталкиваетесь с конкретной проблемой, и здесь нет ничего, что быстрая сглаживание основ Perl не решила бы. – Borodin

ответ

5

The index builtin возвращает первую позицию строки в строке. Для вашего примера index($string1, ':') - 2. Если вы хотите, чтобы ваш substr начинался после :, просто добавьте его, чтобы вы получили три.

my $fragment2 = substr $string1, index($string1, ':') + 1; 

Чтобы получить материал на левой стороне :, вы должны принять substr от начала строки до первого появления :.

use strict; 
use warnings; 
use feature 'say'; 

my $string1 = "ZZ:DPHTEST1ZZ"; 

my $left = substr $string1, 0, index($string1, ':'); 
my $right = substr $string1, index($string1, ':') + 1; 

say $left; 
say $right; 

выше подход полезен in SQL или другие языки, которые не включают в себя split. Однако Perl включает split, поэтому my ($fragment1, $fragment2) = split /:/, $string1 как suggested by Mr. Llama - более разумный вариант. Это более читаемо.

1) Я связал здесь документацию по MySQL. Обратите внимание на отсутствие split и комментарий где-то внизу, говорящий, что нет такой функции, включая объяснения, как делать substr/index.

+0

@ Большое спасибо, это очень полезно, однако как я могу получить первую часть, так как хочу две части в разных переменных, спасибо за поддержку. – neo33

+0

@ neo33 Я обновил ответ, чтобы включить объяснение – simbabque

+0

Большое спасибо за поддержку, Perl немного странно. – neo33

2

Вы можете попробовать следующее

my @splitted = $string1 =~ /([A-Z0-9]*):([A-Z0-9]*)/g; 
print "@splitted"; 

Или, если вы хотите быть более точным с этим вы будете соответствовать «ZZ: DPHTEST1ZZ», но не будет соответствовать «ZZX: DPHTEST1ZZ»:

my @splitted = $string1 =~ /([A-Z0-9]{2}):([A-Z0-9]*)/g; 
+1

При выполнении совпадения иногда лучше использовать обратный набор символов: '/^([^:]+):(.*)/' – shawnhcorey

Смежные вопросы