Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在Perl中打开子目录中的文件_Perl_File_Subdirectory - Fatal编程技术网

Can';t在Perl中打开子目录中的文件

Can';t在Perl中打开子目录中的文件,perl,file,subdirectory,Perl,File,Subdirectory,我真的很难过。我是Perl新手,我完全被困在尝试遍历所有子目录、执行操作的过程中。它在根目录(我的脚本所在的目录)中运行良好,但一旦它到达子目录,它就会爆炸。我试着用“或”或q{}来包围文件名,但没有用。我在StackOverflow上搜索了这个问题,人们说它应该可以工作,open可以处理子目录并接受正向斜杠。 它在第一次打开(读取文件)时失败,只要它潜入一个目录并尝试打开“/Horse/Models.meta”。这是在它以与我的脚本相同的级别处理了20个文件之后。有什么想法吗 use 5.01

我真的很难过。我是Perl新手,我完全被困在尝试遍历所有子目录、执行操作的过程中。它在根目录(我的脚本所在的目录)中运行良好,但一旦它到达子目录,它就会爆炸。我试着用“或”或q{}来包围文件名,但没有用。我在StackOverflow上搜索了这个问题,人们说它应该可以工作,open可以处理子目录并接受正向斜杠。 它在第一次打开(读取文件)时失败,只要它潜入一个目录并尝试打开“/Horse/Models.meta”。这是在它以与我的脚本相同的级别处理了20个文件之后。有什么想法吗

use 5.010;
use strict;
use warnings;
use File::Find;

find(sub {
if (-f and /\.meta$/) {
    print "--> " . $File::Find::name . "\n";
    open my $in,  '<',  $File::Find::name    or die "Can't read old file: $!";
    open my $out, '>', "$File::Find::name.new" or die "Can't write new file: $!";

    while( <$in> )
    {
            if(index($_,"  assetBundleName:")!=-1) {
                    print $out "  assetBundleName: mobs\n";
            } else {
                    print $out $_;
            }
    }
    close $out;
    print("mv -f \"" . $File::Find::name . ".new\" \"" . $File::Find::name . "\"\n");

    system("mv -f \"" . $File::Find::name . ".new\" \"" . $File::Find::name . "\"");

  }
}, '.');
使用5.010;
严格使用;
使用警告;
使用File::Find;
查找(子对象){
如果(-f和/\.meta$/){
打印“-->”“$File::Find::name”“\n”;
打开我的$in,“只需使用

rename "$File::Find::name.new", $File::Find::name or die $!;

如果要使用相对路径(即$File::Find::name)而不是仅使用文件名(即$\),则需要指定

find({ wanted   => sub { ... },
       no_chdir => 1,
}, '.');

$File::Find::name
是相对于原始CWD的文件的完整路径名,但是
File::Find
会一直更改CWD,除非您另有说明。告诉File::Find不要使用
no\u chdir=>1
更改CWD,或者使用
$\u
而不是
$File::Find::name
。我建议使用前者


在一个不相关的注释中,您应该使用以下命令来重命名文件,而不是将其逐出

rename($old_name, $new_name)
   or die("Can't rename \"$old_name\" \"$new_name\": $!\n");
如果需要跨文件系统边界重命名文件,可以使用file::Copy的
move
,但如果操作正确,剥离也不太糟糕:

system("mv", "-f", "--", $old_name, $new_name);
die("Error executing mv: $!\n") if $? == -1;
die("mv killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("mv returned error ".( $? >> 8 )."\n") if $? >> 8;

你说的“炸弹”是什么意思?请不要使用“炸弹”、“失败”、“不起作用”等。它没有提供任何关于问题可能是什么的有用信息。谢谢你,我会改变这一点。但是,这仍然不能解释为什么打开我的$in,“失败”是什么意思“?出现了什么错误?无法读取旧文件:setAssetBund.pl第11行没有这样的文件或目录。好的,添加它并再次运行:无法读取旧文件:(./anies/Models.meta)setAssetBund.pl第11行没有这样的文件或目录。(注意:目录结构的某些更改改变了在子目录中遇到的第一个文件,但仍然存在相同的问题)这个名字里也有一个空格。谢谢!!这很有效!我没有关于no\u chdir谢谢!!no\u chdir是我所缺少的。我没有意识到它在改变我的cwd!这是无关的,但是你为什么要写0x7F而不是十进制版本?我没有看到在
$?
perlvar
中使用它,我很好奇如果重要的话,请告诉我们。