Ей, велик език е пърла. А конкретно в случая разлика има, макар на пръв поглед да изглежда че няма. Глей сега:
Първо, конструкцията $agi_env{channel} означава "бръкни в хеш таблицата agi_env и извади стойността, която отговаря на ключа 'channel'". Същото като $agi_env->{channel}, но разликата е че във втория случай $agi_env е референс към хеш таблицата.
Да ти го преведа на С++, разликата е като между:
some_object.member
и
pointer_to_some_object->member
Второ, конструкцията () дефинира масив (вектор). Така че
my ($x) - дефинира масив от един елемент
my $x - дефинира проста променлива (скалар)
Така, обикновено едното е равносилно на другото. Обаче в случая това не е така, както ще стане ясно след малко.
Трето, операцията
$x =~ m/alabala/;
извършва търсене на регулярния израз alabala в стойността на променливата $x. Тази операция си има и стойност (т.е. отляво на $x може да стои =). Ако погледнеш описанието на операцията =~ m// (или m{}, което е същото), ще забележиш, че в скаларен контекст връща 0 или 1, в зависимост от това дали има съвпадения, а във векторен контекст връща съответните съвпадения.
T.e.:
my $extension = $agi_env{channel} =~ m{Local/(\d+)};
означава "потърси стринга 'Local/XXXX' (където ХХХХ е низ от едно или повече числа) в стойността на channel от хеша $agi_env. Ако го намериш, запиши в $extension стойност 1, иначе -- 0". Това е така, защо отляво на = $agi_env{channel} =~ m{Local/(\d+)} стои скаларна променлива (т.е. казва се, че контекстът е скаларен)
От друга страна:
my ($extension) = $agi_env{channel} =~ m{Local/(\d+)};
означава "потърси стринга 'Local/XXXX' (където ХХХХ е низ от едно или повече числа) в стойността на channel от хеша $agi_env. Ако го намериш, запиши в $extension стойността ХХХХ, иначе не записвай нищо". Това е така, защо отляво на = $agi_env{channel} =~ m{Local/(\d+)} вече стои векторна променлива (т.е. казва се, че контекстът е векторен). В случая има само един елемент в масива и само един комплект () в търсения регулярен израз, а те ограждат именно цифровата стойност ХХХХ, т.е. тя ще бъде върната в променливата $екстеншън ако има съвпадение.
Изводът е: ако $agi_env{channel} има вида Local/ХХХХ, където ХХХХ е някакво цяло число, досега в променливата се е $extension вземало това число. Ако махнеш скобите, ще получиш просто 1 ако $agi_env{channel} има указания вид.
Ей, велик език е пърла. А между другото, ако не се лъжа, бориш един опън сорс шит за воис овър айпи телефония, нали?
Аре поздрави,
# [ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"
|