Wenn du nur Leerzeichen erwischen willst, dann kannst du das einfach mit
$str =~ s/ /_/g; machen. \W steht nicht für Leerzeichen sondern für alle Zeichen die nicht Buchstaben, Ziffern oder Unterstrich sind. Wenn du alle nicht druckbaren Zeichen, also z.B. auch Tabulatoren u.ä., willst, kannst du \s benutzen. Unter
perlre findest du Tabellen mit allen Zeichenklassen.
Btw. wenn du nur einzelne Zeichen durch andere ersetzen willst, dann kannst du besser
tr/// benutzen, das ist genau für den Fall gedacht. Also in deinem Fall z.B.
$str =~ tr/ /_/;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B