如何在Perl中打印变量

时间:2011-05-30 22:50:22

标签: perl

我有一些看起来像

的代码
my ($ids,$nIds);
while (<myFile>){
    chomp;
    $ids.= $_ . " ";
    $nIds++;
}

这应该连接我myFile中的每一行,而nIds应该是我的行数。如何打印$ids$nIds

我只是尝试print $ids,但Perl抱怨道。

my ($ids, $nIds)

是一个清单,对吗?有两个元素?

3 个答案:

答案 0 :(得分:28)

print "Number of lines: $nids\n";
print "Content: $ids\n";

Perl是如何抱怨的? print $ids应该可以使用,但您最后可能需要换行,可以使用上述print明确表示,也可以使用say-l / $\隐式添加换行符。

如果你想在一个字符串中插入一个变量并在它后面有一些看起来像是变量的一部分而不是变量的变量,那么将变量名括在{}中:

print "foo${ids}bar";

答案 1 :(得分:11)

在提问时,您应始终包含所有相关代码。在这种情况下,print语句是您问题的中心。 print语句可能是最重要的信息。第二个最重要的信息是错误,您也没有包含这些错误。下一次,包括这两个。

print $ids应该是一个相当难以说清楚的声明,但这是可能的。可能的原因:

  1. $ids未定义。发出警告undefined value in print
  2. $ids超出范围。使用use strict,会发出致命警告Global variable $ids needs explicit package name,否则会显示未定义警告 上面的警告。
  3. 你在结束时忘记了一个分号 这条线。
  4. 您尝试print $ids $nIds, perl认为$ids 应该是一个文件句柄,并且 您收到错误,例如print to unopened filehandle
  5. <强>说明

    1:不应该发生。如果您执行此类操作,则可能会发生(假设您未使用strict):

    my $var;
    while (<>) {
        $Var .= $_;
    }
    print $var;
    

    给出未定义值的警告,因为$Var$var是两个不同的变量。

    2:如果你这样做,可能会发生:

    if ($something) {
        my $var = "something happened!";
    }
    print $var;
    

    my在当前块内声明变量。在街区之外,它超出了范围。

    3:足够简单,常见错误,容易修复。使用use warnings更容易找到。

    4:也是一个常见的错误。有许多方法可以在同一print语句中正确打印两个变量:

    print "$var1 $var2";  # concatenation inside a double quoted string
    print $var1 . $var2;  # concatenation
    print $var1, $var2;   # supplying print with a list of args
    

    最后,一些perl魔术提示:

    use strict;
    use warnings;
    
    # open with explicit direction '<', check the return value
    # to make sure open succeeded. Using a lexical filehandle.
    open my $fh, '<', 'file.txt' or die $!;
    
    # read the whole file into an array and
    # chomp all the lines at once
    chomp(my @file = <$fh>);
    close $fh;
    
    my $ids  = join(' ', @file);
    my $nIds = scalar @file;
    print "Number of lines: $nIds\n";
    print "Text:\n$ids\n";
    

    将整个文件读入数组仅适用于小文件,否则会占用大量内存。通常,首选逐行。

    变体:

    • print "@file"相当于 $ids = join(' ',@file); print $ids;
    • $#file将返回最后一个索引 在@file。由于数组通常从0开始, $#file + 1相当于scalar @file

    你也可以这样做:

    my $ids;
    do {
        local $/;
        $ids = <$fh>;
    }
    

    通过暂时“关闭”$/输入记录分隔符(即换行符),您将使<$fh>返回整个文件。 <$fh>真正做的是在找到$/之前读取,然后返回该字符串。请注意,这会保留$ids中的换行符。

    逐行解决方案:

    open my $fh, '<', 'file.txt' or die $!; # btw, $! contains the most recent error
    my $ids;
    while (<$fh>) {
        chomp;
        $ids .= "$_ "; # concatenate with string
    }
    my $nIds = $.; # $. is Current line number for the last filehandle accessed.
    

答案 2 :(得分:9)

如何打印$ ids和$ nIds?
print "$ids\n";
print "$nIds\n";
我只是尝试print $ids,但Perl抱怨。

抱怨什么?未初始化的价值?由于打开文件时出错,可能从未输入过循环。请务必检查open是否返回了错误,并确保您使用的是use strict; use warnings;

my ($ids, $nIds)是一个列表,对吗?有两个元素?

这是一个(非常特殊的)函数调用。 $ids,$nIds是一个包含两个元素的列表。