note
Eily
<p>You only have one @user_info in the whole file right? Otherwise your regex will give the wrong result: everything from the first @user_info_start to the <i>last</i> @user_info_end. This is because of '.*' in your regex, because * is 'greedy' it will try to match as much as possible. This means that after @user_info_start has been found, the regex engine will basically jump to the end of the file, and move backward one character at a time (this is called backtracking) until it finds @user_info_end.</p>
<p>To have the reverse behaviour: go forward one character at a time right after finding @user_info_start you could use (.*?), where [doc://perlreref|.*?] will start by matching nothing, and only consume an extra character when necessary.</p>
<p>That being said, I really like the idiom presented by [haukex] [id://1233688|here], which is quite intuitive when you know that the [doc://perlop#Range-Operators|..] operator is read as "FROM .. TO" so in [haukex]'s code that would be FROM @user_info_start TO @user_info_end. One thing you can add to his code if you only have one occurence of @user_info in the whole file is an exit from the loop as soon as you have found your data:
<c>use warnings;
use strict;
my @userinfo;
LINE: while (<DATA>) {
chomp;
if ( /\@user_info_start/ ... /\@user_info_end/ ) {
push @userinfo, $_;
}
elsif (@userinfo) {
last LINE; # stop looking
}
}
use Data::Dumper;
print Dumper(\@userinfo);
__DATA__
xxxxxxxxxxx
xxxx*@user_info_start
xxxx*@Title : Mr
xxxx*@Username : xxxxx
xxxx*@Filetype : txt
xxxx*@Version : 0001
xxxx*@Create_Date : 20190407
xxxx*@Product : xxxx
xxxx*@user_info_end
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
</c></p>
1233681
1233681