代码之家  ›  专栏  ›  技术社区  ›  Karthik SV

Perl Regex无法选择具有特殊字符的单词$

  •  1
  • Karthik SV  · 技术社区  · 8 年前

    我试图将字符串拆分为单词(其中一个单词具有特殊字符 $ ),但分割不起作用。我想将下面的字符串拆分为“测试”“字符串”

    $test = "Test Str$ing";
    
    my @words = split(" ",$test);
    
    print "@words";
    
    print "-------1End------------\n";
    
    
    foreach my $str (split /(\s)+/, $test) {        
        print "$str\n";
    }
    
    print "-------End------------\n";
    

    我执行了上面的代码,得到了下面的结果,如您所见,第二个单词只有一半:

    Test Str
    -------1End------------
    Test
    
    Str
    -------End------------
    

    有什么帮助吗?

    3 回复  |  直到 7 年前
        1
  •  9
  •   Mark Reed    8 年前

    在Perl中,双引号字符串中的美元符号触发插值。因此,这项任务:

    $test = "Test Str$ing";
    

    $test Test Str 后跟变量的值 $ing 如果 十亿美元 没有设置(并且没有启用限制,这会导致程序在此时失败),结果只是 测试Str .

    要获得一个真正的美元符号,您必须用反斜杠对其进行转义,或者使用单引号:

    $test = "Test Str\$ing";
    # or
    $test = 'Test Str$ing';
    

    无论如何,程序中的第一行,在 #! 无论如何,应该是 use strict; 然后,Perl会发现这些错误并崩溃,而不是默默地让您自找麻烦。为了更好地衡量,您应该添加 use warnings; 也可以:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    $test = "Test Str$ing";
    

    观察当我尝试运行上述操作时会发生什么:

    Global symbol "$test" requires explicit package name (did you forget to declare "my $test"?) at foo.pl line 5.   
    Global symbol "$ing" requires explicit package name (did you forget to declare "my $ing"?) at foo.pl line 5.
    Execution of foo.pl aborted due to compilation errors.
    

    您的程序应该看起来更像这样,只需进行少量更改即可通过严格的:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    my $test = 'Test Str$ing';
    
    my @words = split ' ', $test;
    
    print "@words";
    
    print "-------1End------------\n";
    
    foreach my $str (split /(\s)+/, $test) {
      print "$str\n";
    }
    
    print "-------End------------\n";
    

    这对我来说仍然很奇怪,因为你在一行中打印所有单词,而在 1End sentinel,然后将它们打印在一行上,中间有空行(虽然不是真正的空白,但包含原始字符串中的空白)。但如果这是你想要的,上面的方法就行了。输出:

    Test Str$ing-------1End------------
    Test
    
    Str$ing
    -------End------------
    
        2
  •  0
  •   Jan    8 年前

    您可以使用简单的引号:

    #!/usr/bin/perl
    $test = 'Test Str$ing';
    
    my @words = split(' ',$test);
    
    print "@words";
    

    否则,Perl会考虑 $ing 为变量(为空)。

        3
  •  0
  •   Sandeep    8 年前

    将数据分配给变量的最佳实践是使用单引号。

    my $var_name = 'TEST MESSAGE'; 
    

    如果由变量组成的数据要分配给另一个变量,则使用双引号。双引号中的数据将由PERL插值。 前任:

    my $var1 = 'TEST';
    my $var2 = "$var1 MESSAGE";