【问题标题】:Perl: basic question, function functionalityPerl:基本问题,函数功能
【发布时间】:2011-05-16 16:18:11
【问题描述】:

这个函数有什么作用?

    sub MyDigit {
       return <<END;
       0030\t0039
       END
    }

【问题讨论】:

  • 调用它时发生了什么?
  • 它定义了一个只包含 ASCII 数字的字符类,用于正则表达式。看我的回答。 PS:不应该写成Le_Cœurn'est-ce pas?

标签: perl heredoc


【解决方案1】:

它使用一个叫做Here Document的东西来返回一个字符串“0030\t0039”

【讨论】:

    【解决方案2】:

    这称为"here-document",用于将字符串拆分为多行,以替代连接或列表操作:

    print "this is ",
        "one line when printed, ",
        "because print takes multiple ",
        "arguments and prints them all!\n";
    print "however, you can also " .
        "concatenate strings together " .
        "and print them all as one string.\n";
    
    print <<DOC;
    But if you have a lot of text to print,
    you can use a "here document" and create
    a literal string that runs until the
    delimiter that was declared with <<.
    DOC
    print "..and now we're back to regular code.\n";
    

    您可以在手册中阅读有关此处文档的更多信息:请参阅perldoc perlop

    【讨论】:

    • 请注意,OP 的 END 未排列。因此,OP 的代码不包含有效的 heredoc。
    • @Sinan:我以为这是转录中的拼写错误,但检查事实是否如此当然是合理的。
    • @Sinan:看我的回答。每个人都错过了这里真正发生的事情!
    【解决方案3】:

    它返回字符串"0030\t0039\n"\t 是一个制表符,\n 是一个正在添加的换行符,因为该行以换行符结束(显然))。

    <<FOO
    sometext
    FOO
    

    是所谓的heredoc,一种方便编写多行字符串的方式(虽然这里只使用了一行)。

    【讨论】:

    • 难道没有可以添加的修饰符来制作\t 文字吗?我似乎记得需要在某处加上单引号……
    • @Sinan:是的,我做到了。修复。谢谢。
    • @Cameron:来自documentation:“单引号表示文本将按字面意思处理,不对其内容进行插值。这类似于单引号字符串,只是反斜杠没有特殊含义” .所以你需要说&lt;&lt;'FOO'
    【解决方案4】:

    您可以尝试一个简单的实验来帮助自己:

    C:\Temp> cat t.pl
    #!/usr/bin/perl
    
    use strict; use warnings;
    
    print MyDigit();
    
    sub MyDigit {
        return <<END;
        0030\t0039
    END
    }
    

    输出:

    C:\Temp> t | xxd
    0000000: 2020 2020 3030 3330 0930 3033 390d 0a 0030.0039..

    现在,在你的情况下,END 没有排在行首,所以你应该得到消息:

    在 EOF 之前的任何地方都找不到字符串终止符“END”……

    【讨论】:

    • 嗯,是的,但如果你真的要上一堂关于heredox 的课,我认为我在unicharsuninamesuniprops 甚至leo 中的出队策略有助于看起来最干净的异端。但实际上,你们都错过了这个函数的真正作用:它创建了一个只匹配 ASCII 数字的属性。一定是在\p{POSIX_Digit} 出现 v5.12 版本之前。
    • @tchrist 我觉得应该是deQ
    【解决方案5】:

    你们都没有抓住重点!

    它定义了一个用户定义的属性,用于使用正则表达式在\p{MyDigit}\P{MyDigit} 中使用。

    是这样的:

      sub InKana {
          return <<'END';
      3040    309F
      30A0    30FF
      END
      }
    

    或者,您可以根据现有的属性名称来定义它:

      sub InKana {
          return <<'END';
      +utf8::InHiragana
      +utf8::InKatakana
      END
      }
    

    您还可以使用“C”前缀进行减法运算。假设你只 想要实际的字符,而不仅仅是字符的块范围。 你可以像这样清除所有未定义的:

      sub IsKana {
          return <<'END';
      +utf8::InHiragana
      +utf8::InKatakana
      -utf8::IsCn
      END
      }  
    

    您也可以使用“C”前缀从补充字符集开始:

      sub IsNotKana {
          return <<'END';
      !utf8::InHiragana
      -utf8::InKatakana
      +utf8::IsCn
      END
      }
    

    我想我一定是对的,因为我说的是 ex camelis。 :)

    【讨论】:

    • 这个函数必须存在于什么命名空间才能使它有用?
    • @Ether:无论您指定哪个:\p{Some::Function} 位于 %Some:: 命名空间中,而 \p{Function} 位于“current”包中,对于 current 的某些定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多