Regex Perl正则表达式模式

Regex Perl正则表达式模式,regex,perl,Regex,Perl,我有一些数据如下: TYPE: Travel ADDRESS Barcelona Paris 所以,地址可以是1个或多个,我需要丢弃地址,只获取这些城市。由于某种原因,我的解析失败,只打印了地址以生成正确的结果。我是否遗漏了什么 elsif (/^ADDRESS/) { my @address_t = split /[no matter what i put,only ADDRESS is printed]+/, $_; shift @address_t; #

我有一些数据如下:

TYPE: Travel
ADDRESS
  Barcelona
  Paris
所以,地址可以是1个或多个,我需要丢弃地址,只获取这些城市。由于某种原因,我的解析失败,只打印了地址以生成正确的结果。我是否遗漏了什么

elsif (/^ADDRESS/) {
    my @address_t = split /[no matter what i put,only ADDRESS is printed]+/, $_;
        shift @address_t;  #is this how i will discard ADDRESS ?

        foreach my $address (@address_t) {
                @address_names = ($address);            
    }
我认为正则表达式应该被拆分成新行,空格

这是我处理类型的方式:

elsif (/^TYPE/) {
            my @type_t = split '\s', $_;
            $type = $type_tmp[1];
                    print "$type" ; #to test, but i have a hashmap which i load them in and print at the end of the file.

谢谢

试试这样的方法:

如果前一行与/^ADDRESS/匹配,它将打印行。如果你想停下来,请告诉我,我可以调整

use warnings;
use strict; 

my $current_line = "";
my $line_count = 0;

while (<IN>){
    chomp;
    my $previous_line = $current_line;
    $current_line = $_;
    if ($previous_line =~ /^ADDRESS/ or $line_count > 0 ){
    $line_count++;
    print "$current_line\n"

    }   
}

if/elsif是否有一个循环?你有内存中的所有数据还是只有一行?我在foreach循环中有一个print语句,我在这篇文章中测试过它。通常我以散列方式加载数据。但我还没到那里,因为简单的打印语句并不能满足我的需求。循环给出Address的次数与文本文件中的次数相同感谢您的回复和时间。有没有什么方法可以让你根据我已经有的代码来回答?我使用的一种风格会让我感到困惑,因为我是perl和编程新手。顺便说一句,我刚才给出了数据集的一个小视图,上面还有其他属性。我将向您展示我是如何处理类型的。我刚刚编辑了问题并添加了。您不能拆分地址行,该行只包含一个单词。试着理解上面的代码。如果除ADDRESS之外没有其他属性跨越多行,则可以将它们作为elsif语句附加到类型块。ADDRESS是记录类型的最后一个,ADDRESS只是我决定在此处显示的最后两个记录。每一条新记录都在一个空格后开始,空格后面有时间。我已经处理了时间和其他属性。就是这个地址,我无法让正则表达式获取值并在结果中丢弃地址。如果仔细构造循环,块的顺序无关紧要。请问我如何将默认变量$替换为实际变量?我已经在使用$\了。谢谢你的回复。恐怕我会坚持我使用的格式。例如,您可以查看我处理TYPE的方式。ADDRESS是记录的最后一个。新记录在空白后开始。
use warnings;
use strict;

while(<DATA>) {
    if (/^ADDRESS/) {           # if line contains ADDRESS then read addresses
        while (<DATA>) {        # ... in a loop
            last if !/^ +/;     # until we find a non-indented line
            print $_;           # here you can push $_ to a list
        }
    }   
    if ($_ && /^TYPE/) {        # a TYPE after address can be processed now
        # stuff 
    }   
}

__DATA__
TYPE: Travel
ADDRESS
  Barcelona
  Paris
TYPE: Travel
ADDRESS
  Barcelona
  Paris
  Barcelona
  Paris
  Barcelona
  Paris