小编Lit*_*rat的帖子

Kleene的明星:为什么$ _ ="a"; s/a*/e/g产生:ee

a* 意味着零个或多个实例:权利?

那么为什么会$_ = "a"; s/a*/e/g产生:ee

可能的答案:它正在替换字符串:"a"with:"e",它正在替换空字符串:""with:"e".或者它正在取代仅仅缺少一封信:a带有一封信:e或它取代了"零次出现":a与:e

好的,但是:

$_ = "b"; s/a*/e/g 生产: ebe

这似乎是在更换空字符串左:b和还空字符串的权利:b

好.但那为什么不这样做:" a"?为什么它不更换空字符串的左:a和还空字符串的右侧:和也的信:一个本身得到:eee?

有几个零次出现:a左侧是右侧!

regex perl

31
推荐指数
3
解决办法
1038
查看次数

为什么print($ a = a..c)产生:1E0

print (a..c) # this prints: abc  
print ($a = "abc") # this prints: abc

print ($a = a..c); # this prints: 1E0
Run Code Online (Sandbox Code Playgroud)

我本以为会打印出来:abc

use strict;
print ($a = "a".."c"); # this prints 1E0
Run Code Online (Sandbox Code Playgroud)

为什么?这只是我的电脑吗?编辑:我有一个部分答案(范围运算符..在标量上下文中返回一个布尔值 - 谢谢)但我不明白的是:为什么:print($ a ="a"..."c ")产生1而不是0为什么:print($ a ="a".."c")产生1E0而不是1或0

perl

10
推荐指数
3
解决办法
885
查看次数

Perl在这里 - 文档无法正常工作

我一直在尝试使用Here-documents但它不起作用.可能有什么问题?我错过了一些明显的东西吗

这是我正在尝试运行的文件的全部内容(在任何地方都没有空格或标签):

print<<EOF;
text
EOF
Run Code Online (Sandbox Code Playgroud)

我通过将它保存在记事本或记事本++中作为一个名为3.pl的文件来运行它
然后进入Windows 7下的DOS窗口并键入:perl 3.pl 我收到此消息:

在3.pl第1行的EOF之前的任何地方都找不到字符串终止符"EOF".

perl heredoc

7
推荐指数
1
解决办法
3792
查看次数

这是如何工作的:地图与三元钩子算子和()一起使用

在上一个问题中,seaworthy询问如何从数组中删除前5个元素:如何删除数组 的前五个元素?

在几个建议中,friedo提供了这样的:

my $cnt = 0; @array = map { ++$cnt < 5 ? ( ) : $_ } @array;

我没有得到()位.请解释这对我有什么用,因为我不能理解它?

我知道三元钩操作符的工作方式如下:(如果有的话)?(然后这样做):(否则这样做)

例如:$a=2; print ($a==2 ? 3 : 4)#the print:3因为我们有:($ a == 2?3:4)这意味着:(如果$ a等于2)?(然后打印3):(否则打印4)

所以使用friedo的代码,首先$ cnt增加到1,然后我们有:

$cnt < 5 ? ( ) : $_ 意思是: if $cnt is less than 5 ? then ( ) : otherwise $_

我可以看到$ _位是如何工作的,因为我有时会使用这样的地图:

@array = map { $_, "\n" } @array

这会复制@array中的一个元素,将副本放到$中,然后添加一个\n换行符,然后将$中的值复制回@array(并且它使用@array中的所有值执行此操作,因此基本上它会为每个值添加换行符@array中的元素)

因此:
@array = map …

perl

5
推荐指数
1
解决办法
947
查看次数

将强制转换应用于整数和浮点除法的结果:这里发生了什么?

我是初学者,对我来说有些事情没有多大意义.请你能解释我哪里出错了.如果以前曾被问过,我很抱歉.

这里小数点的存在意味着使用浮点除法进行评估.

System.out.println(1/3.0); // this prints: 0.3333333333333333
System.out.println(1.0/3); // this prints: 0.3333333333333333
System.out.println(1.0/3.0); // this prints: 0.3333333333333333
Run Code Online (Sandbox Code Playgroud)

显然,下面是"截断整数除法"的一个例子.这对我来说似乎有点奇怪,但还可以.

System.out.println(1/3); // this prints: 0
Run Code Online (Sandbox Code Playgroud)

可以这样说:"在下面的行中,(double)演员被评估为第一.它有效地说:"将1/3视为双重 - 不要使用截断整数除法.而是使用浮点除法.""

