我可以使用Perl的解压缩将字符串分解为变量吗?

Jim*_*_Bo 3 perl unpack substr

我有一个图像文件名,由四部分组成:

  1. $Directory (图像所在的目录)
  2. $Name (对于一个艺术网站,这是绘画名称参考#)
  3. $File (图像文件名减去扩展名)
  4. $Extension (图片扩展名)
$example 100020003000.png
Run Code Online (Sandbox Code Playgroud)

我希望相应地分解它:

$dir=1000 $name=2000 $file=3000 $ext=.png
Run Code Online (Sandbox Code Playgroud)

我想知道substr是否是分解传入的最佳选择,$example所以我可以使用4个变量来完成这些操作,例如验证/错误检查,从其$Name赋值中获取详细名称等等.我发现这篇文章:

解压缩比substr更快? 所以,在我的初学者"石头工具"的方法:

my $example = "100020003000.png";
my $dir = substr($example, 0,4);
my $name = substr($example, 5,4);
my $file = substr($example, 9,4);
my $ext = substr($example, 14,3); # will add the the  "." later #
Run Code Online (Sandbox Code Playgroud)

那么,我可以使用解压缩,或者甚至是更高效的其他方法吗?

我还想避免加载任何模块,除非这样做会因为某些原因使用更少的资源.Mod是我luv'em的好工具,但我认为这里没有必要.

我意识到我应该将vars推入数组/ hash,但是,我真的是一个初学者,我需要进一步指导如何做到这一点以及如何将它们拉回来.

感谢stackoverflow.com上的所有人!

Sin*_*nür 12

绝对:

my $example = "100020003000.png";
my ($dir, $name, $file, $ext) = unpack 'A4' x 4, $example;

print "$dir\t$name\t$file\t$ext\n";
Run Code Online (Sandbox Code Playgroud)

输出:

1000    2000    3000    .png

  • 即使我更喜欢使用正则表达式的想法,实际提供一个良好的基于​​包的答案+1.:-) (2认同)

Chr*_*ung 5

我只是使用正则表达式:

my ($dir, $name, $file, $ext) = $path =~ m:(.*)/(.*)/(.*)\.(.*):;
Run Code Online (Sandbox Code Playgroud)

或者,为了匹配您的具体示例:

my ($dir, $name, $file, $ext) = $example =~ m:^(\d{4})(\d{4})(\d{4})\.(.{3})$:;
Run Code Online (Sandbox Code Playgroud)

  • 这取决于.如果你有一个固定格式的大量文件名列表(从你的问题看来),请使用`unpack`.否则,请使用正则表达式. (3认同)