Perl:从文本文件的第四列减去常量(8)

Perl:从文本文件的第四列减去常量(8),perl,Perl,我的代码工作正常,只是在输出文件的开头打印了一些垃圾。我可以手动删除它,但希望我的脚本能够正常工作。输入文件是19列数字数据,以“,”(逗号空格)分隔,每列的标题位于第0行(我想跳过,另一个问题) 我使用./column3Minus8.pl INPUTFILE>OUTPUT.txt调用我的文件 #!/usr/bin/perl use strict; while(<>) { my @columns = split ", ", $_; $columns[3] =

我的代码工作正常,只是在输出文件的开头打印了一些垃圾。我可以手动删除它,但希望我的脚本能够正常工作。输入文件是19列数字数据,以“,”(逗号空格)分隔,每列的标题位于第0行(我想跳过,另一个问题)

我使用./column3Minus8.pl INPUTFILE>OUTPUT.txt调用我的文件

 #!/usr/bin/perl

 use strict;

 while(<>) {
    my @columns = split ", ", $_;
    $columns[3] = sprintf("%.5f", $columns[3] - 8);
    print join ", ", @columns;  
 }
#/usr/bin/perl
严格使用;
while(){
我的@columns=split“,”,$\;
$columns[3]=sprintf(%.5f',$columns[3]-8);
打印联接“,”,@列;
}
output.txt开头的垃圾是

 #!/usr/bin/perl
 , , , -8.00000
 , , , -8.00000use strict;
 , , , -8.00000
 , , , -8.00000while(<>) {
 , , , -8.00000 my @columns = split ", ", $_;
 , -8.00000 $columns[3] = sprintf("%.5f", $columns[3] - 8);
 , , -8.00000   print join ", ", @columns;  
 , -8.00000}, , , -8.00000
#/usr/bin/perl
, , -8.00000
,-8.00000使用严格;
, , -8.00000
,-8.00000while(){
,-8.00000 my@columns=split“,”,$;
,-8.00000$columns[3]=sprintf(“%.5f”,$columns[3]-8);
,-8.00000打印连接“,”,@列;
, -8.00000}, , -8.00000
EDITFIX:我在命令行调用中调用了两次perl文件,这导致了垃圾。“/column3Minus8.pl column3Minus8.pl INPUTFILE>OUTPUT.txt”Oops。不过我还是想知道如何跳过第一行。并替换常量


TODO:将常量8替换为变量。跳过第0行,这样它就不会被编辑。

您的程序仍然存在一些小问题。您还应该设置
use warnings
,并且应该
chomp
每一行,以防它是您要修改的最后一列

该程序添加必要的代码,从命令行的第四列中获取要减去的值,并复制文件的第一行

你应该像这样运行它

column3minus.pl 8 inputfile > outputfile

#/usr/bin/perl
严格使用;
使用警告;
我的$delta=shift;
打印标量;#重复第一行
而(){
咀嚼;
my@columns=split/,\s*/;
$columns[3]=sprintf'.5f',$columns[3]-$delta;
打印联接(“,”,@列),“\n”;
}

@MarcB:你似乎不知道自己在说什么
将从
@ARGV
STDIN
中列出的文件中读取(如果该文件为空)。是的,这就是上面发生的情况。它是从argv[0]读取的,argv[0]是脚本本身。@johnstamos:请写出问题,让它们自己站起来。从“我让它工作”开始,我对你的问题一无所知,我对你的问题也没什么感觉it@MarcB当前位置请不要误导他人。Perl不是C,脚本文件位于
$0
$ARGV[0]
是第一个命令行参数。您可以使用
读取命令行中指定的文件,如
/script.pl inputfile>outputfile
,而无需显式打开它们。@Paul:好的。但是我很难相信输入两次源文件名是一个常见的问题。但第一行第四列标题仍在输出文件中编辑和打印。结果仍然是-8.00000。不过现在一定要看到关于它的警告。请问您得到的警告是什么?参数“Header 4”在./column3Minus8.pl第24行,第1行不是减法(-)中的数字。第24行是sprintf行。@johnstamos:我猜,您没有打印标量的
行。
#!/usr/bin/perl

use strict;
use warnings;

my $delta = shift;

print scalar <>;  # Duplicate first line

while (<>) {
  chomp;
  my @columns = split /,\s*/;
  $columns[3] = sprintf '%.5f', $columns[3] - $delta;
  print join(', ', @columns), "\n";
}