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

时间:2016-08-23 05:11:23

标签: regex perl

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

$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 个答案:

答案 0 :(得分:9)

在Perl中,双引号字符串中的美元符号会触发插值。所以这个任务:

$test = "Test Str$ing";

$test设置为字符串Test Str,后跟变量$ing的值。如果未设置$ing(并且您没有启用限制,这会导致程序在此时失败),结果只是Test Str

要获得文字美元符号,您必须使用反斜杠转义它,或使用单引号代替:

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

无论如何,无论如何,程序中的第一行应该是#! {@ 1}}。然后Perl会抓住这些错误并且爆炸而不是默默地让你在脚下射击。为了更好地衡量,您还应添加use strict;

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

答案 1 :(得分:0)

您可以使用简单的引号:

#!/usr/bin/perl
$test = 'Test Str$ing';

my @words = split(' ',$test);

print "@words";

否则Perl认为$ing是一个变量(它是空的)。

答案 2 :(得分:0)

将数据分配给变量的最佳做法是使用单引号。 例如:

my $var_name = 'TEST MESSAGE'; 

如果将包含变量和this的数据分配给另一个变量,则使用双引号。双引号中的数据将通过PERL进行插值。 例如:

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