在Perl中,有没有理由将单个变量封装在双引号中(没有连接)?
我经常在我正在研究的程序的源代码中找到这个(10年前由不在这里工作的人写的):
my $sql_host = "something"; my $sql_user = "somethingelse"; # a few lines down my $db = sub_for_sql_conection("$sql_host","$sql_user","$sql_pass","$sql_db");
据我所知,没有理由这样做.当我使用旧脚本时,我通常会删除引号,因此我的编辑器将它们变为变量而不是字符串.
我认为他们在某个地方看到了这个并复制了风格而没有理解为什么会如此.我错过了什么吗?
谢谢.
解决方法
所有这些都明确地将变量字符串化.在99.9%的情况下,这是某种新手错误.
有些事情可能会发生这种调用风格的副作用:
my $foo = "1234"; sub bar { $_[0] =~ s/2/two/ } print "Foo is $foo\n"; bar( "$foo" ); print "Foo is $foo\n"; bar( $foo ); print "Foo is $foo\n";
在这里,stringification创建了一个副本并将其传递给子例程,绕过Perl的引用语义传递.通常认为调用变量是不礼貌的,所以你可能没问题.
您还可以在此处对对象或其他值进行字符串化.例如,undef字符串化为空字符串.对象可以指定在字符串化时运行的任意代码.可以使用具有不同数值和字符串值的双值标量.这是一种指定您想要字符串形式的方法.
还有一个可能会发生的深刻的怪异事情.如果您正在使用XS代码来查看在函数的标量参数上设置的标志,那么对标量进行字符串化是一种直接的方式来说明perl,“让我成为一个很好的干净的新字符串值”,只有字符串标记和没有数字标志.
我确信99.9%的规则还有其他奇怪的例外.这些是一些.在删除引号之前,请花一点时间来检查这样的怪异垃圾.如果你确实发生了合法使用,请添加一个注释,将引号标识为可行的kludge,并给出它们存在的理由.