Returnerar en sträng formaterad av de vanliga printf-konventionerna i C-bibliotekets funktion sprintf. Se nedan för mer information och se sprintf (3) eller printf (3) på ditt system för en förklaring av de allmänna principerna. Perl har sin egen sprintf formatering: den emulerar C-funktionen sprintf (3). men använder det inte förutom flytande punktnummer, och även då är bara standardmodifierare tillåtna. Icke-standardiserade tillägg i din lokala sprintf (3) är därför inte tillgängliga från Perl. Till skillnad från printf. sprintf gör inte vad du förmodligen menar när du skickar den en array som ditt första argument. Arrayet ges skalärt kontext, och istället för att använda det 0: e elementet i arrayen som formatet, kommer Perl att använda räkningen av element i array som formatet, vilket nästan aldrig är användbart. Perls sprintf tillåter följande universellt kända omvandlingar: Perl tillåter dessutom följande omvandlingar som stöds i stort sett: Till sist, för bakåt (och vi menar bakåt) kompatibilitet tillåter Perl dessa onödiga men omfattande omvandlingar: Observera att antalet exponent siffror i den vetenskapliga notationen som produceras av e. E. g och G för tal med modulen hos exponenten mindre än 100 är systemberoende: den kan vara tre eller mindre (nollpolstret vid behov). Med andra ord kan 1,23 gånger tio till 99: e vara antingen 1.23e99 eller 1.23e099. På samma sätt för a och A. exponent eller hexadecimala siffror kan flyta: speciellt det långa dubbla Perl-konfigurationsalternativet kan orsaka överraskningar. Mellan formatet och formatet kan du ange flera ytterligare attribut som styr tolkningen av formatet. I ordning är dessa: Ett explicit formatparameterindex, som 2. Sprinten kommer som standard att formatera nästa oanvända argument i listan, men det här låter dig ta bort argumenten i ordning: När ett mellanslag och ett plustecken ges som flaggor på en gång ignoreras rymden. När flaggan och en precision ges i o-omvandlingen, ökas precisionen om den är nödvändig för den ledande 0. Denna flagga berättar Perl att tolka den medföljande strängen som en vektor av heltal, en för varje tecken i strängen. Perl tillämpar formatet på varje heltal i sin tur, och förenar sedan de resulterande strängarna med en separator (en punkt, som standard). Detta kan vara användbart för att visa ordinära värden för tecken i godtyckliga strängar: Sätt en asterisk före v för att åsidosätta strängen som ska användas för att separera numren: Du kan också explicit ange det argumentnummer som ska användas för anslutningssträngen med något liknande 2v för Exempel: Argument är vanligtvis formaterade för att vara så breda som krävs för att visa det angivna värdet. Du kan åsidosätta bredden genom att ange ett tal här eller få bredden från nästa argument (med) eller från ett angivet argument (t. ex. med 2): Om en fältbredd som erhållits genom är negativ, har den samma effekt som - flagga: vänsterjustering. Du kan ange en precision (för numeriska omvandlingar) eller en maximal bredd (för strängkonverteringar) genom att ange a. följt av ett nummer. För flytande punktformat förutom g och G. Detta anger hur många ställen som helst för decimalpunkten att visa (standardvärdet är 6). Till exempel: För g och G anger detta det maximala antalet siffror som ska visas, inklusive de före decimalen, och de efter det till exempel: För heltalskonverteringar innebär att precisering innebär att utmatningen av numret själv ska vara noll - plattad till denna bredd, där 0-flaggan ignoreras: För strängkonverteringar avkortas strängen för att specificera en precision för att passa den angivna bredden: Du kan också få precisionen från nästa argument med .. eller från ett angivet argument (t. ex. .2): Om en precision som erhållits genom är negativ, räknas den som ingen precision alls. För numeriska omvandlingar kan du ange storleken för att tolka numret som att använda l. h. V. q. L. eller ll. För heltalskonvertering (duox X bi DUO) antas siffror vanligtvis vara oberoende av att standard heltalstorlek finns på din plattform (vanligtvis 32 eller 64 bitar), men du kan åsidosätta detta för att använda istället en av de vanliga C-typerna, som stöds av kompilatorn brukade bygga Perl: Från och med 5.14 uppstår ingen av dessa undantag om de inte stöds på din plattform. Om varningar är aktiverade emitteras emellertid en varning för printf-varningsklassen på en icke-stöds konverteringsflagg. Om du istället föredrar ett undantag, gör så här: Om du vill veta om ett versionsberoende innan du börjar köra programmet, sätt något liknande här på toppen: Du kan ta reda på om din Perl stöder quads via Config: För flytande - punktkonverteringar (efg EFG), antas vanligtvis att standardflödesstorleken på din plattform (dubbel eller lång dubbel), men du kan tvinga länge dubbelt med q. L. eller ll om din plattform stöder dem. Du kan ta reda på om din Perl stöder långa dubblar via Config: Du kan ta reda på om Perl anser att det är dubbelt dubbelt att vara den standard flytande punktstorleken som ska användas på din plattform via Config: Det kan också vara så länge dubblar och dubblar är desamma sak: Storleksspecifik V har ingen effekt för Perl-kod, men stöds för kompatibilitet med XS-kod. Det betyder att använda standardstorleken för ett Perl-heltal eller flytande punkt, vilket är standardvärdet. Normalt tar sprintf nästa oanvända argument som det värde som ska formateras för varje formatspecifikation. Om formatspecifikationen använder för att kräva ytterligare argument, konsumeras de från argumentlistan i den ordning de visas i formatspecifikationen innan värdet som ska formateras. Om ett argument specificeras av ett explicit index påverkar det inte den normala ordningen för argumenten, även om det explicit angivna indexet skulle ha varit nästa argument. använder a för bredden, b för precisionen och c som värdet att formatera under: skulle använda a för bredd och precision, och b som det värde som ska formateras. Här är några fler exempel vara medvetna om att när du använder ett explicit index kan det behöva flyr: Om användningsland (inklusive användarland 39: notcharacters39) är i kraft och POSIX :: setlocal har blivit kallad, används tecknet som används för decimalavskiljaren i formaterade flytpunkten påverkas av LCNUMERIC-lokalen. Se perllocale och POSIX. Det finns ingen binär omvandlingsspecifikare i glibc normalt. Det är möjligt att lägga till anpassade konverteringstyper till funktionen printf () av funktioner i glibc. Se registertryckfunktion för detaljer. Du kan lägga till en anpassad b-konvertering för eget bruk, om det förenklar programkoden för att få den tillgänglig. Här är ett exempel på hur man implementerar ett anpassat printf-format i glibc. Också vad du talar om w. r.t. hantering av flera resultat i följd är inte reentrancy per se utan snarare utfallet av att använda vad som uppgår till ett globalt objekt för att lagra resultatet. Funktionen återges inte igen. I C är det korrekta eller åtminstone ofta använda idiomet för att hantera funktioner som lagrar sina resultat i ett globalt objekt att kopiera dessa resultat omedelbart efter att de erhållits. Detta har den stora fördelen att om endast ett resultat krävs åt gången är det inte nödvändigt med ytterligare tilldelning. ndash Greg A. Woods Nov 27 12 på 0:51 Här kommer vi att behöva vara oense. Jag kan inte se hur att lägga till en diskret preprocessorsymbol kommer någonstans nära skadan att begränsa användningsfallen allvarligt, vilket gör gränssnittet felaktigt, reserverar permanent lagring under programmets varaktighet för ett temporärt värde och genererar sämre kod på de flesta moderna plattformar . ndash R .. Nov 27 12 på 1:53 Familjen printf () kan bara skriva ut i bas 8, 10 och 16 med standardspecifikationen direkt. Föreslå att du skapar en funktion som omvandlar numret till en sträng per kod speciella behov. Alla andra svar hittills har åtminstone en av dessa begränsningar. Använd statiskt minne för returbufferten. Detta begränsar antalet gånger som funktionen kan användas som argument för printf (). Tilldela minne som kräver uppringningskoden till lediga pekare. Kräver uppringningskoden för att uttryckligen tillhandahålla en lämplig buffert. Ring printf () direkt. Detta förpliktar en ny funktion för att fprintf (). sprintf (). vsprintf (). etc. Använd ett minskat antal heltal. Följande har ingen av ovanstående begränsningar. Det kräver C99 eller senare och användning av s. Det använder en sammansatt bokstavlig för att ge buffertutrymmet. Det har inga problem med flera samtal i ett printf ().Perl printf format exempel (referenssida) Här är en referenssida (fuskblad) av Perl printf formateringsalternativ. Förhoppningsvis omfattar den här listan de vanligaste Perl-utskriftsalternativen du kommer att köra in, eller kommer åtminstone att peka dig i rätt riktning. Perl printf - strängformatering Här är flera exempel som visar hur du formaterar strängar med Perl och printf. Jag använder enstaka citat i alla mina exemplar för att hjälpa till att visa vänster - och rättjustering. Den här koden resulterar i följande utdata: Perl printf - formaterings heltal Följande kod visar hur man skriver ut heltal med Perl, med funktionen printf. Dessa exempel visar hur man kontrollerar fältbredder, skriver ut vänsterjusterat, rätt motiverat och nollfyllt. Och här är utmatningen från källkoden: Formatering av flytande punktnummer Följande Perl printf-kod visar hur du formaterar flytande punktutmatning: Och här är resultatet från dessa printf-flytande punkter (decimal) exempel: Formateringsvaluta Förhoppningsvis kan du se från det exemplet att ett sätt att skriva ut valuta är med två positioner efter decimaltalet, så här: Det fungerar för många enkla program, men för mer robusta program kommer du förmodligen att göra mer arbete än det här. Utskriftsflikar, snedstreck, backslashes, newlines Här är några exempel på Perl printfon som visar hur man skriver ut andra tecken i din produktion, inklusive flikar, snedstreck, backslashes och newlines. En kombination av tekniker Här är ett litet exempel som visar flera av dessa tekniker i ett utskriftsutdrag: Detta resulterar i följande utdata: Relaterat utskriftsinnehåll Här är några länkar till andra utbildningar på vår hemsida:
No comments:
Post a Comment