我使用ActivePerl脚本接收CSV文件并创建加载到数据库中的XML文件。这些是用户ID数据库条目,名称,地址等。我们一直使用家庭电话号码字段来生成初始密码(我们鼓励用户立即更改!)。手机的普及意味着我有很多人没有家用电话,所以我想在家庭电话领域为空时使用手机领域。
我的输入字段如下所示:
# 0 Firstname
# 1 Lastname
# 2 VP (voicepart)
# 3 Address
# 4 City
# 5 State
# 6 Zip
# 7 Phone
# 8 Mobile
# 9 Email
这是我用来创建密码的Perl代码 - 当字段7中有值时,create_password子例程正在工作:
my $pass_word = '';
my $pass_word = create_password($fields[7]);
if (my $pass_word = '') {
print "Use the cell phone number \n";
my $pass_word = create_password($fields[8]);
}
“打印”声明是告诉我它认为它正在做什么。
这让我觉得它应该有效,但“if”的声明从未触发过。 Print语句不打印,只有字段8中的值的任何人都会生成密码。我测试$ pass_word的值的方式一定有问题,但我看不到它。我应该测试$ fields [7]和$ fields [8]的值而不是变量值吗?如果这不起作用,你如何测试Perl变量的空值?
答案 0 :(得分:8)
您的代码中存在多个问题。
首先,在使用my
声明变量后,在使用变量时不需要在变量之前添加my
;
其次,对于这一行:
if (my $pass_word = '')
我认为你的意思是
if ($pass_word == '')
(my
已删除,如第一点所述)
=
表示赋值,它返回您分配给$pass_word
的值,此处为''
,这就是为什么此条件始终返回false。
但是,==
在这里不正确。在perl中,我们使用eq
来比较两个字符串。 ==
用于比较数字。
因此,请移除除第一个之外的所有my
,并使用eq
来比较您的字符串。
答案 1 :(得分:5)
你在这里遇到两个主要问题。
首先是你的字符串相等测试。在Perl中,使用运算符eq
比较字符串的相等性(如$string eq 'something'
中所示)。 =
是赋值运算符。
第二个是你(ab)使用my
。每个my
声明一个“隐藏”前一个变量的新变量,因此实际上你永远不能重复使用它的值,每次都要面对undef
。
将=
替换为eq
条款中的if
;删除除my
的所有首次使用以外的所有内容,您应该设置!
答案 2 :(得分:2)
my
声明一个新变量,该变量在周围范围内隐藏具有相同名称的变量。删除过度使用my
。