2011-05-30 65 views
15

我有一些代碼,看起來像如何打印變量在Perl

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

這應該串連每一行中我myFilenIds應該是我的行數。如何打印我的$ids$nIds?我試過print $ids,但Perl抱怨。

my ($ids, $nIds) 

是一個列表,對嗎?有兩個元素?

+8

-1「Perl的抱怨」,而不是共享實際的消息的文本。 – tadmc 2011-05-31 03:41:08

回答

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

Perl是怎麼抱怨的? print $ids應該可以工作,儘管你可能最後需要一個換行符,或者明確地使用print,或者使用say-l/$\

如果你想在一個字符串內插一個變量,並有東西后立即那會看起來像變量的一部分,但不是在{}圍住變量名:

print "foo${ids}bar"; 
+0

嘿,只是想知道,如果我想要在變量後立即打印什麼,即我想實現這個:'print「Content:$ idsHeyIamhere」' – Juto 2013-08-12 09:30:11

+0

@Juto:加到我的答案 – ysth 2013-10-21 15:18:38

7
如何打印出我的$ ids和$ nIds?
print "$ids\n"; 
print "$nIds\n"; 
我想簡單地 print $ids,但Perl的抱怨。

抱怨什麼?未初始化的值?也許你的循環從未輸入,因爲打開文件時出錯。請務必檢查open是否返回錯誤,並確保您使用的是use strict; use warnings;

my ($ids, $nIds)是一個列表,對嗎?有兩個元素?

這是一個(非常特殊的)函數調用。 $ids,$nIds是一個包含兩個元素的列表。

9

你應該總是在提問時包括所有相關的代碼。在這種情況下,打印語句是問題的中心。印刷聲明可能是最重要的信息。第二個最重要的信息是錯誤,你也沒有包括這個錯誤。下一次,包括這兩個。

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

說明

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. 
+0

Are you sure?當我說'$ array [500] =「yada」'我得到'scalar @ array'的值501。 – BarneySchmale 2016-08-16 17:23:26