繁体   English   中英

Perl:基本问题,功能功能

[英]Perl: basic question, function functionality

此功能有什么作用?

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

这称为“ 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";

您可以在手册中阅读有关here-documents的更多信息:请参见perldoc perlop

你们都错过了重点!

它使用正则表达式定义了一个用户定义的属性,用于\\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
  }

我想我一定是对的,因为我是前骆驼说话的 :)

它使用“ 这里文档”来返回字符串“ 0030 \\ t0039”

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

<<FOO
sometext
FOO

是所谓的heredoc,一种方便地编写多行字符串的方法(尽管此处仅用于一行)。

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

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不在行的开头对齐,因此您应该得到以下消息:

Can't find string terminator "END" anywhere before EOF at …

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM