如何在 Perl 中重复 N 次字符串?

Posted

技术标签:

【中文标题】如何在 Perl 中重复 N 次字符串?【英文标题】:How can I repeat a string N times in Perl? 【发布时间】:2010-09-21 14:33:01 【问题描述】:

在 Python 中,如果我这样做:

print "4" * 4

我明白了

> "4444"

在 Perl 中,我会得到

> 16

在 Perl 中是否有一种简单的方法来实现前者?

【问题讨论】:

这也适用于字符串变量(和字符串表达式),参见my answer。 【参考方案1】:
$ perl -e 'print "4" x 4; print "\n"'
4444

x 运算符记录在 perldoc perlop 中。顺便说一下,这里的二进制意味着一个运算符接受两个参数,而不是由位组成。

二进制“x”是重复运算符。在标量上下文中,或者如果 左操作数不括在括号中,它返回一个字符串,包括 左边的操作数重复右边指定的次数 操作数。在列表上下文中,如果左操作数括在括号中 或者是由“qw/STRING/”组成的列表,它会重复该列表。如果对 操作数为零或负,它返回一个空字符串或一个空 列表,具体取决于上下文。

       print '-' x 80;             # Print row of dashes

       print "\t" x ($tab/8), ' ' x ($tab%8);      # Tab over

       @ones = (1) x 80;           # A list of 80 1’s
       @ones = (5) x @ones;        # Set all elements to 5

perl -e 用于从命令行执行 Perl 代码:

$ perl --帮助 用法:perl [switches] [--] [programfile] [arguments] -e 编写一行程序(允许几个-e,省略程序文件)

【讨论】:

只是一个评论 - 所有 perl 用户(尤其是新用户)可能都不清楚 -e 选项的作用,因此最好提供直接代码示例(如 Paul 的响应所做的那样) . perl -Esay+4x4 在这里,“-E”启用“使用 5.010”(特别是“说”功能)。 say "$var"print "$var\n" 相同。在标量上下文中,'x' 运算符总是返回一个字符串,因此这里不需要使用引号。 现在这会令人困惑:-) 而且没有理由使用双引号,来挑剔。 我有理由使用引号、可读性和意图。您可以省略它们并不意味着您必须(甚至应该)。【参考方案2】:

在 Perl 中,您想使用“x”运算符。

注意区别

"4" x 4

("4") x 4

前者产生重复的字符串:

"4444"

后者是一个重复的列表:

("4", "4", "4", "4")

【讨论】:

在 Perl 6 中,x 运算符总是返回字符串(左操作数在字符串上下文中计算,例如,4x4 -> "4"x4 -> "4444"),xx - 重复用于列表的操作,例如 4xx4 -> (4)xx4 -> (4,4,4,4)。 我无法确认 Perl v5.32【参考方案3】:

在 Perl 中非常相似

print "4" x 4;

【讨论】:

【参考方案4】:

FWIW,在 Perl 中也是 print 4 x 4

通常,在 Perl 中,运算符是单态的,即。对于字符串语义、数字语义、按位语义等,您有不同的运算符集,它们是有意义的,并且操作数的类型在很大程度上无关紧要。当您将数字运算符应用于字符串时,首先将字符串转换为数字,然后您会得到您要求的运算(例如乘法),当您将字符串运算符应用于数字时,它会变成字符串,然后您获得您要求的操作(例如重复)。 Perl 首先关注操作符,其次才是操作数的类型——如果它确实在意的话。

这与 Python 和大多数其他语言相反,在 Python 和大多数其他语言中,您使用一组运算符,操作数的类型决定了您实际会得到哪些语义——即。运算符是多态的。

【讨论】:

您可以的事实并不意味着您一定应该这样做。我认为明确意图会使代码对每个人都更具可读性。省略引号会降低我的可读性。 a) 您在我的回答中看到任何关于您应该做什么或不应该做什么的内容吗? (无论如何,这个4 x 4 不太可能逐字出现在真实的 Perl 代码中。) /跨度> a) 你有没有在我的评论中看到关于你说应该做什么或不应该做什么? b)当您几乎每天都在处理多种语言时,每一点都会有所帮助。使用引号在(几乎)任何语言中都是非常明确的,省略它们意味着要采取额外的心理步骤。【参考方案5】:

如果你想打印10个字符“A”,你也可以这样做

perl -e 'print "A" x 10'; echo

输出示例

user@linux:~$ perl -e 'print "A" x 10'; echo
AAAAAAAAAA
user@linux:~$ 

【讨论】:

这与之前的答案有何不同?【参考方案6】:

到目前为止给出的所有答案都没有提到运算符 x 不仅适用于字符串 literals,而且适用于 字符串或表达式的变量评估为字符串,如

use feature 'say';

my $msg = "hello ";
say $msg x 2;
say chr(33) x 3;

喜欢这个

hello hello
!!!

并且,更重要x 会将表达式自动转换 为字符串(如果它们还没有)(感谢 ggorlen 指出我那个方向!)。比如

say 4 x 2;
say [$msg] x 2;

会产生如下输出

44
ARRAY(0x30ca10)ARRAY(0x30ca10)

【讨论】:

以上是关于如何在 Perl 中重复 N 次字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中使用 grep 检查字符串是不是存在 [重复]

perl学习模式匹配与正则表达式

替换perl中一行中第n次出现后的所有出现

Emacs 重复字符串 n 次

如何在perl中的foreach循环中的字符串中查找和删除重复值的出现

在 Scala 中有效地重复一个字符/字符串 n 次