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

Amb*_*pel 3 perl split

splitperlfunc条目说:

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

暗示有一种方法可以超越这个默认值,但后来就说:

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

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

这不是关键任务,但我在分割一个根相对的URL,比如/foo/bar/,斜杠和获取

['', 'foo', 'bar']
Run Code Online (Sandbox Code Playgroud)

并想知道是否有办法不让那个空白的第一项.

bri*_*foy 7

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

 use File::Spec;

 my( $root, @path_parts ) = File::Spec->splitdir( $path );
Run Code Online (Sandbox Code Playgroud)

保持根的好处在于你可以轻松地向后移动并仍然保持那个前导斜杠(或者你的opearting系统可能使用的任何东西):

 my $path = File::Spec->catfile( $root, @path_parts );
Run Code Online (Sandbox Code Playgroud)

这对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 );
Run Code Online (Sandbox Code Playgroud)

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

 my( $root, @path_parts ) = split m|/|, $path;
Run Code Online (Sandbox Code Playgroud)


NXT*_*NXT 6

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

grep (length, split ('/','/foo/bar'))
Run Code Online (Sandbox Code Playgroud)

我不认为分裂可以做你想要的东西.

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

  • 这具有可能从中间移除元素的奇怪效果.你可能想要摆脱那些,但有时候你可能没有. (2认同)