Perl中的Say功能

Perl中的Say功能,perl,Perl,我有一个下面的Perl代码 $fs_headerrecord_cut_casettenumber_pad_len = 2; $fs_headerrecord_batch_casettenumber_start_pos = 21; $fs_headerrecord_batch_casettenumber_data_len = 2; $fs_header_record = 1; $pad_length = 0; my $dir = "."; opendir(DIR, $dir) or die "Ca

我有一个下面的Perl代码

$fs_headerrecord_cut_casettenumber_pad_len = 2;
$fs_headerrecord_batch_casettenumber_start_pos = 21;
$fs_headerrecord_batch_casettenumber_data_len = 2;
$fs_header_record = 1;
$pad_length = 0;
my $dir = ".";
opendir(DIR, $dir) or die "Cannot open directory: $dir!\n";
my @files = readdir(DIR);
closedir(DIR);

open my $out, ">>output.txt" or die "Cannot open cutfile!\n";
foreach my $file (@files) {

    #next unless (-M $file <= 1 && $file =~ /^fs.*\.DTA$/i) ;
    if (-M $file <= 1 && $file =~ /^fs.*\.DTA$/i) {
        #print log_date() ."$file\n";
        print "$file\n";
        open my $fs_in, "<$file" or die "Cannot open $file!\n";
        while (<$fs_in>) {
            $recordlength = substr($_,220,1);
            if ($recordlength == $fs_header_record) {
                say $out ' ' x $pad_length, 'H', substr($_,0,1), say $out ' ' x $fs_headerrecord_cut_casettenumber_pad_len, substr($_, $fs_headerrecord_batch_casettenumber_start_pos, $fs_headerrecord_batch_casettenumber_data_len);
预期产量

H 14
H 14
H 14
H 14
H 14

当我打印“H”时,它被打印在一个新的行中。谁能告诉我我的代码出了什么问题吗?

您使用的是2个字符,因此您将打印2个换行符

参见:打印vs说:

另外,您正在打印一个额外的“1”,因为您正在打印第二个say的返回值作为第一个say的参数

尝试替换此:

say $out ' ' x $pad_length, 'H', substr($_,0,1), say $out ' ' x $fs_headerrecord_cut_casettenumber_pad_len, substr($_, $fs_headerrecord_batch_casettenumber_start_pos, $fs_headerrecord_batch_casettenumber_data_len);                
为此:

print $out ' ' x $pad_length, 'H', substr($_,0,1);
say $out ' ' x $fs_headerrecord_cut_casettenumber_pad_len, substr($_, $fs_headerrecord_batch_casettenumber_start_pos, $fs_headerrecord_batch_casettenumber_data_len);
或将所有数据发送到同一say语句:

say $out 
    ' ' x $pad_length, 'H', 
    substr($_,0,1),
    $out ' ' x $fs_headerrecord_cut_casettenumber_pad_len, 
    substr($_, $fs_headerrecord_batch_casettenumber_start_pos, $fs_headerrecord_batch_casettenumber_data_len);

您正在使用2个字符,因此将打印2个换行符

参见:打印vs说:

另外,您正在打印一个额外的“1”,因为您正在打印第二个say的返回值作为第一个say的参数

尝试替换此:

say $out ' ' x $pad_length, 'H', substr($_,0,1), say $out ' ' x $fs_headerrecord_cut_casettenumber_pad_len, substr($_, $fs_headerrecord_batch_casettenumber_start_pos, $fs_headerrecord_batch_casettenumber_data_len);                
为此:

print $out ' ' x $pad_length, 'H', substr($_,0,1);
say $out ' ' x $fs_headerrecord_cut_casettenumber_pad_len, substr($_, $fs_headerrecord_batch_casettenumber_start_pos, $fs_headerrecord_batch_casettenumber_data_len);
或将所有数据发送到同一say语句:

say $out 
    ' ' x $pad_length, 'H', 
    substr($_,0,1),
    $out ' ' x $fs_headerrecord_cut_casettenumber_pad_len, 
    substr($_, $fs_headerrecord_batch_casettenumber_start_pos, $fs_headerrecord_batch_casettenumber_data_len);

打印之间不要使用逗号(
说“嗨”,说“嗨”;
),而是将它们作为单独的语句编写,
说“嗨”;说“好”。打印的顺序是相反的,你也会得到额外的
1
打印;比如说$out''x$pad_length,$write;说出$out''x$fs\U headerrecord\u cut\u casette number\u pad\u len,substr($\u,$fs\u headerrecord\u batch\u casette number\u start\u pos,$fs\u hea derrecord\u batch\u casette number\u data\u len);然后1没有被打印出来,但是“H”在另一行上,我想要像上面显示的预期输出一样忽略上面的注释。现在解决了这一问题。
说“blah”
相当于
打印“blah\n”
-换句话说,它在您所说的任何内容的末尾添加了一行新行。打印之间不要使用逗号(
说“嗨”,说“嗨”
),而是将它们作为单独的语句编写,
说“嗨”;说“好”。打印的顺序是相反的,你也会得到额外的
1
打印;比如说$out''x$pad_length,$write;说出$out''x$fs\U headerrecord\u cut\u casette number\u pad\u len,substr($\u,$fs\u headerrecord\u batch\u casette number\u start\u pos,$fs\u hea derrecord\u batch\u casette number\u data\u len);然后1没有被打印出来,但是“H”在另一行上,我想要像上面显示的预期输出一样忽略上面的注释。现在解决了这一问题。
say“blah”
相当于
print“blah\n”
——换句话说,它在您所说的任何内容的末尾添加了一行新行。