Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 60

0
votes
answers
28 views
+10

我不明白「push」返回的值

0
use strict; 
use warnings; 

sub maximum_value { 

    my @array = @_; 
    my @array1 = shift(@_); 
    my @array2 = push(@_, 0); 

    print "@array
"; 
    print "@array1
"; 
    print "@array2
"; 

    my $i = 0; 

    foreach (@array) { 

     if ($i < $_) { 
      $i = $_; 
     } 
    } 

    print "
Max Value is $i"; 
} 

maximum_value(10, 15, 11, 13); 

這是一個Perl腳本。我將這些值傳遞給子程序並將它們存儲在@_中。爲什麼@array2評估爲4?我不明白「push」返回的值

+2

你已經有了一個很好的答案,但是我可能會問你期望在@ @ array2中? – PerlDuck

沙发
0
8
perldoc -f push

狀態:

返回下列完成的推數組中元素的數目。

  1. @_開始有四個要素,因爲你有4個參數調用你的子。
  2. shift@_數組中的第一個元素。 shift返回已移除的元素。 @_數組現在包含3個元素。
  3. push零到末尾的@_數組,其中又包含4個元素。 push返回元素的數量,並將其分配給@array2
0
votes
answers
33 views
+10

更改線程優先級ERROR_INVALID_HANDLE

1

我試圖在腳本中更改線程優先級,但沒有成功,這裏是詳細信息。更改線程優先級ERROR_INVALID_HANDLE

$thr = threads->new(&someFunction, 
        $shared variable 1, 
        $shared variable 2, 
        ); 

我試過使用threads::State;

$thr->priority(2); 

沒有成功

所以,我認爲Win32::API必須努力

my $functionGetLastError= Win32::API->new('Kernel32', 
              'GetLastError', 
              '', 
              'N' 
             ); 
my $functionSetThreadPriority= Win32::API->new('Kernel32', 
               'SetThreadPriority', 
               'II', # I've tried 'PI' and 'II' as well 
               'N' 
              ); 
my $h = $thr->_handle(); 
my $success = $functionSetThreadPriority->Call($h, 2); 
warn "Return Error #".$functionGetLastError->Call() if !$success; 

