我尝试将字符串拆分为单词(其中一个单词具有特殊字符$
),但拆分不起作用。我想将下面的字符串拆分为“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------------
对此有何帮助?
答案 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";