google了一通后把几个指令合在一起,一步解决子目录嵌套下文件名编码转换
不过因为刚学perl,这段代码基本上是抄抄改改,将就着能用,还有些不致命错误不知道怎么去解决,希望高手能帮忙

代码: 全选
#!/usr/bin/perl -w
#unzip.pl
#用于解决windows下用zip压缩的文件到linux下时因编码问题而造成的文件名乱码
#gb2312(cp936) 转至 UTF8
#需要外部命令 7z 与 convmv (安装包p7zip-full,convmv)
#
use strict;
use warnings;
if ( $#ARGV < 0 ){
print "Usage: unzip.pl zipfilename\n";
exit -1;
}else{
@fn = split /\./,$ARGV[0],2;
if(-e $ARGV[0]){
`LANG=C 7z x -o@fn[0] $ARGV[0]`;
chdir @fn[0];
`convmv --notest -f cp936 -t utf8 *`;
my @tree=<*>;
foreach (@tree){
&if_a_tree($_);
}
sub if_a_tree{
if(-d){
# print "$_ is a directory\n";
chdir $_;
`convmv --notest -f cp936 -t utf8 *`;
my @tree=<*>;
foreach(@tree){
&if_a_tree($_);
}
chdir "..";
}
# if(-f){
# print "$_ just a file\n";
# }
}
}else{
print "文件不存在!!\n";
exit;
}
}
检查未输入文件名时出现的提示内容Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 19.
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 17.
Possible unintended interpolation of @fn in string at ./3.pl line 17.
Scalar value @fn[0] better written as $fn[0] at ./3.pl line 18.
Global symbol "@fn" requires explicit package name at ./3.pl line 15.
Global symbol "@fn" requires explicit package name at ./3.pl line 17.
Global symbol "@fn" requires explicit package name at ./3.pl line 18.
BEGIN not safe after errors--compilation aborted at ./3.pl line 20.