Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如果语句为true,则退出while循环_Perl_Loops - Fatal编程技术网

Perl 如果语句为true,则退出while循环

Perl 如果语句为true,则退出while循环,perl,loops,Perl,Loops,我有一个子函数,在它里面,我正在用Perl读取一个文件,使用的是通常的,而-逐行循环,因为这是迄今为止我在Perl中知道的唯一(也是最好的?)选项。现在,我正在基于行搜索一个具有循环的关键字,如 my $var; open(FILE, "stuff.dat") while (my $line = <FILE>){ if ($line =~ /regex/) { $var = $1; return $var; } else { retur

我有一个子函数,在它里面,我正在用Perl读取一个文件,使用的是通常的
,而
-逐行循环,因为这是迄今为止我在Perl中知道的唯一(也是最好的?)选项。现在,我正在基于行搜索一个具有循环的关键字,如

my $var;
open(FILE, "stuff.dat")
while (my $line = <FILE>){
   if ($line =~ /regex/) {
      $var = $1;
      return $var;
   } else {
      return "var is not defined!";
   }
}
close(FILE);
my$var;
打开(文件“stuff.dat”)
while(我的$line=){
如果($line=~/regex/){
$var=$1;
返回$var;
}否则{
return“未定义var!”;
}
}
关闭(文件);
但即使它获取关键字并指定了
$var
,它也会在下一行被覆盖。因此,如果找到关键字并且定义了
$var
,我想退出
while
-循环

我尝试了
next if
next,除非
last
-退出,但这无法正常工作,并声明无法对subs使用
last

打开(我的$FILE,
打开(FILE,“stuff.dat”)
open(my $FILE, "<", "stuff.dat") or die $!;
while (my $line = <$FILE>){
   if ($line =~ /regex/) {
      return $1 if defined $1;
   }
}
close($FILE);
return "var is not defined!";
我的$var; while(我的$line=){ 如果($line=~/regex/){ $var=$1; 最后; } } 关闭(文件); 返回$var;

希望这有帮助。

您可以将regexp求值添加到while循环条件中,而不使用return或last

sub check_file {
    open(FILE, "stuff.dat") or die;

    my $result;
    my $line;

    while (($line = <FILE>) && ($result = ($line !~ m/regex/))) {};

    close(FILE);
    ## $result equals 1 only if we have exit the loop and 
    ## didn't have a match till the last line of the file
    return ($result != 1);
}
子检查\u文件{
打开(文件“stuff.dat”)或死亡;
我的$result;
我的美元线;
而($line=)&&($result=($line!~m/regex/)){};
关闭(文件);
##$result仅当我们退出循环并
##直到文件的最后一行才找到匹配项
返回($result!=1);
}

如果正则表达式不匹配,这将不起作用。这是我想要避免的行为。不幸的是,这会使
文件
文件句柄在子文件完成后打开。这可以通过使用词法文件句柄来解决。
sub check_file {
    open(FILE, "stuff.dat") or die;

    my $result;
    my $line;

    while (($line = <FILE>) && ($result = ($line !~ m/regex/))) {};

    close(FILE);
    ## $result equals 1 only if we have exit the loop and 
    ## didn't have a match till the last line of the file
    return ($result != 1);
}