【问题标题】:Perl Arrays and grepPerl 数组和 grep
【发布时间】:2011-04-07 18:00:36
【问题描述】:

我认为它更像是一个字符,无论如何,我有一个文本文件,由类似的内容组成:

COMPANY NAME

    City

    Addresss,
     Address number

    Email 

    phone number

等等......(它会重复自己,但使用不同的数据......),让我们假设事物文本现在在 $strting 变量中。

我想要一个数组(@row),例如:

$row[0] = "COMPANY NAME";
$row[1] = "City";
$row[2] = "Addresss,
              Address number";
$row[3] = "Email";
$row[4] = "phone number";

不过,起初我可以用 grep 轻松完成,类似这样: 1)@rwo = grep (/^^$/, $string); 不走! 2)@row = grep (/\n/, $string);

还是不行,也试过 split 之类的,还是不行。 任何想法? 谢谢,

【问题讨论】:

  • 既然“它会重复自己,但使用不同的数据”,您是否不是在寻找这些公司数据的数组,例如 @companies = ( { name => 'COMPANY NAME', address => '地址,地址编号', ...}, { name => 'ANOTHER COMPANY', address => '其他地址', ...} ); ?

标签: regex arrays perl text grep


【解决方案1】:

FM 给出了一个可以使用 split 的答案,但我想指出,如果您从文件句柄中读取这些数据,Perl 会让这非常容易。您需要做的就是将特殊变量 $/ 设置为空字符串。这使 Perl 进入“段落模式”。在这种模式下,文件输入运算符返回的每条记录都将包含一段文本,而不是通常的行。

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

local $/ = '';

my @row = <DATA>;

chomp @row;

print Dumper(\@row);

__DATA__
COMPANY NAME

City

Addresss,
 Address number

Email 

phone number

输出是:

$ ./addr 
$VAR1 = [
          'COMPANY NAME',
          'City',
          'Addresss,
 Address number',
          'Email ',
          'phone number'
        ];

【讨论】:

  • 由于您可以将标量作为文件句柄打开,因此很容易将此技巧应用于任何数据。 open my $fh, '&lt;', \$data;
【解决方案2】:

按照我理解您的问题的方式,您想要抓取至少由一个空行分隔的项目。尽管/\n{2,}/ 在字面意义上是正确的(拆​​分为一个或多个换行符),但我建议使用下面的正则表达式,因为它将处理 几乎空白 行(仅包含空白字符的行)。

use strict;
use warnings;

my $str = 'COMPANY NAME

City

Addresss,
 Address number

Email 

phone number';

my @items = split /\n\s*\n/, $str;

【讨论】:

    【解决方案3】:
    use strict;
     use warnings;
     my $string = "COMPANY NAME
    
            City
    
            Addresss,
             Address number
    
            Email
    
            phone number";
    
        my @string_parts = split /\n\n+/, $string; 
        foreach my $test (@string_parts){
              print"$test\n";
        }
    

    输出:

    COMPANY NAME
    City
    Addresss,
    Address number 
    Email
    phone number
    

    【讨论】:

    • 不行,OP想要地址和地址号在同一个部分。
    【解决方案4】:

    grep 不能将字符串作为参数。

    这就是为什么你需要split你所追求的令牌上的字符串(如FM shows)。

    虽然不清楚您需要这个做什么,但我强烈建议您考虑使用 Tie::File 模块:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 2011-02-22
      • 1970-01-01
      • 2018-01-15
      • 2014-01-31
      相关资源
      最近更新 更多