小编Thi*_*Not的帖子

使用Perl执行Python脚本时,为什么不会出现语法错误?

我刚刚编写了一些测试python代码test.py,我将按如下方式启动它:

perl test.py
Run Code Online (Sandbox Code Playgroud)

过了一会儿,我意识到自己的错误.我说"过了一会儿",因为Python代码实际上是正确执行的,就好像在Python解释器中一样!

为什么我的Perl会解释我的Python?test.py看起来像这样:

#!/usr/bin/python

...Python code here...
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我做相反的事情(即调用python something.pl),我会得到大量的语法错误.

python perl

84
推荐指数
1
解决办法
3616
查看次数

为什么使用自动生成文件句柄的三参数打开调用是Perl的最佳实践?

我有两个关于Perl open函数的问题:

1)我似乎记得Perl最佳实践中的3参数版本open比两个参数版本更好,例如

open(OUT, '>>', $file);
Run Code Online (Sandbox Code Playgroud)

open(OUT, ">>$file");
Run Code Online (Sandbox Code Playgroud)

这是为什么?我试图告诉别人前几天使用3参数版本,但似乎无法用任何东西支持它.

2)我似乎还记得autovivified文件句柄比bareword文件句柄更受青睐(他们称之为不同的东西)?而且也记不住为什么,例如

open(my $out, '>>', $file);
Run Code Online (Sandbox Code Playgroud)

open(OUT, '>>', $file);
Run Code Online (Sandbox Code Playgroud)

这是strict件事吗?我似乎记得能够使用OUT,strict但我不记得了.

perl file-io scope

45
推荐指数
3
解决办法
6055
查看次数

Perl子程序是按引用调用还是按值调用?

我试图弄清楚Perl子程序及其工作原理.从perlsub我知道子例程是按引用调用的,并且需要一个赋值(例如my(@copy) = @_;)来将它们转换为按值调用.

在下文中,我看到它change被引用称为"a"和"b"变为"x"和"y".但我很困惑为什么数组没有用额外的元素"z"扩展?

use strict;
use Data::Dumper;

my @a = ( "a" ,"b" );

change(@a);

print Dumper(\@a);

sub change
{
    @_[0] = "x";
    @_[1] = "y";
    @_[2] = "z";
}
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = [
          'x',
          'y'
        ];
Run Code Online (Sandbox Code Playgroud)

在下面,我传递哈希而不是数组.为什么键不能从"a"变为"x"?

use strict;
use Data::Dumper;

my %a = ( "a" => "b" );

change(%a);

print Dumper(\%a);

sub change
{
    @_[0] = "x";
    @_[1] = "y";
}
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = {
    'a' => 'y'
};
Run Code Online (Sandbox Code Playgroud)

我知道真正的 …

perl

28
推荐指数
3
解决办法
2万
查看次数

从前向迭代器获取反向迭代器而不知道值类型

我正在尝试实现一些STL样式的排序算法.std::sort看起来像这样的原型(来自cplusplus.com):

template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
Run Code Online (Sandbox Code Playgroud)

该函数通常被称为这样(虽然容器类型可以变化):

std::vector<int> myVec;
// Populate myVec
std::sort(myVec.begin(), myVec.end());
Run Code Online (Sandbox Code Playgroud)

