【问题标题】:Can I use unpack to split a string into characters in Perl?我可以使用 unpack 在 Perl 中将字符串拆分为字符吗?
【发布时间】:2011-02-10 06:58:21
【问题描述】:

一个常见的“Perlism”正在生成一个列表作为以这种形式循环的东西:

for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }

在这种情况下,全局匹配正则表达式从字符串$str 中依次返回一个字符的列表,并将该值分配给$_

除了正则表达式,split 可以以相同的方式使用或'a'..'z'map 等。

我正在调查unpack 以逐个字段解释字符串生成一个字段。我一直发现unpack 对我的大脑工作方式不太直接,而且我从来没有真正深入研究过它。

作为一个简单的例子,我想生成一个列表,它是使用 unpack 从字符串中的每个元素中的一个字符(是的——我知道我可以用 split(//,$str)/./g 做到这一点,但我真的很想看看如果 unpack 可以这样使用...)

显然,我可以使用 unpack("A1" x length($str), $str) 的字段列表进行解包,但是还有其他一些看起来像 globbing 的方式吗?即,我可以在列表上下文或循环中调用unpack(some_format,$str),以便 unpack 将返回格式组中的下一组字符,直到 $str 耗尽?

我已阅读 The Perl 5.12 Pack podPerl 5.12 pack tutorialthe Perkmonks tutorial

这里是示例代码:

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

my $str=join('',('a'..'z', 'A'..'Z')); #the alphabet...  

$str=~s/(.{1,3})/$1 /g;                #...in groups of three
print "str=$str\n\n";

for ($str=~/./g) { 
 print "regex: = $_\n";
}

for(split(//,$str)) {
 print "split: \$_=$_\n";
}

for(unpack("A1" x length($str), $str)) {
 print "unpack: \$_=$_\n";
}

【问题讨论】:

    标签: perl unpack


    【解决方案1】:

    packunpack 模板可以像正则表达式一样使用括号来分组。该组可以跟随重复计数。 * 作为重复计数的意思是“重复直到你用完要打包/解包的东西”。

    for(unpack("(A1)*", $str)) {
        print "unpack: \$_=$_\n";
    }
    

    您必须运行基准测试来找出其中哪一个是最快的。

    【讨论】:

    • 我知道它必须简单!!!现在我玩了它,"(A1)*" 将 glob(我的问题),"(A1)$i" 将生成 $i 字段。桃色!您知道在哪里以良好的方式记录了吗?网络上的大部分材料都不是很好......
    • @drewk: 在perldoc -f pack (perldoc.perl.org/functions/pack.html) 在“为重复计数而不是数字提供 * 意味着使用但是还有很多项目......”和“A () -group 是括在括号中的子模板..."
    • @Ether:在这种情况下,perldoc 中的示例并没有对我说话。 * 的大部分用途都是像 unpack 'a3/A A*', '007 Bond J '; gives (' Bond', 'J') 那样以“吞噬其余部分”的形式出现,我认为打包/解包的 perldoc 可能——更清楚......
    • @Ether:pack("@1A((@2A)@3A)", qw[X Y Z]) produces "\0X\0\0YZ" 的 ()group 模板下的示例是只有作者喜欢的示例:-}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多