2016-03-07 131 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