Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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 第24行和第26行的语法错误。我不知道';我不知道为什么?_Perl_Bioinformatics - Fatal编程技术网

Perl 第24行和第26行的语法错误。我不知道';我不知道为什么?

Perl 第24行和第26行的语法错误。我不知道';我不知道为什么?,perl,bioinformatics,Perl,Bioinformatics,bioinfo2.pl第24行附近的语法错误“;” bioinfo2.pl第26行“}”附近的语法错误 由于编译错误,bioinfo2.pl的执行被中止 print "Enter file name......\n\n"; chomp($samplefile = <STDIN>); open(INFILE,"$samplefile") or die "Could not open $samplefile"; @residue_name= (); @residue_count= ()

bioinfo2.pl第24行附近的语法错误“;” bioinfo2.pl第26行“}”附近的语法错误 由于编译错误,bioinfo2.pl的执行被中止

print "Enter file name......\n\n";
chomp($samplefile = <STDIN>);
open(INFILE,"$samplefile") or die "Could not open $samplefile";

@residue_name= ();
@residue_count= ();
while($newline = <INFILE>) 
{
    if ($newline =~ /^ATOM/)
    {
        chomp $newline;
        @columns = split //, $newline;  
        $res = join '', $columns[17], $columns[18], $columns[19];
        splice @columns,0;
        $flag=0
        for ($i = 0; $i<scalar(@residue_name); $i++;) 
        {
            if (@residue_name[i] == $res)
            {
                @residue_count[i] = @residue_count[i] + 1;
                $flag=1;

            }
        }
        if($flag==0)
        {
            push(@residue_name, $res);  
        }

        for ($i = 0; $i<scalar(@residue_name); $i++) 
        {   
            print (@residue_name[i], "-------", @residue_count[i], "\n");
        }
    }   
}               
打印“输入文件名…”\n\n;
chomp($samplefile=);
打开(infle,“$samplefile”)或死“无法打开$samplefile”;
@剩余物名称=();
@剩余物计数=();
而($newline=)
{
如果($newline=~/^ATOM/)
{
咀嚼$newline;
@列=拆分/,$newline;
$res=联接“”,$columns[17],$columns[18],$columns[19];
拼接@柱,0;
$flag=0

对于($i=0;$i),建议
使用strict;使用警告
。这将强制您声明变量(您可以使用
my
),并排除许多可能的错误

以下是我注意到的几件事:

  • 在Perl5 v10及更高版本中,您可以使用
    say
    功能(
    使用5.010
    使用功能“say”
    )。这类似于
    打印
    ,但在末尾添加了一个换行符

  • 永远不要使用双参数形式的open。这会导致一些安全问题。请提供显式的open模式。此外,您可以使用标量作为文件句柄;这提供了一些很好的功能,如自动关闭文件

    open my $INFILE, '<', $samplefile or die "Can't open $samplefile: $!";
    
    请注意,符号现在是一个
    @
    ,因为我们使用多个元素

  • splice@columns,0
    是一种表示“从数组中删除所有元素并返回它们”的奇特方式。这不是必需的(以后不会从该变量中读取)。如果使用词法变量(用
    my
    声明),则
    while
    循环的每次迭代都将收到一个新变量。如果确实要删除内容,可以
    undef@columns
    。这应该更有效

  • 实际错误:在开始循环之前,需要在
    $flag=0
    后面加一个分号来终止语句

  • 实际错误:C-style for循环包含parens中包含的三个表达式。您的最后一个分号将它们分成4个表达式,这是一个错误。只需删除它,或者查看我的下一个提示:

  • C样式循环(
    for(foo;bar;baz){}
    )非常痛苦且容易出错。如果您只在一个范围(例如索引)上迭代,则可以使用范围运算符:

    for my $i (0 .. $#residue_name) { ... }
    
    $#
    符号给出数组的最后一个索引

  • 订阅数组(访问数组元素)时,必须包含索引的符号:

    $residue_name[$i]
    
    请注意,数组的符号是
    $
    ,因为我们只访问一个元素

  • 模式
    $var=$var+1
    可以缩短为
    $var++
    。这使用增量运算符

  • $flag==0
    可以缩写为
    !$flag
    ,因为除零之外的所有数字都被认为是真的

  • 这是脚本的一个重新实现。它将文件名作为命令行参数;这比提示用户更灵活

    #!/usr/bin/perl
    
    use strict; use warnings; use 5.010;
    
    my $filename = $ARGV[0]; # @ARGV holds the command line args
    open my $fh, "<", $filename or die "Can't open $filename: $!";
    
    my @residue_name;
    my @residue_count;
    
    while(<$fh>) { # read into "$_" special variable
       next unless /^ATOM/; # start a new iteration if regex doesn't match
    
       my $number = join "", (split //)[17 .. 19]; # who needs temp variables?
    
       my $push_number = 1; # self-documenting variable names
       for my $i (0 .. $#residue_name) {
           if ($residue_name[$i] == $number) {
               $residue_count[$i]++;
               $push_number = 0;
           }
       }
       push @residue_name, $number if $push_number;
    
       # are you sure you want to print this after every input line?
       # I'd rather put this outside the loop.
       for my $i (0 .. $#residue_name) {
           say $residue_name[$i], ("-" x 7), $residue_count[$i]; # "x" repetition operator
       }
    } 
    
    !/usr/bin/perl
    使用严格;使用警告;使用5.010;
    my$filename=$ARGV[0];#@ARGV保存命令行args
    
    打开my$fh,“建议
    使用strict;使用警告
    。这会强制您声明变量(您可以使用
    my
    ),并排除许多可能的错误

    以下是我注意到的几件事:

  • 在Perl5 v10及更高版本中,您可以使用
    say
    功能(
    使用5.010
    使用功能“say”
    )。这类似于
    打印
    ,但在末尾添加了一个换行符

  • 永远不要使用双参数形式的open。这会导致一些安全问题。请提供显式的open模式。此外,您可以使用标量作为文件句柄;这提供了一些很好的功能,如自动关闭文件

    open my $INFILE, '<', $samplefile or die "Can't open $samplefile: $!";
    
    请注意,符号现在是一个
    @
    ,因为我们使用多个元素

  • splice@columns,0
    是一种表示“从数组中删除所有元素并返回它们”的奇特方式。这不是必需的(以后不会从该变量中读取)。如果使用词法变量(用
    my
    声明),则
    while
    循环的每次迭代都将收到一个新变量。如果确实要删除内容,可以
    undef@columns
    。这应该更有效

  • 实际错误:在开始循环之前,需要在
    $flag=0
    后面加一个分号来终止语句

  • 实际错误:C-style for循环包含parens中包含的三个表达式。您的最后一个分号将它们分成4个表达式,这是一个错误。只需删除它,或者查看我的下一个提示:

  • C样式循环(
    for(foo;bar;baz){}
    )非常痛苦且容易出错。如果您只在一个范围(例如索引)上迭代,则可以使用范围运算符:

    for my $i (0 .. $#residue_name) { ... }
    
    $#
    符号给出数组的最后一个索引

  • 订阅数组(访问数组元素)时,必须包含索引的符号:

    $residue_name[$i]
    
    请注意,数组的符号是
    $
    ,因为我们只访问一个元素

  • 模式
    $var=$var+1
    可以缩短为
    $var++
    。这使用增量运算符

  • $flag==0
    可以缩写为
    !$flag
    ,因为除零之外的所有数字都被认为是真的

  • 这是脚本的一个重新实现。它将文件名作为命令行参数;这比提示用户更灵活

    #!/usr/bin/perl
    
    use strict; use warnings; use 5.010;
    
    my $filename = $ARGV[0]; # @ARGV holds the command line args
    open my $fh, "<", $filename or die "Can't open $filename: $!";
    
    my @residue_name;
    my @residue_count;
    
    while(<$fh>) { # read into "$_" special variable
       next unless /^ATOM/; # start a new iteration if regex doesn't match
    
       my $number = join "", (split //)[17 .. 19]; # who needs temp variables?
    
       my $push_number = 1; # self-documenting variable names
       for my $i (0 .. $#residue_name) {
           if ($residue_name[$i] == $number) {
               $residue_count[$i]++;
               $push_number = 0;
           }
       }
       push @residue_name, $number if $push_number;
    
       # are you sure you want to print this after every input line?
       # I'd rather put this outside the loop.
       for my $i (0 .. $#residue_name) {
           say $residue_name[$i], ("-" x 7), $residue_count[$i]; # "x" repetition operator
       }
    } 
    
    !/usr/bin/perl
    使用严格;使用警告;使用5.010;
    my$filename=$ARGV[0];#@ARGV保存命令行args
    
    打开我的$fh,“我花了一段时间才偶然发现所有各种错误。正如其他人所说,使用
    使用警告;
    使用严格;

    规则#1: