Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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
Php perl中的三元运算符在语句中指定变量时产生意外结果_Php_Perl_Function_If Statement - Fatal编程技术网

Php perl中的三元运算符在语句中指定变量时产生意外结果

Php perl中的三元运算符在语句中指定变量时产生意外结果,php,perl,function,if-statement,Php,Perl,Function,If Statement,我正在尝试从php到perl的转换,预期会遇到一些奇怪的情况。我无法理解为什么我的代码的一个版本与另一个版本不同 这失败了: sub tester { $return; ($_[0] < 10) ? $return = "youre a youngin" : $return = "youre an old person"; return $return; } print "how old are you?"; $a = <>; chomp $a; print teste

我正在尝试从php到perl的转换,预期会遇到一些奇怪的情况。我无法理解为什么我的代码的一个版本与另一个版本不同

这失败了:

sub tester
{
$return;
($_[0] < 10) ? $return = "youre a youngin" : $return = "youre an old person";
return $return;
}


print "how old are you?";
$a = <>;
chomp $a;

print  tester($a);  #both result in "youre an old person"
子测试仪
{
$return;
($\[0]<10)?$return=“你是个年轻人”:$return=“你是个老人”;
return$return;
}
打印“你多大了?”;
$a=;
大口一美元;
打印测试仪(a美元)#两者都会导致“你是个老人”
然而,这一点是有效的:

sub tester
{
    return ($_[0] < 10) ? "youre a youngin" : "youre an old person";
}


print "how old are you?";
$a = <>;
chomp $a;
print  tester($a);
子测试仪
{
return($\u0]<10)?“你是个年轻人”:“你是个老人”;
}
打印“你多大了?”;
$a=;
大口一美元;
打印测试仪(a美元);

这里的真正区别是什么

我相信
$return是一个语法错误。您不需要声明它-perl和php中的变量是无作用域的。

此外,
=
优先于
?:
因此需要将
()
添加到两个赋值中。

基本上是运算符优先。

它与Perl的运算符优先有关。在Perl中

($_[0] < 10) ? $return = "youre a youngin" : $return = "youre an old fart";

编辑:

然而,大多数人都会写作

$return = ($_[0] < 10) ? "youre a youngin" : "youre an old fart";
$return=($\u0]<10)?“你是个年轻人”:“你是个老屁”;
,节省了两次键入变量的冗余

根据Perl和PHP文档,Perl
?:
是右关联的,PHP
?:
是左关联的。(http://perldoc.perl.org/perlop.html ) (http://php.net/manual/en/language.operators.precedence.php )如果你写:

sub tester
{
   return ($_[0] < 10) ? "You're a young'un" : "You're an oldie";
}
子测试仪
{
return($\u0]<10)?“你是个年轻人”:“你是个老人”;
}

然后你就会得到你期望的结果。

这是一件优先的事情

($_[0] < 10) ? ($return = "youre a youngin") : ($return = "youre an old fart");
第二,他们将把这一论点放在一个地方性的辩论中:

sub tester {
    my $arg = shift;
第三,他们将以两种方式之一编写条件语句:

if ($arg < 10) {
    $return = "you're a youngin";
}
else {
    $return = "you're an old fart";
}
if($arg<10){
$return=“你是年轻人”;
}
否则{
$return=“你是个老混蛋”;
}
如果它们来自Lisp背景,它们可能会省去$return变量,只写:

return $arg < 10 ? "you're a youngin" : "you're an old fart";
返回$arg<10?“你是个年轻人”:“你是个老屁”;

啊,你已经发现了为什么
?:
是个坏主意,除非是在琐碎的情况下

运算符优先级是个问题。您很可能希望这样做:

$return = ($_[0] < 10) ? "you're a youngin'" : "you're an old fart";
请注意,
my$x=…
声明一个变量并分配一个值,而
my$x,$y,$z=…
声明多个变量并将列表解压缩到其中


my
变量称为词法变量,仅存在于声明它们的块中;它们不像PHP变量那样具有函数作用域。实际上,你应该在中读到它们。

第一个例子中使用了一些非常可疑的三元运算符(
?:
)。难道
=
不比
?:
更重要吗?:
阻止了这一点吗?嗯,错误消息是什么?@Jonah:这与这个问题有什么关系?@ysth:一切。“这失败”是什么意思?我想这对于了解Perl的人来说是非常明显的,但是应该始终给出问题的详细信息。您是否愿意对此进行扩展?赋值的优先级较低,低于三元运算符的优先级。这是非常不正确的。您绝对应该用Perl声明所有内容;否则所有变量都是全局变量@现在,它可能是动态的
local
;-)您应该声明它,但是使用
my$return当然
要严格使用在脚本的开头执行它。不这样做是非常糟糕的做法,因为您没有变量的作用域。不正确。Perl没有函数范围的变量。它具有包全局性(
our
或不带
strict
的无法识别的名称)和块范围词汇(
my
state
)。变量名本身也不是语法错误;不过,它会在
警告下发出“void context”警告。@Dani:请查看perldoc perlsub(Perl的POD中的文档)。你一直在讨论作用域,但你的断言似乎有点离题。我对Perl一无所知,但它肯定支持一些更规范的东西,比如
$return=(cond?a:b)
,而不是
cond?($return=a):($return=b)
?是的,它可以工作并保存字符数。(我试图修正他试图表达的内容,所以我离开了他的表格)@SHiN:噢,我没想到人物计数!但这是三元运算符在所有支持它的语言中的规范用法。OP的用法是高度非标准的(除非它是Perl习惯用法),所以最好避免它。使用
perl-MO=Deparse,-p whatever.pl运行程序,它将显示包含隐含括号的代码。关联性与此无关;这是优先级上的差异(php在某些情况下有一些奇怪的规则制定=更高的优先级)
if ($arg < 10) {
    $return = "you're a youngin";
}
else {
    $return = "you're an old fart";
}
return $arg < 10 ? "you're a youngin" : "you're an old fart";
$return = ($_[0] < 10) ? "you're a youngin'" : "you're an old fart";
use strict;
use warnings;

sub tester {
    my ($age) = @_;
    if ($age < 10) {
        return "you're a youngin'";
    }
    else {
        return "you're an old fart";
    }
}

print "how old are you? ";
my $age = <>;
chomp $age;

print tester($age);