if ($line eq @virus[$x])
should be
if (index($line, $virus[$x]) >= 0)
because the signature might not occupy the entire "line".
Furthermore, the virus could span more than one "line", so
if (index($line, $virus[$x]) >= 0)
should be
if (index($raw_data, $virus[$x]) >= 0)
If you start using read, be careful not to reintroduce the problem. The signature could span more than one block of data.
Next, you should optimize your algo to search for more than one virus at once. For example, if Virus.A has signature "asdfgjkl" and Virus.B has signature "asdfhjkl", it could be faster to search using /asdf[gh]jkl/.