为什么使用require之后,pm文件中不能调用主程序里面的变量?

为什么使用require之后,pm文件中不能调用主程序里面的变量?

我的程序越写越长,因此,尝试用require来将程序分割成多个文件。

这几天看了下《Oreilly_intermediate perl》,在做测试时发现,凡是在主程序里面使用 my 语句声明的变量,在pm文件里面,调用时都显示错误为:
Use of uninitialized value in concatenation (.) or string

那这样的话,我以前在主程序里面声明的所有变量,不是都不能用了,那怎么办?怎么样让pm里面的子程序,能使用我在主程序里面用my声明的变量呢?

请各位指教,谢谢!

我的测试脚本如下,分为两个,一个为test.pl,一个为print_time.pm:
test.pl:
#!/bin/perl -w
use strict;
require 'print_time.pm';
my $my_time;
my $my_year;
my $my_day;

chomp ($my_year = `date +%Y`);
chomp ($my_day = `date +%Y_%m%d`);

print "in main program , \$my_year is $my_year \n";
print "in main program , \$my_day is $my_day \n";

sub print_hello {
        print "Hello , world \n";
}

& print_hello;
& print_time;

print_time.pm:
sub print_time {
        $my_time = localtime;
        print "in print_time.pm, \$my_year is $my_year \n";
        print "in print_time.pm, \$my_day is $my_day \n";
        print "print hello in print_time.pm \n";
        & print_hello;
}
return 1;

运行时产生的报错如下:
root@solaris01 # ./test.pl
in main program , $my_year is 2008
in main program , $my_day is 2008_1024
Hello , world
Use of uninitialized value in concatenation (.) or string at /opt/perl2exe/my/print_time.pm line 3.
in print_time.pm, $my_year is  
Use of uninitialized value in concatenation (.) or string at /opt/perl2exe/my/print_time.pm line 4.
in print_time.pm, $my_day is  
print hello in print_time.pm
Hello , world

my定义的变量是lexically scoped,最大的作用范围就是一个文件,当然不能跨文件传递了
方法就是你使用our定义好了,将局部变量转为全局变量
谢谢!将my换成our,就运行正常了。

看来our比my更好,既然如此,《Perl 语言入门》书中,就应该介绍用our来声明变量(因为反正它是对package生效),我还一直以为声明变量就一定要用my呢。



QUOTE:
原帖由 jjqing 于 2008-10-24 12:23 发表
谢谢!将my换成our,就运行正常了。

看来our比my更好,既然如此,《Perl 语言入门》书中,就应该介绍用our来声明变量(因为反正它是对package生效),我还一直以为声明变量就一定要用my呢。

各有各的用处,有时候你会想在不同的文件用同样的变量名
print_time.pm
里也use strict就知道了


QUOTE:
原帖由 hfahe 于 2008-10-24 13:12 发表
print_time.pm
里也use strict就知道了

是的,我打开use strict之后,它就报了一大堆错:
Global symbol "@my_result" requires explicit package name at

请问,我的主程序里面没有使用包,那么我如果要在print_time.pm里面引用主程序用our声明的变量时,加上package name的话,应该加哪一个名称呢?

或者说,我在print_time.pm中使用use strict,要怎样才能正确引用在主程序里面用our声明的变量?

谢谢!

perl就不适合写长程序!


QUOTE:
原帖由 jjqing 于 2008-10-24 14:14 发表


是的,我打开use strict之后,它就报了一大堆错:
Global symbol "@my_result" requires explicit package name at

请问,我的主程序里面没有使用包,那么我如果要在print_time.pm里面引用主程序用our声 ...

main::
最好通过传参数调用print_time.pm中的子过程等


QUOTE:
原帖由 ynchnluiti 于 2008-10-24 21:34 发表

main::
最好通过传参数调用print_time.pm中的子过程等

谢谢!

我的程序现在有3800行,第二阶段完成以后,估计会到20,000行左右。
大部分子程序,都是用来完成一个功能,比如取得一些值,然后写到文件中,而不是完成一个逻辑处理,因此,大部分大程序都是直接调用,不需要加参数(当然也有小部分是使用参数调用的)。

现在我已经将它分开,成为了8个模块,主程序只管控制整体逻辑,其他的,全部由各模块的子程序去完成。

在这个过程中,还有很多问题要请教大家,谢谢!


QUOTE:
原帖由 ynchnluiti 于 2008-10-24 21:34 发表

main::
最好通过传参数调用print_time.pm中的子过程等

我在print_hello.pm中加上了main::,它出现以下报错:
Variable "$my_time" is not imported at print_time.pm line 4.
Variable "$my_year" is not imported at print_time.pm line 5.
Variable "$my_day" is not imported at print_time.pm line 6.
Global symbol "$my_time" requires explicit package name at print_time.pm line 4.
Global symbol "$my_year" requires explicit package name at print_time.pm line 5.
Global symbol "$my_day" requires explicit package name at print_time.pm line 6.
Compilation failed in require at ./test.pl line 3.

print_hello.pm的内容如下:
#print_time.pm
use strict;
sub print_time {
        $my_time = localtime;
        print "in print_time.pm, my_year is main::$my_year \n";
        print "in print_time.pm, my_day is main::$my_day \n";
        print "print hello in print_time.pm \n";
                & print_hello;
}
return 1;


test.pl内容如下:

#!/usr/bin/perl -w
use strict;
require 'print_time.pm';
our $my_time;
our $my_year;
our $my_day;
our @my_result;
chomp ($my_year = `date +%Y`);
chomp ($my_day = `date +%Y_%m%d`);

print "my result is \n @my_result \n";
print "in main program , \$my_year is $my_year \n";
print "in main program , \$my_day is $my_day \n";

& print_hello;
& print_time;

sub print_hello {
        print "Hello , world \n";
}

请问要如何修改呢?谢谢!