在满足perl条件时弹出堆栈

时间:2012-10-03 11:21:35

标签: perl stack pop

#!/usr/local/bin/perl
sub parser
    {   
        while(<SRCFILE> )
            {
                if(!eof LOGFILE)
                {
                    print "Something";
                    parser();
                }
                else 
                {
                    **Discard Everything in stack**
                }
            }
    }

open (LOGFILE, 'out.txt');
open (SRCFILE , 'a.txt');
parser();

我想在'else'清空堆栈。我尝试使用exit,但执行只是停在那里没有弹出。

编辑: 我已经改变了我的要求。

1 个答案:

答案 0 :(得分:4)

我将假设通过“丢弃堆栈中的所有内容”意味着突破递归子例程的所有级别。你有几个选择:

退出递归的标准方法是在需要返回时编写sub以正确处理大小写。从你所展示的内容来看,就像这样简单:

    sub parser {
        while(<SRCFILE> )
        {
            if(!eof LOGFILE)
            {
                print "Something";

                parser();
            }

            return;
        }
    }

一旦eof LOGFILE为真,您的所有函数调用都将返回(当然,根据您的sub实际需要执行的操作,它可能会变得更复杂)。

另一种选择是:

    sub parser {
        while(<SRCFILE> )
        {
            if(!eof LOGFILE)
            {
                print "Something";

                parser();
            }
            else
            {
                die "Let's break outta here!";
            }
        }
    }

    eval {  parser(); };

die停止执行eval {}块内的所有内容,因此您将丢弃整个调用堆栈。这可以让你做一些棘手的事情,这取决于你的最终设计需要什么。您可以通过选中die来查看$@语句的内容。

当您同时具有正常的返回案例和失败案例时,第二个选项最有用,并且您希望在失败案例中立即停止所有内容。