关于 Perl switch 语句中使用的 Reg 表达式的问题

发布于 2024-11-05 12:51:41 字数 725 浏览 2 评论 0原文

Perl 版本:5.8 使用 ActivePerl。

我尝试在 Perl 中插入 reg 表达式作为 switch 语句的单独条件,但失败了。

您能告诉我更多有关如何修复的信息吗?

我查找了每个文档,但找不到这种示例。谢谢。

while (my $line =<$fh>) { # change foreach to while
    switch ($line) {
        case ($line =~ m/\<IDCateA\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
        case ($line =~ m/\<IDCateB\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
    }
    my $nextline = <$fh>;
}

数据的一部分是这样的,

 <IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
 <IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>

Perl Version: 5.8 ActivePerl used.

I tried to insert reg expressions as individual conditions for switch statement in Perl, but failed.

Could you tell me more about how to fix?

I looked up per doc and can't find this kind of example. Thanks.

while (my $line =<$fh>) { # change foreach to while
    switch ($line) {
        case ($line =~ m/\<IDCateA\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
        case ($line =~ m/\<IDCateB\sName="(\w+)\"\sid="(\w+)\"\s/)  {print "            $1 = $2,\n";}
    }
    my $nextline = <$fh>;
}

A part of the data as this,

 <IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
 <IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

や三分注定 2024-11-12 12:51:41

避免使用 Switch.pm;它是使用脆性技术实现的。
我相信它在 Switch 模块内的范围内执行正则表达式,因此 $1 等在您的代码中不可用(在删除不属于那里的 $line =~ 之后) 。

您的键盘示例缺少 use Switch。我也很难让 Switch 与 __DATA__ 合作。

perldoc -q switch 显示了如果您无法使用 5.10.1 的给定/当语法时使用类似 switch 的语句的多种方法,例如:

use strict;
use warnings;

while (my $line = <DATA>) {
    for ($line) {
        if (/<IDCateA\sName="(\w+)"\sid="(\w+)"\s/) {print "  $1 = $2,\n"}
        elsif (/<IDCateB\sName="(\w+)"\sid="(\w+)"\s/) {print "   $1 = $2,\n"}
    }
}

__DATA__
<IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
<IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>

Avoid using Switch.pm; it is implemented using brittle technology.
I believe that it executes regular expressions in a scope inside the Switch module such that $1, etc., aren't available in your code (after removing the $line =~ that don't belong there).

Your codepad example is missing use Switch. I had trouble getting Switch to cooperate with __DATA__, too.

perldoc -q switch shows a number of ways to have a switch-like statement if you can't use 5.10.1's given/when syntax, for instance:

use strict;
use warnings;

while (my $line = <DATA>) {
    for ($line) {
        if (/<IDCateA\sName="(\w+)"\sid="(\w+)"\s/) {print "  $1 = $2,\n"}
        elsif (/<IDCateB\sName="(\w+)"\sid="(\w+)"\s/) {print "   $1 = $2,\n"}
    }
}

__DATA__
<IDCateA Name="SystemAlpha" id="0" units="" min="0" max="8" default="0" value="3"/>
<IDCateB Name="SystemBeta" id="1" units="" min="0" max="2" default="0" value="0"/>
场罚期间 2024-11-12 12:51:41

从 5.10 或更高版本开始,您应该将 givenforeachwhen 一起使用,而不是旧的已弃用的 Switch.pm 模块。

You should be using given or foreach with when from 5.10 or better, not the old deprecated Switch.pm module.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文