【问题标题】:Force auto-increment to treat its argument as string强制自动增量将其参数视为字符串
【发布时间】:2015-03-04 02:32:30
【问题描述】:

对于字符串,我需要 Perl 的 auto-increment magic,但某些字符串(例如完全由数字组成的字符串)被解释为数字,而是执行正常递增。我将如何强制 Perl 将传递给 ++ 的值视为字符串?

【问题讨论】:

  • 您能解释一下您期望由完全数字组成的字符串如何递增吗?这可能会有所帮助:stackoverflow.com/questions/3508362/… 您可能需要为此编写自己的“增量”函数。
  • 例如,我希望++(my $v = "0001") 变成“0002”,而不仅仅是“2”。当然,这不仅限于完全由数字组成的字符串——例如,在++(my $a = "M2U0") 之后,$a 变为1 而不是我想要的"M2U1"
  • 0001 应该变为 0002 但我认为您的其他示例行不通。这是因为要使变量作为字符串递增,它必须 1. 匹配正则表达式 /^[a-zA-Z]*[0-9]*\z/ 和 2. 只能在字符串上下文中使用。您链接到的文档中对此进行了解释。
  • 刚刚测试过,perl -e'my $var = "0001"; $var++; print $var' 打印出0002。所以那部分有效。 perl -e'my $var = "M2U0"; $var++; print $var' 打印 1 因为它与正则表达式不匹配,并且正在数字上下文中处理。
  • 嗯,我也试过了,对我来说也很好用,我一定是搞砸了。我没想过要好好看看正则表达式本身。看来自动增量魔法毕竟无法完成这项工作。

标签: perl


【解决方案1】:

这是关于自动递增如何工作的相关问题:Autoincrementing letters in Perl

就像docs解释的一样,基本上你需要变量来

  1. 匹配正则表达式/^[a-zA-Z]*[0-9]*\z/
  2. 只能在字符串上下文中使用。

因为您有与正则表达式不匹配的变量,所以这些变量将被视为数字。您可以编写自己的增量函数来获得所需的功能。这是我的一个想法,它可以帮助您入门。

#!/usr/bin/perl
use strict;
use warnings;


my $test = "1000";
for (0..100) {
    $test = increment($test);
}
print $test . "\n";

$test = "M2V3";
for (0..100) {
    $test = increment($test);
}
print $test . "\n";


sub increment {
    my ($str) = @_;

    my @letters = reverse split //, $str;

    my $add = "";
    my $increment = 1;
    my $result = "";


    for my $let (@letters) {
        if ( $increment == 1 ) {
            ++$let;
        }
        if ( $let =~ /(.)(.)/ ) {
            $add = $2;
            $increment = 1;
        } else {
            $add = $let;
            $increment = 0;
        }
        $result = $add . $result;
    }
    return $result;
}

这个输出:

1101
M3F4

我没有计算以确认M3F4 是正确的结果,但它似乎很接近。

【讨论】:

  • 我一直认为Util 模块中有易于使用的函数,它们可以进行花哨的增量,但永远找不到它们。谢谢! String::Incremental 很酷,但对于看起来(看似)简单的问题来说似乎有点繁重。
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多