System.out.println((double)1/3); // this prints: 0.3333333333333333
Run Code Online (Sandbox Code Playgroud)

下面,我们得到0.0 - 这是怎么发生的?

System.out.println((double)(1/3)); // this prints: 0.0
Run Code Online (Sandbox Code Playgroud)

好的,也许额外的括号意味着(1/3)得到第一次评估.它使用截断整数除法得到0进行评估.然后应用double给出0.0 Ok这是有道理的

好的,我们也许可以在这里提出一些一般规则:

规则1 :( double)表达式首先应用(double)cast,然后计算表达式.

规则2 :( double)(表达式)表示计算表达式然后应用强制转换.大!

所以在下面的下一行我们有:(int)表达式,所以我想我们可以应用规则1).(int)演员表被评估为1st.它有效地说:"将1.0/3视为一个int - 不要像使用double那样使用尽可能多的内存.不要使用浮点除法,而是应用截断整数除法.""所以我们有0对吗? .

System.out.println((int)1/3.0); // this prints: 0.3333333333333333
Run Code Online (Sandbox Code Playgroud)

好的,我们有0.33333所以(int)演员没有被评估为1st.好像它不在那里.我们提出第3条规则:

规则3:(int)表达式意味着完全忽略(int)强制转换只是计算表达式,就像(int)甚至不存在一样.

好的将规则3应用到下面的行,我们有(int)但我们只是忽略它.使用浮点除法评估1.0/3.0,得到0.3333333.成功!

System.out.println((int)1.0/3.0); // this prints: 0.3333333333333333
Run Code Online (Sandbox Code Playgroud)

在下面的最后一行,我们再次(int),但我们只是忽略它.(1.0/3)使用浮点除法得到0.3333333333对吧?没有.

System.out.println((int)(1.0/3)); // this prints: 0
Run Code Online (Sandbox Code Playgroud)

好的,现在我很困惑.请问你能帮助我解决这个问题吗?

java floating-point

5
推荐指数
1
解决办法
5268
查看次数

=和,Perl中的运算符

请解释这个明显不一致的行为:

$a = b, c;
print $a; # this prints: b

$a = (b, c);
print $a; # this prints: c
Run Code Online (Sandbox Code Playgroud)

perl

4
推荐指数
2
解决办法
281
查看次数

使用子程序和乘法运算符的明显奇怪性

请你解释一下*显然*不一致的行为给我:

use strict;
sub a { 2 + 2 };
print 2 * a(); # this prints: 8
print a() * 2; # this prints: 8
print 2 * a;   # this prints: 8
print a * 2;   # this prints: 4
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答,非常有帮助 - 我学到了很多东西.

perl

4
推荐指数
2
解决办法
104
查看次数

关于优先级+重复修饰符的问题

请你能解释一下这种明显不一致的行为:

use strict;
my @a;

print "a" x 2; # this prints: aa
@a = "a" x 2; print @a; # this prints: aa

print ("a") x 2; # this prints: a
@a = ("a") x 2; print @a; # this prints: aa
Run Code Online (Sandbox Code Playgroud)

不应该最后一个打印一个'a'?

编辑:好的,现在这对我来说更有意义:"二进制"x"是重复运算符...在列表上下文中,如果左操作数括在括号中或者是由qw/STRING /形成的列表,它重复了这个清单." perlop得到

这对我来说很清楚(二进制x - 为什么使用二进制这个词?是否有一个否定X?)但无论如何:@a =("a")x 2#似乎在列表上下文中,因为我们有一个数组在开头 - 一个数组不是一个列表,但它包含一个列表,所以我认为我们可能有一个列表上下文,(虽然它们可能是同义词,但不是数组上下文).

我想"左操作数"是("a").(或者是那个或@a).perlop没有说明操作数实际上是什么,查询perldoc.perl.org给出"找不到匹配",谷歌搜索给出"在计算机编程中,操作数是用于描述任何能够被操纵的对象的术语".就像数组一样.

因此左操作数可能会括在括号中,所以它可能会"重复列表".该列表是:("a") x 2 或者是:("a")

如果我们重复,("a") x 2我们会得到("a") x 2 ("a") x 2.这似乎不对.

如果我们键入:print $a[1]我们将得到一个'a',所以"它重复列表"意味着Perl变成("a") …

perl operator-precedence

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