Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
如何在perl中使用哈希将文件中的名称更改为另一个名称?_Perl_Hash_Perlscript - Fatal编程技术网

如何在perl中使用哈希将文件中的名称更改为另一个名称?

如何在perl中使用哈希将文件中的名称更改为另一个名称?,perl,hash,perlscript,Perl,Hash,Perlscript,我有一个这样的文件 >;1; AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG >;2; AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG >;3; AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG 我想将每个数字更改为相应的字符串 我编写了下面的Perl程序,但

我有一个这样的文件

>;1;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>;2;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
>;3;
AACTCTGGGACAATGGCACACGGGAAACAGATAATGAACGATCAGCACAGGGAACTAGCG
我想将每个数字更改为相应的字符串

我编写了下面的Perl程序,但我不知道它有什么问题

%lista2 = (
    1  => "CAT00.3",
    2  => "CAT43.1",
    3  => "CAT40.3"
);

open(OA, ">file2.txt");

foreach $key ( keys %lista2 ) {

    open(SAL, "file.txt");

    while ( <SAL> ) {
        chomp;

        if( />/ ) {

            @w = split("\t");   
            $r = 0;
            s/\;//g;

            if ( /%lista2[i]/ ) {    
                print OA "$_ $lista2{$key}\n" ;
                $r = 1;
            }
        }
    }
}

close(SAL);
close(OA);

但我不知道怎么做。

我想你的方向是对的。但在这条路上的某个地方,我们迷路了,似乎随机地试图向任何方向奔跑。你的代码中有很多错误

比如说,你怎么能有这两行呢

        if ( /%lista2[i]/ ) {    
            print OA "$_ $lista2{$key}\n" ;
一次正确的尝试访问一个值(
$lista2{$key}
)和一次完全错误的尝试(
%lista2[i]

然后,由于您只打印到
OA
if(
“/$lista2{$key}/”
),因此您将完全删除输出中的所有其他行。你的例子表明,你不想这样

此外,还要更改循环嵌套。不要一次又一次地打开文件,而是打开一次,迭代行,每次迭代都迭代散列键。你的方式并没有完全错误,但你知道,打开和关闭文件并不便宜。说到关闭文件:您没有关闭外部循环体中的
SAL
,但这就是您重新打开它的地方

并至少使用一些非常基本的错误处理。检查
open
是否失败。一个错误的文件名和程序失败,没有任何迹象表明原因。让你的生活更轻松

如果以后仍要在输出中附加一个
\n
,并再次生成一行,为什么要使用
chomp()
?跳过这个

我不知道如何解释这些台词:

        @w = split("\t");   
        $r = 0;
        s/\;//g;
那是剩菜吗?他们没有做任何有用的事

最后但并非最不重要的一点是,建议
使用strict并可能
使用警告以获取问题点上的指针

这里有一个通过你的例子

#!/usr/bin/perl

use strict;
use warnings;

my %lista2 =
(
  1  => "CAT00.3",
  2  => "CAT43.1",
  3  => "CAT40.3"
);

if (!open(OA, ">file2.txt")) {
 die($!);
}
if (!open(SAL, "file.txt")) {
  die($!);
}

foreach my $line (<SAL>) {
  foreach my $key (keys(%lista2)) {
    if ($line =~ s/^>;$key;$/>$lista2{$key}/) {
      last;
    }
  }
  print(OA $line);
}

close(SAL);
close(OA);
#/usr/bin/perl
严格使用;
使用警告;
我的%lista2=
(
1=>“CAT00.3”,
2=>“CAT43.1”,
3=>“CAT40.3”
);
如果(!open(OA,“>file2.txt”)){
死亡($!);
}
如果(!open(SAL,“file.txt”)){
死亡($!);
}
foreach我的$line(){
foreach my$key(key(%lista2)){
如果($line=~s/^>;$key;$/>$lista2{$key}/){
最后;
}
}
打印(OA$行);
}
关闭(SAL);
关闭(OA);
事实上,在内核中,它可以简化为模式替换。不需要拆分或任何操作。但是,如果您是初学者,模式可能会令人困惑


我还提高了详细程度以使事情更清楚。

您真的在使用PerlScript吗?(这与Perl中编写的脚本不同)如果没有,请考虑删除标签。
#!/usr/bin/perl

use strict;
use warnings;

my %lista2 =
(
  1  => "CAT00.3",
  2  => "CAT43.1",
  3  => "CAT40.3"
);

if (!open(OA, ">file2.txt")) {
 die($!);
}
if (!open(SAL, "file.txt")) {
  die($!);
}

foreach my $line (<SAL>) {
  foreach my $key (keys(%lista2)) {
    if ($line =~ s/^>;$key;$/>$lista2{$key}/) {
      last;
    }
  }
  print(OA $line);
}

close(SAL);
close(OA);