Maybe it's just me, but this is something I've struggled with on a couple of occasions.
Since I can't give any of the examples I'm actually working on, I'll have to use something which is less obviously useful.
The simple version is to use bash to loop through some files and use Perl to print out the filename (as stored by the bash script):
for file in `ls *.label`;
do perl -le "\$a=1;print \"${file} \$a\"";
done
The important things to make this work are:
1. The double quotes used for the Perl script. This enables the variable interpretation by bash.
2. Escape sequences for the double quotes used in the Perl script - the double quotes are necessary to make Perl interpret the Perl variables.
3. Escape sequences for the Perl variables - this distinguishes the Perl variables from the bash ones.
The final script I used was a lot more complicated than this and was used to generate a series of files. I guess I can put the script in as, with no context, it has little meaning.
for si in `seq 38 47`;
do perl -F',' -lane "if(@F==4)
{
print \"\$F[0]\\t\$h{\$F[0]}:\$F[1],\$F[2]\"
if \$F[3] == $si and \!\$i{\$F[0]}++;
}
else{
@F=split/\t/;
\$h{\$F[1]} = \$F[0];
}" file1 file2 > output_${si}.tsv;
done
It would have been nicer just to write a separate Perl script and call that, really. But there you go.