【问题标题】:How do I assign the result of a regex match to a new variable, in a single line?如何在一行中将正则表达式匹配的结果分配给新变量?
【发布时间】:2011-06-08 11:39:47
【问题描述】:

我想在一行中匹配并分配给一个变量:

my $abspath='/var/ftp/path/to/file.txt';

$abspath =~ #/var/ftp/(.*)$#;
my $relpath=$1;

我相信这一定很容易。

【问题讨论】:

  • just one line - 有什么特殊原因吗?您知道在捕获不可为空的模式时,单行不是最佳选择。

标签: regex perl


【解决方案1】:
my ($relpath) = $abspath =~ m#/var/ftp/(.*)$#;

在列表上下文中,匹配返回组的值。

【讨论】:

    【解决方案2】:

    强制 Clippy:“嗨!我看到你在 Perl 中进行路径操作。你想改用 Path::Class 吗?”

    use Path::Class qw(file);
    my $abspath = file '/var/ftp/path/to/file.txt';
    my $relpath = $abspath->relative('/var/ftp');
    # returns "path/to/file.txt" in string context
    

    【讨论】:

    • 这就是我遵循 SO 的原因,我总是忘记 Path::Class。谢谢
    【解决方案3】:

    您可以使用匹配和替换运算符来完成它:

    (my $relpath = $abspath ) =~ s#/var/ftp/(.*)#$1# ;
    

    此代码将$abspath 分配给$relpath,然后对其应用正则表达式。

    编辑:如果您只需要简单的匹配,Qtax 答案会更优雅。如果您需要复杂的替换(我通常需要),只需使用我的表达式即可。

    【讨论】:

      【解决方案4】:

      在 Perl 5.14 中,您还可以使用 /r(非破坏性替换)修饰符:

      perl -E'my $abspath="/var/ftp/path/to/file.txt"; \
              my $relpath= $abspath=~ s{/var/ftp/}{}r; \
              say "abspath: $abspath - relpath: $relpath"'
      

      有关更多示例,请参阅“New Features of Perl 5.14: Non-destructive Substitution”。

      【讨论】:

        【解决方案5】:

        由于您只想删除字符串的开头,您可以优化表达式:

        (my $relpath = $abspath) =~ s#^/var/ftp/##;
        

        甚至:

        my $relpath = substr($abspath, 9);
        

        【讨论】:

          猜你喜欢
          • 2010-11-17
          • 2014-07-20
          • 1970-01-01
          • 2014-09-16
          • 2013-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多