2015-05-27 3 views
-4

Python юридический код:Perl эквивалент python exec?

exec("def f():print 123"); f(); 

Что такое Perl эквивалент конструкция или как связать символы из Eval в текущей области от Eval в Perl?

eval("sub f(){ print 123;}"); f(); 
    "Undefined subroutine &main::f" 

Вопрос не актуален, так как он имеет опечатку в нем первом определении.

+5

Вы * действительно * не хочу, чтобы сделать это – Borodin

+0

Как вы знаете, что он хочет сделать? Он может входить в запутанное perl-соревнование ... – GreenAsJade

+0

Строка 'eval' опасна, потому что это может привести к инъекции кода. Не используйте его, если вы действительно не знаете о безопасности. См. 'Perldoc perlsec' http://perldoc.perl.org/perlsec.html – shawnhcorey

ответ

2

Я не знаю точно, что вы пытаетесь достичь, но строка Eval поместит функцию в пространстве имен пакета (и будет переопределить, если уже существует функция с помощью этого имени). Если вам нужно это только в одном месте:

my $f = sub { my $v = shift; sub { print $v } }->(123); 
... 
$f->(); 

Пример:

#!/usr/bin/env perl -l 

use strict; 
use warnings; 

sub f() { print 456 }; 

eval "sub f() { print 123 }"; 

f(); 

my $f = sub { my $v = shift; sub { print $v } }->(123); 

$f->(); 

Выход:

Subroutine f redefined at (eval 1) line 1. 
123 
123
+0

Спасибо за ваш предложенный трюк с анонимной функцией, но я сделал только опечатку в определении подпрограммы) – bruziuz

+0

Есть ли причина для пустого прототипа? 'sub() {..}' –

+0

Думаю, что есть пустой прототип + некоторый знак двоеточия + тихая модель eval invocation в Perl => все это приводит к ненужному вопросу в stackoverflow) – bruziuz

4

У вас есть неправильная декларация подпрограммы. Попробуйте:

eval("sub f { print 123 }"); f(); 

Смотрите также: http://perldoc.perl.org/perlsub.html

+0

У меня есть опечатка. eval ("sub f {print 123;}"); F(); отлично работает для меня – bruziuz

Смежные вопросы