如何在Perl中打印变量

34

我有一些代码看起来像这样

my ($ids,$nIds);
while (<myFile>){
    chomp;
    $ids.= $_ . " ";
    $nIds++;
}
这应该是将我的myFile中的每一行连接起来,nIds应该是我的行数。我如何打印出我的$ids$nIds
我尝试了简单地使用print $ids,但 Perl 抱怨了。
my ($ids, $nIds)

是一个列表,对吗?有两个元素?


12
“Perl complains” 的表述不够清晰,最好提供实际错误信息的文本。 - tadmc
3个回答

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

Perl报了什么错?print $ids应该可以工作,不过你可能想在末尾显式地使用print或者隐式地使用say-l/$\来添加换行符号。

如果你想要在一个字符串中插入变量并且紧接着插入的内容看起来像是变量的一部分但实际上不是,那么将变量名用{}括起来:

print "foo${ids}bar";

嘿,我在想,如果我想要在变量后立即打印一些内容,该怎么办?也就是说,我想实现这个:print "内容:$idsHeyIamhere" - Juto

13
当你提问时,应该始终包含所有相关的代码,其中最关键的一句是你问题的核心:print语句。print语句很可能是最重要的信息,第二个最关键的信息是错误,你也没有包含在内。下次,请把它们都包含进来。 print $ids应该是一个相当不容易出错的语句,但仍有可能出错的原因:
1. $ids未定义。会给出“print中的未定义值”警告。 2. $ids超出范围。使用strict时,会给出致命警告“全局变量$ids需要显式包名称”,否则会给出上述未定义的警告。 3. 你忘了在行末加分号。 4. 你试图执行“print $ids $nIds”,这时perl认为$ids应该是一个文件句柄,然后你会得到一个类似“向未打开的文件句柄打印”的错误。 解释 1. 不应该发生。如果你像这样做(假设你没有使用严格模式),可能会发生这种情况。
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.

你确定吗?当我说 $array[500] = "yada" 时,scalar @array 的值会变成501。 - BarneySchmale

9
我该如何打印出我的 $ids 和 $nIds?
(注:$ids 和 $nIds 是变量名,可能代表某种ID或编号)
print "$ids\n";
print "$nIds\n";

我尝试简单地打印 $ids,但是Perl报错了。
关于什么报错?未初始化的值?也许您的循环由于打开文件时出现错误而从未进入。请确保检查 open 是否返回错误,并确保使用 use strict; use warnings;。
my ($ids, $nIds) 是一个列表,对吗?有两个元素?
这是一个(非常特殊的)函数调用。$ids,$nIds 是一个包含两个元素的列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接