Bylo oznámeno, že Qualcomm kupuje Arduino. Současně byla představena nová deska Arduino UNO Q se dvěma čipy: MPU Qualcomm Dragonwing QRB2210, na kterém může běžet Linux, a MCU STM32U585 a vývojové prostředí Arduino App Lab.
Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.14.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.
Byla vydána nová stabilní verze 6.10 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.
Netwide Assembler (NASM) byl vydán v nové major verzi 3.00. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.
Linuxová distribuce Frugalware (Wikipedie) ke konci roku 2025 oficiálně končí.
Byla vydána nová verze 3.0.6 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP bude brzy k dispozici také na Flathubu.
Americký výrobce čipů AMD uzavřel s americkou společností OpenAI smlouvu na několikaleté dodávky vyspělých mikročipů pro umělou inteligenci (AI). Součástí dohody je i předkupní právo OpenAI na přibližně desetiprocentní podíl v AMD.
Byla vydána nová verze 10.1 sady aplikací pro SSH komunikaci OpenSSH. Uživatel je nově varován, když se nepoužívá postkvantovou výměnu klíčů.
Byly zpracovány a na YouTube zveřejněny videozáznamy z konference LinuxDays 2025.
Řešení dotazu:
sub new { my ( $pkg, $db ) = @_; my $self = bless {}, $pkg; $self->{_db} = "db/$db.db"; open( $self->{_dbhandler}, $self->{_db} ) or die "DB $db.db not open\n"; return $self; } sub _view { my ( $self, $arg ) = @_; my $dbhandler = $self->{_dbhandler}; while ( my $line = <$dbhandler> ) { if ( $line =~ /( *)$arg( *)\=( *)'(.*?)';( *)/ ) { return $4; } } return undef; }
$self->{_db} = new TAI::DB( 'status' ); print Dumper( $self->{_db} ); print "test1: " . $self->{_db}->_view( 'task' ) . "\n"; print Dumper( $self->{_db} ); print "test2: " . $self->{_db}->_view( 'task' ) . "\n"; print Dumper( $self->{_db} ); print "test3: " . $self->{_db}->_view( 'task' ) . "\n"; print "test4: " . $self->{_db}->_view( 'task' ) . "\n";No a k tomu dotazu, myslím si to co ostatní: soubor projíždíte po řádkách, takže nebude vracet v každém volání totéž. Dá se to řešit různě, ale myslím, že děláte tu celou věc trochu přes ruku, co přesně má být účelem toho kódu?
seek
je jeden z těch méně šťastných.
Nejjednodušší je dát open/close do rutiny _view, čili pokaždé soubor otevřít, najít řádek a potom ho zavřít. Je to stejně efektivní jako seek, ale čistější a robustnější vůči přepisu/smazání souboru.
Další možnost je v konstruktoru soubor kompletně přečíst a uložit si páry klíč=hodnota (pokud chápu dobře, tak ten soubor má takovou strukturu) do hashe a ve _view pouze vracet hodnoty z hashe. Případně dodělat něco jako reload, kterej to načte na požádání znova. Tento přístup je nesporně efektivnější co se týče počtu čtení souboru.
Třetí možnost je se porozhlédnout po CPANu, co například Config::Tiny a další?
Jinak, databáze není nevyhnutelně špatná věc.
Ještě pár postřehů k tomu kódu:
if ( $line =~ /( *)$arg( *)\=( *)'(.*?)';( *)/ ) { return $4; }je lépe zapsat jako
if ( $line =~ /\A\s*\Q$arg\E\s*\=\s*'(.*?)';\s*\Z/ ) { return $1; }(použití \s pro prázdné znaky, \A ... \Z pro ohraničení a \Q ... \E pro quotování proměnné. BTW regexp pro načtení celého souboru by mohl vypadat asi takto nějak
my %config; open (my $soubor, '<', 'soubor.txt'); { unset $/; %config = (<$soubor> =~ /^\s*(\Q$arg\E)\s*\=\s*'(.*?)';\s*?/xmsg); }Místo
return undef;
je kratší (a správnější) použít jen return;
.
Místo open...or die
je modernější metoda use autodie
.
Tiskni
Sdílej: