2013-04-09 64 views
1

我在Fortran中工作了很多年,當然還有Fortran中的Types。在Perl中使用類型

現在,由於我在一家新公司工作,我必須與Perl合作。

由於我的主要工作是使用文本文件中的數據進行操作並且必須通過文件讀取,因此我想從此數據生成「對象」或「類型」。 在Fortran中,我會這樣做,所以進一步的工作是更容易:)

是否有可能與Perl生成一個嚴格類型模式的類​​型,就像我可以在Fortran中一樣?

例如...這是我會做什麼用Fortran:

Type demoType 
    integer i 
    character(256) str 
end Type 

然後,我可以與此類型的變量工作。 Type(demoType) demoVar例如

在Perl中是否有這樣的工作機會?

對不起,我的英語...我是土生土長的德國人講:)

+5

您應該舉例說明您正在使用的數據。僅僅因爲你習慣於處理類型和對象並不意味着它是在perl中工作的最好(或最簡單的方法)。 – TLP 2013-04-09 07:50:37

+0

嗯,我希望我可以給你一些數據的例子,但我不能因爲隱私:( – ratzeputz 2013-04-09 08:14:01

+1

我不*真的*必須向你解釋你不必發佈真實的數據,是嗎?因爲 – TLP 2013-04-09 08:25:15

回答

0

有一些CPAN模塊可以幫助您。這是一個選項:Class::Struct(屬於標準perl版本,不需要進一步安裝)。實施例(從模塊文檔截取):

use Class::Struct; 

struct(Rusage => { 
     ru_utime => 'Timeval', # user time used 
     ru_stime => 'Timeval', # system time used 
}); 

struct(Timeval => [ 
     tv_secs => '$',  # seconds 
     tv_usecs => '$',  # microseconds 
]); 

# create an object: 
my $t = Rusage->new(ru_utime=>Timeval->new(), ru_stime=>Timeval->new()); 


# $t->ru_utime and $t->ru_stime are objects of type Timeval. 
# set $t->ru_utime to 100.0 sec and $t->ru_stime to 5.0 sec. 
$t->ru_utime->tv_secs(100); 
$t->ru_utime->tv_usecs(0); 
$t->ru_stime->tv_secs(5); 
$t->ru_stime->tv_usecs(0); 
+0

非常感謝......這似乎是我習慣了從我的Fortran過去的方式:) – ratzeputz 2013-04-09 08:18:08

0

我勸你看看Modern Perl
如果你想使用類型,那麼看看Moose以面向對象的方式工作並公開方法和屬性。
核心perl動態地評估一個變量以將一個類型賦值給一個變量。

2

在FORTRAN,很像C,變量大多佔據存儲器一個固定的空間。所以Type就像你的demoType描述了一個項目是如何佈局的,像字符串這樣的事情必須預先分配一個最大尺寸。

在Perl中,標量值(主要是字符串和數字)佔用的空間不僅僅是值本身,而且也不能以相同的方式映射。

要在Perl中進行編程,您必須遠離實現,並允許運行時系統爲您提供幫助。字符串的大小可以無限變化(取決於計算機的內存),關聯值集合的首選方法是使用散列(一種由任意字符串而不是數字索引的數組)。

例如,demoType值可能看起來像

my $demo_type = { 
    i => 99, 
    str => 'text' 
} 

,如果你想用許多這樣的配對工作,那麼你應該看看Perl的對象。

如果您沒有面向對象軟件的經驗,那麼您將有一段漫長而迷人的旅程!

+0

那麼我有.NET的經驗...所以面向對象是沒有問題的。即使經過多年,我還沒有使用.NET :) – ratzeputz 2013-04-09 08:44:48

+0

在Perl中面向對象編程只是一個小小的DIY,因爲構造函數只是另一種方法,方法只是子例程,而且你必須明確地收集和使用'this'參數。幾乎所有Perl提供的封裝都是通過使用'bless'和Perl 5中引入的方法調用語法的包和繼承和多態。 – Borodin 2013-04-09 15:34:36

0

我想你可能會試圖存儲整數值和相同數字的字符串化值。

{ 
    i = 123; 
    str = "123"; 
} 

如果是這種情況,您正在嘗試執行一些Perl爲您自動執行的操作。

my $integer = 123; 

my $string = $integer; 

print $string; 

另一種可能性是,你需要一些用字符串關聯。在這種情況下,您可以使用:

  • 一個數組。

    my @data = (123, 'string'); 
    
    print 'integer: ', $data[0], "\n"; 
    print 'string: ', $data[1], "\n"; 
    
  • 數組ref。

    my $data = [ 123, 'string' ]; 
    
    print 'integer: ', $data->[0], "\n"; 
    print 'string: ', $data->[1], "\n"; 
    
  • 哈希

    my %data = (
        123 => 'string', 
    ); 
    
    print $data{123}, "\n"; 
    
  • 哈希裁判

    my $data = { 
        123 => 'string', 
    }; 
    
    print $data->{123}, "\n"; 
    

無論如何你應該交的匿名數據。例如,讓我們實際上可以幫助你學習Perl。我想你應該閱讀documentation for Perl。這是相當extensive。這實際上是我學會如何用Perl編程的。至少讀perlintroperldata。如果你需要構建嵌套的數據結構,你還應該看看perldsc。您也可以查看learn.perl.org