如何在Perl的split()中抑制空的前导字段?

时间:2009-09-28 02:12:48

标签: perl split

perlfuncsplit条目说:

  

默认情况下,保留空的前导字段

暗示有一种方法可以超越默认值,但稍后会说:

  

当字符串

开头有正宽度匹配时,会产生空的前导字段

......这是否意味着没有办法跳过第一个字段?

这不是关键任务,但是我在斜线上分割了一个根相对网址,比如/foo/bar/,并且

['', 'foo', 'bar']

并想知道是否有办法让获得那个空白的第一项。

7 个答案:

答案 0 :(得分:7)

如果要拆分路径元素,请查看File::SpecPath::Class,它们可以处理所有特定于操作系统的内容:

 use File::Spec;

 my( $root, @path_parts ) = File::Spec->splitdir( $path );

保持根的好处在于你可以轻松地向后移动并仍然保持领先的斜线(或者你的操作系统可能使用的任何东西):

 my $path = File::Spec->catfile( $root, @path_parts );

这对URL来说并不是什么大问题,因为它们都使用类似unix的路径规范。尽管如此,以同样的方式构建本地路径很容易,并记住根目录(在Windows,VMS等方面可能很重要):

 my ($docroot_root, @doc_root ) = File::Spec->splitdir( $ENV{DOCUMENT_ROOT} );
 my $local_path = File::Spec->catfile( $docroot_root, @doc_root, @path_parts );

否则,你会被分裂所困扰。它假设你关心字段的位置,所以它保留了它们的位置(即第一个分隔符之前的东西总是在列表中的位置0,即使它是空的)。对于你的问题,我倾向于把它写成一个列表赋值,我使用一个变量来吸收初始的空字段,就像我做的那样

 my( $root, @path_parts ) = split m|/|, $path;

答案 1 :(得分:6)

您可以使用grep删除任何零长度的字段。

grep (length, split ('/','/foo/bar'))

我认为分裂可以做你想做的事情。

告诉您使用特定于域的功能进行拆分的人是正确的。特定于域的拆分等价物将自动处理各种非显而易见的特殊情况。

答案 2 :(得分:1)

brian d foy mentioned File::Spec模块。我真的很喜欢这个,因为它需要一种直观的方法,而且你确切地知道你得到了什么。

根据您使用Perl的脚本/编程风格,您可能需要尝试:

($volume, $directories, $file) = File::Spec->splitpath( $path );

结果很简单,如果您需要音量,那就在您的指尖!

它使您的代码更具可读性!请注意,不同的模块有不同的规格,例如符号链接或已安装的磁盘。

答案 3 :(得分:-1)

如果你通过'/'的分隔符进行拆分,那么我看到输出没有任何问题。考虑到第一个字符是一个分隔符,那么它别无选择,只能有一个空字符串。

答案 4 :(得分:-1)

您可以使用的一种方法是使用正则表达式删除任何前导分隔符。

e.g。

$str = "/foo/bar";
$str =~ m!^/*!!;

然后像以前一样进行分割。

答案 5 :(得分:-1)

split(' ', $string)会将字符串拆分为空格,但不会为您提供前导,尾随或内部空字段。

我认为这是一个更一般的情况,但在'x'上进行拆分相当于/x/

答案 6 :(得分:-1)

像这样

(undef,@x)= split /\//,$string;
相关问题