x is your friend. It will let you insert some white space to add legibility. Maybe not in the one-liner, but certainly during the regex development.

m is your friend. You've got it enabled, but are not actually using it. It's ideal for specifying the end/start of lines that you are doing with $o

s may not be your friend in this case. If you turn off s, then . actually corresponds to the character class [^\n].

While this may not work for the full range of output in your particular case, maybe something like:
dmidecode | perl -e 'undef $/;for (split /(?<=\n)\n+/, <STDIN>) {print if /RAM socket/ && !/Not Installed/}' would work. Keep it simple.

#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

Comment on
Re: grabbing dmidecode memory data - there's got to be a better way
Select or Download CodeReplies are listed 'Best First'.

Yes, that's cool! First slurp, then split on paragraph chunks, and finally simply match against keywords in the block. That's nice. Could you have not done that without the zero-width positive look-behind? Seems like that would be the best way, but I still wonder...

You could simplify the split to \n\n+ or something similar, but then you need to modify something else to keep the records newline separated. I'm willing to go to pretty extreme lengths to keep print if /RAM socket/ && !/Not Installed/ clean just because of personal taste. TIMTOWTDI.