Perl 第24行和第26行的语法错误。我不知道';我不知道为什么?
bioinfo2.pl第24行附近的语法错误“;” bioinfo2.pl第26行“}”附近的语法错误 由于编译错误,bioinfo2.pl的执行被中止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= ()
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: