使用基于变量past的不同重新操作将变量传递给子例程

时间:2013-11-23 05:37:04

标签: perl

所以假设我有以下子例程用于验证用户提交的变量。我想尽可能地压缩代码并使用子例程检查所有用户提供的变量,但传递给例程的每个变量都需要根据传递之前的内容检查不同的正则表达式。辩论。

sub mySubroutine
{
    # Get passed arguments
    my ($unknown) = @_;

    while ($unknown !~ m/^\d{3,6}$/) {    # Check for valid integer.
       # Does Stuff
    }
    return $unknown;

}

my $name = Bob;
mySubroutine($name);
...
my $age = 20;
mySubroutine($age);

确定需要与哪个正则表达式进行比较的最佳方法是什么?即检查$ age传入$ unknown对数字仅正则表达式,但检查$ name也传递给$ unknown对着字符串正则表达式。

我在想我需要使用像$ type这样的附加变量作为传递的内容,然后针对调度表检查,但是每次我必须传递两个变量。有没有办法让子程序看到变量是从主命名空间传递给它的名称是什么?

我认为这个措辞并不好,所以如果我需要详细说明或改写,请告诉我。

2 个答案:

答案 0 :(得分:1)

你的意思是

sub mySubroutine
{
    # Get passed arguments
    my (%args) = @_;
    my $regexes = (
        age  => qr/.../,
        name => qr/.../,
    );

    foreach my $key in (%args)
    {
        if (%args{$key} !~ /$regexes{$key}/)
        {
            ....
        }
    }
}

my $name = Bob;
mySubroutine(name => $name);
...
my $age = 20;
mySubroutine(age => $age);
mySubroutine(age => $age, name => $name, );

这样你就可以解决这个问题,而不会跳过太多的箍...... 你可以在%regex使用数组引用,如果需要多个测试,或者哈希引用,如果你想为每个测试添加一条错误消息然后循环这些... %regexes hash(或更好的对它的引用)也可以是参数的一部分...

答案 1 :(得分:0)

您可以将正则表达式传递给子例程,例如:

sub mySubroutine {
    my ($reg, $str) = @_;
    if ($str =~ $reg) {
        return $str;
    } else {
        say "invalid string: $str";
        return 0;
    }
}

my $name = 'Bob';
# put in the regex all characters you want for a valid name !!!
$name = mySubroutine(qr/^[a-zA-Z' -]+$/,$name);
say $name;
$name = '123';
$name = mySubroutine(qr/^[a-zA-Z' -]+$/,$name);
say $name;
my $age = 20;
$age = mySubroutine(qr/^\d{1,3}$/, $age);
say $age;
$age = 'hgj';
$age = mySubroutine(qr/^\d{1,3}$/, $age);
say $age;

<强>输出:

Bob
invalid string: 123
0
20
invalid string: hgj
0