我刚刚编写了一些测试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),我会得到大量的语法错误.
我有两个关于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子程序及其工作原理.从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)
我知道真正的 …
我正在尝试实现一些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) 我在Firefox和Chrome Dev Console中输入了这个表达式,我想知道为什么它是有效的JavaScript:
var x = { a (b) {} };
console.log(x);
Run Code Online (Sandbox Code Playgroud)
x然后将其设置为具有属性"a"的对象,该属性包含具有参数标识符"b"的名为"a"的函数.这个有效的JavaScript语法怎么样?"a"后冒号丢失,我不理解函数定义.
我想在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):...
我想重复搜索不会更改的数组中的值.
到目前为止,我一直在这样做:我把值放在一个哈希(所以我有一个数组和一个基本相同内容的哈希),然后我使用搜索哈希exists.
我不喜欢有两个不同的变量(数组和散列)都存储相同的东西; 但是,哈希搜索速度要快得多.
我发现~~Perl 5.10 中有一个(smartmatch)运算符.在数组中搜索标量时效率如何?
我刚刚遇到一些非常奇怪的行为,我实在无法解释:
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) 今天在我的大学里,老师问我一个问题.他在论文中写了这段代码并说"这段代码的输出是什么?"
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 ×6
python ×2
algorithm ×1
buffering ×1
c++ ×1
factorial ×1
file-io ×1
iterator ×1
javascript ×1
performance ×1
scope ×1
smartmatch ×1
sorting ×1