【问题标题】:perl : how to split?perl:如何拆分?
【发布时间】:2011-11-12 03:47:39
【问题描述】:

我有一个字符串aa:bb::cc:yy:zz,需要以这样的方式拆分,以便我有一个包含aa:bb::ccyyzz 的数组。即我想从最后创建两个子字符串,: 作为分隔符并保留为数组的元素。实现这一目标的最佳方法是什么?

例如:

aa:bb::cc:yy:zz --> ['aa:bb::cc','yy','zz']

dd:ff:gg:dd:ee:ff:fg --> ['dd:ff:gg:dd:ee','ff','gg']

我将 IP 地址:端口:协议作为密钥存储在文件中,并用“:”拆分以获取 IP、端口、协议,当 IP 地址限制为 IPv4 时,一切正常。现在我想将它移植到 IPv6,在这种情况下 IP 地址包含“:”,所以我无法通过用“:”拆分来获得正确的 IP 地址。

【问题讨论】:

  • 使用标准化的[IP address]:port 格式存储(IP,port) 对会更安全。 AnyEvent::Socket 模块中的parse_hostport/format_hostport 有助于处理它。

标签: regex perl split substr


【解决方案1】:
$ perl -wE '$_="aa:bb::cc:yy:zz"; say join "\n", split /:([^:]+):([^:]+)$/, $_;'
aa:bb::cc
yy
zz

更新:你没有提到这是为了解析 IP 地址。如果是这样,您最好尝试在 CPAN 上找到一个模块

【讨论】:

  • @kumar 欢迎您。基本上和M42是一样的方案。
【解决方案2】:

怎么样:

#!/usr/local/bin/perl 
use Data::Dump qw(dump);
use strict;
use warnings;

my $x = 'dd:ff:gg:dd:ee:ff:fg';
my @l = $x =~ /^(.*?):([^:]+):([^:]+)$/g;
dump @l;

输出:

("dd:ff:gg:dd:ee", "ff", "fg")

【讨论】:

  • 请注意,这将在“两对或更少对”字符串上失败,例如“dd:ff”或“dd”
  • 这对我来说不是问题,因为我希望最少 3 个参数。
  • 谢谢 M42,对我来说是完美的解决方案。
【解决方案3】:
$ perl -e'$_="aa:bb::cc:yy:zz"; @f=/(.*):([^:]+):(.+)/; print "$_\n" for @f'
aa:bb::cc
yy
zz

$ perl -e'$_="dd:ff:gg:dd:ee:ff:fg"; @f=/(.*):([^:]+):(.+)/; print "$_\n" for @f'
dd:ff:gg:dd:ee
ff
fg

【讨论】:

    【解决方案4】:

    我会做一个过于激进的split 然后加入。我认为当您不使用复杂的正则表达式进行拆分时,结果更具可读性。所以:

    my $string = 'aa:bb::cc:yy:zz';
    my @split_string = split(/:/, $string);
    my @result = (join(':', @split_string[0..scalar(@split_string)-3]), $split_string[-2], $split_string[-1]);
    print join(', ', @result), "\n";
    

    给你:

    aa:bb::cc, yy, zz
    

    您必须先对 @split_string 进行一些数组边界检查,然后才能开始像这样对其进行索引。

    【讨论】:

      【解决方案5】:

      此代码将纠正 $string 包含 2 对或更少对的情况:

      my $string = 'aa:bb::cc:yy:zz';
      my @data = split /:/, $string;
      if (@data > 2) {
          unshift @data, join ':', splice @data, 0, -2;
      }
      
      # $string = 'aa:bb::cc:yy:zz';
      # @data contains ('aa:bb::cc', 'yy', 'zz')
      
      # $string = 'aa:bb';
      # @data contains ('aa', 'bb')
      

      【讨论】:

        猜你喜欢
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        相关资源
        最近更新 更多