在Perl中,如何获取给定索引处的字符?

45
如果我有一个Perl字符串:
$str = "Hello";

如何在给定索引处获取一个字符,类似于charAt(index)的功能?

4个回答

51

使用 substr 并指定长度为1,例如:

$nth = substr($string, n-1, 1);

还可以查看perlmonks获取其他解决方案。


24
$char = substr( $mainstring, $i , 1 );

这是一种做法,可能是最清晰的方法。

如果您想要的是数值,并且您打算经常这样做:

unpack("W*","hello")

返回一个Char值的数组:

print join ",", unpack("W*","hello")  ; 
#  104,101,108,108,111

为了正确处理Unicode/Utf8,您可能希望使用

use utf8;
unpack("U*","hello\0ƀ\n") 
# 104,101,108,108,111,0,384,10

或者只需使用 ord(substr($mainstring, $i, 1)) - Keith Thompson
事实上,通常当您想要一个字符的值时,您希望所有字符的值都能得到,而循环使用ord(substr())会比unpack变体更低效、更难阅读和调试。 - Kent Fredric

4

除了其他substr()答案之外,您还可以使用它在索引处设置值。它支持lvalue或带有额外参数的方式。它也非常类似于splice,但是适用于数组。

$string = "hello";
substr($string, 2, 2) = "this works?";
substr($string, 2, 2, "same thing basically");
@a = qw(s t r i n g s a n d t h i n g s);
@cut_out = splice(@a, 2, 2);
@cut_out = splice(@a, 2, 2, @replacement);

有人应该指出 substr( x, y, z ) = foo 等同于 substr( x, y, z, foo ),但是后者的表示法更受推荐,因为前者经常会让新手感到困惑。 - Kent Fredric
你刚刚做到了!我认为在“基本上是同样的事情”这个短语中,我也做到了。我会假设一个新手看到这个例子后会打开substr的页面,注意到LVALUE魔法并使用四个参数的形式,因为LVALUE形式很奇怪和可怕 - 在pod上也是这么说的。也许我对新手有太多信心了? - jettero

0

要获取第i个索引处的字符,请使用substr。例如,要获取第2个索引处的字符:

$str="Perl";
print substr($str,2,1). 

这将会输出r

抱歉, 代码将是substr($str,2,1); 因此,基本上要获取字符串中的第n个字符,格式将是substr(string,index,1)。希望这可以帮助到您。 - Siddharth Kumar Shukla
当然有帮助。但是,你的回答与10年前发布的其他回答相比,有什么不同呢? - Déjà vu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接