Perl 为什么价值会被破坏?
我正在查找找到Perl 为什么价值会被破坏?,perl,Perl,我正在查找找到搜索文本的字段名 my $field; for $field ( qw' email phone name ' ) { last if $user->$field =~ /$search/; } print $field; # undef 在这里,如果$user->email匹配,则调用last命令。 因此,我希望$field应该将电子邮件作为值。但它实际上是undef 为什么循环后的$field变量的值是unde?循环变量的作用域是循环 使用 或 您将从下面的
搜索
文本的字段名
my $field;
for $field ( qw' email phone name ' ) {
last if $user->$field =~ /$search/;
}
print $field; # undef
在这里,如果$user->email
匹配,则调用last
命令。
因此,我希望$field
应该将电子邮件
作为值。但它实际上是undef
为什么循环后的
$field
变量的值是unde
?循环变量的作用域是循环
使用
或
您将从下面的示例中获得更详细的理解
1 #!/usr/bin/perl
2
3 my $field;
4 my $user = {
5 'email' => 'my@email.com'
6 };
7
8 foreach my $search ( "email" , "phone", "name" ) {
9 if ($user->{$search} ){
10 $field = $user->{$search};
11 last;
12 }
13 }
14 print "\n===field========$field====\n";
由于“$field”在全局范围内,因此代码无法工作。由于在for循环中也使用了相同的变量,因此它在for循环中被隐式本地化。如果您的要求只是打印或获取变量中的匹配值,那么您的代码应该类似于:
#This variable will have the field name
my $result;
foreach my $field ( qw ' email phone name ' ) {
if ($user->{$field} =~ /$search/) {
$result = $field;
last;
}
}
print $result;
或者,grep可以用来过滤数组中的值
p.S.在@Eugen的评论后更新了我的答案。如果你想把它添加到你的答案中,他说foreach循环迭代一个正常的列表值,并将标量变量VAR依次设置为列表的每个元素。如果变量前面有关键字my,那么它是词汇范围的,因此只在循环中可见。否则,该变量是循环的隐式局部变量,并在退出循环时恢复其以前的值。“@Dada:hm.这种本地化在哪里比较方便?@EugenKonkov:for循环将它迭代的元素化名,因此保留最后一个值可能会在一定距离内引起奇怪的变化。@Eugen Konkov,在引入词汇变量之前,它会非常有用。现在,我们将
用于我的$x()
。不,$field
在文件的范围内,但它也隐式地本地化到循环中。像本地$field
。见上面的@Dada评论
1 #!/usr/bin/perl
2
3 my $field;
4 my $user = {
5 'email' => 'my@email.com'
6 };
7
8 foreach my $search ( "email" , "phone", "name" ) {
9 if ($user->{$search} ){
10 $field = $user->{$search};
11 last;
12 }
13 }
14 print "\n===field========$field====\n";
#This variable will have the field name
my $result;
foreach my $field ( qw ' email phone name ' ) {
if ($user->{$field} =~ /$search/) {
$result = $field;
last;
}
}
print $result;