【问题标题】:perl - help removing unwanted characters within splitperl - 帮助删除拆分中不需要的字符
【发布时间】:2011-06-03 08:05:40
【问题描述】:

我有一个简单的 perl 脚本,需要帮助进行调整。我使用 split 来分隔键和值。我几乎得到了我想要的,但我想删除在输入文件中找到的括号。另外,有没有办法对数值进行排序(使其成为一个选项)?感谢您的帮助。

例如。输入文件

(hlu,1)
(kcq,4)
(ob2,1)

Perl 脚本:

#!/usr/bin/perl
my $str = '';

open FILE;
while (<>) {
    chomp;
    my ($k, $v) = split /,/;
    $str .= "$k:$v\n"
}
close FILE;
print "$str";

结果:

(hlu:1)
(kcq:4)
(ob2:1)

想看:

hlu:1
ob2:1
kcq:4

【问题讨论】:

  • 如所写,您似乎不需要open FILE / close FILE - 只需直接使用while(&lt;&gt;)。或者使用while(&lt;FILE&gt;),但不能同时使用。

标签: perl


【解决方案1】:

这几乎与Ivan's answer 相同,只是我使用了一个m// 而不是split()——IMO 读起来更简单

另外,如果你使用的是while(&lt;&gt;),不知道为什么你有open FILE / close FILE...我摆脱了它们。

#!/usr/bin/perl

my @items = ();
# read input from stdin/@ARGV
while (<>) {
    chomp;
    m/\((.*),(.*)\)/;
    push @items, [$1, $2];
}
# sort
@items = sort { $a->[1] <=> $b->[1] } @items;

foreach(@items)
{
    my ($k, $v) = @$_;
    print "$k:$v\n";
}

【讨论】:

  • 或者简单地说:push @items, [ m/\((.*),(.*)\)/ ]; 你甚至不需要咀嚼它,除非你使用s 标志——并且需要一个近乎括号。
  • @Axeman:好一个!我不知道m// 在列表上下文中的行为。
【解决方案2】:

将循环更改为:

while (my $line = <FILE>) {
    chomp $line;
    $line =~ s/[()]//g;
    my ($k, $v) = split /,/, $line;
    $str .= "$k:$v\n"
}

【讨论】:

    【解决方案3】:

    您可以删除CanSpice 提到的所有() 符号。或者只是删除开始/结束括号:

    $line =~ s/^\(|\)$//g; ## escaping () symbols with \
    

    要对数据进行排序,您需要先将其放入数组中,然后再对数组进行排序:

    my @data_lines;
    while (<>) {
        chomp;
        s/^\(|\)$//g;
        push(@data_lines, [ split /,/ ]); ## save columns in array
    }
    ## sort data numerically by second column
    @data_lines = sort {$a->[1] <=> $b->[1]} @data_lines;
    ## output result
    for my $row (@data_lines) {
        my ($k, $v) = @$row; ## put values into variables for convenience
        print "$k:$v\n";
    }
    

    【讨论】:

      【解决方案4】:

      只是为了好玩:

      print "$_\n" for                  # 5
          map join(':', @$_),           # 4
          sort { $a->[1] <=> $b->[1] }  # 3
          map [ /(\w+),(\d+)/ ],        # 2
          <>                            # 1
      ;
      

      您可以按相反的顺序解释这些管道:

      1. 读取输入行。
      2. 使用正则表达式来捕获我们关心的项目。将这些项目($1$2)打包到数组 ref 中。
      3. 使用元素[1] 对这些数组引用进行数字排序。
      4. 将小数组转换为以冒号分隔的字符串。
      5. 打印出来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多