在Python中转换Perl Map函数

问题描述 投票:0回答:2

我需要将一段perl代码转换为python,但我对perl及其语法并不熟悉。

特别是,我只是对perl中的map运算符和下面代码中的shift运算符感到困惑。

(@M) = ($y =~ m/((?:\d+:ITEM7 \d+:\d+ )+(?:\d+:ITEM7A \d+:\d+ )*)(?:\d+:ITEM8 \d+:\d+\s*)+/g);

$best = 0;
$bestseq = "";
for($i = 0; $i < scalar(@M); ++$i) {
  $m = $M[$i];
  $m =~ s/\d+://g;
  (@m) = (split / /, $m);
  $v = 0;
  $z = length_in_words($M[$i]);
  map { $v += $_ if($_ =~ m/^\d+$/); } @m;
  if($v > $best) { $best = $v; $bestseq = $M[$i]; }
}

sub length_in_words {
  my $x = shift;
  my @k;
  return scalar(@k = $x =~ m/(\S+)/sg);
}

我知道@M基于python re.findall分配一个数组,但我只是对地图函数和移位运算符以及它如何应用于@k感到困惑

我非常感谢任何帮助!

python regex perl
2个回答
1
投票

map通常用于将一个列表转换为另一个列表;在这里它被滥用简单地循环@m

代码相当于:

for my $maybe_number (@m) {
    if ($maybe_number =~ /^\d+$/) {
        $v += $maybe_number;
    }
}

总结@m的所有元素,只是一个或多个数字。

一个子中的my $x = shift;将子的第一个参数分配给$x

单词中的最后一行长度查找非空白字符的所有序列,并将它们分配给@k。该赋值放置在标量上下文中,该上下文返回分配的元素数。因此它计算了sub的参数中有多少“单词”(非空白字符序列)。


1
投票

虽然你得到了ysth的完整解释,但我无法帮助它,只能重写那篇文章

一个简单的例子

use warnings;
use strict;

use List::Utils qw(sum);    

my ($best, $bestseq) = (0, '');

foreach my $m (@M) {
    (my $new_m = $m) =~ s/\d+://g;
    my @m = split / /, $new_m;
    my $v = sum grep { /^\d+$/ } @m; 
    if ($v > $best) { 
        $best = $v; 
        $bestseq = $new_m; 
    }
}

sub length_in_words {
  return scalar split ' ', $_[0];
}