Inline::Python在-T模式下运行时,什么可以解释这个编译时错误消息?
在/usr/local/lib/perl/5.14.2/Inline/Python.pm第193行中使用-T开关运行时打开时的不安全依赖性.
第193行是Inline::Python打开的地方$o->{API}{location},我将其视为"内联目录".
当然,我使用了所需的选项:
use constant _INLINE_DIR_ => '/var/myapp/inline';
use Inline Config => UNTAINT => 1,
NO_UNTAINT_WARN => 1,
DIRECTORY => _INLINE_DIR_;
Run Code Online (Sandbox Code Playgroud)
我确保其中的/var/myapp/inline所有内容都是可由每个人编写的,显然包括root和用户setuid在运行时编写的应用程序.
同样的脚本在我的计算机上运行没有问题,无论我是否以root身份启动它,运行Inline0.50 Inline::Python0.43,但是当我尝试在使用相同版本Inline::Python且版本为0.49或0.55的服务器上运行它时,会给我这个错误Inline.
我想这个问题可能会引起一些不太重要的问题,但我一直想知道为什么在Perl中没有低优先级的定义或运算符.我想有一个理由,因为perlop明确地提到了这个事实.
我认为它有用的一个例子就是这样一个子例程:
sub input_many_data {
my $x = <> // return;
do_some_processing_with($x);
my $y = <> // return;
do_some_processing_with($y);
return ( $x, $y );
}
while (1) {
my ( $x, $y ) = &input_many_data or last;
do_something_with( $x, $y );
}
Run Code Online (Sandbox Code Playgroud)
它确实可以使用$x = (<> // return),但目的会更加明显,并且代码更具可读性且不易出错,具有类似的功能($x = <>) dor return.
我对Perl模块有一个循环依赖问题:说包X使用Y并想持有对Y实例的静态引用,而包Y使用X并想持有对X实例的静态引用。
简而言之,在未首先加载的模块中our $x_instance = new X将为“无法找到对象方法”提供“新”。
我想像
our $x_instance;
INIT { $x_instance = new X }
Run Code Online (Sandbox Code Playgroud)
很有道理,所以我阅读了有关特殊命名块的所有内容。
好吧,这在我做的简单测试中有效,但在我的实际应用中,它系统地显示了运行INIT块为时已晚。情况与此相同CHECK的块。
我发现的唯一解释是来自Perl Monks,恐怕我对此没有多大意义。
有人对Perl如何执行CHECK和INIT超出其内容的块有一个解释perlmod,并且可以帮助我理解为什么我的块有时执行而有时不执行的原因吗?
顺便说一句,我只想了解这一点,因为我有一个合理的解决方法,我并不是很想解决我原来的循环依赖问题:
our $x_instance;
sub get_x_instance {
$x_instance //= new X;
return $x_instance;
}
Run Code Online (Sandbox Code Playgroud) 我已经开始和摩西一起玩,并试图制作我认为相当标准的基线系统.我基本上遵循了网站上描述的步骤,但不是使用news-commentary我使用Europarl v7进行培训,使用WMT 2006开发套件和原始的Europarl常用测试.我的想法是做一些类似于Le Nagard&Koehn(2010)的事情,他们在基线英语到法语系统中获得了.68的BLEU分数.
总而言之,我的工作流程或多或少是这样的:
tokenizer.perl 关于一切lowercase.perl(而不是truecase)clean-corpus-n.perltrain-model.perl 完全如描述mert-moses.pl 使用WMT 2006开发由此产生的BLEU得分为.26 ......这引出了两个问题:
我有一个程序可以很好地与 GCC 配合使用,但是使用 Clang 编译它反而会使链接器失败。
我认为我的问题是模板类,所以我实现了这个小例子。
test.cpp:
#include "Point.h"
int main()
{
Point<int> p1;
Point<int> p2{ 3, 6 };
}
Run Code Online (Sandbox Code Playgroud)
Point.h:
#ifndef POINT_H
#define POINT_H
template<typename T>
class Point {
T x, y;
public:
Point();
Point(T, T);
};
template class Point<int>;
template class Point<float>;
#endif
Run Code Online (Sandbox Code Playgroud)
Point.cpp:
#include "Point.h"
template<typename T>
Point<T>::Point()
: x{0}, y{0}
{}
template<typename T>
Point<T>::Point(T t_x, T t_y)
: x{t_x}, y{t_y}
{}
Run Code Online (Sandbox Code Playgroud)
当我用 构建它时g++ Point.cpp test.cpp,它可以正常工作。
但是使用 Clang,它会出现以下错误:
$ clang++ Point.cpp test.cpp …Run Code Online (Sandbox Code Playgroud) 我今天花了太多时间调试其中一个阴险的小错误.
这或多或少是我所做的:
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my $test = new MyTest('test');
say $test->to_string for 1..3;
package MyTest;
sub new {
my $class = shift;
my $parm = shift;
return bless \$parm, $class;
}
sub to_string {
my $self = shift;
my $string = 'Hello!' if 0;
$string .= $$self;
return $string;
}
Run Code Online (Sandbox Code Playgroud)
请注意,由于错误测试,my $string不进行评估.(当然,我失去这么多时间的代码没有if 0!)
我意识到编译器不知道测试将是错误的,但是它不应该抱怨我使用的变量可能没有在下一行声明?
此外,我希望这会导致运行时错误,但perl只是给了我
test
testtest
testtesttest
Run Code Online (Sandbox Code Playgroud)
为什么没有错误?这是一个错误还是一个功能?
我对这个例子中的perl子例程参数感到困惑
当我在子程序参数中使用引用时,它可以工作:
@a = ( 1, 2 );
@b = ( 5, 8 );
@c = add_vecpair( \@a, \@b );
print "@c\n";
print $a[0];
sub add_vecpair { # assumes both vectors the same length
my ( $x, $y ) = @_; # copy in the array references
my @result;
@$x[0] = 2;
for ( my $i = 0; $i < @$x; $i++ ) {
$result[$i] = $x->[$i] + $y->[$i];
}
return @result;
}
Run Code Online (Sandbox Code Playgroud)
但是当我不使用引用作为这样的参数时:
@a = ( 1, 2 ); …Run Code Online (Sandbox Code Playgroud) 我想用一个DBIx ResultSet的帮手,也就是DBIx::Class::Helper::ResultSet::Random,在我催化剂的应用.
包文档显示了它是如何从DBIx::Class::ResultSet类中加载的,但据我所知,我没有这些,因为我正在使用它DBIx::Class::Schema::Loader来创建模式.
我试过把它__PACKAGE__->load_components('Helper::ResultSet::Random')放在我的Schema::Result,但是没有用:无法通过包"DBIx :: Class :: ResultSet"找到对象方法"rand".
应该怎么做?