Chinaunix

标题: 有誰能幫我看看這個嗎? [打印本页]

作者: inmolee    时间: 2003-07-01 16:43
标题: 有誰能幫我看看這個嗎?
假設有一個文字檔內容為此為C Shell的環境下輸出之檔案)
#########################
set gEXISTS=yes
set gPROF_xmax=18
set gPROF_ymax=24
set gPROF_xmin=0
set gPROF_ymin=0
#########################
在C Shell中可用source讀進來並完成設定宣告,請問在perl中該如何讀進此檔案並完成宣告呢?
作者: anonimousboy    时间: 2003-07-01 16:48
标题: 有誰能幫我看看這個嗎?
原帖由 "inmolee" 发表:
假設有一個文字檔內容為此為C Shell的環境下輸出之檔案)
#########################
set gEXISTS=yes
set gPROF_xmax=18
set gPROF_ymax=24
set gPROF_xmin=0
set gPROF_ymin=0
#####################..........
   
不明白你意思的说~~
作者: inmolee    时间: 2003-07-01 20:51
标题: 有誰能幫我看看這個嗎?
原帖由 "anonimousboy" 发表:
   
不明白你意思的说~~
   

是這樣的....
我用C Shell寫程式,用perl/tk作GUI,很奇怪的組合吧,因為對Shell較熟,
所以程式主體以C Shell為主,而perl/tk是用來抓取C Shell產生的變數值,
希望你能看得懂.....^_^
作者: nkliyong    时间: 2003-07-01 22:47
标题: 有誰能幫我看看這個嗎?
原帖由 "inmolee" 发表:
假設有一個文字檔內容為此為C Shell的環境下輸出之檔案)
#########################
set gEXISTS=yes
set gPROF_xmax=18
set gPROF_ymax=24
set gPROF_xmin=0
set gPROF_ymin=0
#####################..........
   

去Perl问问看.
作者: laoxia    时间: 2003-07-02 02:20
标题: 有誰能幫我看看這個嗎?
应当是这样吧

$gEXISTS=yes ;

俺是菜鸟,谨供参考
作者: laoxia    时间: 2003-07-02 02:22
标题: 有誰能幫我看看這個嗎?
上边仅是定义了而已,俺要帮你研究研究如何实现这个
作者: 红袖添香    时间: 2003-07-02 02:29
标题: 有誰能幫我看看這個嗎?
...

在 perl 中用

$a = $ENV{'HOME'};
$b = $ENV{'PWD'};

等可以等到原有的环境变量,
作者: laoxia    时间: 2003-07-02 02:58
标题: 有誰能幫我看看這個嗎?
这个问题先要把文件格式改一下,把每行从

set gEXISTS=yes

改成

$gEXISTS=yes ;

再用PERL运行一下
作者: laoxia    时间: 2003-07-02 04:10
标题: 有誰能幫我看看這個嗎?
  1.    
  2. #!/bin/ksh
  3. awk /set/ $1 | awk '{print $2}' | awk -F"=" '{printf("$%s=%s;\n",$1,$2)}' > $1.n
  4. ew
  5. /usr/local/bin/perl $1.new
复制代码


[/code]
作者: 红袖添香    时间: 2003-07-02 04:38
标题: 有誰能幫我看看這個嗎?
...

laoxia,楼主好象是说要在 perl script 内部调用...
不过我也不太清楚是不是这个意思,
他好象是港澳台同胞的说......
作者: laoxia    时间: 2003-07-02 05:45
标题: 有誰能幫我看看這個嗎?
原帖由 "红袖添香" 发表:
...

laoxia,楼主好象是说要在 perl script 内部调用...
不过我也不太清楚是不是这个意思,
他好象是港澳台同胞的说......
    不是吧?俺会错么?:)
