首页 文章

在perl脚本中使用grep

提问于
浏览
1

我有一个perl脚本,例如:

#!/usr/bin/perl -w

    use strict;

    my @vars = split(" ", "aaa bbb");
    my @list = split(" ", "aaa");

    foreach(@vars) {
        if ( grep(/$_/, @list)) {
            print "1\t";
        }else{
            print "0\t";
        }
    }

我希望它给出“1 0”作为回报,但它总是“1 1” . 有谁知道为什么?我使用的是perl 5.8.8 .

谢谢 .

Spring

1 回答

  • 7

    因为您正在滥用 $_ 变量 .

    grep EXPR, LIST 构造的表达式中, $_ 别名为列表的元素,并计算表达式 . 在 grep 语句结束之前, $_ 的先前值不会恢复 .

    由于裸 /.../ 表达式等同于 $_ =~ /.../ ,因此 grep 语句只是

    grep $_ =~ /$_/, @list
    

    $_ 别名为 @list 的元素,对于 $_ 的大多数正常值都是如此 .

    我们的教训是不要让 $_ 为你做太多工作 . 说

    foreach $var (@vars) {
        if ( grep(/$var/, @list)) {
            print "1\t";
        }else{
            print "0\t";
        }
    }
    

    代替 . 任何在六个月后查看您的代码的人(包括您未来的自己)都会感谢您 .

相关问题