在perl中使用分隔符将字符串转换为字符串的最佳方法是什么?

时间:2016-06-23 13:17:37

标签: string perl

如何在Perl中将$var = "000000000"转换为$var = "0_0000_0000"

5 个答案:

答案 0 :(得分:1)

如果字符串的长度始终为9个字符,则可以使用substr

my $var = '000000000';
substr($var, 5, 0) = '_';
substr($var, 1, 0) = '_';

要格式化任意长度的字符串,您可以使用如下函数:

sub format_str {
    my $str = reverse $_[0];
    $str =~ s/(.{4})(?=.)/$1_/g;
    return scalar reverse $str;
}

my $var = "000000000";
print format_str $var; # "0_0000_0000"

答案 1 :(得分:0)

$var = "000000000"; 
$var2 = substr($var,0,1)."_".substr($var,1,4)."_".substr($var,5); 
print $var2;

答案 2 :(得分:0)

对于任意长度字符串的解决方案并考虑到非常长的字符串产生的效率问题,请参阅我之前的问题和答案:How to chunk text "from the back" in perl.

根据评论中的建议,这里是使用链接问题/答案中的想法的代码,它回答了OP问题:

use integer;
my $la = length($var);
my $r = $la % 4;
my $q = $la / 4;
my $tr = $r ? "a$r" : "";
$var = join "_", unpack "$tr(a4)$q", $var;

注意:更改所有三个 4以获得不同的分组大小。

答案 3 :(得分:0)

假设您正在询问如何在字符串的第一个和第五个字符后插入_,以下是各种简单明了的解决方案:

my $in  = '000000000'; 
my $out = substr($var,0,1) . '_' . substr($var,1,4) . '_' . substr($var,5);

my $in  = '000000000'; 
my $out = join('_', substr($var,0,1), substr($var,1,4), substr($var,5));

my $in  = '000000000'; 
my $out = join('_', unpack('a1 a4 a4*', $in));

my $in  = '000000000'; 
my $out = $in =~ s/^(.)(.{4})/${1}_${2}_/sr;  # 5.14+

my $in  = '000000000'; 
( my $out = $in ) =~ s/^(.)(.{4})/${1}_${2}_/s;

在就地:

my $var = '000000000'; 
$var =~ s/^(.)(.{4})/${1}_${2}_/s;

my $var = '000000000';
substr($var, 5, 0) = '_';
substr($var, 1, 0) = '_';

答案 4 :(得分:0)

如果这是"How can I output my numbers with commas added?"中解决的 commify 问题,可用perldoc -q 'commas added',那么类似的解决方案就足够了,使用额外的参数来定义分隔符和区间大小

您需要阅读其他选项的perlfaq条目

use strict;
use warnings 'all';

print group_characters(1234567), "\n";
print group_characters('000000000', '_', 4), "\n";
print group_characters('0123456789ABCDEF', ' ', 4), "\n";

sub group_characters {
    my ($s, $sep, $n) = @_;
    $sep //= ',';
    $n   //= 3;

    1 while $s =~ s/[^$sep]+\K(?=[^$sep]{$n})/$sep/;

    $s;
}

输出

1,234,567
0_0000_0000
0123 4567 89AB CDEF