2011-06-16 50 views
-1

我的Perl腳本是:我的第一個Perl腳本產生錯誤

#!/usr/bin/perl -w 
use strict ; 
use warnings; 
print "Hello $name \n" 

我得到這個錯誤:

Global symbol "$name" requires explicit package name at fst_pscpt.pl.

這是真的停止我的progress.do我們需要包括任何包? ??

感謝&問候, B.Raviteja

+4

有沒有必要當你有'使用警告使用'-w'標誌;'在你的代碼。 '使用警告;'被認爲是正確的,現代的用法。欲瞭解更多信息,你可以閱讀perllexwarn。在你的Perl學習的這個階段,這可能沒有多大意義,但如果你不想盲目吸收我的斷言,那麼你應該得到一個鏈接。 http://perldoc.perl.org/perllexwarn.html – daotoad 2011-06-16 05:57:10

+0

您示例的好處在於您已經開始遵循您的第一個腳本 – ppant 2011-06-16 17:19:45

回答

13

您還沒有宣佈任何變量$name。所以你需要以某種方式獲得這個變量。例如,如果你想通過命令行得到它,你可以這樣做:

#!/usr/bin/perl -w 
use strict; 
use warnings; 
my $name = $ARGV[0]; 
print "Hello, $name!\n"; 

然後調用你的程序,像這樣:

./myprog.pl Rafe 

而得到的輸出:

Hello, Rafe! 

另外,在最後一行末尾沒有分號。你也需要這個。

+2

's/ARGV [1]/ARGV [0] /'的Perl最佳實踐。分號在塊的末尾是可選的,包括代碼的結尾。 Perl以這種方式和其他許多方式非常寬容。 – 2011-06-16 05:16:57

+2

@socket好習慣總是用分號結束語句,不過。 – 2011-06-16 05:32:56

+0

我同意並且幾乎總是使用可選的分號。然而,如果它是可選的,你需要這個*有點太強大了。 – musiKk 2011-06-16 07:17:40

2

你需要聲明$name當你use strict;(其中包括嚴格的變數)。只需插入該行:

my $name; 

在使用它之前。

+3

好吧,你也想把它設置爲「undef」以外的東西,否則'print'將不能很好地工作。 – cjm 2011-06-16 06:36:04

+2

打印將正常工作。雖然你會得到一個關於不初始化$ name的信息 – pavel 2011-06-16 10:18:25

5

diagnostics讓你在這種情況下,更有益的幫助:

$ perl -Mdiagnostics fst_pscpt.pl 
Global symbol "$name" requires explicit package name at fst_pscpt.pl line 4. 
Execution of fst_pscpt.pl aborted due to compilation errors (#1) 
    (F) You've said "use strict" or "use strict vars", which indicates 
    that all variables must either be lexically scoped (using "my"), 
    declared beforehand using "our", or explicitly qualified to say 
    which package the global variable is in (using "::"). 

Uncaught exception from user code: 
     Global symbol "$name" requires explicit package name at fst_pscpt.pl line 4. 
Execution of fst_pscpt.pl aborted due to compilation errors. 
at fst_pscpt.pl line 5