我有一些代碼,看起來像如何打印變量在Perl
my ($ids,$nIds);
while (<myFile>){
chomp;
$ids.= $_ . " ";
$nIds++;
}
這應該串連每一行中我myFile
和nIds
應該是我的行數。如何打印我的$ids
和$nIds
?我試過print $ids
,但Perl抱怨。
my ($ids, $nIds)
是一個列表,對嗎?有兩個元素?
我有一些代碼,看起來像如何打印變量在Perl
my ($ids,$nIds);
while (<myFile>){
chomp;
$ids.= $_ . " ";
$nIds++;
}
這應該串連每一行中我myFile
和nIds
應該是我的行數。如何打印我的$ids
和$nIds
?我試過print $ids
,但Perl抱怨。
my ($ids, $nIds)
是一個列表,對嗎?有兩個元素?
如何打印出我的$ ids和$ nIds?
print "$ids\n";
print "$nIds\n";
我想簡單地
print $ids
,但Perl的抱怨。
抱怨什麼?未初始化的值?也許你的循環從未輸入,因爲打開文件時出錯。請務必檢查open
是否返回錯誤,並確保您使用的是use strict; use warnings;
。
my ($ids, $nIds)
是一個列表,對嗎?有兩個元素?
這是一個(非常特殊的)函數調用。 $ids,$nIds
是一個包含兩個元素的列表。
你應該總是在提問時包括所有相關的代碼。在這種情況下,打印語句是問題的中心。印刷聲明可能是最重要的信息。第二個最重要的信息是錯誤,你也沒有包括這個錯誤。下一次,包括這兩個。
print $ids
應該是一個相當硬的聲明搞亂了,但它是可能的。可能的原因:
$ids
未定義。給出警告undefined value in print
$ids
超出範圍。用use strict
,給出了致命的警告Global variable $ids needs explicit package name
,否則從上面發出未定義的 警告。print $ids $nIds
,在這種情況下, 的perl認爲$ids
應該是一個文件句柄,並 你會得到一個錯誤,如print to unopened filehandle
。說明
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.
Are you sure?當我說'$ array [500] =「yada」'我得到'scalar @ array'的值501。 – BarneySchmale 2016-08-16 17:23:26
-1「Perl的抱怨」,而不是共享實際的消息的文本。 – tadmc 2011-05-31 03:41:08