我复制了std::sort我自己的排序功能的原型.要遍历要排序的容器,我执行以下操作:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {  
  RandomAccessIterator iter;
  for (iter = first; iter != last; ++iter) {
    // Do stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

很容易.但是如果我想使用反向迭代器呢?这在从两端对容器进行分类的算法中是方便的,例如鸡尾酒排序.

有没有办法从作为参数传入的迭代器中获取反向迭代器?如果我事先知道容器类型,我可以这样做:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {
  std::vector<int>::reverse_iterator riter(last);
  std::vector<int>::reverse_iterator rend(first);
  for ( ; riter != rend; ++riter) {
    // Do stuff …
Run Code Online (Sandbox Code Playgroud)

c++ sorting iterator

24
推荐指数
1
解决办法
2万
查看次数

用于计算阶乘的快速算法

我发现这个页面描述了许多用于计算阶乘的算法.不幸的是,解释很简洁,我不想逐行筛选源代码来理解算法背后的基本原理.

任何人都能指出我对这些(或其他快速)计算因子的算法的更详细描述吗?

编辑: 此页面描述了素数因子分解的方法,这是所有性能最佳的因子算法共有的技术.它还包含Python中的一些很好的示例代码.作者链接到二进制分裂的描述,并参考了算法杂志("计算因子的复杂性")中的一篇文章,看起来很有希望,如果我只能得到它.

algorithm performance factorial

23
推荐指数
2
解决办法
3万
查看次数

在对象声明中属性名后没有冒号,它有效吗?

我在Firefox和Chrome Dev Console中输入了这个表达式,我想知道为什么它是有效的JavaScript:

var x = { a (b) {} };
console.log(x);
Run Code Online (Sandbox Code Playgroud)

x然后将其设置为具有属性"a"的对象,该属性包含具有参数标识符"b"的名为"a"的函数.这个有效的JavaScript语法怎么样?"a"后冒号丢失,我不理解函数定义.

javascript

21
推荐指数
2
解决办法
2041
查看次数

如何获取数字的前两位数?

我想在Python中检查数字的前两位数字.像这样的东西:

for i in range(1000):

    if(first two digits of i == 15):
        print("15")

    elif(first two digits of i == 16):
        print("16")
Run Code Online (Sandbox Code Playgroud)

是否有命令检查数字的前两位数字?我想避免像这样的命令if(i>149 and i<160):...

python

19
推荐指数
3
解决办法
6万
查看次数

在数组中搜索标量时,Perl的smartmatch运算符有多快?

我想重复搜索不会更改的数组中的值.

到目前为止,我一直在这样做:我把值放在一个哈希(所以我有一个数组和一个基本相同内容的哈希),然后我使用搜索哈希exists.

我不喜欢有两个不同的变量(数组和散列)都存储​​相同的东西; 但是,哈希搜索速度要快得多.

我发现~~Perl 5.10 中有一个(smartmatch)运算符.在数组中搜索标量时效率如何?

perl smartmatch

18
推荐指数
3
解决办法
4967
查看次数

Perl做... while和last命令

我刚刚遇到一些非常奇怪的行为,我实在无法解释:

do {
    my $qry = $self->getHTMLQuery(undef, $mech->content());
    next if (!defined($qry));

    push(
        @prods,
        map { 'http://www.XXXXYYYX.com'.$_->attr('href') }
            $qry->query('div.prodInfo div.prodInfoBox a.prodLink.GridItemLink')
    );

    $qry->delete();
    $TEST++;

    last if ($TEST >= 10);

} while(eval { $mech->follow_link(class => 'jump next') });

print "WHILE ENDED\n";
Run Code Online (Sandbox Code Playgroud)

上面的代码永远不会打印"WHILE ENDED",即使它$TEST> = 10 时似乎超出了while循环.

但是下面的代码确实打印了"WHILE ENDED":

do {
    my $qry = $self->getHTMLQuery(undef, $mech->content());
    next if (!defined($qry));

    push(
        @prods,
        map { 'http://www.XXXXYYYX.com'.$_->attr('href') }
            $qry->query('div.prodInfo div.prodInfoBox a.prodLink.GridItemLink')
    );

    $qry->delete();
    $TEST++;

} while(eval { $mech->follow_link(class => 'jump next') } && $TEST …
Run Code Online (Sandbox Code Playgroud)

perl

17
推荐指数
3
解决办法
1万
查看次数

当我使用sleep时,为什么不在循环的每次迭代中打印输出?

今天在我的大学里,老师问我一个问题.他在论文中写了这段代码并说"这段代码的输出是什么?"

use warnings;

for (1 .. 20)
{
    print ".";
}
Run Code Online (Sandbox Code Playgroud)

我发现它很容易并且说它将循环20次并且在每次迭代时它将打印一个点(.)因此总共20个点将是输出.

他说你是对的,然后他对代码做了一些改动.代码是:

use warnings;

for (1 .. 20)
{
    print ".";
    sleep 1;
}
Run Code Online (Sandbox Code Playgroud)

他说现在的产量是多少?我不知道睡眠功能,我猜想在每次迭代时它会打印点(.)然后它会等待1秒(因为睡眠功能)然后它会再次迭代然后它会再次打印(.)然后它将等待1秒,依此类推......

老师叫我在家里检查一下.我在家尝试了,我发现第二个代码等了20秒,然后一次打印所有点(20个点).我想知道这是怎么发生的?为什么点(.)在每次迭代时都没有打印?

perl buffering

15
推荐指数
3
解决办法
3066
查看次数