在perl中对if语句使用范围运算符

在perl中对if语句使用范围运算符,perl,Perl,我想实现像这样更真实的目标 ## Start abc def 123 45 156.356 ghi jkl 345 33 478.89 end Start abc eef 123 45 456.356 ghi jkl 345 33 678.89 end Start abc eef 123 45 256.356 ghi kkl 345 33 878.89 end 我想看一下每一组 if(/Start/../end/) if($line =~ def) $$ ($line =

我想实现像这样更真实的目标

##
Start
abc
def 123 45 156.356
ghi
jkl  345 33  478.89
end

Start
abc
eef  123 45 456.356
ghi
jkl  345 33  678.89
end

Start
abc
eef  123 45 256.356
ghi
kkl  345 33  878.89
end
我想看一下每一组

if(/Start/../end/)

if($line =~ def) $$ ($line =~jkl\s+(\S+)\s+(\S+)\s+(\S+)) { if($3 <$VALUE) {  { print "whole set"}
if(/Start//end/)

如果($line=~def)$$($line=~jkl\s+(\s+)\s+(\s+)\s+(\s+){if($3如果要逐行处理输入,则需要保存它们,并在满足条件后打印

use strict;
use warnings;

my @lines;
my ($one, $two);
my $VALUE = 1000;

while (<DATA>) {

  if (my $ff = /Start/ .. /end/) { 
    push @lines, $_;
    $one ||= /def/;
    $two ||= /jkl\s+(\S+)\s+(\S+)\s+(\S+)/ && $3 <$VALUE;

    # end of flip-flop block reached?
    if ($ff =~ /E0/) {
      print @lines if $one and $two;
      @lines = ();
      $one = $two = undef;
    }
  }
}

__DATA__
Start
abc
def 123 45 156.356
ghi
jkl  345 33  478.89
end

Start
abc
eef  123 45 456.356
ghi
jkl  345 33  678.89
end

Start
abc
eef  123 45 256.356
ghi
kkl  345 33  878.89
end
使用严格;
使用警告;
我的@行;
我的(1美元,2美元);
我的美元价值=1000;
而(){
如果(my$ff=/Start//end/){
按@行,$\;
$one | |=/def/;

$two | |=/jkl\s+(\s+)\s+(\s+)\s+(\s+)/&&&3如果您逐行处理输入,则希望保存它们并在满足条件后打印

use strict;
use warnings;

my @lines;
my ($one, $two);
my $VALUE = 1000;

while (<DATA>) {

  if (my $ff = /Start/ .. /end/) { 
    push @lines, $_;
    $one ||= /def/;
    $two ||= /jkl\s+(\S+)\s+(\S+)\s+(\S+)/ && $3 <$VALUE;

    # end of flip-flop block reached?
    if ($ff =~ /E0/) {
      print @lines if $one and $two;
      @lines = ();
      $one = $two = undef;
    }
  }
}

__DATA__
Start
abc
def 123 45 156.356
ghi
jkl  345 33  478.89
end

Start
abc
eef  123 45 456.356
ghi
jkl  345 33  678.89
end

Start
abc
eef  123 45 256.356
ghi
kkl  345 33  878.89
end
使用严格;
使用警告;
我的@行;
我的(1美元,2美元);
我的美元价值=1000;
而(){
如果(my$ff=/Start//end/){
按@行,$\;
$one | |=/def/;

$two | |=/jkl\s+(\s+)\s+(\s+)\s+(\s+)/&&&3如果您逐行处理输入,则希望保存它们并在满足条件后打印

use strict;
use warnings;

my @lines;
my ($one, $two);
my $VALUE = 1000;

while (<DATA>) {

  if (my $ff = /Start/ .. /end/) { 
    push @lines, $_;
    $one ||= /def/;
    $two ||= /jkl\s+(\S+)\s+(\S+)\s+(\S+)/ && $3 <$VALUE;

    # end of flip-flop block reached?
    if ($ff =~ /E0/) {
      print @lines if $one and $two;
      @lines = ();
      $one = $two = undef;
    }
  }
}

__DATA__
Start
abc
def 123 45 156.356
ghi
jkl  345 33  478.89
end

Start
abc
eef  123 45 456.356
ghi
jkl  345 33  678.89
end

Start
abc
eef  123 45 256.356
ghi
kkl  345 33  878.89
end
使用严格;
使用警告;
我的@行;
我的(1美元,2美元);
我的美元价值=1000;
而(){
如果(my$ff=/Start//end/){
按@行,$\;
$one | |=/def/;

$two | |=/jkl\s+(\s+)\s+(\s+)\s+(\s+)/&&&3如果您逐行处理输入,则希望保存它们并在满足条件后打印

use strict;
use warnings;

my @lines;
my ($one, $two);
my $VALUE = 1000;

while (<DATA>) {

  if (my $ff = /Start/ .. /end/) { 
    push @lines, $_;
    $one ||= /def/;
    $two ||= /jkl\s+(\S+)\s+(\S+)\s+(\S+)/ && $3 <$VALUE;

    # end of flip-flop block reached?
    if ($ff =~ /E0/) {
      print @lines if $one and $two;
      @lines = ();
      $one = $two = undef;
    }
  }
}

__DATA__
Start
abc
def 123 45 156.356
ghi
jkl  345 33  478.89
end

Start
abc
eef  123 45 456.356
ghi
jkl  345 33  678.89
end

Start
abc
eef  123 45 256.356
ghi
kkl  345 33  878.89
end
使用严格;
使用警告;
我的@行;
我的(1美元,2美元);
我的美元价值=1000;
而(){
如果(my$ff=/Start//end/){
按@行,$\;
$one | |=/def/;

$two | |=/jkl\s+(\s+)\s+(\s+)\s+(\s+)/&&$3我不会使用范围运算符,而是以段落模式读取。您可以通过将
$/
设置为空字符串来执行此操作:

local $/ = '';
while ( <> ) {
    print if m/def/ and m/jkl/;
}
比如说

或许:

local $/ = '';
while ( <DATA> ) {
    my %stuff = m/(\w+) (.*)/;
    $stuff{$_} = [split(' ', $stuff{$_})] for keys %stuff;        
    print if m/def/ and m/jkl/ and $stuff{'def'}[2] >2 ;
}
local$/='';
而(){
我的%stuff=m/(\w+)(*)/;
$stuff{$\u}=[split(“”,$stuff{$\u})],用于键%stuff;
如果m/def/和m/jkl/以及$stuff{'def'}[2]>2,则打印;
}

我不会对此使用范围运算符,而是以段落模式读取。您可以通过将
$/
设置为空字符串来执行此操作:

local $/ = '';
while ( <> ) {
    print if m/def/ and m/jkl/;
}
比如说

或许:

local $/ = '';
while ( <DATA> ) {
    my %stuff = m/(\w+) (.*)/;
    $stuff{$_} = [split(' ', $stuff{$_})] for keys %stuff;        
    print if m/def/ and m/jkl/ and $stuff{'def'}[2] >2 ;
}
local$/='';
而(){
我的%stuff=m/(\w+)(*)/;
$stuff{$\u}=[split(“”,$stuff{$\u})],用于键%stuff;
如果m/def/和m/jkl/以及$stuff{'def'}[2]>2,则打印;
}

我不会对此使用范围运算符,而是以段落模式读取。您可以通过将
$/
设置为空字符串来执行此操作:

local $/ = '';
while ( <> ) {
    print if m/def/ and m/jkl/;
}
比如说

或许:

local $/ = '';
while ( <DATA> ) {
    my %stuff = m/(\w+) (.*)/;
    $stuff{$_} = [split(' ', $stuff{$_})] for keys %stuff;        
    print if m/def/ and m/jkl/ and $stuff{'def'}[2] >2 ;
}
local$/='';
而(){
我的%stuff=m/(\w+)(*)/;
$stuff{$\u}=[split(“”,$stuff{$\u})],用于键%stuff;
如果m/def/和m/jkl/以及$stuff{'def'}[2]>2,则打印;
}

我不会对此使用范围运算符,而是以段落模式读取。您可以通过将
$/
设置为空字符串来执行此操作:

local $/ = '';
while ( <> ) {
    print if m/def/ and m/jkl/;
}
比如说

或许:

local $/ = '';
while ( <DATA> ) {
    my %stuff = m/(\w+) (.*)/;
    $stuff{$_} = [split(' ', $stuff{$_})] for keys %stuff;        
    print if m/def/ and m/jkl/ and $stuff{'def'}[2] >2 ;
}
local$/='';
而(){
我的%stuff=m/(\w+)(*)/;
$stuff{$\u}=[split(“”,$stuff{$\u})],用于键%stuff;
如果m/def/和m/jkl/以及$stuff{'def'}[2]>2,则打印;
}



您的问题是什么?我只想打印开始abc def ghi jkl END您的问题是什么?我只想打印开始abc def ghi jkl END您的问题是什么?我只想打印开始abc def ghi jkl end您的问题是什么?我只想打印开始abc def ghi jkl end$1 | | |=/def/;请您解释一下“| |=”?我在某个地方看到了,但我不知道如何在没有明确含义的情况下使用。这是“或等于”-如果第一个值为false(未定义/零/空字符串),则它将指定第二个值。@Sobrique:太棒了……我知道了。我不明白为什么这个答案被否决。这不是一个坏方法。使用范围运算符的同样棒的方法一些新运算符:)$one | |=/def/;你能解释一下这个“| |=”吗?我在某个地方看到过,但我不知道如何使用,但没有明确的含义。如果第一个值为false(未定义/零/空字符串),则为`或等于'它反而指定了第二个值。@Sobrique:supery…我知道了。我不明白为什么这个答案被否决了。这不是一个坏方法。使用范围运算符的同样出色的方法一些新运算符:)$one |=/def/;请解释一下“| |=”?我在某个地方看到过,但我不知道如何使用,而不知道其含义。如果第一个值为false(未定义/零/空字符串),则为“或等于”它反而指定了第二个值。@Sobrique:supery…我知道了。我不明白为什么这个答案被否决了。这不是一个坏方法。使用范围运算符的同样出色的方法一些新运算符:)$one |=/def/;请解释一下“| |=”?我在某个地方看到过,但我不知道如何使用,而不知道其含义。如果第一个值为false(未定义/零/空字符串),则为“或等于”它改为分配第二个值。@Sobrique:supery…我得到了它。我不明白为什么这个答案被否决。这不是一个坏方法。使用范围运算符的同样出色的方法一些新运算符:)我想使用$/但不知道“”空字符串。问题更多的是在匹配m/def/之后,我需要从该行捕获像$3这样的值“def 0 123 456.567。然后我需要将其与一个值($3<$value)进行比较。”如果为true,则打印整个集合。重复def&jkl Start abc def 0 123 456.567 ghi jkl endOK。您能将其编辑到您的问题中吗。从当前区块提取非常容易。我想使用$/但不知道“”空字符串。匹配m/def/I后,prob更大。我需要从该行“def 0 123 456.567”中捕获$3之类的值。然后,如果为真,我需要将其与值($3<$value)进行比较。打印整个集合。对def&jkl重复此操作