It seems each record now ends with a blank line, rather than the word “end” as in the OP. And each record is a collection of lines of the form key = value. So we add another loop, and create a hash in which each key is the storeId (as before), but each value is a (reference to a) nested hash of key/value pairs:
#! perl
use strict;
use warnings;
use Data::Dump qw( pp );
my $var = <<END_RECORDS;
storeId = 12
phoneNumber = (270) 111-1111
nameString = My Store1
isOutOfStock = true
isReplenishable = true
isNotAvailable = false
availbilityCode = 0
stockStatus = Out of stock
distance = 4.41
city = Highland Village
stateCode = TX
zipCode = 11111
fullStreet = some random street address
storeTypeId = 1
isStorePUTEligible = true
walmartExpressStore = false
canAddToCart = false
storeId = 500
phoneNumber = (270) 111-1111
nameString = my store2
isOutOfStock = true
isReplenishable = true
isNotAvailable = false
availbilityCode = 0
stockStatus = In stock
distance = 6.82
city = Roanoke
stateCode = TX
zipCode = 76262
fullStreet = some random street address
storeTypeId = 1
isStorePUTEligible = true
walmartExpressStore = false
canAddToCart = false
END_RECORDS
my %hash;
while ($var =~ /storeId = (\d+)\s+(.*?)\n(?:\n|$)/gs)
{
my ($key, $val) = ($1, $2);
my %h;
$h{$1} = $2 while $val =~ /(\S+)\s*=\s*(.*?)\n/g;
$hash{$key} = { %h };
}
print "storeID = $_\n", pp($hash{$_}), "\n" for
grep { exists $hash{$_}->{stockStatus} &&
$hash{$_}->{stockStatus} =~ /(?:In|Limited) Stock/i
+} keys %hash;
Output:
2:42 >perl 523_SoPW.pl
storeID = 500
{
availbilityCode => 0,
city => "Roanoke",
distance => 6.82,
fullStreet => "some random street address",
isNotAvailable => "false",
isOutOfStock => "true",
isReplenishable => "true",
isStorePUTEligible => "true",
nameString => "my store2",
phoneNumber => "(270) 111-1111",
stateCode => "TX",
stockStatus => "In stock",
storeTypeId => 1,
walmartExpressStore => "false",
zipCode => 76262,
}
2:42 >
Hope that helps,