作者: 红袖添香    时间: 2003-07-02 08:26
标题: 有誰能幫我看看這個嗎?
[quote]原帖由 "laoxia"]    不是吧?俺会错么?:)[/quote 发表:
     

:wink:

我也不知道,
看楼主怎么说吧.....
作者: inmolee    时间: 2003-07-02 11:01
标题: 有誰能幫我看看這個嗎?
原帖由 "红袖添香" 发表:
...

laoxia,楼主好象是说要在 perl script 内部调用...
不过我也不太清楚是不是这个意思,
他好象是港澳台同胞的说......
   
紅袖姐你好啊
我的問題是這樣的....
1. 我用C Shell寫程式
2. 我用perl/tk來作GUI
3. 我想把C Shell的變數丟給GUI(perl/tk),假設在C Shell中
    set a=1
    set a=2
    set c=`echo "scale=3;$a*$b"|bc
    接著執行perl/tk,在widget視窗上顯示出a,b,c的值,請問該如何讀進
    C shell的變數
4. 把perl/tk(GUI)的變數丟回給C Shell,跟第3步驟相反,請問該如何做....
5. 紅袖姐真厲害,我是台灣人,我很喜歡上這來學習及問問題,因為這裡的人
    都很熱心也很厲害,台灣都找不到這樣的地方....謝謝你們的幫忙喔!
作者: 红袖添香    时间: 2003-07-02 20:58
标题: 有誰能幫我看看這個嗎?
原帖由 "inmolee" 发表:
   
紅袖姐你好啊
我的問題是這樣的....
1. 我用C Shell寫程式
2. 我用perl/tk來作GUI
3. 我想把C Shell的變數丟給GUI(perl/tk),假設在C Shell中
    set a=1
    set a=2
    set c=`echo "scale=3;$a*$b"..........
   


这个问题基本上是否定的,因为 perl 执行 sh 的脚本是放到 子shell 中进行,所以取不到值。不过不要灰心,有人做了个变通,可以这样做。

  1. # Function: csh_source
  2. # Use: This is a graceless way to source a csh-script that sets up
  3. # environment variables and/or cd's to another directory,
  4. # from perl.
  5. # Parameters: Name of script file
  6. # Return: None (env variables are set, as is wd)
  7. sub csh_source
  8. {
  9.     local($file) = @_;
  10.     local($_,*E,$lhs,$rhs,$wd,$c,$done);

  11.     $file =~ s/\$([a-zA-Z_\-][\w\-]+)/$ENV{$1};/eg;
  12.     $c = "csh -f -c 'source $file ;echo ++--++;env;echo ++--++;pwd'";
  13.     open(E,$c.'|') || die("$0: Cannot fork csh: $!\n");

  14.     %ENV=();
  15.     while(<E>)
  16.     {
  17. chop;
  18. if ($done && !/^\+\+--\+\+$/ && /=/)
  19. {
  20.      ($lhs,$rhs) = split(/=/,$_,2);
  21.      $ENV{$lhs} = $rhs;
  22. }
  23. elsif (/^\+\+--\+\+$/)
  24. {
  25.      if ($done++)
  26.      {
  27.   chop($wd = <E>);
  28.   chdir($wd);
  29.   last;
  30.      }
  31. }
  32.     } close E;
  33. }
复制代码


要注意的是,你自己的脚本中就不能有 "++--++" 这样的输出内容了。

调用的方法是

  1. &csh_source('abc.csh');
  2. print "$ENV{'a'}\n";
  3. print "$ENV{'b'}\n";
  4. print "$ENV{'c'}\n";
复制代码


因为这里用的是环境变量,所以,你的 csh 脚本就必须相应作些变动,不用 set 而是用 setenv.
作者: 红袖添香    时间: 2003-07-02 21:08
标题: 有誰能幫我看看這個嗎?
...

至于反过来,perl 的变量交给 shell 处理,就比较容易了,只是不知道你具体想怎么用, `` 或 eval 应该可以解决这个问题.
作者: inmolee    时间: 2003-07-02 21:54
标题: 有誰能幫我看看這個嗎?
原帖由 "红袖添香" 发表:
...

至于反过来,perl 的变量交给 shell 处理,就比较容易了,只是不知道你具体想怎么用, `` 或 eval 应该可以解决这个问题.
   

假設perl/tk,在GUI畫面中有3個文字敘述:
1. please keyin a number (a) 這裡keyin變數值)
2. please keyin a number (b) 這裡keyin變數值)
3. 結束GUI視窗並回到C Shell執行命令....
4. 用C Shell執行 set c=`echo "scale=3;$a*$b"|bc`
5. echo $c
作者: inmolee    时间: 2003-07-02 21:57
标题: 有誰能幫我看看這個嗎?
# Function: csh_source
# Use: This is a graceless way to source a csh-script that sets up
# environment variables and/or cd's to another directory,
# from perl.
# Parameters: Name of script file
# Return: None (env variables are set, as is wd)
sub csh_source
{
    local($file) = @_;
    local($_,*E,$lhs,$rhs,$wd,$c,$done);

    $file =~ s/\$([a-zA-Z_\-][\w\-]+)/$ENV{$1};/eg;
    $c = "csh -f -c 'source $file ;echo ++--++;env;echo ++--++;pwd'"
.................................
不錯的想法,果然是紅袖姊姊,厲害厲害....謝謝囉!
作者: 红袖添香    时间: 2003-07-03 06:00
标题: 有誰能幫我看看這個嗎?
原帖由 "inmolee" 发表:
$ENV{$1};/eg;
    $c = "csh -f -c 'source $file ;echo ++--++;env;echo ++--++;pwd'"
.................................
不錯的想法,果然是紅袖姊姊,厲害厲害....謝謝囉!
   


不是我的,不過是我轉手賣给你的....   :wink:
作者: 红袖添香    时间: 2003-07-03 06:30
标题: 有誰能幫我看看這個嗎?
原帖由 "inmolee" 发表:
   

假設perl/tk,在GUI畫面中有3個文字敘述:
1. please keyin a number (a) 這裡keyin變數值)
2. please keyin a number (b) 這裡keyin變數值)
3. 結束GUI視窗並回到C Shell執行命令....
4. 用C Shell執..........
   

確實是比較奇怪的想法,

按道理說,這些問題的處理應該是在 perl 中處理應該更容易,用不著 Shell
來幫忙。 shell 能做的事,perl 都應該能做,最不濟的時候,它還能夠用
system(); 來調用....

不過即使是按你的想法,這個問題也是應該有解的。我沒有用過 perl 的 tk,
但是我想,在用 GUI 時,也應該能夠在控制台上輸出一些消息吧?這些標準
輸出應該可以傳送給 shell.

比如你從 GUI 部分得到的 $a 和 $b,然後可以在 perl 中這樣,
...
$a = 3;
$b = 5;
print "set a=$a \n";
print "set b=$b \n";
...

在呼叫 perl 時,用 eval  `script.pl` 就可以了, 你的 shell 環境就能得到
$a, $b 的值。
作者: inmolee    时间: 2003-07-03 12:37
标题: 有誰能幫我看看這個嗎?
謝謝紅袖姐,我的收穫倒是不少ㄟ.....謝謝各位!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2