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;