再次,沒有成功:(,但現在我有一個線索,該腳本返回錯誤號

最後錯誤6

MSDN site, System Error Codes (0-499),似乎錯誤是

ERROR_INVALID_HANDLE

我在做什麼錯?

+0

參見[什麼樣的線程是Perl的線程?](http://perldoc.perl.org/perlthrtut.html#What-kind-of-threads-are-Perl-threads%3f)在文檔。 – choroba 2014-12-03 13:37:27

沙发
0
3

$thread->_handle奇怪地返回HANDLE*,而SetThreadPriority預計HANDLE。您需要取消引用指針,你可以做如下:

use constant THREAD_PRIORITY_HIGHEST => 2; 

sub SetThreadPriority { 
    my ($thread, $priority) = @_; 

    # $thread->_handle() returns a HANDLE*. 
    my $handle_ptr = $thread->_handle(); 
    my $packed_handle = unpack('P'.HANDLE_SIZE, pack(PTR_FORMAT, $handle_ptr)); 
    my $handle  = unpack(HANDLE_FORMAT, $packed_handle); 

    state $SetThreadPriority = (
     Win32::API->new('Kernel32', 'SetThreadPriority', 'Ni', 'i') 
     or die("Loading SetThreadPriority: $^E
") 
    ); 

    return $SetThreadPriority->Call($handle, $priority); 
} 

下面是完整的測試程序:

,您可以使用 $^E
use strict; 
use warnings; 
use feature qw(say state); 

use threads; 
use threads::shared; 

use Carp  qw(croak); 
use Config  qw(%Config); 
use Win32::API qw(); 

sub uint_format { 
    $_[0] == 4 ? 'L' 
    : $_[0] == 8 ? 'Q' 
    : croak("Unsupported") 
} 

use constant PTR_SIZE => $Config{ptrsize}; 
use constant PTR_FORMAT => uint_format(PTR_SIZE); 

use constant HANDLE_SIZE => PTR_SIZE; 
use constant HANDLE_FORMAT => PTR_FORMAT; 

use constant THREAD_PRIORITY_HIGHEST => 2; 

sub SetThreadPriority { 
    my ($thread, $priority) = @_; 

    # $thread->_handle() returns a HANDLE*. 
    my $handle_ptr = $thread->_handle(); 
    my $packed_handle = unpack('P'.HANDLE_SIZE, pack(PTR_FORMAT, $handle_ptr)); 
    my $handle  = unpack(HANDLE_FORMAT, $packed_handle); 

    state $SetThreadPriority = (
     Win32::API->new('Kernel32', 'SetThreadPriority', 'Ni', 'i') 
     or die("Loading SetThreadPriority: $^E
") 
    ); 

    return $SetThreadPriority->Call($handle, $priority); 
} 

{ 
    my $done :shared = 0; 

    my $thread = async { 
     { lock($done); cond_wait($done) while !$done; } 
    }; 

    my $rv = SetThreadPriority($thread, THREAD_PRIORITY_HIGHEST); 
    say $rv ? "Success" : "Error: $^E"; 

    { lock($done); $done = 1; cond_broadcast($done); } 
    $thread->join(); 
} 

公告訪問GetLastError

SetThreadPriority($handle, THREAD_PRIORITY_HIGHEST) 
    or die("SetThreadPriority: $^E
"; 
+0

@ user2842165,更新 – ikegami 2014-12-03 17:02:57

+0

我會說這是一個錯誤,但賠率是,不能再在這個階段發生變化,不是第一那種在threads.pm中: - / – 2014-12-04 03:51:47

板凳
0
0

ERROR_INVALID_HANDLE

這表明什麼_handle返回是不是的Win32 API ::理解。我懷疑「P」想要一個字符串緩衝區而不是一個整數轉換的指針。 「我」可能是錯誤的東西,因爲它在64位上的大小是錯誤的,我會自己嘗試「N」。

此外,對於將來在Unix上遇到此問題的讀者:請嘗試我的POSIX::RT::Scheduler模塊。

+0

'N'什麼Win32 :: API文件作爲一個指針的整數等價物。但真正的問題是'_handle'返回'HANDLE *',但'SetThreadPriority'需要一個'HANDLE'。 – ikegami 2014-12-03 17:18:54

+0

我試圖編譯POSIX :: RT ::計劃,但沒有成功:( – tals 2014-12-04 06:56:54

0
votes
answers
27 views
+10

刪除網址,當鼠標懸停在一個(可能嗎?)

0

是否有可能刪除一個元素網址當你懸停刪除網址,當鼠標懸停在一個(可能嗎?)

這就是我的意思是:

enter image description here

+1

你爲什麼試圖達到這個目標? – YATO

+1

[如何隱藏瀏覽器左下角/右側鏈接信息懸停]的可能重複(https://stackoverflow.com/questions/30410748/how-to-hide-link-information-at-the-bottom - 左 - 右的的瀏覽器上懸停) –

沙发
0
0

您不能關閉狀態欄。這是Chrome的狀態欄,你有沒有控制過它

https://productforums.google.com/forum/?hl=en#!category-topic/chrome/discuss-chrome/FtD7qjochgw

但是你可以使用pointer-events: none;但也將禁用的鏈接。

板凳
0
1

一種選擇是使用一點JavaScript。

<a>標記中移除href=屬性,而在<a>或其他任何元素上具有onclick=...屬性。

然後在onclick處理程序中分配給document.location

地板
0
0

看來你正試圖修改當前的URL地址而不改變頁面。
您是否有正當理由?由於它不是標準的,它會對許多用戶顯示爲惡意攻擊。

沒有關於你想達到什麼的進一步信息,我只能說你不應該修改網址而不改變頁面。否則,使用JavaScript,您可以更改頁面和URL,而無需進行整頁更改。

如果您正在嘗試使用ajax更改頁面和url,而無需刷新,請參閱下面的其他堆棧溢出問題。

https://stackoverflow.com/a/1865840/1246494

Modify the URL without reloading the page

How to change the current URL in javascript?

其他引用。

https://developer.mozilla.org/en-US/docs/Web/API/Window/location#Methods

0
votes
answers
29 views
+10

什麼是超級作曲作曲家的$美元符號?

-1

在查詢語言中頻繁使用_ $符號,這是什麼意思,並且每個類關鍵字都有一個美元前綴。 $和_ $符號的意義/含義是什麼?

沙发
0
1

查詢可能使用_ $語法嵌入參數。請注意,查詢參數必須是基元類型(字符串,整數,雙精度,長整數,布爾值,日期時間),關係或枚舉。

命名查詢下面是3個參數來定義:

query Q18 { 
description: "Select all drivers aged older than PARAM" 
statement: 
    SELECT org.acme.Driver 
     WHERE (_$ageParam < age) 
      ORDER BY [lastName ASC, firstName DESC] 
       LIMIT _$limitParam 
        SKIP _$skipParam 
} 

這裏是源:Source

板凳
0
0

$前綴用於通過Composer來標識實體的序列化到JSON類型。在查詢語言中使用_$前綴來創建參數化查詢。

0
votes
answers
38 views
+10

試圖從另一個子文件夾引用1個子文件夾

0

我非常沮喪,呃,我原以爲這很簡單...也許我錯了。試圖從另一個子文件夾引用1個子文件夾

我有一個父文件夾[父],在父文件夾我有: 的index.html [childCSS] [childPAGES] [childJS] [圖像] 的index.html使一個鏈接到[childPAGES] references.html (references.html在childPAGES文件夾中找到) references.html然後鏈接到在[childCSS]中找到的refCss.css refCss.css調用[images] background.gif的背景圖像。 但他們似乎無法找到對方。 我已經確定,CSS的路由不加載(我做過background-color = #somefunkypurple,它沒有畫出紫色)...所以它沒有讀取CSS文件。問題是...爲什麼...

所以HTML是這樣的:

index.html 
<head><link rel="stylesheet" type="text/css" src="./childCss/stylesheet.css"/></head> 
further down in code 
<a href="./childPAGES/ref.html"> 

現在childPAGES/ref.html

<link rel="stylesheet" type:"text/css" src="../../childPAGES/stylesheetB.css" 

,但它並沒有找到該文件.. 。進一步的文件中:

/childCss/stylesheetB.css 
    background-images: url('../../images/background.gif'); 

background.gif還是沒有被找到或顯示...我不知道我做錯了什麼......也許我應該用HRE F?

沙发
0
0

我認爲你只是用「../」走得太遠了。

您是否嘗試過使用:

link rel="stylesheet" type:"text/css" src="../childPAGES/stylesheetB.css" 

background-images: url('../images/background.gif'); 
0
votes
answers
22 views
+10

如何在Perl正則表達式中使用操作?

0

例如,讓我們說我有這樣的事情:如何在Perl正則表達式中使用操作?

$_ = 23; 
$a = 2; 
print /$a $a+1/x; 

應打印1.基本上,是它可以使用正則表達式的字符串中的功能呢?

+0

從你的例子中很難知道爲什麼你不會在正則表達式之外進行操作 – beasy

沙发
0
1

正則表達式中的變量插值與字符串中的變量插值幾乎相同。給定??,字符串??將是"2 2+1"。該變量已展開,但字符串中的代碼未執行。

圍繞這個的一個訣竅是在字符串中使用解引用引用。這使我們可以包含任意表達式,但語法有點麻煩。通常,我們用我們想包含的值創建一個數組引用,然後立即解引用它:@{[$x + 1]}。這與Ruby的#{...}插值或Bash $(...)命令替換類似。

所以正則表達式/$x @{[$x + 1]}/x會工作。

但在大多數情況下,這將更加清晰進行正則表達式之外的所有計算:

my $x = 2; 
my $y = $x + 1; 
/$x $y/x; 

Perl的正則表達式的語法也有語法,可以動態地生成正則表達式的部分。使用上面的變量插值,插值變量內容,然後編譯正則表達式。但高級正則表達式可能會在模式匹配期間更改變量的值。這些延遲的正則表達式可以用(??{ ... })語法編寫。這裏:/$x (??{ $x + 1 })/x。但是,這是一個非常先進且容易出錯的正則表達式特性。這也會比普通的正則表達式慢。

板凳
0
1

an extended pattern,它提供了在匹配運算符m/或替換運算符s///的匹配部分中的代碼執行。

它的版本替換代碼的回報,接着把它當作一種模式是

/(??{ code })/ 

所以你的情況

$_ = 23; 
my $x = 2; 
my ($m) = /(2(??{ $x+1 }))/; 
say $m; 

RE_EVAL: { 
    use re 'eval'; 
    my ($m) = /($x(??{ $x+1 }))/; 
    say $m; 
} 

比賽和捕獲23

這裏use re 'eval'明確允許這一點,通常由於安全原因不允許。

這是一個非常複雜的功能,它帶有複雜的警告。除了在上述鏈接中的輸入外,還請按照該文本中的鏈接閱讀有關Embedded Code Execution frequency

請不要使用這個複雜的工具,以方便或代替正確書寫的代碼。

0
votes
answers
48 views
+10

更新現有資產 - Hyperledger作曲家

0

我試圖創建作曲家簡單hyperledger chaincode,需要一個貸款數目,如果它存在,否則更新相關的資產創建一個新的資產。更新現有資產 - Hyperledger作曲家

我的模型文件看起來像這樣:

asset Loan identified by loanNum{ 
    o String loanNum 
    o Double balance 
} 

transaction createTransaction { 
    o String loanNum 
    o Double transAmount 
} 

我的劇本是這樣的:

function createTransaction(tx) { 
    var NS = 'org.acme.ra'; 
    var factory = getFactory(); 
    var loanToUpdate 

//returns all assets 
    return getAssetRegistry(NS + '.Loan') 
     .then(function(assetRegistry){ 
     return assetRegistry.exists(tx.loanNum); 
     }) 
     .then(function(exists){ 
      if (exists) { 
        return getAssetRegistry(NS + '.Loan')       
         .then(function(assetRegistry2){        
          loanToUpdate = assetRegistry2.get(tx.loanNum) 
          loanToUpdate.balance = tx.transAmount; 
          return assetRegistry2 
         }) 
         .then(function(updateAssetRegistry){ 
          return updateAssetRegistry.update(loanToUpdate)//broken right here 
        }) 
      } 
      else { 
        return getAssetRegistry(NS + '.Loan') 
         .then(function(assetRegistry2){ 
         var newLoan =factory.newResource(NS,'Loan',tx.loanNum); 
          newLoan.balance = tx.transAmount;       
          return assetRegistry2.add(newLoan); 
         })        
      } 
     })  

}

腳本摘要:

  1. 兩個值提供給腳本,貸款編號和交易0金額爲。
  2. 腳本然後返回資產註冊,如果貸款數量已經存在返回 適當布爾。
  3. 如果(在資產註冊表中存在貸款犯規)假,新的資產將利用從交易貸款和餘額創建。
  4. 如果爲True,則返回的資產註冊表,然後我用不用彷徨功能,並設置結果等於在腳本的開始創建的loanToUpdate變量。然後,我使用資產註冊表上的.update(loanToUpdate)函數來更新現有資產。

當布爾是假的腳本正常工作,並創建一個新的資產,但是當布爾是真實的,交易中包含已經存在我得到的錯誤貸款數量「錯誤:預期資源或概念」

編輯

現在,我得到更多的經驗,這一點,我認爲這是可以做到更容易與內置的關係,但低於生病後我更新的功能代碼。

更新的代碼與修復:

function createTransaction(tx) { 
    var NS = 'org.acme.ra'; 
    var factory = getFactory(); 
    var loanToUpdate 

//returns all assets 
    return getAssetRegistry(NS + '.Loan') 
     .then(function(assetRegistry){ 
     return assetRegistry.exists(tx.loanNum); 
     }) 
     .then(function(exists){ 
     if (exists) { 
       return getAssetRegistry(NS + '.Loan')      
        .then(function(assetRegistry2){        
        return assetRegistry2.get(tx.loanNum); 
       }) 
       .then(function(updateloan){ 
         loanToUpdate = updateloan      
         loanToUpdate.balance = tx.transAmount; 
         return getAssetRegistry(NS + '.Loan') 

       }) 
       .then(function(assetRegistry3){ 
         return assetRegistry3.update(loanToUpdate); 
       }) 
     } 
     else { 
       return getAssetRegistry(NS + '.Loan') 
        .then(function(assetRegistry2){ 

         var newLoan = factory.newResource(NS,'Loan',tx.loanNum);        
         newLoan.balance = tx.transAmount;       
         return assetRegistry2.add(newLoan); 
        })        
     } 
    })  

}

沙发
0
0

獲得的資產註冊表返回一個承諾,所以行 loanToUpdate = assetRegistry2.get(tx.loanNum) 需要在承諾鏈的一部分,所以你需要一個.then塊來處理返回的值,然後才能更新它。

0
votes
answers
20 views
+10

服務器錯誤或空白頁與CGI腳本

0

我有這麼一小撮代碼,出於某種原因,從http://localhost/cgi-bin/sysinfo.sh運行時無法執行。我在CentOS 7的虛擬機上,我會盡我所能的幫助。我似乎無法得到這些指示,但是他們在Vi中是正確的。服務器錯誤或空白頁與CGI腳本

#!/bin/bash 
echo -e "Content-type: text/html

" 
echo " 
<html> 
<head> 
    <title>Bash as CGI</title> 
</head> 
<body> 
<h3>General system information for host $(hostname -s).    </h3> 
<h4>Memory Info</h4> 
<pre> $(free -m) </pre> 
<h4>Disk Info:</h4> 
<pre> $(df -h) </pre> 
<h4>Logged in user</h4> 
<pre> $(w) </pre> 
<hr> 
Information generated on $(date) 
</body> 
</html> 

當我將它作爲shell腳本運行時... html標籤都隨着命令的輸出一起顯示。

內容類型:文本/ HTML

<html> 
<head> 
    <title>Bash as CGI</title> 
</head> 
<body> 
<h3>General system information for host localhost</h3> 
<h4>Memory Info</h4> 
<pre>    total  used  free  shared 
buff/cache available 
Mem:   1775   994   137   20   643   
540 
Swap:   2047   0  2047 </pre> 
<h4>Disk Info:</h4> 
<pre> Filesystem    Size Used Avail Use% Mounted on 
/dev/mapper/centos-root 47G 9.7G 38G 21%/
devtmpfs     873M  0 873M 0% /dev 
tmpfs     888M 4.2M 884M 1% /dev/shm 
tmpfs     888M 9.1M 879M 2% /run 
tmpfs     888M  0 888M 0% /sys/fs/cgroup 
/dev/sda1    1014M 235M 780M 24% /boot 
tmpfs     178M 4.0K 178M 1% /run/user/42 
tmpfs     178M 44K 178M 1% /run/user/0 </pre> 
<h4>Logged in user</h4> 
<pre> 21:33:21 up 2:01, 3 users, load average: 0.06, 0.04, 0.05 
USER  TTY  FROM    [email protected] IDLE JCPU PCPU WHAT 
root  pts/0 :0    20:45 1.00s 0.14s 0.00s w 
root  :0  :0    20:45 ?xdm? 1:11 0.11s 
/usr/libexec/gnome-session-binary --session gnome-classic </pre> 
<hr> 
Information generated on Sat Nov 18 21:33:21 EST 2017 
</body> 
</html> 
+0

什麼是您的網絡服務?你如何配置它執行'.sh'腳本? – janos

+0

請問您的文件包含右雙引用(你粘貼的東西沒有) –

+0

「不能執行」對於你的問題並不是一個非常有用的描述你究竟看到了什麼意外的行爲?寫到Web服務器錯誤日誌中的內容 –

沙发
0
2

echo的命令,打印內容中缺少張貼代碼閉合"。 無論如何, 雙引號字符在HTML內容中非常常見,這種打印方式可能會在以後引起頭痛。 它會更容易使用此文檔:

#!/bin/bash 

cat <<EOF 
Content-type: text/html 

... (HTML content here) 

EOF 

還要注意的是要能夠運行這個, 文件必須是可執行文件(chmod +x script.sh), 和Web服務器必須配置爲執行腳本, 而不是打印其內容,這是一種常見的默認設置。

板凳
0
0

爲什麼迴應???!

print「Content-type:text/html n n」;

打印「等等等等」,並記住的第二個「你沒有它。

0
votes
answers
49 views
+10

重新排列PDF文件中的數據

-2

我正在使用Perl來生成帶有 PDF::API2模塊的PDF文件。重新排列PDF文件中的數據

我很難以所需的格式將數據寫入文件。

目前,這是它如何出現在PDF文件中。

Currently looks like this in PDF

這裏是我的腳本

my %data = (
    '1' => { 
     'SEQUENCE' => '1', 
     'NAME'  => 'John', 
     'ADDR1' => 'Road 1', 
     'GRADE' => '5' 
    }, 
    '2' => { 
     'SEQUENCE' => '2', 
     'NAME'  => 'Smith', 
     'ADDR1' => 'Road 2', 
     'GRADE' => '6' 
    } 
); 

... 
... 

my @rows = qw(NAME ADDR1 GRADE); 

for my $id (sort keys %data){ 
    push @tbl, [ @{$data{$id}}{@rows} ]; 
    ($name, $addr, $grade) = ($data{$id}{'NAME'}, $data{$id}{'ADDR1'}, $data{$id}{'GRADE'}); 
} 

... 
... 

my $pdftable = new PDF::Table; 
$pdftable->table(
    $pdf, 
    $page, 
    @tbl, 
    x => 50, 
    w => 400, 
    start_y => 630, 
    start_h => 630, 
    next_y => 630, 
    next_h => 630, 
    padding => 5, 
    border => 1, 
    padding_right => 10, 
); 
$pdf->saveas(); 

但我希望它出現這樣的:

It should be formatted like this

我知道我必須做出修改@tbl數據,但是如何?

沙发
0
-1

PDF::Tabletable函數採用一個「陣列或多個陣列」作爲它的第三個參數。您目前有它strucutred這樣的:

my @tbl = ([$name,$addr,$grade], [...]) 

每個嵌套數組(什麼是[]括號內)是表的新行,和元素數組是行的單元格。因此,相反,你想讓它的結構:

my @tbl = (['NAME',$name], ['ADDR1',$addr], ['GRADE',$grade], [...]) 

要使用您的%data結構,它構造:

for my $id (sort keys %data) { 
    push @tbl, [$_, $data{$id}->{$_}] for qw/NAME ADDR1 GRADE/; 
    push @tbl, [qw/- -/]; # to add a blank row as a separator 
} 
+0

謝謝@beasy。 如何打印在不同的表中的數據,而在同一個表中顯示它與分離了 - - 。 – vinodk89

+0

在每個循環中創建一個新的「PDF :: Table」 – beasy

0
votes
answers
20 views
+10

如何通過符號表來訪問子主::和子的名字在一個標量

2

假設我有一個功能foo(或::foo,或者main::foo如果你喜歡),我定義如何通過符號表來訪問子主::和子的名字在一個標量

use strict; 
my $sub_name = 'foo'; 

我想間接調用foo,因爲「名稱存儲在$sub_name中的函數」。 (對於這個例子來說,假設調用應通過列表1, 2, 3作爲參數。)

我知道,有一種方法用符號表工作main::直接,對待它就像一個散列做到這一點像數據結構一樣。

這個符號表的咒語就是我要找的。

我以前做過很多次這樣的事情,但我多年沒有編寫過Perl,而且我不再記住這個咒語。

(我更願意這樣做,而不必訴諸no strict,但如果這是不可能根本不算什麼。)

+0

可能的重複:https://stackoverflow.com/q/1915616/5830574 – PerlDuck

+0

@PerlDuck:我看到了這個線程,但我沒有看到答案我的問題在裏面。 – kjo

沙发
0
3

我會簡單地用一個象徵性的參考。

my $sub = &$qualified_sub_name; # &$symbol is except from strict 'refs'. 

$sub->() 

但是您要求我們避免使用符號引用。這太複雜了。 (這可能也無法處理冒號的怪異,但合法的誤操作。)

my $pkg = \%::; 
my $sub_name = $qualified_sub_name; 
$pkg = $pkg->{$1} while $sub_name =~ s/^(.*?::)//sg; 
my $sub = $pkg->{$sub_name}; 
$sub = *{ $pkg->{$sub_name} }{CODE} 
    if ref($sub) eq 'GLOB'; # Skip if glob optimized away. 

$sub->() 
+1

你的答案慢跑了我的記憶。我正在尋找的僅僅是表達式'* {$ :: {'foo'}} {CODE}(1,2,3)'。謝謝! – kjo

+2

@ikegami不,如果沒有其他插槽(如'$ foo'或'@ foo')存在,perl會優化簡單子'foo'的情況。它會直接在符號表中存儲一個coderef。 – melpomene

+1

另一個有趣的例子是常量:'perl -wE'使用常量foo => 42;說$ :: {foo}' - 'SCALAR(0x3a9808)'。不是一團糟,只是標準的Perl行爲。 – melpomene

板凳
0
1

您可以使用can

my $sub_name = 'foo'; 
my $coderef = main->can($sub_name); 
$coderef->(@args); 

正如其他人所說,你要注意,這也可以返回如「能方法「或」isa「。 另外,如果$sub_name包含Some::Module::subname,這也將被調用。

如果您不確定$sub_name中有什麼,您可能需要採取不同的方法。 只有當您控制了$sub_name並且它只能包含預期值時,才能使用它。 (我認爲這,這就是爲什麼我寫這個答案。)

+0

如果'$ sub_name'是例如,這可能會返回意想不到的結果' 「ISA」'。 – melpomene

+0

OP詢問如何執行子呼叫,而不是方法呼叫(無論如何你都做錯了!!)。你的方法可能會導致錯誤的子被調用。 – ikegami

+0

ikegami:'$ coderef - >()'是一個子調用,不是方法調用。 – tinita