Chinaunix

标题: 神奇的substr左值用法 [打印本页]

作者: 黑色阳光_cu    时间: 2010-12-16 17:00
标题: 神奇的substr左值用法
本帖最后由 黑色阳光_cu 于 2010-12-17 13:36 编辑
  1. #!/bin/env perl

  2. use strict;
  3. use warnings;

  4. my $str = "abcdefg";
  5. *front = \substr($str, 0, 1);
  6. *rear = \substr($str, -1, 1);
  7. our ($front, $rear);

  8. print "str: $str\n";
  9. print "front: $front    rear: $rear\n";

  10. $front = 1;
  11. $rear = 2;
  12. print "str: $str\n";
  13. print "front: $front    rear: $rear\n";

  14. $str = "new string";
  15. print "str: $str\n";
  16. print "front: $front    rear: $rear\n";

复制代码

作者: wfnh    时间: 2010-12-16 17:15
本帖最后由 wfnh 于 2010-12-16 17:26 编辑

的确很有趣
魔术是....
作者: x9x9    时间: 2010-12-16 17:34
神马意思?没看明白~求教~
作者: toniz    时间: 2010-12-16 17:42
意思是  通过SUBSTR获取的是字符串的固定位置的值。

VERY GOOD..~
作者: phoenix_perl    时间: 2010-12-16 18:03
哦,原来是\函数名的原因.
我还奇怪,为啥$rear 最后和预期的不同.
作者: 黑色阳光_cu    时间: 2010-12-16 19:02
左值函数的性质
作者: じ☆vedě鍶唸    时间: 2010-12-16 20:37
非常漂亮 赞:wink:
作者: じ☆vedě鍶唸    时间: 2010-12-16 20:37
非常漂亮 赞:wink:
作者: zhlong8    时间: 2010-12-16 21:03
本帖最后由 zhlong8 于 2010-12-16 21:07 编辑

示例不错,这里左值类似于 tiescalar 获取值和赋值都是通过函数调用实现的,不过是C级别
作者: 黑色阳光_cu    时间: 2010-12-16 21:25
示例不错,这里左值类似于 tiescalar 获取值和赋值都是通过函数调用实现的,不过是C级别
zhlong8 发表于 2010-12-16 21:03



   
你看过 lvalue 有关的实现了?
作者: zhlong8    时间: 2010-12-16 21:31
回复 10# 黑色阳光_cu


    Devel::Peek 可以看到它是是 PVLV 类型的值, magic 类型是 substr(可以看 illguts),具体这个 magic 的实现还没看到
作者: liyangole    时间: 2010-12-17 11:26
{:3_190:} 神奇 哈。
作者: atiking    时间: 2010-12-17 13:18
黑色阳光_cu 发表于 2010-12-16 17:00


加一行,更清楚

  1. #!/bin/env perl

  2. use strict;
  3. use warnings;

  4. my $str = "abcdefg";
  5. *front = \substr($str, 0, 1);
  6. *rear = \substr($str, -1, 1);
  7. our ($front, $rear);

  8. print "str: $str\n";
  9. print "front: $front    rear: $rear\n";

  10. $front = 1;
  11. $rear = 2;
  12. print "str: $str\n";
  13. print "front: $front    rear: $rear\n";

  14. $str = "new string";
  15. print "str: $str\n";
  16. print "front: $front    rear: $rear\n";
复制代码
substr( $string, $start, $stop ) = 'somevalue'
相当于
substr( $string, $start, $stop , 'somevalue' );


不过$str赋值为"new string"后,为什么print出来的结果是
front:n   rear:r

作者: 黑色阳光_cu    时间: 2010-12-17 13:39
加一行,更清楚substr( $string, $start, $stop ) = 'somevalue'
相当于
substr( $string, $start, $ ...
atiking 发表于 2010-12-17 13:18



   
改了,贴代码时忘加了。
作者: atiking    时间: 2010-12-17 14:30
回复 14# 黑色阳光_cu


  能帮我解释下,最后一行结果为什么rear是'r'吗
作者: 黑色阳光_cu    时间: 2010-12-17 14:34
回复  黑色阳光_cu


  能帮我解释下,最后一行结果为什么rear是'r'吗
atiking 发表于 2010-12-17 14:30



   
明显,负数位置被转成正的处理了。在字符串"abcdefg"上,位置-1等价于位置6。而"new string"位置6的字母是r
作者: kingwmj    时间: 2010-12-17 14:40
认真学习。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2