Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 变量中grep和split处理的Perl错误_String_Perl - Fatal编程技术网

String 变量中grep和split处理的Perl错误

String 变量中grep和split处理的Perl错误,string,perl,String,Perl,我试图将grep的输出分配到变量中,但我得到了数字作为输出 案例一: 产量 print ( grep !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i , split ( / / , $str1[0] ) ); my $pname = grep !/create/i&&!/or/i &&!/replace

我试图将grep的输出分配到变量中,但我得到了数字作为输出

案例一:

产量

print ( grep !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i ,  split ( / / , $str1[0] ) );
my $pname = grep !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i ,  split ( / / , $str1[0] ) ;
print $pname , "\n";
案例二:

是字符串,但输出为

print ( grep !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i ,  split ( / / , $str1[0] ) );
my $pname = grep !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i ,  split ( / / , $str1[0] ) ;
print $pname , "\n";
是数字吗

区别是什么?如何获取字符串

任何帮助都将不胜感激。

与许多Perl函数(和运算符)一样,
grep
在列表上下文和标量上下文中做的事情略有不同。中解释了其不同的回报行为

为列表的每个元素计算块或表达式(本地设置 $返回到每个元素),并返回由这些元素组成的列表值 表达式对其求值为true的元素。在标量中 返回表达式为真的次数

在第一个示例中,
print
将列表上下文强加于表达式,因此您可以得到一个值列表。在第二个示例中,将结果分配给标量,因此在标量上下文中调用
grep
,并返回找到的匹配数

解决方案是确保在列表上下文中调用
grep
。两种简单的方法是执行列表分配:

my ($pname) = grep ...;
或者将结果分配给数组

my @pnames = grep ...;
如果你习惯了咨询,你会发现Perl编程要容易得多。

与许多Perl函数(和运算符)一样,
grep
在列表上下文和标量上下文中做的事情略有不同。中解释了其不同的回报行为

为列表的每个元素计算块或表达式(本地设置 $返回到每个元素),并返回由这些元素组成的列表值 表达式对其求值为true的元素。在标量中 返回表达式为真的次数

在第一个示例中,
print
将列表上下文强加于表达式,因此您可以得到一个值列表。在第二个示例中,将结果分配给标量,因此在标量上下文中调用
grep
,并返回找到的匹配数

解决方案是确保在列表上下文中调用
grep
。两种简单的方法是执行列表分配:

my ($pname) = grep ...;
或者将结果分配给数组

my @pnames = grep ...;

如果你习惯了咨询,你会发现Perl编程容易得多。

当你使用
grep
时,你正在处理列表
grep
将输入作为列表,并生成一个列表作为输出

每当在标量上下文中对数组求值(例如分配给标量变量)时,它都会返回其长度。无论何时在列表上下文中对其求值,它都返回数组本身。在本例中,grep的工作方式与数组相同,返回在标量上下文中计算时从grep返回的列表的长度

my $pname = grep { 
               !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i  
            } split / /, $str1[0]);
print $pname , "\n";
将返回从grep返回的列表的大小,因为
$pname
是标量变量

my ($pname) = grep { 
               !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i  
            } split / /, $str1[0]);
print $pname , "\n";
将返回列表的第一个元素,因为赋值是在列表上下文中执行的(请注意
$pname
周围的参数)


下面是上下文的简要概述:

当您使用
grep
时,您正在处理列表
grep
将输入作为列表,并生成一个列表作为输出

每当在标量上下文中对数组求值(例如分配给标量变量)时,它都会返回其长度。无论何时在列表上下文中对其求值,它都返回数组本身。在本例中,grep的工作方式与数组相同,返回在标量上下文中计算时从grep返回的列表的长度

my $pname = grep { 
               !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i  
            } split / /, $str1[0]);
print $pname , "\n";
将返回从grep返回的列表的大小,因为
$pname
是标量变量

my ($pname) = grep { 
               !/create/i&&!/or/i &&!/replace/i&&!/package/i&&!/body/i&&!/as/i  
            } split / /, $str1[0]);
print $pname , "\n";
将返回列表的第一个元素,因为赋值是在列表上下文中执行的(请注意
$pname
周围的参数)


这里是对上下文的简要概述:

“每当在标量上下文中计算列表时(例如分配给标量变量),它都会返回其长度”-我可以理解为什么您可能认为这是正确的(在这种情况下,
grep
肯定是这样操作的),但在一般情况下不是这样的。列表在标量上下文(即数组)中不返回其长度。数组和列表不是一回事。我写信试图澄清这个概念。@DaveCross谢谢,我会改正的。事实上,我几周前读过你的文章,但我还是看错了。啊!“每当在标量上下文中对列表求值时(例如分配给标量变量),它都会返回其长度”-我可以理解为什么您可能认为这是正确的(在本例中,
grep
肯定是这样操作的),但在一般情况下并非如此。列表在标量上下文(即数组)中不返回其长度。数组和列表不是一回事。我写信试图澄清这个概念。@DaveCross谢谢,我会改正的。事实上,我几周前读过你的文章,但我还是看错了。啊!