我知道myPerl中有什么.它定义了一个仅存在于定义它的块范围内的变量.怎么our办?有our什么不同my?
鉴于以下Perl计划:
package Foo;
use strict;
use warnings;
sub new {
my ($class) = @_;
return bless {}, $class;
}
sub c {
print "IN ORIG C\n";
}
sub DESTROY {
print "IN DESTROY\n";
c();
}
1;
package main;
use strict;
use warnings;
no warnings qw/redefine once/;
local *Foo::c = sub { print "IN MY C\n" };
my $f = Foo->new();
undef $f;
Run Code Online (Sandbox Code Playgroud)
我期望输出为:
IN DESTROY
IN MY C
Run Code Online (Sandbox Code Playgroud)
但我实际得到的输出为:
IN DESTROY
IN ORIG C
Run Code Online (Sandbox Code Playgroud)
问:为什么我的本地化重新定义Foo::c没有生效?
我有一组3或4个单独的Perl脚本,它们曾经是一个简单的管道的一部分,但我现在试图将它们组合在一个脚本中以便于使用(现在没有子程序功能).问题是在不同的脚本中定义了几个具有相同名称的变量.我找到的解决方法是给这些变量赋予不同的名称,但它可能开始变得混乱,并且可能不是这样做的正确方法.我知道全局和局部变量的概念,但我不太明白它们是如何工作的.
处理这类变量有什么经验法则吗?您是否知道任何可以对变量范围有所了解或有任何建议的好文档?
谢谢.
编辑:我已经使用"使用警告;使用严格;" 并使用"my"声明变量.问题实际上可能与范围块的定义以及如何使它们彼此独立有关...
我正在看这个问题,当我在玩耍时,我遇到了这个问题:
#! /usr/bin/env perl
#
# use warnings;
use strict;
use feature qw(say);
{
our $foo = "bar";
say "Foo = $foo";
}
say "Foo = $foo"; # This is line #12
Run Code Online (Sandbox Code Playgroud)
是的,我确实use warnings;关掉了......
当我运行这个时,我得到:
Variable "$foo" is not imported at ./test.pl line 12.
Global symbol "$foo" requires explicit package name at ./test.pl line 12.
Execution of ./test.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)
嗯...我得到相同的" 变量"$ foo"不会导入./test.pl第12行. "如果我已经完成错误my $foo = "bar";.我使用时会理解这一点,my因为$foo一旦离开块就没有变量.但是, …
我有一个perl脚本,称为main.pl,在清晰的情况下,当前处于多个分支状态,如下所示:
分支1:
my %hash
my $variable = "a"
my $variable2 = "c"
sub codeIsOtherwiseTheSame()
....
Run Code Online (Sandbox Code Playgroud)
分支2:
my %hash2
my $variable = "b"
sub codeIsOtherwiseTheSame()
....
Run Code Online (Sandbox Code Playgroud)
分公司3
my %hash
my $variable2 = "d"
sub codeIsOtherwiseTheSame()
....
Run Code Online (Sandbox Code Playgroud)
现在,脚本的每个分支都具有相同的代码。唯一的区别是声明的变量的种类及其初始化值是什么。我要做的是将这些不同的变量提取到包装脚本中(对于每个变体),这样就不必更改主脚本了。我这样做是因为有几个用户将使用此脚本,但是根据他们的用例,它们之间只有很小的差异。因此,我希望每种用户都有自己的简化界面。同时,我希望主脚本在被调用后仍能意识到这些变量。以下是我想要的示例:
包装脚本1:
my %hash;
my $variable = "a";
my $variable2 = "c";
system("main.pl");
Run Code Online (Sandbox Code Playgroud)
包装脚本2:
my %hash2;
my $variable = "b";
system("main.pl");
Run Code Online (Sandbox Code Playgroud)
包装脚本3:
my %hash;
my $variable2 = "d";
system("main.pl");
Run Code Online (Sandbox Code Playgroud)
Main.pl
sub codeIsOtherwiseTheSame()
Run Code Online (Sandbox Code Playgroud)
如何提取包装器脚本以获得上面想要的组织和行为?
我有一个脚本 ( A.pl) 和一个包 ( B.pm),我想在其中创建一个静态变量,B.pm以便A.pl.
use lib 'path/to/B_Package';
for loop 10 times {
fun(age);
}
if ($count>0) {
print "script fails";
}
Run Code Online (Sandbox Code Playgroud)
package B {
fun() {
my $age_given = shift;
my $count;
eval {
result = someFileHandling;
} or die {
$count++;
}
}
}
Run Code Online (Sandbox Code Playgroud)