加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl自定义后缀或自定义后缀运算符的语法

发布时间:2020-12-16 06:25:40 所属栏目:大数据 来源:网络整理
导读:我想知道如何运行这样的操作 $T = 25 C;@specs = (273.15 K,23 bar,2.0 mol/s); 并让他们编译.我不会挑剔他们的结果是什么,或者它是如何实现的.我的目标是让传统后缀单元注释的物理量表达式编译为这些单元的perl表达式. 我想我需要使用自定义解析技术,但我更
我想知道如何运行这样的操作

$T = 25 C;
@specs = (273.15 K,23 bar,2.0 mol/s);

并让他们编译.我不会挑剔他们的结果是什么,或者它是如何实现的.我的目标是让传统后缀单元注释的物理量表达式编译为这些单元的perl表达式.

我想我需要使用自定义解析技术,但我更喜欢使用任何现有功能或解析模块,而不仅仅是将regex过滤器应用于我的原始源.

Parse::Keyword似乎很有希望,但我看不出它是否可以解析后缀操作,并声称它已被弃用.

编辑:我想尽可能避免使用源过滤器,因为我不想为Perl的语法极端情况编写正则表达式(例如“25(J / K)”).

Perl在这里产生的错误告诉我:

perl -E "25 C"
Bareword found where operator expected at -e line 1,near "25 C"
(Missing operator before C?)

看起来我需要挂钩Perl在数字文字之后检测运算符的地方.

Devel::Declare可以添加后缀运算符吗?如果是这样,怎么样?

解决方法

你可以滥用重载来获得你想要的东西.

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Data::Dumper;
use MyUnits;

my $T = '25 C';

say Dumper $T;

my @specs = ('273.15 K','23 bar','2.0 mol/s');

say Dumper @specs;

正如您将看到的,您可以使用“value”和“type”属性返回对象.

MyUnits.pm看起来像这样:

package MyUnits;

use strict;
use warnings;

use overload
  '""' => &;to_string;

my %_const_handlers = (
  q => &;string_parser,);

sub string_parser {
  my $c = eval { __PACKAGE__->new($_[0]) };
  return $_[1] if $@;
  return $c;
}

sub import {
  overload::constant %_const_handlers;
}

sub new {
  my $class = shift;

  # ->new(type => ...,value => ...)
  if (@_ == 4) {
    return bless { @_ },$class;
  }
  # ->new({ type => ...,value => ...)
  if (@_ == 1 and ref $_[0] eq 'HASH') {
    return bless $_[0],$class;
  }
  # -> new('999xxx')
  if (@_ == 1 and ! ref $_[0]) {
    my ($val,$type) = $_[0] =~ /(d+.?d*)s*(.+)/;
    return bless({
      value => $val,type => $type,});
  }
}

sub to_string {
  return "$_[0]->{value}$_[0]->{type}";
}

1;

您需要添加更多方法以使其能够执行有用的操作.

在大多数情况下,与源过滤器相比,重载并不比派对技巧少得多.它几乎肯定会使你的程序慢得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读