Your C-style for loop runs from zero to minus one, because $#efile refers to the last index of the array @efile, which is created on the spot - empty. Your task will be much simpler if it is written using the idiomatic $_ variable.
#!/usr/bin/perl
use warnings;
use strict;
my $input_file = 'dump.vcd';
open (INPUT, '<', $input_file)
or die $!;
while (<INPUT>) {
s/\$var\w \d+ ([!,\#,\",\$,\%,&]) (\w) \$end/\$var $1 $2/;
print;
}
close INPUT;
That has the benefit that the file is read and processed one line at a time, with no space taken for an array to hold it. I added
warnings and
strict, which would have told you what was wrong. I also improved
open to the 3-arg form and added error checking in case
open fails.
I don't believe your character class is exactly what you think it is because of all the commas and escapes. I didn't modify the s/// statement because I didn't know its intent.