Reputation: 1879
Hello I am working with a perl script and i have the following variable:
$string1="ZZ:DPHTEST1ZZ";
I would like to build two additional variables by getting a substring from $string1 using ":" as separator, I would like to add two prints in my script with the following outputs:
print $fragment1;
print $fragment2;
to get the following output:
ZZ
DPHTEST1ZZ
I tried with:
$fragment1 = substr $string1, index($string1, ':');
print $fragment1;
but I am getting:
:DPHTEST1ZZ
therefore I would like to appreciate to get this strings, by using the separator, i was researching a little and I just found methods of perl that use the position, thanks for the support,
Upvotes: 0
Views: 89
Reputation: 1429
You can try the following
my @splitted = $string1 =~ /([A-Z0-9]*):([A-Z0-9]*)/g;
print "@splitted";
Or if you want to be more specific with this you will match "ZZ:DPHTEST1ZZ" but you won't match "ZZX:DPHTEST1ZZ":
my @splitted = $string1 =~ /([A-Z0-9]{2}):([A-Z0-9]*)/g;
Upvotes: 2
Reputation: 54333
The index
builtin returns the first position of a string within a string. For your example, index($string1, ':')
is 2. If you want your substr
to start after the :
just add one so you get three.
my $fragment2 = substr $string1, index($string1, ':') + 1;
To get the stuff on the left of the :
, you need to take substr
from the beginning of the string to the first occurrence of :
.
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;
The above approach is useful in SQL1 or other languages that do not include split
. However, Perl does include split
, so my ($fragment1, $fragment2) = split /:/, $string1
as suggested by Mr. Llama is the more sensible option. It's way more readable.
1) I linked a MySQL documentation here. Note the absence of split
and a comment somewhere at the bottom saying that there is no such function including explanations of how to do substr
/index
instead.
Upvotes: 5