2016-03-07 232 views
1

我還處於早期的Perl階段,所以如果這是顯而易見的道歉。覆蓋變量

我聲明瞭Perl中的變量,如下圖所示:

my $new_filename = 'nope'; 

現在,如果滿足特定條件(讓我們假設它是在這裏),我試圖重新分配的$new_filename價值,像這樣:

my $new_filename = "$common::conf{'html_dir'}/images/banners/$lc_prodid.$filetype"; 

我爲他們分配valuu到表:

my $sql_query = qq(INSERT INTO banner_image (link, title, active, imageloc, rank) VALUES ('$link_text','$banner_text','$active','$new_filename','$new_rank')); 

我的問題是$new_filename總是在數據庫中顯示爲'nope'。任何人都可以提出爲什麼這可能是?

由於

+1

是否使用省略'使用嚴格「和」使用警告「? – simbabque

+3

第二次不要使用'my'。 – Biffen

+1

使用佔位符而不是在字符串中插入它們。假設你正在使用DBI,你應該這樣做。不這樣做是暴露自己的SQL注入和錯誤。 – TLP

回答

7

關鍵字my用於聲明一個變量。這意味着它會告訴Perl關於給定scope中的新變量。你只需要做一次。在聲明變量後,可以根據需要隨時將分配給

my $foo = 'foo'; 
$foo = 'bar'; 

但這並不是唯一的問題。

現在,如果滿足特定條件(讓我們假設它是在這裏),我試圖重新分配

這可能看起來如下:

my $foo = 'foo'; 
if ($bar) { 
    my $foo = 'bar'; 
} 

現在你有宣佈新的詞法版本$foo在較小的範圍後的那些括號if。您不會覆蓋外部範圍中的現有$foo。這就是爲什麼價值不變。

這裏有一些提示/關於本摘要:

  • 聲明中所必需的最小範圍變量
  • 儘可能晚的聲明變量
  • 聲明變量兩次
+0

似乎沒有人在學校教授* [在必要的最小範圍內[聲明]變量的政策*。大量的人 - 看起來像大多數人 - 在文件開頭FORTRAN風格的塊中聲明瞭所有必要的變量。自從17年前C99以來,這在C中甚至是不必要的。相反,我認爲應該清除教授Perl 4技術的在線教程,但可悲的是[Brian D Foy *在這方面與我不同意](http://www.learning-perl.com/2013/05/)爲什麼-WE-示教的子程序,符號/)。哦,*清除*無論如何都是個笑話 – Borodin

+0

@bo他也不會同意你的名字大寫。他在他的網站上有一個教程。 ;-) – simbabque

+0

堅韌,這是他的名字!我爲他放了** D **,這足夠了。人們稱他爲真的並不取決於他 – Borodin

2

如果你是簽名:

my $new_filename ="$common::conf{'html_dir'}/images/banners/$lc_prodid.$filetype"; 

if子句裏則是本地範圍的if語句,不會覆蓋變量聲明之外,你需要我的第二assingment